Commit 2f912ae4 authored by nanahira's avatar nanahira

botlist

parent 575de548
Pipeline #43280 failed with stages
in 106 minutes and 18 seconds
......@@ -127,6 +127,9 @@ export const TRANSLATIONS = {
cloud_replay_menu_play: 'Play Cloud Replay',
cloud_replay_menu_download_yrp: 'Download YRP Replay',
cloud_replay_menu_back: 'Back',
botlist_menu_single: 'Single',
botlist_menu_match: 'Match',
botlist_menu_back: 'Back',
},
'zh-CN': {
update_required: '请更新你的客户端版本',
......@@ -247,5 +250,8 @@ export const TRANSLATIONS = {
cloud_replay_menu_play: '播放云录像',
cloud_replay_menu_download_yrp: '下载 YRP 录像',
cloud_replay_menu_back: '返回',
botlist_menu_single: '单局',
botlist_menu_match: '比赛',
botlist_menu_back: '返回',
},
};
......@@ -124,6 +124,10 @@ export class WindBotProvider {
return this.bots.find((bot) => bot.name === name || bot.deck === name);
}
getBots() {
return this.bots.filter((bot) => !bot.hidden);
}
issueJoinToken(roomName: string, windbot: WindbotData) {
let token = '';
do {
......
import { YGOProCtosJoinGame } from 'ygopro-msg-encode';
import { Context } from '../app';
import { Client } from '../client';
import { MenuEntry, MenuManager } from '../feats';
import { JoinWindbotAi, WindBotProvider } from '../feats/windbot';
export class JoinBotlist {
private menuManager = this.ctx.get(() => MenuManager);
private joinWindbotAi = this.ctx.get(() => JoinWindbotAi);
private windbotProvider = this.ctx.get(() => WindBotProvider);
constructor(private ctx: Context) {
if (!this.windbotProvider.enabled) {
return;
}
this.ctx.middleware(YGOProCtosJoinGame, async (msg, client, next) => {
const pass = (msg.pass || '').trim();
if (!pass || pass.toUpperCase() !== 'B') {
return next();
}
await this.openBotListMenu(client);
return msg;
});
}
private async openBotListMenu(client: Client) {
const bots = this.windbotProvider
.getBots()
.map((bot) => ({ name: bot.name, deck: bot.deck }));
const menu: MenuEntry[] = bots.map((bot) => ({
title: `${bot.name} - ${bot.deck}`,
callback: async (menuClient) => {
await this.openBotActionMenu(menuClient, bot.name);
},
}));
await this.menuManager.launchMenu(client, menu);
}
private async openBotActionMenu(client: Client, botName: string) {
const bot = this.windbotProvider.getBotByNameOrDeck(botName);
const botTitle = bot ? `${bot.name} - ${bot.deck}` : botName;
const menu: MenuEntry[] = [
{
title: botTitle,
callback: async (menuClient) => {
await this.openBotActionMenu(menuClient, botName);
},
},
{
title: '#{botlist_menu_single}',
callback: async (menuClient) => {
await this.joinWindbotAi.joinByPass(`AI#${botName}`, menuClient);
},
},
{
title: '#{botlist_menu_match}',
callback: async (menuClient) => {
await this.joinWindbotAi.joinByPass(`AI,M#${botName}`, menuClient);
},
},
{
title: '#{botlist_menu_back}',
callback: async (menuClient) => {
await this.openBotListMenu(menuClient);
},
},
];
await this.menuManager.launchMenu(client, menu);
}
}
......@@ -13,6 +13,7 @@ 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';
import { JoinBotlist } from './join-botlist';
export const JoinHandlerModule = createAppContext<ContextState>()
.provide(ClientVersionCheck)
......@@ -24,6 +25,7 @@ export const JoinHandlerModule = createAppContext<ContextState>()
.provide(JoinRoomIp)
.provide(CloudReplayJoinHandler)
.provide(JoinRoomlist)
.provide(JoinBotlist)
.provide(JoinRoom)
.provide(JoinBlankPassMenu)
.provide(JoinBlankPassRandomDuel)
......
......@@ -26,28 +26,28 @@ export class JoinRoomlist {
}
private async openRoomListMenu(client: Client) {
const roomNames = this.roomManager
.allRooms()
.filter((room) => room.native)
.map((room) => room.name);
// .sort((a, b) => a.localeCompare(b));
await this.menuManager.launchMenu(client, async () => {
const roomNames = this.roomManager
.allRooms()
.filter((room) => room.native)
.map((room) => room.name);
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);
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);
},
}));
return 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