Commit 575de548 authored by purerosefallen's avatar purerosefallen

join roomlist

parent a2db3519
Pipeline #43279 passed with stages
in 1 minute and 53 seconds
......@@ -61,6 +61,8 @@ chatgptSystemPrompt: 你是{{windbot}},一名与{{player}}实时互动的游
chatgptTokenLimit: 12000
chatgptExtraOpts: {}
enableReconnect: 1
enableCloudReplay: 1
enableRoomlist: 1
reconnectTimeout: 180000
hidePlayerName: 0
enableRandomDuel: 1
......
......@@ -46,7 +46,9 @@ export class ClientHandler {
return next();
})
.middleware(YGOProCtosJoinGame, async (msg, client, next) => {
client.roompass = msg.pass || '';
if (!msg.bypassEstablished) {
client.roompass = msg.pass || '';
}
return next();
})
.middleware(
......
......@@ -139,6 +139,12 @@ export const defaultConfig = {
// Boolean parse rule (default true): only '0'/'false'/'null' => false, otherwise true.
// Note: with default-true parsing, empty string is treated as true.
ENABLE_RECONNECT: '1',
// Enable cloud replay menu entry (R/W pass handling).
// Boolean parse rule (default true): only '0'/'false'/'null' => false, otherwise true.
ENABLE_CLOUD_REPLAY: '1',
// Enable room list menu entry (L pass handling).
// Boolean parse rule (default true): only '0'/'false'/'null' => false, otherwise true.
ENABLE_ROOMLIST: '1',
// Reconnect timeout after disconnect. Format: integer string in milliseconds (ms).
RECONNECT_TIMEOUT: '180000',
// Hide player name mode in random duel rooms.
......
......@@ -4,9 +4,14 @@ import { CloudReplayService } from '../feats';
export class CloudReplayJoinHandler {
private cloudReplayService = this.ctx.get(() => CloudReplayService);
private enabled =
this.ctx.config.getBoolean('ENABLE_CLOUD_REPLAY') && !!this.ctx.database;
constructor(private ctx: Context) {
this.ctx.middleware(YGOProCtosJoinGame, async (msg, client, next) => {
if (!this.enabled) {
return next();
}
const pass = (msg.pass || '').trim();
if (!pass) {
return next();
......
......@@ -12,6 +12,7 @@ import { BadwordPlayerInfoChecker } from './badword-player-info-checker';
import { JoinBlankPassRandomDuel } from './join-blank-pass-random-duel';
import { JoinBlankPassWindbotAi } from './join-blank-pass-windbot-ai';
import { JoinBlankPassMenu } from './join-blank-pass-menu';
import { JoinRoomlist } from './join-roomlist';
export const JoinHandlerModule = createAppContext<ContextState>()
.provide(ClientVersionCheck)
......@@ -22,6 +23,7 @@ export const JoinHandlerModule = createAppContext<ContextState>()
.provide(JoinWindbotAi)
.provide(JoinRoomIp)
.provide(CloudReplayJoinHandler)
.provide(JoinRoomlist)
.provide(JoinRoom)
.provide(JoinBlankPassMenu)
.provide(JoinBlankPassRandomDuel)
......
import { YGOProCtosJoinGame } from 'ygopro-msg-encode';
import { Context } from '../app';
import { Client } from '../client';
import { MenuEntry, MenuManager } from '../feats';
import { RoomManager } from '../room';
export class JoinRoomlist {
private logger = this.ctx.createLogger(this.constructor.name);
private menuManager = this.ctx.get(() => MenuManager);
private roomManager = this.ctx.get(() => RoomManager);
private enabled = this.ctx.config.getBoolean('ENABLE_ROOMLIST');
constructor(private ctx: Context) {
this.ctx.middleware(YGOProCtosJoinGame, async (msg, client, next) => {
if (!this.enabled) {
return next();
}
const pass = (msg.pass || '').trim();
if (!pass || pass.toUpperCase() !== 'L') {
return next();
}
await this.openRoomListMenu(client);
return msg;
});
}
private async openRoomListMenu(client: Client) {
const roomNames = this.roomManager
.allRooms()
.filter((room) => room.native)
.map((room) => room.name);
// .sort((a, b) => a.localeCompare(b));
const menu: MenuEntry[] = roomNames.map((roomName) => ({
title: roomName,
callback: async (menuClient) => {
const room = this.roomManager.findByName(roomName);
if (!room || !room.native) {
this.logger.debug(
{ roomName },
'Roomlist target room no longer exists',
);
await this.openRoomListMenu(menuClient);
return;
}
await room.join(menuClient);
},
}));
await this.menuManager.launchMenu(client, menu);
}
}
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