{ "version": 3, "sources": ["../../../../server/chat-plugins/announcements.ts"], "sourcesContent": ["/*\r\n * Announcements chat plugin\r\n * By Spandamn\r\n */\r\n\r\nexport interface AnnouncementOptions {\r\n\tactivityNumber?: number;\r\n\tsource: string;\r\n\ttimeoutMins?: number;\r\n\ttimerEnd?: number;\r\n}\r\n\r\nexport interface AnnouncementData extends AnnouncementOptions {\r\n\treadonly activityid: 'announcement';\r\n}\r\n\r\nexport class Announcement extends Rooms.MinorActivity {\r\n\treadonly activityid = 'announcement' as ID;\r\n\tname = 'Announcement';\r\n\tactivityNumber: number;\r\n\tsource: string;\r\n\tconstructor(room: Room, options: AnnouncementOptions) {\r\n\t\tsuper(room);\r\n\t\tthis.activityNumber = options.activityNumber || room.nextGameNumber();\r\n\t\tthis.source = options.source;\r\n\t\tthis.setTimer(options);\r\n\t}\r\n\r\n\tgenerateAnnouncement() {\r\n\t\treturn `

${this.source}

`;\r\n\t}\r\n\r\n\tdisplayTo(user: User, connection: Connection | null = null) {\r\n\t\tconst recipient = connection || user;\r\n\t\trecipient.sendTo(this.room, `|uhtml|announcement${this.activityNumber}|${this.generateAnnouncement()}`);\r\n\t}\r\n\r\n\tdisplay() {\r\n\t\tconst announcement = this.generateAnnouncement();\r\n\t\tfor (const id in this.room.users) {\r\n\t\t\tconst thisUser = this.room.users[id];\r\n\t\t\tthisUser.sendTo(this.room, `|uhtml|announcement${this.activityNumber}|${announcement}`);\r\n\t\t}\r\n\t}\r\n\r\n\tonConnect(user: User, connection: Connection | null = null) {\r\n\t\tthis.displayTo(user, connection);\r\n\t}\r\n\r\n\tdestroy() {\r\n\t\tthis.room.send(`|uhtmlchange|announcement${this.activityNumber}|
(${this.room.tr`The announcement has ended.`})
`);\r\n\t\tthis.room.setMinorActivity(null);\r\n\t}\r\n\r\n\ttoJSON(): AnnouncementData {\r\n\t\treturn {\r\n\t\t\tsource: this.source,\r\n\t\t\tactivityNumber: this.activityNumber,\r\n\t\t\ttimeoutMins: this.timeoutMins,\r\n\t\t\ttimerEnd: this.timerEnd,\r\n\t\t\tactivityid: 'announcement',\r\n\t\t};\r\n\t}\r\n\r\n\tsave() {\r\n\t\tthis.room.settings.minorActivity = this.toJSON();\r\n\t\tthis.room.saveSettings();\r\n\t}\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tannouncement: {\r\n\t\thtmlcreate: 'new',\r\n\t\tcreate: 'new',\r\n\t\tnew(target, room, user, connection, cmd, message) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tif (!target) return this.parse('/help announcement new');\r\n\t\t\ttarget = target.trim();\r\n\t\t\tif (room.battle) return this.errorReply(this.tr`Battles do not support announcements.`);\r\n\r\n\t\t\tconst text = this.filter(target);\r\n\t\t\tif (target !== text) return this.errorReply(this.tr`You are not allowed to use filtered words in announcements.`);\r\n\r\n\t\t\tconst supportHTML = cmd === 'htmlcreate';\r\n\r\n\t\t\tthis.checkCan('minigame', null, room);\r\n\t\t\tif (supportHTML) this.checkCan('declare', null, room);\r\n\t\t\tthis.checkChat();\r\n\t\t\tif (room.minorActivity) {\r\n\t\t\t\treturn this.errorReply(this.tr`There is already a poll or announcement in progress in this room.`);\r\n\t\t\t}\r\n\r\n\t\t\tconst source = supportHTML ? this.checkHTML(Chat.collapseLineBreaksHTML(target)) : Chat.formatText(target, true);\r\n\r\n\t\t\troom.setMinorActivity(new Announcement(room, {source}));\r\n\r\n\t\t\tthis.roomlog(`${user.name} used ${message}`);\r\n\t\t\tthis.modlog('ANNOUNCEMENT');\r\n\t\t\treturn this.privateModAction(room.tr`An announcement was started by ${user.name}.`);\r\n\t\t},\r\n\t\tnewhelp: [`/announcement create [announcement] - Creates an announcement. Requires: % @ # &`],\r\n\r\n\t\ttimer(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tconst announcement = this.requireMinorActivity(Announcement);\r\n\r\n\t\t\tif (target) {\r\n\t\t\t\tthis.checkCan('minigame', null, room);\r\n\t\t\t\tif (target === 'clear') {\r\n\t\t\t\t\tif (!announcement.endTimer()) return this.errorReply(this.tr`There is no timer to clear.`);\r\n\t\t\t\t\treturn this.add(this.tr`The announcement timer was turned off.`);\r\n\t\t\t\t}\r\n\t\t\t\tconst timeoutMins = parseFloat(target);\r\n\t\t\t\tif (isNaN(timeoutMins) || timeoutMins <= 0 || timeoutMins > 7 * 24 * 60) {\r\n\t\t\t\t\treturn this.errorReply(this.tr`Time should be a number of minutes less than one week.`);\r\n\t\t\t\t}\r\n\t\t\t\tannouncement.setTimer({timeoutMins});\r\n\t\t\t\troom.add(`The announcement timer was turned on: the announcement will end in ${timeoutMins} minute${Chat.plural(timeoutMins)}.`);\r\n\t\t\t\tthis.modlog('ANNOUNCEMENT TIMER', null, `${timeoutMins} minutes`);\r\n\t\t\t\treturn this.privateModAction(`The announcement timer was set to ${timeoutMins} minute${Chat.plural(timeoutMins)} by ${user.name}.`);\r\n\t\t\t} else {\r\n\t\t\t\tif (!this.runBroadcast()) return;\r\n\t\t\t\tif (announcement.timeout) {\r\n\t\t\t\t\treturn this.sendReply(`The announcement timer is on and will end in ${announcement.timeoutMins} minute${Chat.plural(announcement.timeoutMins)}.`);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn this.sendReply(this.tr`The announcement timer is off.`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\ttimerhelp: [\r\n\t\t\t`/announcement timer [minutes] - Sets the announcement to automatically end after [minutes] minutes. Requires: % @ # &`,\r\n\t\t\t`/announcement timer clear - Clears the announcement's timer. Requires: % @ # &`,\r\n\t\t],\r\n\r\n\t\tclose: 'end',\r\n\t\tstop: 'end',\r\n\t\tend(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tthis.checkCan('minigame', null, room);\r\n\t\t\tthis.checkChat();\r\n\t\t\tconst announcement = this.requireMinorActivity(Announcement);\r\n\t\t\tannouncement.end(room);\r\n\t\t\tthis.modlog('ANNOUNCEMENT END');\r\n\t\t\tthis.privateModAction(room.tr`The announcement was ended by ${user.name}.`);\r\n\t\t},\r\n\t\tendhelp: [`/announcement end - Ends a announcement and displays the results. Requires: % @ # &`],\r\n\r\n\t\tshow: '',\r\n\t\tdisplay: '',\r\n\t\t''(target, room, user, connection) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tconst announcement = this.requireMinorActivity(Announcement);\r\n\t\t\tif (!this.runBroadcast()) return;\r\n\t\t\troom.update();\r\n\r\n\t\t\tif (this.broadcasting) {\r\n\t\t\t\tannouncement.display();\r\n\t\t\t} else {\r\n\t\t\t\tannouncement.displayTo(user, connection);\r\n\t\t\t}\r\n\t\t},\r\n\t\tdisplayhelp: [`/announcement display - Displays the announcement`],\r\n\t},\r\n\tannouncementhelp: [\r\n\t\t`/announcement allows rooms to run their own announcements. These announcements are limited to one announcement at a time per room.`,\r\n\t\t`Accepts the following commands:`,\r\n\t\t`/announcement create [announcement] - Creates a announcement. Requires: % @ # &`,\r\n\t\t`/announcement htmlcreate [announcement] - Creates a announcement, with HTML allowed. Requires: # &`,\r\n\t\t`/announcement timer [minutes] - Sets the announcement to automatically end after [minutes]. Requires: % @ # &`,\r\n\t\t`/announcement display - Displays the announcement`,\r\n\t\t`/announcement end - Ends a announcement. Requires: % @ # &`,\r\n\t],\r\n};\r\n\r\nprocess.nextTick(() => {\r\n\tChat.multiLinePattern.register('/announcement (new|create|htmlcreate) ');\r\n});\r\n\r\n// should handle restarts and also hotpatches\r\nfor (const room of Rooms.rooms.values()) {\r\n\tif (room.settings.minorActivity?.activityid === 'announcement') {\r\n\t\troom.setMinorActivity(new Announcement(room, room.settings.minorActivity), true);\r\n\t}\r\n}\r\n"], "mappings": "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", "names": [] }