Files
Yumi/src/providers/Discord.ts
T

271 lines
10 KiB
TypeScript
Raw Normal View History

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();