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';
import { RandomDuelModule } from './random-duel';
import { WaitForPlayerProvider } from './wait-for-player-provider';
import { ResourceModule } from './resource';
import { MenuManager } from './menu-manager';
import { ClientKeyProvider } from './client-key-provider';
export const FeatsModule = createAppContext<ContextState>()
.use(ResourceModule)
.provide(ClientKeyProvider)
.provide(MenuManager)
.provide(ClientVersionCheck)
.provide(Welcome)
.provide(PlayerStatusNotify)
.provide(Reconnect)
.provide(WaitForPlayerProvider)
.provide(WaitForPlayerProvider) // chat refresh
.provide(SideTimeout)
.use(RandomDuelModule)
.use(ResourceModule) // chat bad words
.use(RandomDuelModule) // chat random duel block
.use(WindbotModule)
.define();
export * from './client-version-check';
export * from './client-key-provider';
export * from './menu-manager';
export * from './welcome';
export * from './random-duel';
......
This diff is collapsed.
......@@ -29,6 +29,7 @@ import { getSpecificFields } from '../../utility/metadata';
import { YGOProCtosDisconnect } from '../../utility/ygopro-ctos-disconnect';
import { isUpdateDeckPayloadEqual } from '../../utility/deck-compare';
import { CanReconnectCheck } from './can-reconnect-check';
import { ClientKeyProvider } from '../client-key-provider';
interface DisconnectInfo {
key: string;
......@@ -54,13 +55,13 @@ declare module '../../client' {
declare module '../../room' {
interface Room {
noReconnect?: boolean;
isLooseReconnectRule?: boolean;
}
}
export class Reconnect {
private disconnectList = new Map<string, DisconnectInfo>();
private reconnectTimeout = this.ctx.config.getInt('RECONNECT_TIMEOUT'); // 超时时间,单位:毫秒(默认 180000ms = 3分钟)
private clientKeyProvider = this.ctx.get(() => ClientKeyProvider);
constructor(private ctx: Context) {
// 检查是否启用断线重连(默认启用)
......@@ -142,7 +143,7 @@ export class Reconnect {
}
private async registerDisconnect(client: Client, room: Room) {
const key = this.getAuthorizeKey(client, room);
const key = this.clientKeyProvider.getClientKey(client);
// 通知房间
await room.sendChat(
......@@ -764,22 +765,6 @@ export class Reconnect {
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 {
if (!client.roomName) {
return undefined;
......@@ -836,11 +821,8 @@ export class Reconnect {
// 宽松模式或匹配条件
const matchCondition =
room.isLooseReconnectRule ||
player.ip === newClient.ip ||
(newClient.vpass &&
newClient.vpass === player.vpass &&
newClient.roompass === player.roompass);
this.clientKeyProvider.getClientKey(player) ===
this.clientKeyProvider.getClientKey(newClient);
if (matchCondition) {
return player;
......@@ -865,7 +847,7 @@ export class Reconnect {
this.clearDisconnectInfo(disconnectInfo);
continue;
}
const key = this.getAuthorizeKey(newClient, room);
const key = this.clientKeyProvider.getClientKey(newClient);
if (key !== disconnectInfo.key) {
continue;
}
......
......@@ -13,7 +13,7 @@ export class JoinBlankPassRandomDuel {
}
const result = await this.randomDuelProvider.findOrCreateRandomRoom(
'',
client.ip,
client,
);
if (result.errorMessage) {
return client.die(result.errorMessage, ChatColor.RED);
......
import { createAppContext } from 'nfkit';
import { ContextState } from '../app';
import { ClientVersionCheck, MenuManager } from '../feats';
import { ClientVersionCheck } from '../feats';
import { JoinWindbotAi, JoinWindbotToken } from '../feats/windbot';
import { JoinRoom } from './join-room';
import { JoinFallback } from './fallback';
......@@ -19,7 +19,6 @@ export const JoinHandlerModule = createAppContext<ContextState>()
.provide(RandomDuelJoinHandler)
.provide(JoinWindbotAi)
.provide(JoinRoom)
.provide(MenuManager)
.provide(JoinBlankPassMenu)
.provide(JoinBlankPassRandomDuel)
.provide(JoinBlankPassWindbotAi)
......
......@@ -20,7 +20,7 @@ export class RandomDuelJoinHandler {
}
const result = await this.randomDuelProvider.findOrCreateRandomRoom(
type,
client.ip,
client,
);
if (result.errorMessage) {
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