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 ) { return { redirect: { destination: `/servers/${data.vanity}`, permanent: true, }, props: {}, } } return { props: { data, desc, date: Number(SnowflakeUtil.deconstruct(data.id ?? '0').timestamp), 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 }