@@ -13,7 +13,7 @@ function debug(args: any | []) {
13
13
}
14
14
15
15
type QueueItem = { userId : string ; timestamp : number } ;
16
- const messageQueueChannelMap = new Map < string , QueueItem [ ] > ( [ ] ) ;
16
+ const message_queue_channel_map = new Map < string , QueueItem [ ] > ( [ ] ) ;
17
17
18
18
const ONE_MINUTE = 60_000 ;
19
19
const FIVE_MINUTES = 300_000 ;
@@ -90,7 +90,15 @@ type SlowModeActivation = {
90
90
expiry : number ;
91
91
} ;
92
92
93
- let currentSlowMode : SlowModeActivation | undefined ;
93
+ /** Track slow mode state per channel */
94
+ const slow_mode_state_channel_map = new Map < string , SlowModeActivation > ( ) ;
95
+
96
+ /** Look up rate limit per user based on level. */
97
+ function level_to_rate_limit ( level : BusyLevels | - 1 ) : number {
98
+ return (
99
+ levelConfigs . find ( ( el ) => el . level === level ) ?. rateLimitPerUser ?? - 1
100
+ ) ;
101
+ }
94
102
95
103
export default async function slow_mode ( message : Message ) : Promise < void > {
96
104
if (
@@ -105,44 +113,56 @@ export default async function slow_mode(message: Message): Promise<void> {
105
113
const now = Date . now ( ) ;
106
114
const { channelId } = message ;
107
115
108
- if ( ! Array . isArray ( messageQueueChannelMap . get ( channelId ) ) ) {
116
+ if ( ! Array . isArray ( message_queue_channel_map . get ( channelId ) ) ) {
109
117
// instantiate array, mapped against channel id
110
- messageQueueChannelMap . set ( channelId , [ ] ) ;
118
+ message_queue_channel_map . set ( channelId , [ ] ) ;
111
119
}
112
120
113
- const channelMessageQueue = messageQueueChannelMap . get ( channelId ) ! ;
121
+ const channel_message_queue = message_queue_channel_map . get ( channelId ) ! ;
114
122
debug ( [
115
123
'queue on message' ,
116
124
{
117
- channelMessageQueue,
118
- messageQueueChannelMap,
125
+ channelMessageQueue : channel_message_queue ,
126
+ messageQueueChannelMap : message_queue_channel_map ,
119
127
} ,
120
128
] ) ;
121
129
122
- channelMessageQueue . push ( { userId : message . author . id , timestamp : now } ) ;
130
+ channel_message_queue . push ( { userId : message . author . id , timestamp : now } ) ;
123
131
124
132
// Remove old messages from queue
125
- while ( channelMessageQueue [ 0 ] . timestamp < now - QUEUE_TIME_RANGE ) {
126
- channelMessageQueue . shift ( ) ;
133
+ while ( channel_message_queue [ 0 ] . timestamp < now - QUEUE_TIME_RANGE ) {
134
+ channel_message_queue . shift ( ) ;
127
135
}
128
136
129
- debug ( [ 'queue on purge' , channelMessageQueue ] ) ;
137
+ debug ( [ 'queue on purge' , channel_message_queue ] ) ;
130
138
const { level : newLevel , messagesUntilNextLevel } = checkBusyLevel (
131
139
now ,
132
- channelMessageQueue ,
140
+ channel_message_queue ,
133
141
) ;
134
142
143
+ // Secret joke
144
+ // TODO: refactor into its own hook
145
+ if ( message . content . includes ( 'the bot is here' ) ) {
146
+ await message . react ( '👀' ) ;
147
+ }
148
+
135
149
// Return early if:
136
150
//
137
151
// - new level is equal to current level
138
152
// OR
139
153
// - new level is lower or equal to the current level AND current rate limit
140
154
// hasn't expired
155
+ // BUT ALSO
156
+ // - channel has slow mode already activated
157
+ const currentSlowMode = slow_mode_state_channel_map . get ( channelId ) ;
141
158
const currentModeExpired = now > ( currentSlowMode ?. expiry ?? 0 ) ;
142
159
const currentLevel = currentSlowMode ?. level ?? - 1 ;
160
+ const hasStateMismatch =
161
+ level_to_rate_limit ( currentLevel ) !== message . channel . rateLimitPerUser ;
143
162
if (
144
- newLevel === currentLevel ||
145
- ( newLevel <= currentLevel && ! currentModeExpired )
163
+ ! hasStateMismatch &&
164
+ ( newLevel === currentLevel ||
165
+ ( newLevel <= currentLevel && ! currentModeExpired ) )
146
166
) {
147
167
debug ( [
148
168
'early return due to new level not exceeding current, or current rate limit has not expired' ,
@@ -190,11 +210,11 @@ export default async function slow_mode(message: Message): Promise<void> {
190
210
await message . channel . send ( targetConfig . channelMessage ) ;
191
211
192
212
const setTime = Date . now ( ) ;
193
- currentSlowMode = {
213
+ slow_mode_state_channel_map . set ( channelId , {
194
214
level : targetConfig . level ,
195
215
timestamp : setTime ,
196
216
expiry : setTime + targetConfig . timeout ,
197
- } ;
217
+ } ) ;
198
218
}
199
219
200
220
/** Get number of unique users in message queue */
0 commit comments