@@ -21,7 +21,9 @@ import {
2121 channelNames ,
2222 dormantChannelTimeout ,
2323 dormantChannelLoop ,
24+ askHelpChannelId ,
2425} from '../env' ;
26+ import { isTrustedMember } from '../util/inhibitors' ;
2527
2628export class HelpChanModule extends Module {
2729 constructor ( client : CookiecordClient ) {
@@ -103,13 +105,8 @@ export class HelpChanModule extends Module {
103105
104106 this . busyChannels . add ( msg . channel . id ) ;
105107
106- const helpUser = new HelpUser ( ) ;
107- helpUser . userId = msg . author . id ;
108- helpUser . channelId = msg . channel . id ;
109- await helpUser . save ( ) ;
110-
111108 await msg . pin ( ) ;
112- await msg . member . roles . add ( askCooldownRoleId ) ;
109+ await this . addCooldown ( msg . member , msg . channel ) ;
113110 await this . moveChannel ( msg . channel , categories . ongoing ) ;
114111
115112 await this . ensureAskChannels ( msg . guild ) ;
@@ -149,7 +146,7 @@ export class HelpChanModule extends Module {
149146 }
150147
151148 const owner = await HelpUser . findOne ( {
152- where : { channelId : msg . channel . id } ,
149+ channelId : msg . channel . id ,
153150 } ) ;
154151
155152 if (
@@ -219,7 +216,7 @@ export class HelpChanModule extends Module {
219216 await Promise . all ( pinned . map ( msg => msg . unpin ( ) ) ) ;
220217
221218 const helpUser = await HelpUser . findOne ( {
222- where : { channelId : channel . id } ,
219+ channelId : channel . id ,
223220 } ) ;
224221 if ( helpUser ) {
225222 const member = await channel . guild . members . fetch ( {
@@ -255,12 +252,19 @@ export class HelpChanModule extends Module {
255252 }
256253 }
257254
258- @command ( )
259- async cooldown ( msg : Message , @optional user ?: GuildMember ) {
260- console . log ( 'Cooldown' , msg . content ) ;
261- if ( ! msg . guild ) return ;
255+ private async addCooldown ( member : GuildMember , channel : TextChannel ) {
256+ await member . roles . add ( askCooldownRoleId ) ;
257+ const helpUser = new HelpUser ( ) ;
258+ helpUser . userId = member . user . id ;
259+ helpUser . channelId = channel . id ;
260+ await helpUser . save ( ) ;
261+ }
262262
263- const guildTarget = await msg . guild . members . fetch ( user ?? msg . author ) ;
263+ @command ( { inhibitors : [ CommonInhibitors . guildsOnly ] } )
264+ async cooldown ( msg : Message , @optional member ?: GuildMember ) {
265+ const guildTarget = await msg . guild ! . members . fetch (
266+ member ?? msg . author ,
267+ ) ;
264268
265269 if ( ! guildTarget ) return ;
266270
@@ -272,19 +276,13 @@ export class HelpChanModule extends Module {
272276 }
273277
274278 const helpUser = await HelpUser . findOne ( {
275- where : { userId : guildTarget . id } ,
279+ userId : guildTarget . id ,
276280 } ) ;
277281
278282 if ( helpUser ) {
279- const channel = msg . guild . channels . resolve ( helpUser . channelId ) ;
280- // If we don't have a channel, just remove the cooldown. This should
281- // only happen if someone deletes a help channel.
282- if ( channel ) {
283- await msg . channel . send (
284- `${ guildTarget . displayName } has an active help channel: ${ channel . name } ` ,
285- ) ;
286- return ;
287- }
283+ return msg . channel . send (
284+ `${ guildTarget . displayName } has an active help channel: <#${ helpUser . channelId } >` ,
285+ ) ;
288286 }
289287
290288 await guildTarget . roles . remove ( askCooldownRoleId ) ;
@@ -293,6 +291,63 @@ export class HelpChanModule extends Module {
293291 ) ;
294292 }
295293
294+ @command ( { inhibitors : [ isTrustedMember ] } )
295+ async claim ( msg : Message , member : GuildMember ) {
296+ const helpUser = await HelpUser . findOne ( {
297+ userId : member . id ,
298+ } ) ;
299+ if ( helpUser ) {
300+ return msg . channel . send (
301+ `${ member . displayName } already has an open help channel: <#${ helpUser . channelId } >` ,
302+ ) ;
303+ }
304+
305+ const channelMessages = await msg . channel . messages . fetch ( { limit : 50 } ) ;
306+ const questionMessages = channelMessages . filter (
307+ questionMsg =>
308+ questionMsg . author . id === member . id &&
309+ questionMsg . id !== msg . id ,
310+ ) ;
311+
312+ const msgContent = questionMessages
313+ . array ( )
314+ . slice ( 0 , 10 )
315+ . map ( msg => msg . content )
316+ . reverse ( )
317+ . join ( '\n' )
318+ . slice ( 0 , 2000 ) ;
319+
320+ const claimedChannel = msg . guild ! . channels . cache . find (
321+ channel =>
322+ channel . type === 'text' &&
323+ channel . parentID == categories . ask &&
324+ channel . name . startsWith ( this . CHANNEL_PREFIX ) &&
325+ ! this . busyChannels . has ( channel . id ) ,
326+ ) as TextChannel | undefined ;
327+
328+ if ( ! claimedChannel ) {
329+ return msg . channel . send (
330+ ':warning: failed to claim a help channel, no available channel.' ,
331+ ) ;
332+ }
333+
334+ this . busyChannels . add ( claimedChannel . id ) ;
335+ const toPin = await claimedChannel . send (
336+ new MessageEmbed ( )
337+ . setAuthor ( member . displayName , member . user . displayAvatarURL ( ) )
338+ . setDescription ( msgContent ) ,
339+ ) ;
340+ await toPin . pin ( ) ;
341+ await this . addCooldown ( member , claimedChannel ) ;
342+ await this . moveChannel ( claimedChannel , categories . ongoing ) ;
343+ await claimedChannel . send (
344+ `${ member . user } this channel has been claimed for your question. Please review <#${ askHelpChannelId } > for how to get help.` ,
345+ ) ;
346+ await this . ensureAskChannels ( msg . guild ! ) ;
347+
348+ this . busyChannels . delete ( claimedChannel . id ) ;
349+ }
350+
296351 // Commands to fix race conditions
297352 @command ( {
298353 inhibitors : [ CommonInhibitors . hasGuildPermission ( 'MANAGE_MESSAGES' ) ] ,
0 commit comments