diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 57c9b96..d32f475 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -19,14 +19,13 @@ assignees: '' > 어떤 문제가 발생하나요? -## 클라이언트 버전 +## 빌드 버전 -> 클라이언트 버전을 알려주세요! +> 클라이언트의 빌드 버전을 알려주세요! ## 사양 diff --git a/Dockerfile b/Dockerfile index dddd35c..d2124c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,12 @@ WORKDIR /usr/src/app ARG NEXT_PUBLIC_SENTRY_DSN ARG SENTRY_DSN ARG SENTRY_AUTH_TOKEN +ARG SOURCE_COMMIT +ARG TAG ENV NEXT_PUBLIC_SENTRY_DSN $NEXT_PUBLIC_SENTRY_DSN +ENV NEXT_PUBLIC_SOURCE_COMMIT $SOURCE_COMMIT +ENV NEXT_PUBLIC_TAG $TAG ENV SENTRY_DSN $SENTRY_DSN ENV SENTRY_AUTH_TOKEN $SENTRY_AUTH_TOKEN ENV SENTRY_ORG koreanbots diff --git a/api-docs b/api-docs index fcc3fb5..f7d36b4 160000 --- a/api-docs +++ b/api-docs @@ -1 +1 @@ -Subproject commit fcc3fb57a2bce58703acb6a2e9be4cfe98929427 +Subproject commit f7d36b42ac19c91a150580309025f439faa5cbbf diff --git a/hooks/build b/hooks/build index 2dd6aca..e883f42 100644 --- a/hooks/build +++ b/hooks/build @@ -1,3 +1,3 @@ #!/bin/bash -docker build --build-arg SENTRY_AUTH_TOKEN=$SENTRY_AUTH_TOKEN --build-arg NEXT_PUBLIC_SENTRY_DSN=$NEXT_PUBLIC_SENTRY_DSN --build-arg SENTRY_DSN=$SENTRY_DSN -f $DOCKERFILE_PATH -t $IMAGE_NAME . \ No newline at end of file +docker build --build-arg SENTRY_AUTH_TOKEN=$SENTRY_AUTH_TOKEN --build-arg NEXT_PUBLIC_SENTRY_DSN=$NEXT_PUBLIC_SENTRY_DSN --build-arg SENTRY_DSN=$SENTRY_DSN --build-arg SOURCE_COMMIT=$SOURCE_COMMIT --build-arg TAG=$IMAGE_NAME -f $DOCKERFILE_PATH -t $IMAGE_NAME . \ No newline at end of file diff --git a/pages/_app.tsx b/pages/_app.tsx index adf7879..71f463d 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -6,9 +6,10 @@ import { useEffect, useState } from 'react' import { DefaultSeo } from 'next-seo' import { GlobalHotKeys } from 'react-hotkeys' import NProgress from 'nprogress' +import Package from '../package.json' import Logger from '@utils/Logger' -import { handlePWA, parseCookie, systemTheme } from '@utils/Tools' +import { handlePWA, parseCookie, parseDockerhubTag, systemTheme } from '@utils/Tools' import { DESCRIPTION, shortcutKeyMap, THEME_COLOR, TITLE } from '@utils/Constants' import { Theme } from '@types' @@ -39,6 +40,7 @@ const KoreanbotsApp = ({ Component, pageProps, err, cookie }: KoreanbotsProps): '%c' + 'KOREANBOTS', 'color: #3366FF; -webkit-text-stroke: 2px black; font-size: 72px; font-weight: bold;' ) + Logger.debug(`[BUILD INFO] Tag: ${parseDockerhubTag(process.env.NEXT_PUBLIC_TAG)}, Version: v${Package.version}, Hash: ${process.env.NEXT_PUBLIC_SOURCE_COMMIT}`) console.log( '%c' + '이곳에 코드를 붙여넣으면 공격자에게 엑세스 토큰을 넘겨줄 수 있습니다!!', 'color: #ff0000; font-size: 20px; font-weight: bold;' diff --git a/pages/bots/[id]/vote.tsx b/pages/bots/[id]/vote.tsx index b86cf55..bf231d5 100644 --- a/pages/bots/[id]/vote.tsx +++ b/pages/bots/[id]/vote.tsx @@ -27,6 +27,7 @@ const Tag = dynamic(() => import('@components/Tag')) const Segment = dynamic(() => import('@components/Segment')) const Advertisement = dynamic(() => import('@components/Advertisement')) const Login = dynamic(() => import('@components/Login')) +const Message = dynamic(() => import('@components/Message')) const VoteBot: NextPage = ({ data, user, theme, csrfToken }) => { const [ votingStatus, setVotingStatus ] = useState(0) @@ -58,39 +59,46 @@ const VoteBot: NextPage = ({ data, user, theme, csrfToken }) => { } ] }} /> - - - {data.name}{getJosaPicker('로')(data.name)} 돌아가기 - - -
- - {data.votes}} dark /> -

{data.name}

-

12시간마다 다시 투표하실 수 있습니다.

-
- { - votingStatus === 0 ? - : votingStatus === 1 ? { - const res = await Fetch<{ retryAfter: number }|unknown>(`/bots/${data.id}/vote`, { method: 'POST', body: JSON.stringify({ _csrf: csrfToken, _captcha: key }) }) - setResult(res) - setVotingStatus(2) - }} - /> - : result.code === 200 ?

