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 = { ...@@ -127,6 +127,9 @@ export const TRANSLATIONS = {
cloud_replay_menu_play: 'Play Cloud Replay', cloud_replay_menu_play: 'Play Cloud Replay',
cloud_replay_menu_download_yrp: 'Download YRP Replay', cloud_replay_menu_download_yrp: 'Download YRP Replay',
cloud_replay_menu_back: 'Back', cloud_replay_menu_back: 'Back',
botlist_menu_single: 'Single',
botlist_menu_match: 'Match',
botlist_menu_back: 'Back',
}, },
'zh-CN': { 'zh-CN': {
update_required: '请更新你的客户端版本', update_required: '请更新你的客户端版本',
...@@ -247,5 +250,8 @@ export const TRANSLATIONS = { ...@@ -247,5 +250,8 @@ export const TRANSLATIONS = {
cloud_replay_menu_play: '播放云录像', cloud_replay_menu_play: '播放云录像',
cloud_replay_menu_download_yrp: '下载 YRP 录像', cloud_replay_menu_download_yrp: '下载 YRP 录像',
cloud_replay_menu_back: '返回', cloud_replay_menu_back: '返回',
botlist_menu_single: '单局',
botlist_menu_match: '比赛',
botlist_menu_back: '返回',
}, },
}; };
...@@ -124,6 +124,10 @@ export class WindBotProvider { ...@@ -124,6 +124,10 @@ export class WindBotProvider {
return this.bots.find((bot) => bot.name === name || bot.deck === name); return this.bots.find((bot) => bot.name === name || bot.deck === name);
} }
getBots() {
return this.bots.filter((bot) => !bot.hidden);
}
issueJoinToken(roomName: string, windbot: WindbotData) { issueJoinToken(roomName: string, windbot: WindbotData) {
let token = ''; let token = '';
do { 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'; ...@@ -13,6 +13,7 @@ import { JoinBlankPassRandomDuel } from './join-blank-pass-random-duel';
import { JoinBlankPassWindbotAi } from './join-blank-pass-windbot-ai'; import { JoinBlankPassWindbotAi } from './join-blank-pass-windbot-ai';
import { JoinBlankPassMenu } from './join-blank-pass-menu'; import { JoinBlankPassMenu } from './join-blank-pass-menu';
import { JoinRoomlist } from './join-roomlist'; import { JoinRoomlist } from './join-roomlist';
import { JoinBotlist } from './join-botlist';
export const JoinHandlerModule = createAppContext<ContextState>() export const JoinHandlerModule = createAppContext<ContextState>()
.provide(ClientVersionCheck) .provide(ClientVersionCheck)
...@@ -24,6 +25,7 @@ export const JoinHandlerModule = createAppContext<ContextState>() ...@@ -24,6 +25,7 @@ export const JoinHandlerModule = createAppContext<ContextState>()
.provide(JoinRoomIp) .provide(JoinRoomIp)
.provide(CloudReplayJoinHandler) .provide(CloudReplayJoinHandler)
.provide(JoinRoomlist) .provide(JoinRoomlist)
.provide(JoinBotlist)
.provide(JoinRoom) .provide(JoinRoom)
.provide(JoinBlankPassMenu) .provide(JoinBlankPassMenu)
.provide(JoinBlankPassRandomDuel) .provide(JoinBlankPassRandomDuel)
......
...@@ -26,28 +26,28 @@ export class JoinRoomlist { ...@@ -26,28 +26,28 @@ export class JoinRoomlist {
} }
private async openRoomListMenu(client: Client) { private async openRoomListMenu(client: Client) {
const roomNames = this.roomManager await this.menuManager.launchMenu(client, async () => {
.allRooms() const roomNames = this.roomManager
.filter((room) => room.native) .allRooms()
.map((room) => room.name); .filter((room) => room.native)
// .sort((a, b) => a.localeCompare(b)); .map((room) => room.name);
const menu: MenuEntry[] = roomNames.map((roomName) => ({ const menu: MenuEntry[] = roomNames.map((roomName) => ({
title: roomName, title: roomName,
callback: async (menuClient) => { callback: async (menuClient) => {
const room = this.roomManager.findByName(roomName); const room = this.roomManager.findByName(roomName);
if (!room || !room.native) { if (!room || !room.native) {
this.logger.debug( this.logger.debug(
{ roomName }, { roomName },
'Roomlist target room no longer exists', 'Roomlist target room no longer exists',
); );
await this.openRoomListMenu(menuClient); await this.openRoomListMenu(menuClient);
return; return;
} }
await room.join(menuClient); await room.join(menuClient);
}, },
})); }));
return menu;
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