2022-03-03 20:56:49 +07:00
import { Guild , Client , GuildMember , Intents , Interaction , Message , TextChannel } from "discord.js" ;
import { Guild as GuildPrisma } from ".prisma/client" ;
2021-09-14 09:56:11 -07:00
import Logger from "../libs/Logger" ;
import Environment from "./Environment" ;
2021-09-15 04:10:50 -07:00
import Discord_Core from "../discord/Core" ;
2021-09-18 11:15:22 -07:00
import Discord_Settings from "../discord/Settings" ;
2021-09-15 04:10:50 -07:00
import Discord_Ping from "../discord/Ping" ;
import Discord_Help from "../discord/Help" ;
import Discord_Invite from "../discord/Invite" ;
import Discord_Say from "../discord/Say" ;
2021-09-18 06:28:41 -07:00
import Discord_InteractionManager from "../discord/InteractionManager" ;
2021-09-15 04:10:50 -07:00
import Discord_MembershipScreening from "../discord/MembershipScreening" ;
2021-09-19 08:40:09 -07:00
import Discord_osu from "../discord/osu" ;
2021-09-20 12:37:52 -07:00
import Discord_UserInfo from "../discord/UserInfo" ;
2022-02-05 00:46:35 +07:00
import Discord_Stats from "../discord/Stats" ;
2022-01-30 20:10:17 +07:00
import Discord_MusicPlayer_Play from "../discord/MusicPlayer/Play" ;
import Discord_MusicPlayer_Skip from "../discord/MusicPlayer/Skip" ;
import Discord_MusicPlayer_Join from "../discord/MusicPlayer/Join" ;
import Discord_MusicPlayer_Leave from "../discord/MusicPlayer/Leave" ;
import Discord_MusicPlayer_Queue from "../discord/MusicPlayer/Queue" ;
import Discord_MusicPlayer_Search from "../discord/MusicPlayer/Search" ;
2022-03-03 20:56:49 +07:00
import Discord_MusicPlayer_NowPlaying from "../discord/MusicPlayer/NowPlaying" ;
2022-03-03 23:57:30 +07:00
import Discord_MusicPlayer_Loop from "../discord/MusicPlayer/Loop" ;
2022-06-06 02:18:41 +07:00
import Discord_MusicPlayer_Pause from "../discord/MusicPlayer/Pause" ;
import Discord_MusicPlayer_Resume from "../discord/MusicPlayer/Resume" ;
2022-01-30 20:10:17 +07:00
2022-02-27 17:15:05 +07:00
import Discord_Developer_ServiceAnnouncement from "../discord/developer/ServiceAnnouncement" ;
2022-03-03 22:18:34 +07:00
import Discord_Developer_Debug from "../discord/developer/Debug" ;
2021-09-19 08:40:09 -07:00
2021-09-14 09:56:11 -07:00
import Cache from "./Cache" ;
2022-03-03 20:56:49 +07:00
import DiscordModule from "../utils/DiscordModule" ;
import { Map } from "typescript" ;
2021-09-14 09:56:11 -07:00
class Discord {
public client : Client ;
2022-03-03 20:56:49 +07:00
private loaded_module = new Map < string , DiscordModule >();
2021-09-14 09:56:11 -07:00
constructor () {
this . client = new Client ({
2022-01-30 20:10:17 +07:00
//partials: ['MESSAGE', 'CHANNEL', 'REACTION'],
intents : [ Intents . FLAGS . GUILDS , Intents . FLAGS . GUILD_MESSAGES , Intents . FLAGS . GUILD_MEMBERS , Intents . FLAGS . GUILD_PRESENCES , Intents . FLAGS . GUILD_VOICE_STATES ]
2021-09-14 09:56:11 -07:00
});
}
public init () : void {
2022-03-03 20:56:49 +07:00
2021-09-14 09:56:11 -07:00
Logger . info ( 'Logging in to discord' );
this . client . login ( Environment . get (). DISCORD_TOKEN );
2022-03-03 20:56:49 +07:00
const modules : DiscordModule [] = [
new Discord_Core (),
new Discord_Help (),
new Discord_Invite (),
new Discord_Ping (),
new Discord_Stats (),
new Discord_UserInfo (),
new Discord_Say (),
new Discord_InteractionManager (),
new Discord_osu (),
new Discord_Settings (),
2021-09-15 04:10:50 -07:00
2022-03-03 20:56:49 +07:00
new Discord_MusicPlayer_Play (),
new Discord_MusicPlayer_NowPlaying (),
new Discord_MusicPlayer_Skip (),
new Discord_MusicPlayer_Join (),
new Discord_MusicPlayer_Leave (),
new Discord_MusicPlayer_Queue (),
new Discord_MusicPlayer_Search (),
2022-03-03 23:57:30 +07:00
new Discord_MusicPlayer_Loop (),
2022-06-06 02:18:41 +07:00
new Discord_MusicPlayer_Pause (),
new Discord_MusicPlayer_Resume (),
2021-09-19 08:40:09 -07:00
2022-03-03 20:56:49 +07:00
new Discord_MembershipScreening (),
2022-01-30 20:10:17 +07:00
2022-03-03 20:56:49 +07:00
new Discord_Developer_ServiceAnnouncement (),
2022-03-03 22:18:34 +07:00
new Discord_Developer_Debug ()
2022-03-03 20:56:49 +07:00
];
2021-09-14 09:56:11 -07:00
2022-03-03 20:56:49 +07:00
for ( const _module of modules ) {
if ( _module . id ) {
if ( this . loaded_module . has ( _module . id ))
Logger . error ( `Module ${ _module . constructor . name } is trying to assign a conflicting module id ${ _module . id } . ${ this . loaded_module . get ( _module . id ) ! . constructor . name } is already assigned to this id.` );
else
this . loaded_module . set ( _module . id , _module );
}
else
Logger . error ( `Invalid module ${ _module . constructor . name } . The module does not have an id.` );
}
2022-01-27 17:59:59 +07:00
2022-03-03 20:56:49 +07:00
Logger . info ( `Loaded ${ this . loaded_module . size } Discord Modules` );
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
thisModule . Init ();
2021-09-14 09:56:11 -07:00
}
2021-09-18 05:19:53 -07:00
// On bot logged in
2021-09-14 09:56:11 -07:00
this . client . on ( "ready" , () => {
2022-03-03 20:56:49 +07:00
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
thisModule . Ready ();
2021-09-14 09:56:11 -07:00
}
});
2021-09-18 05:19:53 -07:00
// Member join guild event to modules
2021-09-15 04:10:50 -07:00
this . client . on ( "guildMemberAdd" , ( member : GuildMember ) => {
2022-03-03 20:56:49 +07:00
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
thisModule . GuildMemberAdd ( member );
2021-09-15 04:10:50 -07:00
}
});
2021-09-18 05:19:53 -07:00
// Interaction create event to modules
2021-09-15 04:10:50 -07:00
this . client . on ( "interactionCreate" , ( interaction : Interaction ) => {
2022-03-03 20:56:49 +07:00
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
2021-09-15 04:10:50 -07:00
2022-03-03 20:56:49 +07:00
if ( interaction . guild ) {
thisModule . GuildInteractionCreate ( interaction );
if ( interaction . isCommand () && interaction . commandName && thisModule . commandInteractionName ) {
thisModule . GuildCommandInteractionCreate ( interaction );
if ( interaction . commandName . toLowerCase () === thisModule . commandInteractionName )
thisModule . GuildModuleCommandInteractionCreate ( interaction );
}
else if ( interaction . isButton ()) {
thisModule . GuildButtonInteractionCreate ( interaction );
}
else if ( interaction . isSelectMenu ()) {
thisModule . GuildSelectMenuInteractionCreate ( interaction );
}
}
//thisModule.InteractionCreate(interaction);
2021-09-15 04:10:50 -07:00
}
});
2021-09-18 05:19:53 -07:00
// Message create event to modules
2021-09-15 04:10:50 -07:00
this . client . on ( "messageCreate" , ( message : Message ) => {
2022-03-03 20:56:49 +07:00
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
thisModule . GuildMessageCreate ( message );
2021-09-14 09:56:11 -07:00
}
});
2021-09-18 05:19:53 -07:00
// Joined guild event to modules
2022-03-03 20:56:49 +07:00
this . client . on ( "guildCreate" , ( guild : Guild ) => {
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
thisModule . GuildCreate ( guild );
2021-09-18 05:19:53 -07:00
}
});
2022-03-03 20:56:49 +07:00
// Handling guild commands
2021-09-15 04:10:50 -07:00
this . client . on ( "messageCreate" , async ( message : Message ) => {
2021-09-14 09:56:11 -07:00
if ( ! ( message . channel instanceof TextChannel )) return ;
2021-09-15 06:05:30 -07:00
if ( message . author . bot ) return ;
2021-09-14 09:56:11 -07:00
if ( typeof message . guild ? . id === 'undefined' ) return ;
let GuildCache = await Cache . getGuild ( message . guild . id );
if ( typeof GuildCache === 'undefined' || typeof GuildCache . prefix === 'undefined' ) return ;
if ( ! message . content . startsWith ( GuildCache . prefix )) return ;
2021-09-19 01:33:45 -07:00
let noPrefixMessage = message . content . replace ( GuildCache . prefix , '' );
let symbols = [
'!' , '@' , '#' , '$' , '%' , '^' , '&' , '*' , '(' , ')' , '-' , '=' , '_' , '+' , '\\' , '/' , '<' , '>' , '[' , ']' , '{' , '}' , '`' , '"' , "'" , ',' , '.' , '~' , '|' , ';' , ':' , '?' , '、' , '。'
];
2021-09-18 11:15:22 -07:00
2021-09-19 03:36:55 -07:00
const isTag = ( prefix : string ) => {
return prefix . startsWith ( '<@!' ) && prefix . endsWith ( '>' ) ||
prefix . startsWith ( '<:' ) && prefix . endsWith ( '>' ) ||
prefix . startsWith ( '<a:' ) && prefix . endsWith ( '>' ) ||
prefix . startsWith ( '<#' ) && prefix . endsWith ( '>' );
}
2021-09-19 01:33:45 -07:00
if (( GuildCache . prefix . indexOf ( ' ' ) >= 0 )) {
if ( noPrefixMessage . charAt ( 0 ) !== ' ' ) return ;
}
else {
if ( symbols . includes ( GuildCache . prefix . charAt ( GuildCache . prefix . length - 1 ))) {
2021-09-19 03:36:55 -07:00
if ( noPrefixMessage . charAt ( 0 ) === ' ' ) {
//Handle for "@Bot <command>"
if ( isTag ( GuildCache . prefix )) {}
else
return ;
}
else {
//Handle for "@Bot<command>"
if ( isTag ( GuildCache . prefix )) return ;
}
2021-09-19 01:33:45 -07:00
}
2021-09-19 03:36:55 -07:00
2021-09-19 01:33:45 -07:00
else {
if ( noPrefixMessage . charAt ( 0 ) !== ' ' ) return ;
}
//if(noPrefixMessage.charAt(0) !== ' ' && !symbols.includes(noPrefixMessage.charAt(0))) return;
2021-09-18 11:15:22 -07:00
}
2021-09-19 01:33:45 -07:00
if ( noPrefixMessage === '' ) return ;
if ( noPrefixMessage . charAt ( 0 ) === ' ' ) {
/*if(symbols.includes(GuildCache.prefix.charAt(GuildCache.prefix.length - 1))) {
if((GuildCache.prefix.indexOf(' ') >= 0)) return;
}*/
noPrefixMessage = noPrefixMessage . substring ( 1 );
2021-09-18 11:15:22 -07:00
}
2021-09-19 01:33:45 -07:00
let args = noPrefixMessage . split ( " " );
2021-09-14 09:56:11 -07:00
args = args . filter ( e => e !== '' );
2021-09-19 01:33:45 -07:00
let command = args [ 0 ];
args . shift ();
2021-09-14 09:56:11 -07:00
if ( args . length === 0 )
args = [];
2022-03-03 20:56:49 +07:00
for ( const module of this . loaded_module ) {
let thisModule : DiscordModule = module [ 1 ];
thisModule . GuildOnCommand ( command , args , message );
2021-09-14 09:56:11 -07:00
2022-03-03 20:56:49 +07:00
if ( thisModule . commands && thisModule . commands . includes ( command ))
thisModule . GuildOnModuleCommand ( args , message );
2021-09-14 09:56:11 -07:00
}
});
2021-09-18 03:51:14 -07:00
// Handling mentions
this . client . on ( "messageCreate" , async ( message : Message ) => {
// TODO: Handle DMs commands soon
if ( ! ( message . channel instanceof TextChannel )) return ;
if ( message . author . bot ) return ;
if ( typeof message . guild ? . id === 'undefined' ) return ;
if ( ! message . mentions . users ) return ;
if ( message . mentions . users . first () ? . id !== this . client . user ? . id ) return ;
if ( ! message . content . startsWith ( `<@! ${ this . client . user ? . id } >` )) return ;
let args = message . content . split ( " " );
let command = args [ 1 ];
args . shift ();
args . shift ();
args = args . filter ( e => e !== '' );
if ( args . length === 0 )
args = [];
2022-03-03 20:56:49 +07:00
for ( const module of this . loaded_module ) {
2022-03-04 20:21:07 +07:00
let thisModule : DiscordModule = module [ 1 ];
2022-03-03 20:56:49 +07:00
thisModule . GuildOnCommand ( command , args , message );
2022-03-04 20:21:07 +07:00
if ( thisModule . commands && thisModule . commands . includes ( command ))
thisModule . GuildOnModuleCommand ( args , message );
2021-09-18 03:51:14 -07:00
}
});
2021-09-14 09:56:11 -07:00
}
}
export default new Discord ();