Commit 93745262 authored by nanahira's avatar nanahira

add ClientKeyProvider

parent 17fa2913
export * from './provider';
import { Client } from '../../client';
export class ClientKeyProvider {
// Keep this switch for future compatibility with srvpro identity policies.
isLooseIdentityRule = false;
getClientKey(client: Client): string {
if (!this.isLooseIdentityRule && client.vpass) {
return client.name_vpass;
}
if (this.isLooseIdentityRule) {
return client.name || client.ip || 'undefined';
}
return `${client.ip}:${client.name}`;
}
}
...@@ -9,15 +9,19 @@ import { SideTimeout } from './side-timeout'; ...@@ -9,15 +9,19 @@ import { SideTimeout } from './side-timeout';
import { RandomDuelModule } from './random-duel'; import { RandomDuelModule } from './random-duel';
import { WaitForPlayerProvider } from './wait-for-player-provider'; import { WaitForPlayerProvider } from './wait-for-player-provider';
import { ResourceModule } from './resource'; import { ResourceModule } from './resource';
import { MenuManager } from './menu-manager';
import { ClientKeyProvider } from './client-key-provider';
export const FeatsModule = createAppContext<ContextState>() export const FeatsModule = createAppContext<ContextState>()
.use(ResourceModule) .provide(ClientKeyProvider)
.provide(MenuManager)
.provide(ClientVersionCheck) .provide(ClientVersionCheck)
.provide(Welcome) .provide(Welcome)
.provide(PlayerStatusNotify) .provide(PlayerStatusNotify)
.provide(Reconnect) .provide(Reconnect)
.provide(WaitForPlayerProvider) .provide(WaitForPlayerProvider) // chat refresh
.provide(SideTimeout) .provide(SideTimeout)
.use(RandomDuelModule) .use(ResourceModule) // chat bad words
.use(RandomDuelModule) // chat random duel block
.use(WindbotModule) .use(WindbotModule)
.define(); .define();
export * from './client-version-check'; export * from './client-version-check';
export * from './client-key-provider';
export * from './menu-manager'; export * from './menu-manager';
export * from './welcome'; export * from './welcome';
export * from './random-duel'; export * from './random-duel';
......
This diff is collapsed.
...@@ -29,6 +29,7 @@ import { getSpecificFields } from '../../utility/metadata'; ...@@ -29,6 +29,7 @@ import { getSpecificFields } from '../../utility/metadata';
import { YGOProCtosDisconnect } from '../../utility/ygopro-ctos-disconnect'; import { YGOProCtosDisconnect } from '../../utility/ygopro-ctos-disconnect';
import { isUpdateDeckPayloadEqual } from '../../utility/deck-compare'; import { isUpdateDeckPayloadEqual } from '../../utility/deck-compare';
import { CanReconnectCheck } from './can-reconnect-check'; import { CanReconnectCheck } from './can-reconnect-check';
import { ClientKeyProvider } from '../client-key-provider';
interface DisconnectInfo { interface DisconnectInfo {
key: string; key: string;
...@@ -54,13 +55,13 @@ declare module '../../client' { ...@@ -54,13 +55,13 @@ declare module '../../client' {
declare module '../../room' { declare module '../../room' {
interface Room { interface Room {
noReconnect?: boolean; noReconnect?: boolean;
isLooseReconnectRule?: boolean;
} }
} }
export class Reconnect { export class Reconnect {
private disconnectList = new Map<string, DisconnectInfo>(); private disconnectList = new Map<string, DisconnectInfo>();
private reconnectTimeout = this.ctx.config.getInt('RECONNECT_TIMEOUT'); // 超时时间,单位:毫秒(默认 180000ms = 3分钟) private reconnectTimeout = this.ctx.config.getInt('RECONNECT_TIMEOUT'); // 超时时间,单位:毫秒(默认 180000ms = 3分钟)
private clientKeyProvider = this.ctx.get(() => ClientKeyProvider);
constructor(private ctx: Context) { constructor(private ctx: Context) {
// 检查是否启用断线重连(默认启用) // 检查是否启用断线重连(默认启用)
...@@ -142,7 +143,7 @@ export class Reconnect { ...@@ -142,7 +143,7 @@ export class Reconnect {
} }
private async registerDisconnect(client: Client, room: Room) { private async registerDisconnect(client: Client, room: Room) {
const key = this.getAuthorizeKey(client, room); const key = this.clientKeyProvider.getClientKey(client);
// 通知房间 // 通知房间
await room.sendChat( await room.sendChat(
...@@ -764,22 +765,6 @@ export class Reconnect { ...@@ -764,22 +765,6 @@ export class Reconnect {
return undefined; return undefined;
} }
private getAuthorizeKey(client: Client, room?: Room): string {
// 参考 srvpro 逻辑
// 如果有 vpass 且不是宽松匹配模式,优先用 name_vpass
if (!room?.isLooseReconnectRule && client.vpass) {
return client.name_vpass;
}
// 宽松匹配模式或内部客户端
if (room?.isLooseReconnectRule) {
return client.name || client.ip || 'undefined';
}
// 默认:ip:name
return `${client.ip}:${client.name}`;
}
private getClientRoom(client: Client): Room | undefined { private getClientRoom(client: Client): Room | undefined {
if (!client.roomName) { if (!client.roomName) {
return undefined; return undefined;
...@@ -836,11 +821,8 @@ export class Reconnect { ...@@ -836,11 +821,8 @@ export class Reconnect {
// 宽松模式或匹配条件 // 宽松模式或匹配条件
const matchCondition = const matchCondition =
room.isLooseReconnectRule || this.clientKeyProvider.getClientKey(player) ===
player.ip === newClient.ip || this.clientKeyProvider.getClientKey(newClient);
(newClient.vpass &&
newClient.vpass === player.vpass &&
newClient.roompass === player.roompass);
if (matchCondition) { if (matchCondition) {
return player; return player;
...@@ -865,7 +847,7 @@ export class Reconnect { ...@@ -865,7 +847,7 @@ export class Reconnect {
this.clearDisconnectInfo(disconnectInfo); this.clearDisconnectInfo(disconnectInfo);
continue; continue;
} }
const key = this.getAuthorizeKey(newClient, room); const key = this.clientKeyProvider.getClientKey(newClient);
if (key !== disconnectInfo.key) { if (key !== disconnectInfo.key) {
continue; continue;
} }
......
...@@ -13,7 +13,7 @@ export class JoinBlankPassRandomDuel { ...@@ -13,7 +13,7 @@ export class JoinBlankPassRandomDuel {
} }
const result = await this.randomDuelProvider.findOrCreateRandomRoom( const result = await this.randomDuelProvider.findOrCreateRandomRoom(
'', '',
client.ip, client,
); );
if (result.errorMessage) { if (result.errorMessage) {
return client.die(result.errorMessage, ChatColor.RED); return client.die(result.errorMessage, ChatColor.RED);
......
import { createAppContext } from 'nfkit'; import { createAppContext } from 'nfkit';
import { ContextState } from '../app'; import { ContextState } from '../app';
import { ClientVersionCheck, MenuManager } from '../feats'; import { ClientVersionCheck } from '../feats';
import { JoinWindbotAi, JoinWindbotToken } from '../feats/windbot'; import { JoinWindbotAi, JoinWindbotToken } from '../feats/windbot';
import { JoinRoom } from './join-room'; import { JoinRoom } from './join-room';
import { JoinFallback } from './fallback'; import { JoinFallback } from './fallback';
...@@ -19,7 +19,6 @@ export const JoinHandlerModule = createAppContext<ContextState>() ...@@ -19,7 +19,6 @@ export const JoinHandlerModule = createAppContext<ContextState>()
.provide(RandomDuelJoinHandler) .provide(RandomDuelJoinHandler)
.provide(JoinWindbotAi) .provide(JoinWindbotAi)
.provide(JoinRoom) .provide(JoinRoom)
.provide(MenuManager)
.provide(JoinBlankPassMenu) .provide(JoinBlankPassMenu)
.provide(JoinBlankPassRandomDuel) .provide(JoinBlankPassRandomDuel)
.provide(JoinBlankPassWindbotAi) .provide(JoinBlankPassWindbotAi)
......
...@@ -20,7 +20,7 @@ export class RandomDuelJoinHandler { ...@@ -20,7 +20,7 @@ export class RandomDuelJoinHandler {
} }
const result = await this.randomDuelProvider.findOrCreateRandomRoom( const result = await this.randomDuelProvider.findOrCreateRandomRoom(
type, type,
client.ip, client,
); );
if (result.errorMessage) { if (result.errorMessage) {
return client.die(result.errorMessage, ChatColor.RED); return client.die(result.errorMessage, ChatColor.RED);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment