import { NextPage, NextPageContext } from 'next' import dynamic from 'next/dynamic' import Link from 'next/link' import { NextSeo } from 'next-seo' import { get } from '@utils/Query' import { BotSubmissionDenyReasonPresetsName, git } from '@utils/Constants' import Day from '@utils/Day' import { SubmittedBot } from '@types' import useClipboard from 'react-use-clipboard' import { ParsedUrlQuery } from 'querystring' import NotFound from 'pages/404' const Container = dynamic(() => import('@components/Container')) const Divider = dynamic(() => import('@components/Divider')) const LongButton = dynamic(() => import('@components/LongButton')) const Tag = dynamic(() => import('@components/Tag')) const Advertisement = dynamic(() => import('@components/Advertisement')) const Segment = dynamic(() => import('@components/Segment')) const Markdown = dynamic(() => import('@components/Markdown')) const Owner = dynamic(() => import('@components/Owner')) const Message = dynamic(() => import('@components/Message')) const PendingBot: NextPage = ({ data }) => { const [isCopied, setCopied] = useClipboard(data?.desc, { successDuration: 1000, }) if (!data) return return (
{data.state === 0 ? (

승인 대기중

해당 봇은 아직 승인 대기 상태입니다.

) : data.state === 1 ? (

승인됨

신청하신 해당 봇이 승인되었습니다!

봇 페이지

) : (

거부됨

아쉽게도 신청하신 해당 봇은 거부되었습니다.

{data.reason && ( <>

사유:{' '} {BotSubmissionDenyReasonPresetsName[data.reason] || data.reason}

{data.reason.includes('카테고리') ? DenyPresetsArticle.INVALID_CATEGORY : DenyPresetsArticle[data.reason]}
)}
{data.strikes < 3 ? (

앞으로 {3 - data.strikes}번의 심사 기회가 남았습니다. 심사 기회를 모두 소진하시면 동일한 봇으로의 심사가 제한됩니다.
'프라이빗 봇', '봇 오프라인', '공식 디스코드 서버 미참여'로 거부된 경우 심사 기회가 차감되지 않습니다.

) : (

더 이상 해당 봇으로 심사를 신청하실 수 없습니다.

)}
)}

{data.intro}

초대하기

{isCopied ? ( <> 복사됨 ) : ( <> 설명 마크다운 복사하기 )}

정보

ID
{data.id}
등록일
{Day(data.date * 1000).format('LLL')}
접두사
{data.prefix}

카테고리

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

제작자

) } export const getServerSideProps = async (ctx: Context) => { const data = await get.botSubmit.load(JSON.stringify(ctx.query)) return { props: { data: data ? { ...data, strikes: await get.botSubmitStrikes(data.id), } : null, }, } } const DenyPresetsArticle = { MISSING_VERIFY: ( <>

개발자 확인 불가로 거부되셨다면 본인이 봇의 소유자라는 것을 증명할 수 없다는 뜻입니다.

본인이 봇 소유자임을 증명하려면, 개발자의 태그(username#0000 형식)가 반드시 다음 명령어중에 포함되어야합니다.

  • 도움 명령어: 도움, 도움말, 명령어, help, commands
  • [접두사]hellothisisverification 응답: 유저#태그(아이디)

), OFFLINE: ( <>

봇 오프라인으로 거부되셨다면 심사 당시에 봇이 오프라인으로 명령어가 응답하지 않았다는 뜻입니다.

봇이 24시간 호스팅 되지 않는다면, 아쉽게도 저희가 심사 시간을 맞춰드릴 수 없기에 심사 시간과 봇의 온라인 시간이 맞지 않는다면 심사를 진행할 수 없습니다.

), INVALID_CATEGORY: (

한 개 이상의 올바르지 않은 카테고리가 포함되어 있습니다. 반드시 봇에 해당되는{' '} 카테고리만 선택해주세요.
카테고리에 대한 자세한 설명은{' '} 여기 에서 확인하실 수 있습니다.

), PRIVATE: (

봇을 초대할 수 없어, 심사를 진행할 수 없습니다. 다음 항목을 확인해주세요.

  • 봇이 공개 봇인가요?
  • 봇이 아직 인증을 받지 못하였는데 100서버에 도달하여 초대가 불가한가요?
  • "REQUIRES OAUTH2 CODE GRANT" 옵션을 사용하고 있나요?
  • 위 항목들을 해결하신 뒤에 다시 신청해주세요.

), LICENSE_VIOLATION: (

한 건 이상의 오픈소스 라이선스 위반사항이 있습니다. 사용하신 오픈소스를 라이선스에 맞추어, 사이트 내 봇 설명과 봇 명령어 안에 기재해주세요.

), ABSENT_AT_DISCORD: (

반드시 공식 디스코드에 참가해주세요.

), } interface PendingBotProps { data: SubmittedBot & { strikes: number | null } } interface Context extends NextPageContext { query: URLQuery } interface URLQuery extends ParsedUrlQuery { id: string date: string } export default PendingBot