해당 봇에 투표했습니다!

- : result.code === 429 ? <> -

이미 해당 봇에 투표하였습니다.

-

{Day(+new Date() + result.data?.retryAfter).fromNow()} 다시 투표하실 수 있습니다.

- - :

{result.message}

- } -
+ { + data.state === 'blocked' ?
+ +

해당 봇은 관리자에 의해 삭제되었습니다.

+
+
: <> + + + {data.name}{getJosaPicker('로')(data.name)} 돌아가기 + + +
+ + {data.votes}} dark /> +

{data.name}

+

12시간마다 다시 투표하실 수 있습니다.

+
+ { + votingStatus === 0 ? + : votingStatus === 1 ? { + const res = await Fetch<{ retryAfter: number }|unknown>(`/bots/${data.id}/vote`, { method: 'POST', body: JSON.stringify({ _csrf: csrfToken, _captcha: key }) }) + setResult(res) + setVotingStatus(2) + }} + /> + : result.code === 200 ?

해당 봇에 투표했습니다!

+ : result.code === 429 ? <> +

이미 해당 봇에 투표하였습니다.

+

{Day(+new Date() + result.data?.retryAfter).fromNow()} 다시 투표하실 수 있습니다.

+ + :

{result.message}

+ } +
-
-
- +
+
+ + } } diff --git a/pages/debug.tsx b/pages/debug.tsx index 98ba4e4..0b18e67 100644 --- a/pages/debug.tsx +++ b/pages/debug.tsx @@ -1,14 +1,13 @@ import dynamic from 'next/dynamic' import { useFormik } from 'formik' -import { checkBrowser } from '@utils/Tools' - const Container = dynamic(()=> import('@components/Container')) const Divider = dynamic(()=> import('@components/Divider')) const Segment = dynamic(()=> import('@components/Segment')) import Package from '../package.json' import Markdown from '@components/Markdown' +import { parseDockerhubTag } from '@utils/Tools' const ClientInfo = ():JSX.Element => { const formik = useFormik({ @@ -29,44 +28,18 @@ https://github.com/koreanbots }, onSubmit: ()=>{ alert('Pong') } }) - return + return

개발자모드

정보들

빌드정보

    -
  • 버전: {Package.version}
  • - -
  • - 해시: {process.env.NEXT_PUBLIC_COMMIT_HASH} -
  • -
  • 브랜치: {process.env.NEXT_PUBLIC_BRANCH}
  • - +
  • Tag: {parseDockerhubTag(process.env.NEXT_PUBLIC_TAG)}
  • +
  • Version: v{Package.version}
  • +
  • Hash: {process.env.NEXT_PUBLIC_SOURCE_COMMIT}
-

클라이언트 정보

-

브라우저

- {checkBrowser()} -

User-Agent

-
{navigator.userAgent}
- {/*

Darkmode

- - - - - - - - - - - - - - - -
ThemeSystem CachedSystem
{theme}{localStorage.detected}{systemTheme}
*/}
diff --git a/pages/users/[id]/index.tsx b/pages/users/[id]/index.tsx index 7613123..076d4e1 100644 --- a/pages/users/[id]/index.tsx +++ b/pages/users/[id]/index.tsx @@ -107,7 +107,7 @@ const Users: NextPage = ({ user, data }) => { {data.bots.length === 0 ?

소유한 봇이 없습니다.

: { - (data.bots as Bot[]).map((bot: Bot) => ( + (data.bots as Bot[]).filter(el => el.state !== 'blocked').map((bot: Bot) => ( )) } diff --git a/tests/utils.test.ts b/tests/utils.test.ts index 1a13b61..d967dcf 100644 --- a/tests/utils.test.ts +++ b/tests/utils.test.ts @@ -2,6 +2,7 @@ import { DiscordEnpoints } from '../utils/Constants' import { checkUserFlag, formatNumber } from '../utils/Tools' test('format Number', () => { + expect(formatNumber(995)).toBe('1천') expect(formatNumber(1000)).toBe('1천') expect(formatNumber(33333)).toBe('3.3만') expect(formatNumber(600)).toBe('600') diff --git a/utils/Query.ts b/utils/Query.ts index 1efbe80..9348749 100644 --- a/utils/Query.ts +++ b/utils/Query.ts @@ -57,14 +57,14 @@ async function getBot(id: string, owners=true):Promise { res[0].status = discordBot.presence?.activities?.find(r => r.type === 'STREAMING') ? 'streaming' : discordBot.presence?.status || null delete res[0].trusted delete res[0].partnered - if (owners) - { + if (owners) { res[0].owners = await Promise.all( res[0].owners.map(async (u: string) => await get._rawUser.load(u)) ) res[0].owners = res[0].owners.filter((el: User | null) => el).map((row: User) => ({ ...row })) } - + + await knex('bots').update({ name: discordBot.username }).where({ id }) } @@ -95,28 +95,31 @@ async function getBotList(type: ListType, page = 1, query?: string):Promise(arr: T[]): T { return arr[Math.floor(Math.random() * arr.length)] } +export function parseDockerhubTag(imageTag: string) { + return imageTag?.split('/').pop().split(':').pop() +} + export * from './ShowdownExtensions' \ No newline at end of file