import { NextPage, NextPageContext } from 'next' import { useRouter } from 'next/router' import dynamic from 'next/dynamic' import Link from 'next/link' import { NextSeo } from 'next-seo' import { useEffect, useState } from 'react' import { Field, Form, Formik } from 'formik' import Tooltip from 'rc-tooltip' import { SnowflakeUtil } from 'discord.js' import { ParsedUrlQuery } from 'querystring' import { Bot, ResponseProps, Theme, User } from '@types' import { git, KoreanbotsEndPoints, reportCats, Status } from '@utils/Constants' import { get } from '@utils/Query' import Day from '@utils/Day' import { ReportSchema } from '@utils/Yup' import Fetch from '@utils/Fetch' import { checkBotFlag, checkUserFlag, formatNumber, parseCookie } from '@utils/Tools' import { getToken } from '@utils/Csrf' import NotFound from '../../404' const Container = dynamic(() => import('@components/Container')) const DiscordAvatar = dynamic(() => import('@components/DiscordAvatar')) const Divider = dynamic(() => import('@components/Divider')) const Tag = dynamic(() => import('@components/Tag')) const Owner = dynamic(() => import('@components/Owner')) const Segment = dynamic(() => import('@components/Segment')) const LongButton = dynamic(() => import('@components/LongButton')) const Advertisement = dynamic(() => import('@components/Advertisement')) const Markdown = dynamic(() => import ('@components/Markdown')) const Message = dynamic(() => import('@components/Message')) const Button = dynamic(() => import('@components/Button')) const TextArea = dynamic(() => import('@components/Form/TextArea')) const Modal = dynamic(() => import('@components/Modal')) const NSFW = dynamic(() => import('@components/NSFW')) const Bots: NextPage = ({ data, desc, date, user, theme, csrfToken }) => { const bg = checkBotFlag(data?.flags, 'trusted') && data?.banner const router = useRouter() const [ nsfw, setNSFW ] = useState() const [ reportModal, setReportModal ] = useState(false) const [ reportRes, setReportRes ] = useState>(null) useEffect(() => { setNSFW(localStorage.nsfw) }, []) if (!data?.id) return return (
{ data.state === 'blocked' ?

해당 봇은 관리자에 의해 삭제되었습니다.

: data.category.includes('NSFW') && !nsfw ? setNSFW(true)} onDisableClick={() => localStorage.nsfw = true} /> : <>
{ data.state === 'private' ?

해당 봇은 특수목적 봇이므로 초대하실 수 없습니다.

해당 봇은 공개 사용이 목적이 아닌 특수목적봇입니다. 따라서 따로 초대하실 수 없습니다.

: data.state === 'reported' ?

해당 봇은 신고가 접수되어, 관리자에 의해 잠금 상태입니다.

해당 봇 사용에 주의해주세요.

봇 소유자분은 가이드라인에 대한 위반사항을 확인해주시고 디스코드 서버로 문의해주세요.

: '' }
{' '} {Status[data.status]?.text} } />

{data.name}{' '} {checkBotFlag(data.flags, 'trusted') ? ( ) : ''}

{data.intro}

{ data.state === 'ok' &&

초대하기

}

하트 추가

{formatNumber(data.votes)}
{ ((data.owners as User[]).find(el => el.id === user?.id) || checkUserFlag(user?.flags, 'staff')) &&

관리하기

} { ((data.owners as User[]).find(el => el.id === user?.id) || checkUserFlag(user?.flags, 'staff')) && { const res = await Fetch(`/bots/${data.id}/stats`, { method: 'PATCH'} ) if(res.code !== 200) return alert(res.message) else window.location.reload() }}>

정보 갱신하기

}

정보

접두사
{data.prefix}
서버수
{data.servers || 'N/A'}
{ data.shards && data.servers > 1500 && <>
샤드수
{data.shards}
}
봇 생성일
{Day(date).fromNow(false)}
{ checkBotFlag(data.flags, 'verified') ?
디스코드 인증됨
: '' }

카테고리

{data.category.map(el => ( ))}

제작자

{(data.owners as User[]).map(el => ( ))}
신고하기 { setReportModal(false) setReportRes(null) }} full dark={theme === 'dark'}> { reportRes?.code === 200 ?

성공적으로 신고하였습니다!

더 자세한 설명이 필요할 수 있습니다! 공식 디스코드에 참여해주세요

: { const res = await Fetch(`/bots/${data.id}/report`, { method: 'POST', body: JSON.stringify(body) }) setReportRes(res) }} validationSchema={ReportSchema} initialValues={{ category: null, description: '', _csrf: csrfToken }}> { ({ errors, touched, values, setFieldValue }) => (
{ reportRes &&

{reportRes.message}

    {reportRes.errors?.map((el, n) =>
  • {el}
  • )}
}

신고 구분

해당되는 항목을 선택해주세요.

{ reportCats.map(el =>
) }
{errors.category && touched.category ? errors.category as string: null}

설명

신고하시는 내용을 자세하게 설명해주세요.