summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-08-16 21:02:12 +0900
committerGitHub <noreply@github.com>2024-08-16 21:02:12 +0900
commita8810af8d9a78c0819781001ab045a9c8cf9d171 (patch)
tree5394547362eba377f244d39a28fd9e943caa8302 /packages
parentenhance(frontend): improve usability (diff)
downloadsharkey-a8810af8d9a78c0819781001ab045a9c8cf9d171.tar.gz
sharkey-a8810af8d9a78c0819781001ab045a9c8cf9d171.tar.bz2
sharkey-a8810af8d9a78c0819781001ab045a9c8cf9d171.zip
fix(backend): リバーシの設定変更が反映されないのを修正 (#14404)
* fix(backend): リバーシの設定変更が反映されないのを修正 * Update Changelog * add bindthis
Diffstat (limited to 'packages')
-rw-r--r--packages/backend/src/core/ReversiService.ts33
-rw-r--r--packages/backend/src/server/api/stream/channels/reversi-game.ts8
-rw-r--r--packages/misskey-js/etc/misskey-js.api.md3
-rw-r--r--packages/misskey-js/src/consts.ts13
-rw-r--r--packages/misskey-js/src/index.ts1
5 files changed, 46 insertions, 12 deletions
diff --git a/packages/backend/src/core/ReversiService.ts b/packages/backend/src/core/ReversiService.ts
index 7f939b99c7..51dca3da59 100644
--- a/packages/backend/src/core/ReversiService.ts
+++ b/packages/backend/src/core/ReversiService.ts
@@ -6,6 +6,7 @@
import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis';
import { ModuleRef } from '@nestjs/core';
+import { reversiUpdateKeys } from 'misskey-js';
import * as Reversi from 'misskey-reversi';
import { IsNull, LessThan, MoreThan } from 'typeorm';
import type {
@@ -399,7 +400,33 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
}
@bindThis
- public async updateSettings(gameId: MiReversiGame['id'], user: MiUser, key: string, value: any) {
+ public isValidReversiUpdateKey(key: unknown): key is typeof reversiUpdateKeys[number] {
+ if (typeof key !== 'string') return false;
+ return (reversiUpdateKeys as string[]).includes(key);
+ }
+
+ @bindThis
+ public isValidReversiUpdateValue<K extends typeof reversiUpdateKeys[number]>(key: K, value: unknown): value is MiReversiGame[K] {
+ switch (key) {
+ case 'map':
+ return Array.isArray(value) && value.every(row => typeof row === 'string');
+ case 'bw':
+ return typeof value === 'string' && ['random', '1', '2'].includes(value);
+ case 'isLlotheo':
+ return typeof value === 'boolean';
+ case 'canPutEverywhere':
+ return typeof value === 'boolean';
+ case 'loopedBoard':
+ return typeof value === 'boolean';
+ case 'timeLimitForEachTurn':
+ return typeof value === 'number' && value >= 0;
+ default:
+ return false;
+ }
+ }
+
+ @bindThis
+ public async updateSettings<K extends typeof reversiUpdateKeys[number]>(gameId: MiReversiGame['id'], user: MiUser, key: K, value: MiReversiGame[K]) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return;
@@ -407,10 +434,6 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
if ((game.user1Id === user.id) && game.user1Ready) return;
if ((game.user2Id === user.id) && game.user2Ready) return;
- if (!['map', 'bw', 'isLlotheo', 'canPutEverywhere', 'loopedBoard', 'timeLimitForEachTurn'].includes(key)) return;
-
- // TODO: より厳格なバリデーション
-
const updatedGame = {
...game,
[key]: value,
diff --git a/packages/backend/src/server/api/stream/channels/reversi-game.ts b/packages/backend/src/server/api/stream/channels/reversi-game.ts
index c6f4a4ae3b..7597a1cfa3 100644
--- a/packages/backend/src/server/api/stream/channels/reversi-game.ts
+++ b/packages/backend/src/server/api/stream/channels/reversi-game.ts
@@ -12,6 +12,7 @@ import { ReversiGameEntityService } from '@/core/entities/ReversiGameEntityServi
import { isJsonObject } from '@/misc/json-value.js';
import type { JsonObject, JsonValue } from '@/misc/json-value.js';
import Channel, { type MiChannelService } from '../channel.js';
+import { reversiUpdateKeys } from 'misskey-js';
class ReversiGameChannel extends Channel {
public readonly chName = 'reversiGame';
@@ -46,8 +47,9 @@ class ReversiGameChannel extends Channel {
break;
case 'updateSettings':
if (!isJsonObject(body)) return;
- if (typeof body.key !== 'string') return;
- if (!isJsonObject(body.value)) return;
+ if (!this.reversiService.isValidReversiUpdateKey(body.key)) return;
+ if (!this.reversiService.isValidReversiUpdateValue(body.key, body.value)) return;
+
this.updateSettings(body.key, body.value);
break;
case 'cancel':
@@ -64,7 +66,7 @@ class ReversiGameChannel extends Channel {
}
@bindThis
- private async updateSettings(key: string, value: JsonObject) {
+ private async updateSettings<K extends typeof reversiUpdateKeys[number]>(key: K, value: MiReversiGame[K]) {
if (this.user == null) return;
this.reversiService.updateSettings(this.gameId!, this.user, key, value);
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index 16cb560a52..77a3820f46 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -2830,6 +2830,9 @@ type ReversiShowGameResponse = operations['reversi___show-game']['responses']['2
type ReversiSurrenderRequest = operations['reversi___surrender']['requestBody']['content']['application/json'];
// @public (undocumented)
+export const reversiUpdateKeys: ["map", "bw", "isLlotheo", "canPutEverywhere", "loopedBoard", "timeLimitForEachTurn"];
+
+// @public (undocumented)
type ReversiVerifyRequest = operations['reversi___verify']['requestBody']['content']['application/json'];
// @public (undocumented)
diff --git a/packages/misskey-js/src/consts.ts b/packages/misskey-js/src/consts.ts
index aa8eeb48cb..5863a0b1dd 100644
--- a/packages/misskey-js/src/consts.ts
+++ b/packages/misskey-js/src/consts.ts
@@ -1,11 +1,16 @@
import type { operations } from './autogen/types.js';
import type {
- AbuseReportNotificationRecipient, Ad,
+ AbuseReportNotificationRecipient,
+ Ad,
Announcement,
- EmojiDetailed, InviteCode,
+ EmojiDetailed,
+ InviteCode,
MetaDetailed,
Note,
- Role, SystemWebhook, UserLite,
+ Role,
+ ReversiGameDetailed,
+ SystemWebhook,
+ UserLite,
} from './autogen/models.js';
export const notificationTypes = ['note', 'follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'roleAssigned', 'achievementEarned'] as const;
@@ -159,7 +164,7 @@ export const reversiUpdateKeys = [
'canPutEverywhere',
'loopedBoard',
'timeLimitForEachTurn',
-] as const;
+] as const satisfies (keyof ReversiGameDetailed)[];
export type ReversiUpdateKey = typeof reversiUpdateKeys[number];
diff --git a/packages/misskey-js/src/index.ts b/packages/misskey-js/src/index.ts
index 28007a8ade..7e0165d20b 100644
--- a/packages/misskey-js/src/index.ts
+++ b/packages/misskey-js/src/index.ts
@@ -22,6 +22,7 @@ export const mutedNoteReasons = consts.mutedNoteReasons;
export const followingVisibilities = consts.followingVisibilities;
export const followersVisibilities = consts.followersVisibilities;
export const moderationLogTypes = consts.moderationLogTypes;
+export const reversiUpdateKeys = consts.reversiUpdateKeys;
// api extractor not supported yet
//export * as api from './api.js';