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 { botEnforcements, 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?.bg 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)} /> ) : ( <>
{checkBotFlag(data.flags, 'private') ? (

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

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

) : data.state === 'reported' ? (

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

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

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

) : data.enforcements.filter((i) => i !== 'NONE').length > 0 ? (

이 봇은 기능에 제한을 두고 있습니다.

{data.enforcements .filter((i) => i !== 'NONE') .map((i) => (

  • {botEnforcements[i].description}
  • ))}

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

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

    {data.intro}

    {data.state === 'ok' && !checkBotFlag(data.flags, 'private') && (

    초대하기

    )}

    하트 추가

    {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}

    설명

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