{ "version": 3, "sources": ["../../../server/room-minor-activity.ts"], "sourcesContent": ["/**\r\n * Minor activities\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * Minor activities are representations of non-game activities that rooms\r\n * regularly use, such as polls and announcements. Rooms are limited to\r\n * one minor activity at a time.\r\n *\r\n * Minor activities keep track of users in the form of userids and IPs.\r\n * If a player votes for a poll under one IP, they cannot vote for the same\r\n * poll again.\r\n *\r\n * The user-tracking system is not implemented at the base level: Announcements\r\n * do not have a reason to keep track of users' IPs/IDs because they're just used\r\n * to broadcast a message to a room.\r\n *\r\n * @license MIT\r\n */\r\n\r\nexport interface MinorActivityData {\r\n\treadonly activityid: 'announcement' | 'poll';\r\n\tactivityNumber?: number;\r\n\tsource?: string;\r\n\ttimeoutMins?: number;\r\n\ttimerEnd?: number;\r\n\tquestion: string;\r\n\tsupportHTML: boolean;\r\n\tmultiPoll: boolean;\r\n\tpendingVotes?: {[userid: string]: number[]};\r\n\tvoters?: {[k: string]: number[]};\r\n\tvoterIps?: {[k: string]: number[]};\r\n\ttotalVotes?: number;\r\n\tisQuiz?: boolean;\r\n\tanswers: string[] | {name: string, votes: number, correct?: boolean}[];\r\n}\r\n\r\n// globally Rooms.MinorActivity\r\nexport abstract class MinorActivity {\r\n\tabstract activityid: ID;\r\n\tabstract name: string;\r\n\r\n\ttimeout: NodeJS.Timer | null;\r\n\ttimeoutMins: number;\r\n\ttimerEnd: number;\r\n\troomid: RoomID;\r\n\troom: Room;\r\n\tsupportHTML: boolean;\r\n\tconstructor(room: Room) {\r\n\t\tthis.timeout = null;\r\n\t\tthis.timeoutMins = 0;\r\n\t\tthis.timerEnd = 0;\r\n\t\tthis.roomid = room.roomid;\r\n\t\tthis.room = room;\r\n\t\tthis.supportHTML = false;\r\n\t}\r\n\r\n\tsetTimer(options: {timeoutMins?: number, timerEnd?: number}) {\r\n\t\tif (this.timeout) clearTimeout(this.timeout);\r\n\r\n\t\tthis.timeoutMins = options.timeoutMins || 0;\r\n\t\tif (!this.timeoutMins) {\r\n\t\t\tthis.timerEnd = 0;\r\n\t\t\tthis.timeout = null;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst now = Date.now();\r\n\t\tthis.timerEnd = options.timerEnd || now + this.timeoutMins * 60000;\r\n\t\tthis.timeout = setTimeout(() => {\r\n\t\t\tconst room = this.room;\r\n\t\t\tif (!room) return; // someone forgot to `.destroy()`\r\n\r\n\t\t\tthis.end(room);\r\n\t\t}, this.timerEnd - now);\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tend(room: Room, MinorActivityClass?: new (...args: any[]) => any) {\r\n\t\troom.minorActivity?.destroy();\r\n\t\tif (room.minorActivityQueue?.length) {\r\n\t\t\tconst pollData = room.minorActivityQueue.shift()!;\r\n\t\t\tif (!room.minorActivityQueue.length) room.clearMinorActivityQueue();\r\n\t\t\tif (!room.settings.minorActivityQueue?.length) {\r\n\t\t\t\tdelete room.settings.minorActivityQueue;\r\n\t\t\t\troom.saveSettings();\r\n\t\t\t}\r\n\r\n\t\t\tif (pollData.activityid !== 'poll') throw new Error(`Unexpected Minor Activity (${pollData.activityid}) in queue`);\r\n\r\n\t\t\troom.add(`|c|&|/log ${room.tr`The queued poll was started.`}`).update();\r\n\t\t\troom.modlog({\r\n\t\t\t\taction: 'POLL',\r\n\t\t\t\tnote: '(queued)',\r\n\t\t\t});\r\n\r\n\t\t\tif (!MinorActivityClass) {\r\n\t\t\t\tif (pollData.activityid === 'poll') {\r\n\t\t\t\t\tconst {Poll} = require('./chat-plugins/poll');\r\n\t\t\t\t\troom.setMinorActivity(new Poll(room, pollData));\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\troom.setMinorActivity(new MinorActivityClass(room, pollData));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tendTimer() {\r\n\t\tif (!this.timeout) return false;\r\n\t\tclearTimeout(this.timeout);\r\n\t\tthis.timeoutMins = 0;\r\n\t\tthis.timerEnd = 0;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tabstract destroy(): void;\r\n\tabstract display(): void;\r\n\tonConnect?(user: User, connection: Connection | null): void;\r\n\tonRename?(user: User, oldid: ID, joining: boolean): void;\r\n\tabstract toJSON(): AnyObject;\r\n\tabstract save(): void;\r\n}\r\n"], "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCO,MAAe,cAAc;AAAA,EAUnC,YAAY,MAAY;AACvB,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,KAAK;AACnB,SAAK,OAAO;AACZ,SAAK,cAAc;AAAA,EACpB;AAAA,EAEA,SAAS,SAAoD;AAC5D,QAAI,KAAK;AAAS,mBAAa,KAAK,OAAO;AAE3C,SAAK,cAAc,QAAQ,eAAe;AAC1C,QAAI,CAAC,KAAK,aAAa;AACtB,WAAK,WAAW;AAChB,WAAK,UAAU;AACf;AAAA,IACD;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,WAAW,QAAQ,YAAY,MAAM,KAAK,cAAc;AAC7D,SAAK,UAAU,WAAW,MAAM;AAC/B,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC;AAAM;AAEX,WAAK,IAAI,IAAI;AAAA,IACd,GAAG,KAAK,WAAW,GAAG;AACtB,SAAK,KAAK;AAAA,EACX;AAAA,EAEA,IAAI,MAAY,oBAAkD;AACjE,SAAK,eAAe,QAAQ;AAC5B,QAAI,KAAK,oBAAoB,QAAQ;AACpC,YAAM,WAAW,KAAK,mBAAmB,MAAM;AAC/C,UAAI,CAAC,KAAK,mBAAmB;AAAQ,aAAK,wBAAwB;AAClE,UAAI,CAAC,KAAK,SAAS,oBAAoB,QAAQ;AAC9C,eAAO,KAAK,SAAS;AACrB,aAAK,aAAa;AAAA,MACnB;AAEA,UAAI,SAAS,eAAe;AAAQ,cAAM,IAAI,MAAM,8BAA8B,SAAS,sBAAsB;AAEjH,WAAK,IAAI,aAAa,KAAK,kCAAkC,EAAE,OAAO;AACtE,WAAK,OAAO;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,MACP,CAAC;AAED,UAAI,CAAC,oBAAoB;AACxB,YAAI,SAAS,eAAe,QAAQ;AACnC,gBAAM,EAAC,KAAI,IAAI,QAAQ,qBAAqB;AAC5C,eAAK,iBAAiB,IAAI,KAAK,MAAM,QAAQ,CAAC;AAAA,QAC/C;AAAA,MACD,OAAO;AACN,aAAK,iBAAiB,IAAI,mBAAmB,MAAM,QAAQ,CAAC;AAAA,MAC7D;AAAA,IACD;AAAA,EACD;AAAA,EAEA,WAAW;AACV,QAAI,CAAC,KAAK;AAAS,aAAO;AAC1B,iBAAa,KAAK,OAAO;AACzB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,WAAO;AAAA,EACR;AAQD;", "names": [] }