Skip to content

Commit

Permalink
v0.7.0 (#73)
Browse files Browse the repository at this point in the history
* fix(deps): update dependency supabase to v2

* Develop (#51)

* ci: 🎡 nextのバージョンを15に戻す

* fix: 🐛 cache関連の記述 削除

* refactor: 💡 関数名を内容にあうように修正

* feat: 🎸 各ユーザのページをnext buildにてビルドするように

* ci: 🎡 各種パッケージ更新

* ci: 🎡 push時にビルドチェックを走らせるのを辞める

* refactor: 💡 不要な記述を削除

* feat: 🎸 ユーザのページをrevalidate出来るように

* ServerActionとして動いていないバグを修正

* Develop (#54)

* ci: 🎡 nextのバージョンを15に戻す

* fix: 🐛 cache関連の記述 削除

* refactor: 💡 関数名を内容にあうように修正

* feat: 🎸 各ユーザのページをnext buildにてビルドするように

* ci: 🎡 各種パッケージ更新

* ci: 🎡 push時にビルドチェックを走らせるのを辞める

* refactor: 💡 不要な記述を削除

* feat: 🎸 ユーザのページをrevalidate出来るように

* ServerActionとして動いていないバグを修正

* fix: 🐛 時差が発生するのを修正 (#52)

* Feature/online (#53)

* fix: 🐛 時差が発生するのを修正

* fix: 🐛 時差バグ 再修正

* refactor: 💡 300秒キャッシュ

* fix: 🐛 時差バグ 本当の本当になおった

* refactor: 💡 不要なimportを削除

* ci: 🎡 事前ビルド対象を直近30日内にプレイのあったユーザに限定

* chore: 🤖 キャッシュ時間設定

* chore: 🤖 キーワード・ページ名・キャッシュ時間を指定

✅ Closes: #33

* v0.6.0

* chore(deps): update dependency eslint to v9

* chore(deps): update dependency eslint-config-prettier to v10

* chore(deps): update dependency @types/node to v22

* chore(deps): update dependency sass to v1.85.1 (#64)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(deps): update dependency supabase to v2.15.8 (#65)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(deps): update dependency react-toastify to v11.0.5 (#62)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update typescript-eslint monorepo to v8.25.0 (#63)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Merge/release (#67)

* fix(deps): update dependency supabase to v2

* Develop (#51)

* ci: 🎡 nextのバージョンを15に戻す

* fix: 🐛 cache関連の記述 削除

* refactor: 💡 関数名を内容にあうように修正

* feat: 🎸 各ユーザのページをnext buildにてビルドするように

* ci: 🎡 各種パッケージ更新

* ci: 🎡 push時にビルドチェックを走らせるのを辞める

* refactor: 💡 不要な記述を削除

* feat: 🎸 ユーザのページをrevalidate出来るように

* ServerActionとして動いていないバグを修正

* Develop (#54)

* ci: 🎡 nextのバージョンを15に戻す

* fix: 🐛 cache関連の記述 削除

* refactor: 💡 関数名を内容にあうように修正

* feat: 🎸 各ユーザのページをnext buildにてビルドするように

* ci: 🎡 各種パッケージ更新

* ci: 🎡 push時にビルドチェックを走らせるのを辞める

* refactor: 💡 不要な記述を削除

* feat: 🎸 ユーザのページをrevalidate出来るように

* ServerActionとして動いていないバグを修正

* fix: 🐛 時差が発生するのを修正 (#52)

* Feature/online (#53)

* fix: 🐛 時差が発生するのを修正

* fix: 🐛 時差バグ 再修正

* refactor: 💡 300秒キャッシュ

* fix: 🐛 時差バグ 本当の本当になおった

* refactor: 💡 不要なimportを削除

* ci: 🎡 事前ビルド対象を直近30日内にプレイのあったユーザに限定

* chore: 🤖 キャッシュ時間設定

* chore: 🤖 キーワード・ページ名・キャッシュ時間を指定

✅ Closes: #33

* v0.6.0

* chore(deps): update dependency eslint to v9

* chore(deps): update dependency eslint-config-prettier to v10

* chore(deps): update dependency @types/node to v22

* Hotfix/invalid multibytes tags (#58)

* fix: 🐛 Revalidateでマルチバイト文字を指定してはいけない

* fix: 🐛 各種パラメータがundefinedになるのを修正

* v0.6.1

* Hotfix/sns image (#59)

* chore: 🤖 metadataBaseをexport

* refactor: 💡 不要なコードを削除

* v0.6.2

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* feat: 🎸 player/id/[id]を実装 (#68)

* feat: 🎸 player/id/[id]を実装

ユーザ名のページにアクセスしたらIDのページに転送

* feat: 🎸 更新したらリロードさせる

* fix: 🐛 ステージの表示名を修正

* feat: 🎸 オンラインページを更新

* ci: 🎡 パッケージの更新

* Update package.json (#71)

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
  • Loading branch information
sweshelo and renovate[bot] authored Feb 28, 2025
1 parent f7a12dd commit 92aca5b
Show file tree
Hide file tree
Showing 13 changed files with 525 additions and 1,221 deletions.
1,543 changes: 369 additions & 1,174 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "medusa",
"version": "0.6.2",
"version": "0.7.0",
"private": true,
"scripts": {
"dev": "next dev --turbo",
Expand Down
37 changes: 12 additions & 25 deletions src/app/player/[name]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,36 +1,23 @@
import { Metadata } from 'next'
import { notFound, redirect } from 'next/navigation'

import { PlayerPage } from '@/features/player'
import { fetchAchievement } from '@/service/supabase/achievement'
import { fetchPlayer, fetchRecentPlayedPlayersName } from '@/service/supabase/player'
import { getPlayerIdByName } from '@/service/supabase/player'

interface PageProps {
params: Promise<{ name: string }>
}

export const revalidate = 86400 // 丸一日キャッシュする
export const dynamicParams = true

export async function generateStaticParams() {
const players = await fetchRecentPlayedPlayersName()
return players.map(name => ({ name }))
export const metadata: Metadata = {
robots: { index: false },
}

export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
const name = decodeURI((await params).name)

return {
title: `${name}さんのページ`,
description: `${name}さんの記録を閲覧します`,
}
interface PageProps {
params: Promise<{ name: string }>
}

export default async function Page({ params }: PageProps) {
const name = decodeURI((await params).name)
if (!name) return

const player = await fetchPlayer(name)
const achievement = (await fetchAchievement(player.records[0]?.achievement)) ?? undefined
const id = await getPlayerIdByName(name)

return player ? <PlayerPage player={player} achievement={achievement} /> : <></>
if (id) {
redirect(`/player/id/${id}`)
} else {
notFound()
}
}
35 changes: 35 additions & 0 deletions src/app/player/id/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Metadata } from 'next'

import { PlayerPage } from '@/features/player'
import { fetchAchievement } from '@/service/supabase/achievement'
import { fetchPlayer, fetchRecentPlayedPlayersId } from '@/service/supabase/player'

interface PageProps {
params: Promise<{ id: string }>
}

export const revalidate = 86400 // 丸一日キャッシュする
export const dynamicParams = true

export async function generateStaticParams() {
const players = await fetchRecentPlayedPlayersId()
return players.map(id => ({ id: `${id}` }))
}

export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
const { name } = await fetchPlayer(parseInt((await params).id))
return {
title: `${name}さんのページ`,
description: `${name}さんの記録を閲覧します`,
robots: {
index: false,
},
}
}

export default async function Page({ params }: PageProps) {
const player = await fetchPlayer(parseInt((await params).id))
const achievement = (await fetchAchievement(player.records[0].achievement)) ?? undefined

return player ? <PlayerPage player={player} achievement={achievement} /> : <></>
}
6 changes: 5 additions & 1 deletion src/app/ranking/page.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { endOfMonth, subMonths } from 'date-fns'
import { Metadata } from 'next'

import RankingPage from '@/features/ranking'
Expand All @@ -8,7 +9,10 @@ export const metadata: Metadata = {
}

export default async function Page() {
const ranking = await fetchRankingTable()
const ranking =
(await fetchRankingTable()) ??
(await fetchRankingTable(endOfMonth(subMonths(new Date(), 1)))) ??
[]

return <RankingPage ranking={ranking.sort((a, b) => a.rank - b.rank)} />
}
5 changes: 5 additions & 0 deletions src/components/drawer/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ export const Drawer = () => {
プレイヤー検索
</Link>
</li>
<li>
<Link href="/online" className="block p-2 hover:bg-gray-100">
オンライン
</Link>
</li>
</ul>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/components/revalidater/action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ export const revalidateUserData = async (tags: string | string[]) => {
}

export const revalidatePage = async (path: string) => {
revalidatePath(encodeURIComponent(path))
revalidatePath(path)
}
6 changes: 4 additions & 2 deletions src/components/revalidater/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import classNames from 'classnames'
import { addSeconds, differenceInSeconds, format } from 'date-fns'
import { usePathname } from 'next/navigation'
import { usePathname, useRouter } from 'next/navigation'
import { useCallback, useEffect, useState } from 'react'
import { toast } from 'react-toastify'
import { Tooltip } from 'react-tooltip'
Expand All @@ -23,6 +23,7 @@ const RefreshSpan = 300

export const Revalidater = () => {
const pathname = usePathname()
const router = useRouter()
const handleButtonClick = useCallback(async () => {
await revalidatePage(pathname)
toast.success('データベースと同期しました')
Expand All @@ -37,7 +38,8 @@ export const Revalidater = () => {
)
setEnabled(false)
setStoredDate(new Date())
}, [pathname])
router.refresh()
}, [pathname, router])

const [isEnabled, setEnabled] = useState<boolean>(false)
const [storedDate, setStoredDate] = useState<Date | null>(null)
Expand Down
6 changes: 4 additions & 2 deletions src/components/stage-icon/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@ interface StageProps {
name: string
}

const getShortenName = (name: string) => {
export const getShortenName = (name: string) => {
switch (name) {
case 'ウラシブヤ1':
case 'ウラシブヤ':
return 'シブ1'
case 'ウラシブヤ2':
return 'シブ2'
case 'ウラシブヤ3':
return 'シブ3'
case 'ウラシブヤ1.2':
return 'ハロシブ'
return 'シブ1.2'
case 'ウラオオサカ1':
case 'ウラオオサカ':
return 'サカ1'
case 'ウラオオサカ2':
return 'サカ2'
Expand Down
5 changes: 5 additions & 0 deletions src/features/online/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { Headline } from '@/components/common/headline'
import { PlayerCard } from '@/components/player/card'
import { Revalidater } from '@/components/revalidater'

import { ScheduleTable } from '../schedule'

interface Props {
players: {
player_name: string
Expand All @@ -17,6 +19,9 @@ export const OnlinePlayers = ({ players }: Props) => {
<>
<Headline title="オンラインのプレイヤー" />
<Revalidater />
<div className="overflow-x-auto rounded-lg shadow my-4">
<ScheduleTable />
</div>
<div className="mt-4 mb-4 space-y-2">
{players.map((player, index) => (
<PlayerCard player={{ name: player.player_name }} chara={player.chara} key={index}>
Expand Down
53 changes: 53 additions & 0 deletions src/features/schedule/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import classNames from 'classnames'
import { format, isWithinInterval, parseISO } from 'date-fns'

import { fetchSchedule } from '@/service/supabase/schedule'

export const ScheduleTable = async () => {
const schedule = await fetchSchedule()
return (
<>
<table className="min-w-full divide-y divide-gray-200 rounded-lg">
<thead className="bg-orange-300">
<tr>
<th className="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-center">
日付
</th>
<th className="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-center">
偶数
</th>
<th className="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-center">
奇数
</th>
</tr>
</thead>
<tbody className="bg-white divide-y divide-gray-200">
{schedule.slice(-4).map(table => {
const isActiveTerm = isWithinInterval(new Date(), {
start: parseISO(table.started_at!),
end: parseISO(table.ended_at!),
})
return (
<tr
key={table.id}
className={classNames({
['bg-amber-200']: isActiveTerm,
})}
>
<td className="text-center py-2 items-center gap-2 justify-center">
{format(table.started_at!, 'MM/dd')} ~ {format(table.ended_at!, 'MM/dd')}
</td>
<td className="text-center py-2 items-center gap-2 justify-center">
{table.even_time}
</td>
<td className="text-center py-2 items-center gap-2 justify-center">
{table.odd_time}
</td>
</tr>
)
})}
</tbody>
</table>
</>
)
}
10 changes: 5 additions & 5 deletions src/service/original/ranking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ import { format } from 'date-fns'

import { Ranking } from '@/types/ranking'

const originalPageURL = (index: number) => {
const month = format(new Date(), 'yyyyMM')
const originalPageURL = (index: number, date: Date | undefined) => {
const month = format(date ?? new Date(), 'yyyyMM')
return `https://p.eagate.573.jp/game/chase2jokers/ccj/ranking/index.html?page=${index}&rid=${month}`
}

export const fetchRankingTable = async () => {
export const fetchRankingTable = async (date?: Date) => {
const ranking: Ranking[] = []

await Promise.all(
[0, 1, 2, 3].map(async index => {
try {
const html = await (await fetch(originalPageURL(index))).text()
const html = await (await fetch(originalPageURL(index, date))).text()
const $ = cheerio.load(html)

$('#ranking_data')
Expand Down Expand Up @@ -90,5 +90,5 @@ export const fetchRankingTable = async () => {
})
)

return ranking
return ranking.length > 0 ? ranking : undefined
}
36 changes: 26 additions & 10 deletions src/service/supabase/player.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,28 @@ import { subDays } from 'date-fns'

import { supabase } from './client'

export const fetchPlayer = async (playerName: string) => {
export const getPlayerIdByName = async (playerName: string) => {
const { data: players, error } = await supabase([playerName])
.from('player')
.select('id')
.eq('name', playerName)
.limit(1)

if (error) {
throw new Error(`Error fetching player: ${error.message}`)
}

const [player] = players
return player.id
}

export const fetchPlayer = async (playerId: number) => {
// プレイヤー情報を取得
const { data: players, error: playerError } = await supabase([playerName])
const tag = [`${playerId}`]
const { data: players, error: playerError } = await supabase(tag)
.from('player')
.select('*')
.eq('name', playerName)
.eq('id', playerId)
.limit(1)

if (playerError) {
Expand All @@ -17,10 +33,10 @@ export const fetchPlayer = async (playerName: string) => {
const [player] = players

// レコードを取得(新しい順に300件まで)
const { data: records, error: recordsError } = await supabase([playerName])
const { data: records, error: recordsError } = await supabase(tag)
.from('record')
.select('*')
.eq('player_name', playerName)
.eq('player_name', player.name)
.order('created_at', { ascending: false })
.limit(300)

Expand All @@ -29,10 +45,10 @@ export const fetchPlayer = async (playerName: string) => {
}

// 最高ランキング
const { data: rankings } = await supabase([playerName])
const { data: rankings } = await supabase(tag)
.from('record')
.select('ranking')
.eq('player_name', playerName)
.eq('player_name', player.name)
.order('ranking', { ascending: true })
.limit(1)
const ranking = rankings?.[0]?.ranking ?? null
Expand All @@ -58,18 +74,18 @@ export const fetchAllPlayersName = async (): Promise<string[]> => {
}
}

export const fetchRecentPlayedPlayersName = async (): Promise<string[]> => {
export const fetchRecentPlayedPlayersId = async (): Promise<number[]> => {
const { data: players, error: joinError } = await supabase(['ranking'])
.from('player')
.select(`name`)
.select(`id`)
.gte('updated_at', subDays(new Date(), 30).toISOString())
.order('name')

if (joinError) {
console.error('ユーザ取得でエラー: ', joinError)
return []
} else {
return players.map(player => player.name)
return players.map(player => player.id)
}
}

Expand Down

0 comments on commit 92aca5b

Please sign in to comment.