UNPKG

zyno-bot-addons

Version:

Create easily addons for Zyno Bot

850 lines (762 loc) 74.3 kB
const structureHandler = require('./structureHandler.js'); const MemberManager = require('../managers/memberManager.js'); const GuildMemberManager = require('../managers/guildMemberManager.js'); const GuildManager = require('../managers/guildManager.js'); const inviteManager = require('../managers/inviteManager.js'); const channelManager = require('../managers/channelManager.js'); const voiceStateManager = require('../managers/voiceStateManager.js'); const userManager = require('../managers/userManager.js'); const roleManager = require('../managers/roleManager.js'); const emojiManager = require('../managers/emojiManager.js'); const MessageManager = require('../managers/messageManager.js'); const Save = require('../save.js'); const { getAddonPermission, validatePermission, passClient, wait } = require('../../utils/functions.js'); const { eventListeners, addons, emojiCollectors, interactionCollectors, builtStructures, structureStatus, structureListener } = require('../../utils/saves.js'); const scopes = require('../../bitfields/scopes.js'); const { ChannelType, AuditLogEvent } = require('discord.js'); async function specificStructureCreation(guild, addonInfo, callback){ if(!Array.isArray(builtStructures[addonInfo.addon.name])) builtStructures[addonInfo.addon.name] = []; if(builtStructures[addonInfo.addon.name].indexOf(guild.id) >= 0) return callback(); if(addonInfo.verified === true && addonInfo.allowed === true){ builtStructures[addonInfo.addon.name].push(guild.id); let g = structureHandler.createStructure('Guild', [guild, addonInfo.addon]); const channels = Array.from(guild.channels.cache.values()); for(let _i = 0; _i < channels.length; _i++){ let channel = channels[_i]; if(!channel) continue; if(channel.type === ChannelType.GuildText || channel.type === ChannelType.GuildAnnouncement){ structureHandler.createStructure('TextChannel', [channel, addonInfo.addon, g]); } else if(channel.type === ChannelType.GuildCategory){ structureHandler.createStructure('CategoryChannel', [channel, addonInfo.addon, g]); } else if(channel.type === ChannelType.GuildVoice){ structureHandler.createStructure('VoiceChannel', [channel, addonInfo.addon, g]); } else if(channel.type === ChannelType.GuildStageVoice){ structureHandler.createStructure('StageChannel', [channel, addonInfo.addon, g]); } else if(channel.type === ChannelType.GuildForum){ structureHandler.createStructure('ForumChannel', [channel, addonInfo.addon, g]); } else if(channel.type === ChannelType.GuildDirectory){ structureHandler.createStructure('DirectoryChannel', [channel, addonInfo.addon, g]); } if(_i % 3 === 0) await wait(1e2); } const guildRoles = Array.from(guild.roles.cache.values()); for(let _i = 0; _i < guildRoles.length; _i++){ var guildRole = guildRoles[_i]; if(!guildRole) continue; structureHandler.createStructure('Role', [guildRole, addonInfo.addon, g]); if(_i % 3 === 0) await wait(1e2); } const guildEmojis = Array.from(guild.emojis.cache.values()); for(let _i = 0; _i < guildEmojis.length; _i++){ var guildEmoji = guildEmojis[_i]; if(!guildEmoji) continue; structureHandler.createStructure('Emoji', [guildEmoji, addonInfo.addon, g]); if(_i % 3 === 0) await wait(2e1); } const members = Array.from(guild.members.cache.values()); for(let _i = 0; _i < members.length; _i++){ var _member = members[_i]; if(!_member) continue; structureHandler.createStructure('Member', [_member, addonInfo.addon]); structureHandler.createStructure('VoiceState', [_member.voice, addonInfo.addon]); if(_i % 3 === 0) await wait(2e1); } } callback(); } function createStructures(client){ return new Promise(async resolve => { structureStatus['building'] = true; const readableAddons = addons.toReadableArray(); const guilds = Object.values(client.mainguilds); for(var i = 0; i < guilds.length; i++){ var guild = guilds[i]; let addonIndex = 0; if(readableAddons.length <= addonIndex) continue; await new Promise(async (nextG) => { async function createNewCallback(){ await specificStructureCreation(guild, readableAddons[addonIndex].value, async function(){ ++addonIndex; if(addonIndex + 1 > readableAddons.length){ nextG(); } else { await createNewCallback(); } }); } await createNewCallback(); }); } structureStatus['building'] = false; structureListener.emit('created'); resolve(); }); } function emitEvent(addonName, eventName, permissionBitfield, ...args){ if(!validatePermission(getAddonPermission(addonName), permissionBitfield)) return; const listener = eventListeners.filter(e => e.addonName === addonName)[0]; if(!listener) return; if(listener.listener.listenerCount(eventName) > 0){ listener.listener.emit(eventName, ...args); } } function handleEvents(client, parser){ return new Promise(async resolve => { passClient(client); let _addons = addons.toReadableArray(); client.on('inviteCreate', invite => { if(!invite) return; if(client.config.guilds.indexOf(invite.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ if(validatePermission(getAddonPermission(addonInfo.addon.name), scopes.bitfield.GUILDS)){ const addonGuilds = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const cachedGuild = addonGuilds.get(invite.guild.id); if(!cachedGuild) continue; let cachedInvite = structureHandler.createStructure('Invite', [invite, cachedGuild, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'inviteCreate', scopes.bitfield.GUILDS, cachedInvite); cachedInvite = null; } } } }); client.on('inviteDelete', invite => { if(!invite) return; if(client.config.guilds.indexOf(invite.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ if(validatePermission(getAddonPermission(addonInfo.addon.name), scopes.bitfield.GUILDS)){ const addonInviteManager = inviteManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildInviteManager = addonInviteManager.get(invite.guild.id) || structureHandler.createStructure('Save'); let cachedInvite = guildInviteManager.get(invite.code); guildInviteManager.delete(invite.code); addonInviteManager.set(invite.guild.id, guildInviteManager); inviteManager.set(addonInfo.addon.name, addonInviteManager); emitEvent(addonInfo.addon.name, 'inviteDelete', scopes.bitfield.GUILDS, cachedInvite); cachedInvite = null; } } } }); parser.on('voiceStateUpdate', (_oldState, _newState) => { if(!_newState || !_oldState) return; if(client.config.guilds.indexOf((_newState.member || _oldState.member).guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonVoiceStateManager = voiceStateManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildVoiceStateManager = addonVoiceStateManager.get(_oldState.guild.id) || structureHandler.createStructure('Save'); let oldState = guildVoiceStateManager.get(_oldState.member.id); guildVoiceStateManager.delete(_oldState.member.id); addonVoiceStateManager.set(_oldState.guild.id, guildVoiceStateManager); voiceStateManager.set(addonInfo.addon.name, addonVoiceStateManager); let newState = structureHandler.createStructure('VoiceState', [_newState, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'voiceUpdate', scopes.bitfield.MEMBERS, oldState, newState); oldState = null; newState = null; } else { continue; } } }); parser.on('memberAdd', _member => { if(!_member) return; if(client.config.guilds.indexOf(_member.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ let member = structureHandler.createStructure('Member', [_member, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'memberAdd', scopes.bitfield.MEMBERS, member); member = null; } } }); parser.on('memberLeave', _member => { if(!_member) return; if(client.config.guilds.indexOf(_member.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonG = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const g = addonG.get(_member.guild.id) || structureHandler.createStructure('Save'); let member = g.get(_member.id); g.delete(_member.id); addonG.set(_member.guild.id, g); GuildMemberManager.set(addonInfo.addon.name, addonG); const addonMemberManager = MemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const memberInfo = addonMemberManager.get(_member.id); if(memberInfo){ memberInfo.delete(_member.guild.id); if(memberInfo.size === 0){ addonMemberManager.delete(_member.id); } else { addonMemberManager.set(_member.id, memberInfo); } MemberManager.set(addonInfo.addon.name, addonMemberManager); } emitEvent(addonInfo.addon.name, 'memberLeave', scopes.bitfield.MEMBERS, member); member = null; } } }); parser.on('kick', (_member, entry) => { if(!_member) return; if(client.config.guilds.indexOf(_member.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonG = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const g = addonG.get(_member.guild.id); if(g){ g.delete(_member.id); addonG.set(_member.guild.id, g); GuildMemberManager.set(addonInfo.addon.name, addonG); } const addonMemberManager = MemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const memberInfo = addonMemberManager.get(_member.id); if(memberInfo){ memberInfo.delete(_member.guild.id); if(memberInfo.size === 0){ addonMemberManager.delete(_member.id); } else { addonMemberManager.set(_member.id, memberInfo); } MemberManager.set(addonInfo.addon.name, addonMemberManager); } const addonGuildManager = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); let guild = addonGuildManager.get(_member.guild.id); let kickEntry = structureHandler.createStructure('KickEntry', [_member.user, guild, entry, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'memberKick', scopes.bitfield.MEMBERS, kickEntry); guild = null; kickEntry = null; } } }); parser.on('muteAdd', (_oldMember, _newMember, auditLog) => { if(!_oldMember || !_newMember) return; if(client.config.guilds.indexOf(_newMember.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonGuildMemberManager = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildGuildMemberManager = addonGuildMemberManager.get(_oldMember.guild.id) || structureHandler.createStructure('Save'); let oldMember = guildGuildMemberManager.get(_oldMember.id); guildGuildMemberManager.delete(_oldMember.id); addonGuildMemberManager.set(_oldMember.guild.id, guildGuildMemberManager); GuildMemberManager.set(addonInfo.addon.name, addonGuildMemberManager); let newMember = structureHandler.createStructure('Member', [_newMember, addonInfo.addon]); let muteEntry = structureHandler.createStructure('MuteEntry', [auditLog, newMember, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'memberMuteAdd', scopes.bitfield.MEMBERS, oldMember, newMember, muteEntry); oldMember = null; newMember = null; muteEntry = null; } } }); parser.on('muteRemove', (_oldMember, _newMember, auditLog) => { if(!_oldMember || !_newMember) return; if(client.config.guilds.indexOf(_newMember.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonGuildMemberManager = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildGuildMemberManager = addonGuildMemberManager.get(_oldMember.guild.id) || structureHandler.createStructure('Save'); let oldMember = guildGuildMemberManager.get(_oldMember.id); guildGuildMemberManager.delete(_oldMember.id); addonGuildMemberManager.set(_oldMember.guild.id, guildGuildMemberManager); GuildMemberManager.set(addonInfo.addon.name, addonGuildMemberManager); let newMember = structureHandler.createStructure('Member', [_newMember, addonInfo.addon]); let muteEntry = structureHandler.createStructure('MuteEntry', [auditLog, newMember, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'memberMuteRemove', scopes.bitfield.MEMBERS, oldMember, newMember, muteEntry); oldMember = null; newMember = null; muteEntry = null; } } }); parser.on('guildMemberUpdate', async (_oldMember, _newMember) => { if(!_oldMember || !_newMember) return; if(client.config.guilds.indexOf(_newMember.guild.id) < 0) return; await wait(400); _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonGuildManager = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const cachedGuild = addonGuildManager.get(_oldMember.guild.id); const addonGuildMemberManager = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildGuildMemberManager = addonGuildMemberManager.get(_oldMember.guild.id) || structureHandler.createStructure('Save'); let oldMember = guildGuildMemberManager.get(_oldMember.id); guildGuildMemberManager.delete(_oldMember.id); addonGuildMemberManager.set(_oldMember.guild.id, guildGuildMemberManager); GuildMemberManager.set(addonInfo.addon.name, addonGuildMemberManager); let newMember = structureHandler.createStructure('Member', [_newMember, addonInfo.addon]); if(oldMember.nickname !== newMember.nickname){ _newMember.guild.fetchAuditLogs({ limit: 1, type: AuditLogEvent.MemberUpdate, }).then(logs => { const log = logs.entries.first(); if(!log) return; if(log.targetId !== newMember.id) return; let entry = structureHandler.createStructure('BaseEntry', [log, newMember, cachedGuild, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'nicknameChange', scopes.bitfield.MEMBERS, oldMember, newMember, entry); oldMember = null; newMember = null; entry = null; }).catch(err => {}); } else if(oldMember.roles.size !== newMember.roles.size){ _newMember.guild.fetchAuditLogs({ limit: 1, type: AuditLogEvent.MemberRoleUpdate, }).then(logs => { const log = logs.entries.first(); if(!log) return; if(log.targetId !== newMember.id) return; let entry = structureHandler.createStructure('BaseEntry', [log, newMember, cachedGuild, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'roleChange', scopes.bitfield.MEMBERS, oldMember, newMember, entry); oldMember = null; newMember = null; entry = null; }).catch(err => {}); } else { oldMember = null; newMember = null; } } } }); client.on('userUpdate', async (_oldUser, _newUser) => { if(!_oldUser || !_newUser) return; await wait(400); _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonUserManager = userManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); let oldUser = addonUserManager.get(_oldUser.id) ?? structureHandler.createStructure('User', [_oldUser, addonInfo.addon, false]); addonUserManager.delete(_oldUser.id); userManager.set(addonInfo.addon.name, addonUserManager); let newUser = structureHandler.createStructure('User', [_newUser, addonInfo.addon, false]); if(oldUser.username !== newUser.username){ emitEvent(addonInfo.addon.name, 'usernameChange', scopes.bitfield.MEMBERS, oldUser, newUser); } else if(oldUser.discriminator !== newUser.discriminator){ emitEvent(addonInfo.addon.name, 'discriminatorChange', scopes.bitfield.MEMBERS, oldUser, newUser); } else if(oldUser.avatarURL !== newUser.avatarURL){ emitEvent(addonInfo.addon.name, 'avatarChange', scopes.bitfield.MEMBERS, oldUser, newUser); } else if(oldUser.bannerURL !== newUser.bannerURL){ emitEvent(addonInfo.addon.name, 'bannerChange', scopes.bitfield.MEMBERS, oldUser, newUser); } oldUser = null; newUser = null; } } }); parser.on('ban', (ban, entry) => { if(!ban) return; if(client.config.guilds.indexOf(ban.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonG = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const g = addonG.get(ban.guild.id); if(g){ g.delete(ban.user.id); addonG.set(ban.guild.id, g); GuildMemberManager.set(addonInfo.addon.name, addonG); } const addonMemberManager = MemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const memberInfo = addonMemberManager.get(ban.user.id); if(memberInfo){ memberInfo.delete(ban.guild.id); if(memberInfo.size === 0){ addonMemberManager.delete(ban.user.id); } else { addonMemberManager.set(ban.user.id, memberInfo); } MemberManager.set(addonInfo.addon.name, addonMemberManager); } const addonGuildManager = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); let guild = addonGuildManager.get(ban.guild.id); let banEntry = structureHandler.createStructure('BanEntry', [ban.user, guild, entry, addonInfo.addon]); emitEvent(addonInfo.addon.name, 'memberBan', scopes.bitfield.MEMBERS, banEntry); guild = null; banEntry = null; } } }); parser.on('levelUp', _member => { if(!_member) return; if(client.config.guilds.indexOf(_member.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonGuildMemberManager = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildGuildMemberManager = addonGuildMemberManager.get(_member.guild.id) || structureHandler.createStructure('Save'); let cachedMember = guildGuildMemberManager.get(_member.id); emitEvent(addonInfo.addon.name, 'levelUp', scopes.bitfield.MEMBERS, cachedMember); cachedMember = null; } } }); parser.on('ticketClose', (_channel, transcript, rawInfo) => { if(!_channel) return; if(client.config.guilds.indexOf(_channel.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonChannelManager = channelManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildChannelManager = addonChannelManager.get(_channel.guild.id) || structureHandler.createStructure('Save'); let channel = guildChannelManager.get(_channel.id); const addonGuildManager = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); let guild = addonGuildManager.get(_channel.guild.id); if(!channel){ if(_channel.type === ChannelType.GuildText || _channel.type === ChannelType.GuildAnnouncement){ channel = structureHandler.createStructure('TextChannel', [_channel, addonInfo.addon, guild]); } else if(_channel.type === ChannelType.GuildCategory){ channel = structureHandler.createStructure('CategoryChannel', [_channel, addonInfo.addon, guild]); } else if(_channel.type === ChannelType.GuildVoice){ channel = structureHandler.createStructure('VoiceChannel', [_channel, addonInfo.addon, guild]); } else if(_channel.type === ChannelType.GuildStageVoice){ channel = structureHandler.createStructure('StageChannel', [_channel, addonInfo.addon, guild]); } else if(_channel.type === ChannelType.GuildForum){ channel = structureHandler.createStructure('ForumChannel', [_channel, addonInfo.addon, guild]); } else if(_channel.type === ChannelType.GuildDirectory){ channel = structureHandler.createStructure('DirectoryChannel', [_channel, addonInfo.addon, guild]); } } emitEvent(addonInfo.addon.name, 'ticketClose', scopes.bitfield.CHANNELS, channel, transcript, rawInfo); channel = null; guild = null; } } }); client.on('guildMembersChunk', (_members, guild, chunk) => { if(!_members || !guild) return; if(client.config.guilds.indexOf(guild.id) < 0) return; const members = Array.from(_members.values()); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonGuildMemberManager = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildGuildMemberManager = addonGuildMemberManager.get(guild.id) || structureHandler.createStructure('Save'); let chunkedMembers = structureHandler.createStructure('Save'); for(var i = 0; i < members.length; i++){ let member = members[i]; let _member = guildGuildMemberManager.get(member.id) ?? structureHandler.createStructure('Member', [member, addonInfo.addon]); chunkedMembers.set(_member.id, _member); _member = null; guildGuildMemberManager.delete(member.id); addonGuildMemberManager.set(guild.id, guildGuildMemberManager); GuildMemberManager.set(addonInfo.addon.name, addonGuildMemberManager); const addonMemberManager = MemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const memberInfo = addonMemberManager.get(member.id); if(memberInfo){ memberInfo.delete(guild.id); if(memberInfo.size === 0){ addonMemberManager.delete(member.id); } else { addonMemberManager.set(member.id, memberInfo); } MemberManager.set(addonInfo.addon.name, addonMemberManager); } } emitEvent(addonInfo.addon.name, 'membersPrune', scopes.bitfield.MEMBERS, chunkedMembers, chunkedMembers.first().guild); chunkedMembers = null; } } }); parser.on('messageCreate', async message => { if(!message) return; if(message.partial){ try{ message = await message.fetch(); } catch { return; } } if(!message.guild || !message.channel || !message.id || (!message.author && !message.member)) return; if(message.channel.type === ChannelType.DM) return; if(client.config.guilds.indexOf(message.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ let msg = structureHandler.createStructure('Message', [message, addonInfo.addon]); if(msg.channel){ if(validatePermission(getAddonPermission(addonInfo.addon.name), scopes.bitfield.MESSAGES) && (msg.channel.isVoiceStage() || msg.channel.isTextChannel() || msg.channel.isThread() || msg.channel.isVoiceChannel())){ const addonMessageManager = MessageManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildMessageManager = addonMessageManager.get(message.guild.id) || structureHandler.createStructure('Save'); const channelMessageManager = guildMessageManager.get(message.channel.id) || structureHandler.createStructure('Save'); channelMessageManager.set(message.id, msg); guildMessageManager.set(message.channel.id, channelMessageManager); addonMessageManager.set(message.guild.id, guildMessageManager); MessageManager.set(addonInfo.addon.name, addonMessageManager); } } emitEvent(addonInfo.addon.name, 'message', scopes.bitfield.MESSAGES, msg); msg = null; } } }); parser.on('messageDelete', (_message, _executor) => { if(!_message) return; if(_message.partial){ return; } if(!_message.guild || !_message.channel || !_message.id || (!_message.author && !_message.member)) return; if(_message.channel.type === ChannelType.DM) return; if(client.config.guilds.indexOf(_message.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ let executor = structureHandler.createStructure('User', [_executor, addonInfo.addon, false]); let message = structureHandler.createStructure('Message', [_message, addonInfo.addon]); if(validatePermission(getAddonPermission(addonInfo.addon.name), scopes.bitfield.MESSAGES)){ const addonMessageManager = MessageManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildMessageManager = addonMessageManager.get(_message.guild.id) || structureHandler.createStructure('Save'); const channelMessageManager = guildMessageManager.get(_message.channel.id) || structureHandler.createStructure('Save'); channelMessageManager.delete(_message.id); guildMessageManager.set(_message.channel.id, channelMessageManager); addonMessageManager.set(_message.guild.id, guildMessageManager); MessageManager.set(addonInfo.addon.name, addonMessageManager); } emitEvent(addonInfo.addon.name, 'messageDelete', scopes.bitfield.MESSAGES, message, executor); executor = null; message = null; } } }); parser.on('messageUpdate', async (_oldMessage, _newMessage) => { if(!_oldMessage || !_newMessage) return; if(_newMessage.partial){ try{ _newMessage = await _newMessage.fetch(); } catch { return; } } if(!_newMessage.guild || !_newMessage.channel || !_newMessage.id || (!_newMessage.author && !_newMessage.member) || !_oldMessage.guild || !_oldMessage.channel || !_oldMessage.id || (!_oldMessage.author && !_oldMessage.member)) return; if(_newMessage.channel.type === ChannelType.DM) return; if(client.config.guilds.indexOf(_newMessage.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonMessageManager = MessageManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildMessageManager = addonMessageManager.get(_oldMessage.guild.id) || structureHandler.createStructure('Save'); const channelMessageManager = guildMessageManager.get(_oldMessage.channel.id) || structureHandler.createStructure('Save'); let oldMessage = channelMessageManager.get(_oldMessage.id) ?? structureHandler.createStructure('Message', [_oldMessage, addonInfo.addon]); let newMessage = structureHandler.createStructure('Message', [_newMessage, addonInfo.addon]); if(validatePermission(getAddonPermission(addonInfo.addon.name), scopes.bitfield.MESSAGES)){ const addonMessageManager = MessageManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const guildMessageManager = addonMessageManager.get(_newMessage.guild.id) || structureHandler.createStructure('Save'); const channelMessageManager = guildMessageManager.get(_newMessage.channel.id) || structureHandler.createStructure('Save'); channelMessageManager.set(newMessage.id, newMessage); guildMessageManager.set(_newMessage.channel.id, channelMessageManager); addonMessageManager.set(_newMessage.guild.id, guildMessageManager); MessageManager.set(addonInfo.addon.name, addonMessageManager); } emitEvent(addonInfo.addon.name, 'messageUpdate', scopes.bitfield.MESSAGES, oldMessage, newMessage); oldMessage = null; newMessage = null; } } }); parser.on('reactionAdd', (_reaction, _user) => { if(!_reaction || !_user) return; if(client.config.guilds.indexOf(_reaction.message.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonUserManager = userManager.get(addonInfo.addon.name) ?? structureHandler.createStructure('Save'); let user = addonUserManager.get(_user.id) ?? structureHandler.createStructure('User', [_user, addonInfo.addon, false]); let reaction = structureHandler.createStructure('Reaction', [_reaction, addonInfo.addon, user]); const addonEmojiCollectors = emojiCollectors.get(addonInfo.addon.name); if(addonEmojiCollectors){ const messageCollectors = addonEmojiCollectors.get(_reaction.message.id); if(messageCollectors){ const collectors = messageCollectors.filter(c => { return c.filter(reaction, user); }); const removeCollectors = []; for(let i = 0; i < collectors.length; i++){ let collector = collectors[i]; ++collector.count; if(collector.max <= collector.count){ removeCollectors.push(collector); } if(collector.time < (new Date()).getTime()){ removeCollectors.push(collector); continue; } collector.emit('collect', reaction, user); } for(let i = 0; i < removeCollectors.length; i++){ let removeCollector = removeCollectors[i]; removeCollector.emit('end'); removeCollector.removeAllListeners(); let collectorIndex = messageCollectors.indexOf(removeCollector); if(collectorIndex >= 0){ messageCollectors.splice(collectorIndex, 1); } } addonEmojiCollectors.set(_reaction.message.id, messageCollectors); emojiCollectors.set(addonInfo.addon.name, addonEmojiCollectors); } } emitEvent(addonInfo.addon.name, 'reactionAdd', scopes.bitfield.EMOJIS, reaction); reaction = null; user = null; } } }); client.on('messageReactionRemove', async (_reaction, _user) => { if(!_reaction || !_user) return; if(client.config.guilds.indexOf(_reaction.message.guild.id) < 0) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ try{ await wait(400); await _reaction.message.fetch(); } catch {} const addonUserManager = userManager.get(addonInfo.addon.name) ?? structureHandler.createStructure('Save'); let user = addonUserManager.get(_user.id) ?? structureHandler.createStructure('User', [_user, addonInfo.addon, false]); let reaction = structureHandler.createStructure('Reaction', [_reaction, addonInfo.addon, user]); emitEvent(addonInfo.addon.name, 'reactionDelete', scopes.bitfield.EMOJIS, reaction); user = null; reaction = null; } } }); parser.on('serverAdd', async (_guild) => { if(!_guild) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ await createStructures(client, _addons); let guild = addonInfo.addon.guilds.get(_guild.id); emitEvent(addonInfo.addon.name, 'guildAdd', scopes.bitfield.GUILDS, guild); guild = null; } } }); parser.on('guildUpdate', async (_oldGuild, _newGuild) => { if(!_oldGuild || !_newGuild) return; if(client.config.guilds.indexOf(_newGuild.id) < 0) return; await wait(400); _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ _newGuild.fetchAuditLogs({ limit: 1, type: AuditLogEvent.GuildUpdate }).then(async logs => { const log = logs.entries.first(); if(!log) return; if(log.targetId !== _newGuild.id) return; const addonGuildManager = GuildManager.get(addonInfo.addon.name) ?? structureHandler.createStructure('Save'); let oldGuild = addonGuildManager.get(_oldGuild.id) ?? structureHandler.createStructure('Guild', [_oldGuild, addonInfo.addon]); let newGuild = structureHandler.createStructure('Guild', [_newGuild, addonInfo.addon]); let entry = structureHandler.createStructure('BaseEntry', [log, undefined, newGuild, addonInfo.addon]); if(oldGuild.name !== newGuild.name){ emitEvent(addonInfo.addon.name, 'guildNameChange', scopes.bitfield.GUILDS, oldGuild, newGuild, entry); } else if(oldGuild.iconURL !== newGuild.iconURL){ emitEvent(addonInfo.addon.name, 'guildIconChange', scopes.bitfield.GUILDS, oldGuild, newGuild, entry); } else if(oldGuild.description !== newGuild.description){ emitEvent(addonInfo.addon.name, 'guildDescriptionChange', scopes.bitfield.GUILDS, oldGuild, newGuild, entry); } else if(oldGuild.ownerId !== newGuild.ownerId){ emitEvent(addonInfo.addon.name, 'guildOwnerChange', scopes.bitfield.GUILDS, oldGuild, newGuild, entry); } else if(oldGuild.boosts !== newGuild.boosts){ emitEvent(addonInfo.addon.name, 'guildBoost', scopes.bitfield.GUILDS, oldGuild, newGuild, entry); } oldGuild = null; newGuild = null; entry = null; }).catch(err => {}); } } }); parser.on('serverDelete', (_oldServer) => { if(!_oldServer) return; _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ const addonGuildManager = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); let oldServer = addonGuildManager.get(_oldServer.id); const addonGuildMemberManager = GuildMemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); addonGuildMemberManager.delete(_oldServer.id); GuildMemberManager.set(addonInfo.addon.name, addonGuildMemberManager); const addonMemberManager = MemberManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); const members = addonMemberManager.filter(m => m instanceof Save ? typeof m.get(_oldServer.id) !== 'undefined' : false); const memberIds = Array.from(members.keys()); for(var i = 0; i < memberIds.length; i++){ var memberId = memberIds[i]; let g = members.get(memberId); g.delete(_oldServer.id); addonMemberManager.set(memberId, g); g = null; } MemberManager.set(addonInfo.addon.name, addonMemberManager); const addonRoleManager = roleManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); addonRoleManager.delete(_oldServer.id); roleManager.set(addonInfo.addon.name, addonRoleManager); const addonEmojiManager = emojiManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); addonEmojiManager.delete(_oldServer.id); emojiManager.set(addonInfo.addon.name, addonEmojiManager); const addonMessageManager = MessageManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); addonMessageManager.delete(_oldServer.id); MessageManager.set(addonInfo.addon.name, addonMessageManager); const addonVoiceStateManager = voiceStateManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); addonVoiceStateManager.delete(_oldServer.id); voiceStateManager.set(addonInfo.addon.name, addonVoiceStateManager); addonGuildManager.delete(_oldServer.id); GuildManager.set(addonInfo.addon.name, addonGuildManager); const addonInviteManager = inviteManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); addonInviteManager.delete(_oldServer.id); inviteManager.set(addonInfo.addon.name, addonInviteManager); addonInfo.addon.guilds.delete(_oldServer.id); emitEvent(addonInfo.addon.name, 'guildDelete', scopes.bitfield.GUILDS, oldServer); oldServer = null; } } }); client.on('emojiCreate', async (_emoji) => { if(!_emoji) return; if(client.config.guilds.indexOf(_emoji.guild.id) < 0) return; await wait(400); _addons = addons.toReadableArray(); for(var z = 0; z < _addons.length; z++){ let addonInfo = _addons[z].value; if(addonInfo.verified === true && addonInfo.allowed === true && addonInfo.addon.ready === true){ _emoji.guild.fetchAuditLogs({ limit: 1, type: AuditLogEvent.EmojiCreate, }).then(logs => { const log = logs.entries.first(); if(!log) return; if(log.targetId !== _emoji.id) return; const addonGuildManager = GuildManager.get(addonInfo.addon.name) || structureHandler.createStructure('Save'); let guild = addonGuildManager.get(_emoji.guild.id) ?? structureHandler.createStructure('Guild', [_emoji.guild, addonInfo.addon]); let emoji = guild.emojis.filter(e => e.value.id === _emoji.id).first(); let entry = structureHandler.createStructure('BaseEntry', [log, undefined, guild,