import { useState, useEffect } from 'react' 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 Tooltip from 'rc-tooltip' import { SnowflakeUtil } from 'discord.js' import { ParsedUrlQuery } from 'querystring' import { Server, Theme, User } from '@types' import { DiscordEnpoints, DSKR_BOT_ID, KoreanbotsEndPoints } from '@utils/Constants' import { get, safeImageHost } from '@utils/Query' import Day from '@utils/Day' import Fetch from '@utils/Fetch' import { checkBotFlag, checkServerFlag, checkUserFlag, formatNumber, parseCookie } from '@utils/Tools' import { getToken } from '@utils/Csrf' import NotFound from '../../404' const Container = dynamic(() => import('@components/Container')) const Image = dynamic(() => import('@components/Image')) const ServerIcon = dynamic(() => import('@components/ServerIcon')) 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 Modal = dynamic(() => import('@components/Modal')) const Servers: NextPage = ({ data, desc, date, user, theme }) => { const [ emojisModal, setEmojisModal ] = useState(false) const [ ownersModal, setOwnersModal ] = useState(false) const [ owners, setOwners ] = useState(null) const bg = checkBotFlag(data?.flags, 'trusted') && data?.banner const router = useRouter() useEffect(() => { if(data) Fetch(`/servers/${data.id}/owners`).then(async res => { if(res?.code === 200) setOwners(res.data) }) }, [ data ]) if (!data?.id) return return
{ data.state === 'blocked' ?

해당 서버는 관리자에 의해 삭제되었습니다.

: <>
{ data.state === 'unreachable' ?

서버 정보를 갱신할 수 없습니다.

서버에서 봇이 추방되었거나, 봇이 오프라인이여서 서버 정보를 갱신할 수 없습니다.

{ owners?.find(el => el.id === user?.id) && <>

서버 괸리자시군요!

봇을 서버에서 추방하셨다면 이곳을 눌러 봇을 다시 초대해주세요!

}
: data.state === 'reported' ?

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

해당 서버를 주의해주세요.

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

: '' }

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

{data.intro}

{ ['ok', 'unreachable'].includes(data.state) &&

참가하기

}

하트 추가

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

관리하기

{/* { const res = await Fetch(`/servers/${data.id}/stats`, { method: 'PATCH'} ) if(res.code !== 200) return alert(res.message) else window.location.reload() }}>

정보 갱신하기

*/} }

정보

멤버 수
{data.members || 'N/A'}
부스트 티어
{typeof data.boostTier === 'number' ? `${data.boostTier}레벨` : 'N/A'}
서버 생성일
{Day(date).fromNow(false)}
{ checkServerFlag(data.flags, 'discord_partnered') ?
디스코드 파트너
: '' } { checkServerFlag(data.flags, 'verified') ?
디스코드 인증됨
: '' }

카테고리

{data.category.map(el => ( ))}
{ data.emojis.length !== 0 && <>

이모지

{ data.emojis.slice(0, 5).map(el => ) } { data.emojis.length > 5 && setEmojisModal(true)} text={`+${data.emojis.length - 5}개`} /> }
setEmojisModal(false)} full dark={theme === 'dark'}> {data.emojis.length}개의 이모지가 있습니다.
{ data.emojis.map(el =>
) }
}

소유자

{ data.owner && } setOwnersModal(true)}>관리자 전체보기 setOwnersModal(false)} full dark={theme === 'dark'}>
{owners ? owners.map(el => ( )) : 불러오는 중...}
}
} export const getServerSideProps = async (ctx: Context) => { const parsed = parseCookie(ctx.req) const data = await get.server.load(ctx.query.id) if(!data) return { props: { data } } const desc = safeImageHost(data.desc) const user = await get.Authorization(parsed?.token) if((checkServerFlag(data.flags, 'trusted') || checkServerFlag(data.flags, 'partnered')) && data.vanity && data.vanity !== ctx.query.id) { ctx.res.statusCode = 301 ctx.res.setHeader('Location', `/servers/${data.vanity}`) return { props: {} } } return { props: { data, desc, date: SnowflakeUtil.deconstruct(data.id ?? '0').date.toJSON(), user: await get.user.load(user || ''), csrfToken: getToken(ctx.req, ctx.res) }, } } export default Servers interface ServersProps { data: Server desc: string date: Date user: User theme: Theme csrfToken: string } interface Context extends NextPageContext { query: URLQuery } interface URLQuery extends ParsedUrlQuery { id: string }