44 ActionRowBuilder ,
55 ApplicationCommandOptionType ,
66 ApplicationCommandType ,
7+ ApplicationIntegrationType ,
78 AutocompleteInteraction ,
89 ButtonBuilder ,
910 ButtonStyle ,
@@ -12,6 +13,7 @@ import {
1213 ComponentType ,
1314 EmbedBuilder ,
1415 GuildMember ,
16+ InteractionContextType ,
1517 MessageFlags ,
1618 type ApplicationCommandOptionData ,
1719 type CacheType ,
@@ -31,6 +33,8 @@ import search from "./utils/youtube/search";
3133import {
3234 checkIfGuildIsTrackingUserAlready ,
3335 discordAddGuildTrackingUser ,
36+ discordAddNewGuild ,
37+ discordCheckIfDmChannelExists ,
3438 discordGetAllTrackedInGuild ,
3539 discordRemoveGuildTrackingChannel ,
3640} from "./db/discord" ;
@@ -54,8 +58,8 @@ interface Command {
5458 name : string ;
5559 description : string ;
5660 options ?: ApplicationCommandOptionData [ ] ;
57- integration_types ?: number [ ] ;
58- contexts ?: number [ ] ;
61+ integration_types ?: ApplicationIntegrationType [ ] ;
62+ contexts ?: InteractionContextType [ ] ;
5963 type ?: ApplicationCommandType ;
6064 } ;
6165 execute : ( interaction : ChatInputCommandInteraction ) => Promise < void > ;
@@ -64,6 +68,8 @@ interface Command {
6468 ) => Promise < any > ;
6569}
6670
71+ // Context 2: Interaction can be used within Group DMs and DMs other than the app's bot user
72+ // /track, /tracked and /untracked can't be used in these contexts
6773const commands : Record < string , Command > = {
6874 ping : {
6975 data : {
@@ -76,7 +82,7 @@ const commands: Record<string, Command> = {
7682 execute : async ( interaction : CommandInteraction ) => {
7783 await interaction
7884 . reply ( {
79- ephemeral : false ,
85+ flags : MessageFlags . Ephemeral ,
8086 content : `Ping: ${ interaction . client . ws . ping } ms` ,
8187 } )
8288 . catch ( console . error ) ;
@@ -134,7 +140,7 @@ const commands: Record<string, Command> = {
134140 execute : async ( interaction : CommandInteraction ) => {
135141 await interaction
136142 . reply ( {
137- ephemeral : false ,
143+ flags : MessageFlags . Ephemeral ,
138144 content : `Uptime: ${ (
139145 performance . now ( ) /
140146 ( 86400 * 1000 )
@@ -149,7 +155,7 @@ const commands: Record<string, Command> = {
149155 name : "hmm" ,
150156 description : "What does this command do?" ,
151157 integration_types : [ 0 , 1 ] ,
152- contexts : [ 0 , 1 ] ,
158+ contexts : [ 0 , 1 , 2 ] ,
153159 } ,
154160 execute : async ( interaction : CommandInteraction ) => {
155161 await interaction . reply ( {
@@ -173,7 +179,7 @@ const commands: Record<string, Command> = {
173179 Bun . gc ( false ) ;
174180 await interaction
175181 . reply ( {
176- ephemeral : false ,
182+ flags : MessageFlags . Ephemeral ,
177183 content : [
178184 `Heap size: ${ ( heap . heapSize / 1024 / 1024 ) . toFixed ( 2 ) } MB / ${ (
179185 heap . heapCapacity /
@@ -266,9 +272,11 @@ const commands: Record<string, Command> = {
266272 description :
267273 "Track a channel to get notified when they upload a video!" ,
268274 integration_types : [ 0 , 1 ] ,
269- contexts : [ 0 , 1 , 2 ] ,
275+ contexts : [ 0 , 1 ] ,
270276 } ,
271277 execute : async ( interaction : CommandInteraction ) => {
278+ const isDm = ! interaction . inGuild ( ) ;
279+
272280 // Get the YouTube Channel ID
273281 const targetPlatform = (
274282 interaction as ChatInputCommandInteraction
@@ -280,7 +288,7 @@ const commands: Record<string, Command> = {
280288 const discordChannelId =
281289 ( interaction . options . get ( "updates_channel" ) ?. value as string ) ??
282290 interaction . channelId ;
283- const guildId = interaction . guildId ;
291+ const guildId = isDm ? discordChannelId : interaction . guildId ;
284292
285293 // Log the autocomplete value
286294 console . log ( `Autocomplete value: ${ platformUserId } ` ) ;
@@ -312,33 +320,26 @@ const commands: Record<string, Command> = {
312320 return ;
313321 }
314322
315- // TODO: Enable DMs :)
316- const isDm = interaction . channel ?. isDMBased ( ) ;
317-
318- if ( ! guildId || isDm || isDm === undefined ) {
319- await interaction . reply ( {
320- flags : MessageFlags . Ephemeral ,
321- content :
322- "This command is not supported in DMs currently!\nNot a DM? Then the bot failed to get the guild info" ,
323- } ) ;
323+ console . log ( interaction . channelId ) ;
324324
325- return ;
326- }
325+ if ( isDm ) console . log ( "DM" ) ;
327326
328327 // TODO: Embed
329328 // Check the permissions of the user
330- if (
331- ! interaction . memberPermissions ?. has (
332- PermissionFlagsBits . ManageChannels ,
333- )
334- ) {
335- await interaction . reply ( {
336- flags : MessageFlags . Ephemeral ,
337- content :
338- "You do not have the permission to manage channels!" ,
339- } ) ;
329+ if ( ! isDm ) {
330+ if (
331+ ! interaction . memberPermissions ?. has (
332+ PermissionFlagsBits . ManageChannels ,
333+ )
334+ ) {
335+ await interaction . reply ( {
336+ flags : MessageFlags . Ephemeral ,
337+ content :
338+ "You do not have the permission to manage channels!" ,
339+ } ) ;
340340
341- return ;
341+ return ;
342+ }
342343 }
343344
344345 // TODO: Embed
@@ -393,6 +394,8 @@ const commands: Record<string, Command> = {
393394
394395 return ;
395396 }
397+ } else if ( isDm ) {
398+ // DM channels don't need permission checks
396399 } else {
397400 await interaction . reply ( {
398401 flags : MessageFlags . Ephemeral ,
@@ -402,6 +405,17 @@ const commands: Record<string, Command> = {
402405 return ;
403406 }
404407
408+ // Before attempting to add the subscription, if it's a DM, check if it's already in the database. If not add it
409+ if ( isDm ) {
410+ const data = (
411+ await discordCheckIfDmChannelExists ( discordChannelId )
412+ ) . data ;
413+
414+ if ( ! data . length ) {
415+ await discordAddNewGuild ( discordChannelId , true ) ;
416+ }
417+ }
418+
405419 switch ( targetPlatform ) {
406420 case "youtube" : {
407421 const contentType = interaction . options . get ( "content_type" )
@@ -567,7 +581,7 @@ const commands: Record<string, Command> = {
567581
568582 await interaction . reply ( {
569583 flags : MessageFlags . Ephemeral ,
570- content : `Started tracking the channel ${ youtubeChannelInfo ?. channelName ?? platformUserId } in ${ targetChannel . name } !` ,
584+ content : `Started tracking the channel ${ youtubeChannelInfo ?. channelName ?? platformUserId } in <# ${ targetChannel ?. id } > !` ,
571585 } ) ;
572586 } else {
573587 await interaction . reply ( {
@@ -694,7 +708,7 @@ const commands: Record<string, Command> = {
694708 ) {
695709 await interaction . reply ( {
696710 flags : MessageFlags . Ephemeral ,
697- content : `Started tracking the streamer ${ platformUserId } (${ platformUserId } ) in ${ targetChannel . name } !` ,
711+ content : `Started tracking the streamer ${ platformUserId } (${ platformUserId } ) in <# ${ targetChannel ?. id } > !` ,
698712 } ) ;
699713 } else {
700714 await interaction . reply ( {
@@ -815,24 +829,15 @@ const commands: Record<string, Command> = {
815829 contexts : [ 0 , 1 ] ,
816830 } ,
817831 execute : async ( interaction : CommandInteraction ) => {
832+ const isDm = ! interaction . inGuild ( ) ;
833+
818834 // Get the YouTube Channel ID
819835 const platformUserId = interaction . options . get ( "user_id" )
820836 ?. value as string ;
821- const guildId = interaction . guildId ;
822-
823- // DMs are currently not supported, so throw back an error
824- if ( ! guildId || interaction . channel ?. isDMBased ( ) ) {
825- await interaction . reply ( {
826- flags : MessageFlags . Ephemeral ,
827- content :
828- "This command is not supported in DMs currently!\nNot a DM? Then an error has occurred :(" ,
829- } ) ;
830-
831- return ;
832- }
833837
834838 // Check the permissions of the user
835839 if (
840+ ! isDm &&
836841 ! interaction . memberPermissions ?. has (
837842 PermissionFlagsBits . ManageChannels ,
838843 )
@@ -865,7 +870,7 @@ const commands: Record<string, Command> = {
865870 } ,
866871 autoComplete : async ( interaction : AutocompleteInteraction ) => {
867872 const trackedChannels = await discordGetAllTrackedInGuild (
868- interaction . guildId as string ,
873+ interaction . guildId ?? ( interaction . channelId as string ) ,
869874 ) ;
870875
871876 console . dir (
@@ -912,14 +917,16 @@ const commands: Record<string, Command> = {
912917 contexts : [ 0 , 1 ] ,
913918 } ,
914919 execute : async ( interaction : CommandInteraction ) => {
915- const guildId = interaction . guildId ;
916- const channelId = interaction . channelId ;
920+ let guildId = interaction . guildId ;
917921
918- if ( ! guildId || ! channelId ) {
922+ const isDm = ! interaction . inGuild ( ) ;
923+
924+ if ( isDm ) guildId = interaction . channelId ;
925+
926+ if ( ! guildId ) {
919927 await interaction . reply ( {
920928 flags : MessageFlags . Ephemeral ,
921- content :
922- "You are likely in a DM, this command is not supported in DMs!" ,
929+ content : "An error occurred! Please report" ,
923930 } ) ;
924931
925932 return ;
0 commit comments