diff --git a/play.pokemonshowdown.com/src/battle.ts b/play.pokemonshowdown.com/src/battle.ts index 71c56a7c8d..2727e513be 100644 --- a/play.pokemonshowdown.com/src/battle.ts +++ b/play.pokemonshowdown.com/src/battle.ts @@ -1150,6 +1150,7 @@ export class Battle { autoresize?: boolean, } = {}) { this.id = options.id || ''; + this.roomid = options.id || ''; if (options.$frame && options.$logFrame) { this.scene = new BattleScene(this, options.$frame, options.$logFrame); @@ -3539,55 +3540,19 @@ export class Battle { this.log(args, undefined, preempt); break; } - case 'join': case 'j': case 'J': { - if (this.roomid) { - let room = app!.rooms[this.roomid]; - let user = BattleTextParser.parseNameParts(args[1]); - let userid = toUserid(user.name); - if (!room.users[userid]) room.userCount.users++; - room.users[userid] = user; - room.userList.add(userid); - room.userList.updateUserCount(); - room.userList.updateNoUsersOnline(); - } - this.log(args, undefined, preempt); - break; - } - case 'leave': case 'l': case 'L': { - if (this.roomid) { - let room = app!.rooms[this.roomid]; - let user = args[1]; - let userid = toUserid(user); - if (room.users[userid]) room.userCount.users--; - delete room.users[userid]; - room.userList.remove(userid); - room.userList.updateUserCount(); - room.userList.updateNoUsersOnline(); - } + case 'join': case 'j': case 'J': + case 'leave': case 'l': case 'L': + // User list management is handled by ChatRoom.receiveLine + // Here we just log the message to the battle log this.log(args, undefined, preempt); break; - } - case 'name': case 'n': case 'N': { - if (this.roomid) { - let room = app!.rooms[this.roomid]; - let user = BattleTextParser.parseNameParts(args[1]); - let oldid = args[2]; - if (toUserid(oldid) === app!.user.get('userid')) { - app!.user.set({ - away: user.away, - status: user.status, - }); - } - let userid = toUserid(user.name); - room.users[userid] = user; - room.userList.remove(oldid); - room.userList.add(userid); - } + case 'name': case 'n': case 'N': + // User list management is handled by ChatRoom.receiveLine + // Here we just log the message to the battle log if (!this.ignoreSpects) { this.log(args, undefined, preempt); } break; - } case 'player': { let side = this.getSide(args[1]); side.setName(args[2]); diff --git a/play.pokemonshowdown.com/src/panel-battle.tsx b/play.pokemonshowdown.com/src/panel-battle.tsx index e0a7b62385..171b7126b3 100644 --- a/play.pokemonshowdown.com/src/panel-battle.tsx +++ b/play.pokemonshowdown.com/src/panel-battle.tsx @@ -148,6 +148,34 @@ export class BattleRoom extends ChatRoom { choices: BattleChoiceBuilder | null = null; autoTimerActivated: boolean | null = null; + override receiveLine(args: Args) { + switch (args[0]) { + case 'users': + const usernames = args[1].split(','); + const count = parseInt(usernames.shift()!, 10); + this.setUsers(count, usernames); + return; + case 'join': case 'j': case 'J': + this.addUser(args[1]); + break; + case 'leave': case 'l': case 'L': + this.removeUser(args[1]); + break; + case 'name': case 'n': case 'N': + this.renameUser(args[1], args[2]); + break; + case 'noinit': + this.loadReplay(); + return; + } + // Route to battle or backlog + if (this.battle) { + this.update(args); + } else { + (this.backlog ||= []).push(args); + } + } + loadReplay() { const replayid = this.id.slice(7); Net(`https://replay.pokemonshowdown.com/${replayid}.json`).get().catch().then(data => {