/* eslint-disable no-mixed-spaces-and-tabs */ import { NextPage, NextPageContext } from 'next' import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { useState } from 'react' import useClipboard from 'react-use-clipboard' import { get } from '@utils/Query' import { cleanObject, parseCookie, redirectTo } from '@utils/Tools' import { getToken } from '@utils/Csrf' import Fetch from '@utils/Fetch' import { ParsedUrlQuery } from 'querystring' import { Bot, BotSpec, ResponseProps, Theme, WebhookStatus } from '@types' import NotFound from 'pages/404' import Link from 'next/link' import { Form, Formik } from 'formik' import { DeveloperBot, DeveloperBotSchema } from '@utils/Yup' import Input from '@components/Form/Input' import Tooltip from '@components/Tooltip' const Button = dynamic(() => import('@components/Button')) const DeveloperLayout = dynamic(() => import('@components/DeveloperLayout')) const DiscordAvatar = dynamic(() => import('@components/DiscordAvatar')) const Message = dynamic(() => import('@components/Message')) const Modal = dynamic(() => import('@components/Modal')) const BotApplication: NextPage = ({ user, spec, bot, theme, csrfToken }) => { const router = useRouter() const [ data, setData ] = useState>(null) const [ modalOpened, setModalOpen ] = useState(false) const [ showToken, setShowToken ] = useState(false) const [ tokenCopied, setTokenCopied ] = useClipboard(spec?.token, { successDuration: 1000 }) async function updateApplication(d: DeveloperBot) { const res = await Fetch(`/applications/bots/${bot.id}`, { method: 'PATCH', body: JSON.stringify(cleanObject(d)) }) setData(res) } async function resetToken() { const res = await Fetch<{ token: string }>(`/applications/bots/${bot.id}/reset`, { method: 'POST', body: JSON.stringify({ token: spec.token, _csrf: csrfToken }) }) setData(res) return res } if(!user) { localStorage.redirectTo = window.location.href redirectTo(router, 'login') return } if(!bot || !spec) return return ( 돌아가기

봇 설정

한국 디스코드 리스트 API에 사용할 정보를 이곳에서 설정하실 수 있습니다.

{ !data ? '' : data.code === 200 ?

수정 성공!

봇 정보를 저장했습니다.

:

{data.message}

    { data.errors?.map((el, i)=>
  • {el}
  • ) }
}

{bot.name}#{bot.tag}

봇 토큰

{showToken ? spec.token : '******************'}
setModalOpen(false)} dark={theme === 'dark'} header='정말로 토큰을 재발급하시겠습니까?'>

기존에 사용중이시던 토큰은 더 이상 사용하실 수 없습니다

{({ errors, touched }) => (

웹훅 URL {(!data || data.code !== 200) && spec.webhookStatus === WebhookStatus.Disabled && ( ⚠️ )}

웹훅을 이용하여 다양한 한국 디스코드 리스트의 봇에 발생하는 이벤트를 받아볼 수 있습니다.
웹훅 링크가 유효하지 않을 경우 웹훅이 중지되며, 다시 저장할 경우 다시 활성화됩니다.
웹훅에 대한 자세한 내용은 개발자 문서에서 확인하실 수 있습니다.

{touched.webhookURL && errors.webhookURL ?
{errors.webhookURL}
: null}
)}
) } interface BotApplicationProps { user: string spec: BotSpec bot: Bot csrfToken: string theme: Theme } export const getServerSideProps = async (ctx: Context) => { const parsed = parseCookie(ctx.req) const user = (await get.Authorization(parsed?.token)) || '' return { props: { user, spec: await get.botSpec(ctx.query.id, user), bot: await get.bot.load(ctx.query.id), csrfToken: getToken(ctx.req, ctx.res) } } } interface Context extends NextPageContext { query: URLQuery } interface URLQuery extends ParsedUrlQuery { id: string date: string } export default BotApplication