/** * Main menu panel * * @author Guangcong Luo * @license AGPLv3 */ class MainMenuRoom extends PSRoom { readonly classType: string = 'mainmenu'; userdetailsCache: {[userid: string]: { userid: ID, avatar?: string | number, group?: string, rooms?: {[roomid: string]: {isPrivate?: true, p1?: string, p2?: string}}, }} = {}; receive(line: string) { const tokens = PS.lineParse(line); switch (tokens[0]) { case 'challstr': PSLoginServer.query({ act: 'upkeep', challstr: tokens[1], }, res => { if (!res) return; if (!res.loggedin) return; this.send(`/trn ${res.username},0,${res.assertion}`); }); return; case 'updateuser': PS.user.setName(tokens[1], tokens[2] === '1', tokens[3]); return; case 'queryresponse': this.handleQueryResponse(tokens[1] as ID, JSON.parse(tokens[2])); return; } const lobby = PS.rooms['lobby']; if (lobby) lobby.receive(line); } handleQueryResponse(id: ID, response: any) { switch (id) { case 'userdetails': let userid = response.userid; let userdetails = this.userdetailsCache[userid]; if (!userdetails) { this.userdetailsCache[userid] = response; } else { Object.assign(userdetails, response); } const room = PS.rooms[`user-${userid}`] as UserRoom; if (room) room.update(''); break; } } } class MainMenuPanel extends PSRoomPanel { focus() { (this.base!.querySelector('button.big') as HTMLButtonElement).focus(); } render() { const searchButton = (PS.down ? : ); const onlineButton = ' button' + (PS.connected ? '' : ' disabled'); return ; } } PS.roomTypes['mainmenu'] = { Model: MainMenuRoom, Component: MainMenuPanel, };