fix(backend): リバーシの設定変更が反映されないのを修正 (#14404)
* fix(backend): リバーシの設定変更が反映されないのを修正 * Update Changelog * add bindthis
This commit is contained in:
		
							parent
							
								
									45d88574c3
								
							
						
					
					
						commit
						a8810af8d9
					
				
					 6 changed files with 47 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -22,6 +22,7 @@
 | 
			
		|||
  (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/679)
 | 
			
		||||
- Fix: ActivityPubのエンティティタイプ判定で不明なタイプを受け取った場合でも処理を継続するように
 | 
			
		||||
  - キュー処理のつまりが改善される可能性があります
 | 
			
		||||
- Fix: リバーシの対局設定の変更が反映されないのを修正
 | 
			
		||||
 | 
			
		||||
## 2024.7.0
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2829,6 +2829,9 @@ type ReversiShowGameResponse = operations['reversi___show-game']['responses']['2
 | 
			
		|||
// @public (undocumented)
 | 
			
		||||
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'];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue