diff options
Diffstat (limited to 'events')
| -rw-r--r-- | events/defaults/dm.js.json | 5 | ||||
| -rw-r--r-- | events/defaults/interaction.js.json | 3 | ||||
| -rw-r--r-- | events/defaults/message.js.json | 6 | ||||
| -rw-r--r-- | events/defaults/reaction-remove.js.json | 1 | ||||
| -rw-r--r-- | events/defaults/ready.js.json | 5 | ||||
| -rw-r--r-- | events/dm.js | 104 | ||||
| -rw-r--r-- | events/interaction.js | 57 | ||||
| -rw-r--r-- | events/message.js | 100 | ||||
| -rw-r--r-- | events/reaction-remove.js | 20 | ||||
| -rw-r--r-- | events/ready.js | 87 |
10 files changed, 388 insertions, 0 deletions
diff --git a/events/defaults/dm.js.json b/events/defaults/dm.js.json new file mode 100644 index 0000000..c11cbb9 --- /dev/null +++ b/events/defaults/dm.js.json @@ -0,0 +1,5 @@ +{ + "ticket-id-chars":{"value":"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + "ticket-id-length":{"value":7}, + "ticket-id-split":{"value":3} +}
\ No newline at end of file diff --git a/events/defaults/interaction.js.json b/events/defaults/interaction.js.json new file mode 100644 index 0000000..544b7b4 --- /dev/null +++ b/events/defaults/interaction.js.json @@ -0,0 +1,3 @@ +{ + +}
\ No newline at end of file diff --git a/events/defaults/message.js.json b/events/defaults/message.js.json new file mode 100644 index 0000000..4e863a9 --- /dev/null +++ b/events/defaults/message.js.json @@ -0,0 +1,6 @@ +{ +"restrict-channels":{"value":["825023574221783102","754582601766928456","545076257369358338"]}, +"error-message":{"value":"failed to execute command:("},"error-timeout":{"value":10000}, +"error-message-auth":{"value":"you are not authorized to use this:(("}, +"error-message-not-found":{"value":"i couldnt find that command:( were you talking to me?"}, +"error-message-not-here":{"value":"cant use that here!"}}
\ No newline at end of file diff --git a/events/defaults/reaction-remove.js.json b/events/defaults/reaction-remove.js.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/events/defaults/reaction-remove.js.json @@ -0,0 +1 @@ +{}
\ No newline at end of file diff --git a/events/defaults/ready.js.json b/events/defaults/ready.js.json new file mode 100644 index 0000000..4ee756c --- /dev/null +++ b/events/defaults/ready.js.json @@ -0,0 +1,5 @@ +{ + "status":{"value":"dm to report an issue"}, + "type":{"value":"Playing","options":["Listening","Playing","Streaming","Watching"]}, + "timed_interval":{"value":5000} +}
\ No newline at end of file diff --git a/events/dm.js b/events/dm.js new file mode 100644 index 0000000..dfb7f51 --- /dev/null +++ b/events/dm.js @@ -0,0 +1,104 @@ +const { ActivityType, ButtonBuilder, ButtonStyle, ActionRowBuilder} = require("discord.js"); +const { EmbedBuilder } = require("discord.js"); +const fs = require('fs') +const path = require("path"); +let db = require("../src/db") +let settings = require("../src/settings") +let config_loc = __filename+".json" +module.exports = { + name : "dm", + config_loc : config_loc, + async main (client,Discord,message){ + if(message==null||message.author.bot)return; + let config = JSON.parse(fs.readFileSync(config_loc)) + //start tickets + let date = new Date().toLocaleString() + let tickets = await db.Tickets.findAll({where:{status:'open',author:message.author.id}}) + let matt = Array.from(message.attachments, ([name, value]) => ({ name, value })) + let smatt = [] + for(let att of matt){ + smatt.push({attachment:att.value.url}) + } + if(tickets.length==0){ + let nticket = this.generate_id() + const embed = new EmbedBuilder() + .setTitle("New Ticket | "+nticket) + .setAuthor({name: message.author.tag, iconURL: message.author.displayAvatarURL()}) + .setColor(settings.defaultColor) + .setDescription("Message: "+message.content) + .setFooter({text:"Created by: "+message.author.id+" | Created: "+date}) + + const confirm = new ButtonBuilder() + .setCustomId('confirm') + .setLabel('Confirm') + .setStyle(ButtonStyle.Primary); + const row = new ActionRowBuilder() + .addComponents(confirm); + + let mess = await message.channel.send({embeds:[embed],components:[row],files:smatt}); + + const collectorFilter = i => true; + + try { + const confirmation = await mess.awaitMessageComponent({ filter: collectorFilter, time: 60000000 }); + if(confirmation.customId == "confirm"){ + + let nt = await db.Tickets.create({ + ticket:nticket, + message: message.content, + attachments: JSON.stringify(matt), + status: "open", + author: message.author.id, + name: message.author.tag, + created: date, + messages: JSON.stringify([]), + pfp: message.author.displayAvatarURL() + }) + + const aembed = new EmbedBuilder() + .setTitle("New Ticket | "+nticket) + .setAuthor({name: message.author.tag, iconURL: message.author.displayAvatarURL()}) + .setColor(settings.defaultColor) + .setDescription("Message: '"+message.content+"'\n\nUse `/ticket` or `sns ticket reply "+nticket+" {message}`") + .setFooter({text:"Created by: "+message.author.id+" | Created: "+date}) + + global.channels["admin-chan"].send({embeds:[aembed],files:smatt}) + confirmation.deferUpdate() + } + } catch (e) { + const confirm_timeout = new ButtonBuilder() + .setCustomId('confirm') + .setLabel('Confirm') + .setStyle(ButtonStyle.Primary) + .setDisabled(true); + const row_timeout = new ActionRowBuilder() + .addComponents(confirm_timeout); + await mess.edit({ components: [row_timeout] }); + } + } else { + let ticket = tickets[0] + let messages = JSON.parse(ticket.messages) + messages.push({message:message.content,attachments:matt}) + db.Tickets.update({'messages':JSON.stringify(messages)},{where:{id:ticket.id}}) + const aembed = new EmbedBuilder() + .setTitle("Updated Ticket | "+ticket.ticket) + .setAuthor({name: message.author.tag, iconURL: message.author.displayAvatarURL()}) + .setColor(settings.defaultColor) + .setDescription("Message: '"+message.content+"'\n\nReply with `sns ticket reply "+ticket.ticket+" {message}`") + .setFooter({text:"Created by: "+message.author.id+" | Created: "+date}) + + global.channels["admin-chan"].send({embeds:[aembed],files:smatt}) + } + //done w/ tickets + }, + generate_id(){ + let config = JSON.parse(fs.readFileSync(config_loc)) + var ticket = ""; + var characters = config["ticket-id-chars"].value; + for (var i = 0; i < config["ticket-id-length"].value; i++) { + ticket += characters.charAt(Math.floor(Math.random() * characters.length)); + if (i == config["ticket-id-split"].value) ticket += "-"; + } + return ticket + } +}
\ No newline at end of file diff --git a/events/interaction.js b/events/interaction.js new file mode 100644 index 0000000..3a3b32a --- /dev/null +++ b/events/interaction.js @@ -0,0 +1,57 @@ +const { ActivityType , PermissionsBitField} = require("discord.js"); +const fs = require('fs') +const path = require("path"); +const { EmbedBuilder } = require("discord.js"); +let db = require("../src/db") +let settings = require('../src/settings') +let config_loc = __filename+".json" +module.exports = { + name : "interactionCreate", + config_loc : config_loc, + async main (client,Discord){ + await db._raw.sync() + let config = JSON.parse(fs.readFileSync(config_loc)) + client.on("interactionCreate", async(interaction) => { + if(interaction.guild==null)return + if(!settings["allowed-servers"].includes(interaction.guild.id)) + return console.log("denied interaction from (guild)"+interaction.guild.id) + let date = new Date() + if(interaction.isChatInputCommand()){ + + await interaction.guild.members.fetch() + interaction.user = interaction.guild.members.cache.get(interaction.user.id) + let mod = interaction.user.permissions!=null&&interaction.user.permissions?.has(PermissionsBitField.Flags.KickMembers) + let command = global.s_commands.find(o => o.name === interaction.commandName) + if(!((!command.command.config.restrict||command.command.config.restrict.includes(interaction.channel.id))&& + (!command.command.config.restricted||!command.command.config.restricted.includes(interaction.channel.id)))&&!mod) + return interaction.reply({content:"you cannot send this here! try `sns help` for more info",ephemeral:true}) + if(command==null) + return; + interaction.author = interaction.user + let uid = interaction.user.id; + + if(!mod&&command.command.last_command[uid]!=null&&(date.getTime()-command.command.last_command[uid].getTime())/1000<command.command.config.cooldown) + return interaction.reply({content:"this command is on cooldown for "+ + ((date.getTime()-command.command.last_command[uid].getTime())/1000).toFixed(2)+"/"+command.command.config.cooldown+"s",ephemeral:true}) + + command.command.last_command[uid] = new Date(); + await command.command.s_main(client,Discord,interaction); + + } else if (interaction.isAutocomplete()){ + + const focused = interaction.options.getFocused(true); + let command = global.s_commands.find(o => o.name === interaction.commandName) + let subcommand = command.opt.find(o => o.name === focused.name) + let autocomplete = (typeof subcommand.autocomplete === 'function' ? await subcommand.autocomplete() : subcommand.autocomplete); + const filtered = autocomplete.filter(choice => choice.startsWith(focused.value)); + if(filtered.length>25) + filtered.length=25 + await interaction.respond( + filtered.map(choice => ({ name: choice, value: choice })), + ); + + } + }) + + }, +}
\ No newline at end of file diff --git a/events/message.js b/events/message.js new file mode 100644 index 0000000..817a592 --- /dev/null +++ b/events/message.js @@ -0,0 +1,100 @@ +const fs = require('fs') +const path = require("path"); +let db = require("../src/db"); +const { parse_inp } = require("../src/util") +const { channel } = require('diagnostics_channel'); +const { PermissionsBitField } = require('discord.js'); +const { EmbedBuilder } = require("discord.js"); +let settings = require('../src/settings') +let config_loc = __filename+".json" +module.exports = { + name : "messageCreate", + config_loc : config_loc, + async main (client,Discord){ + let config = JSON.parse(fs.readFileSync(config_loc)) + client.on("messageCreate", async (message) => { + if(message.guild==null) + return require("./dm").main(client,Discord,message) + if(!settings["allowed-servers"].includes(message.guild.id)||message.author.bot||message.member==null) + return; + //handle sticky messages + let stickies = await db.Sticky.findAll(); + for(let s of stickies){ + if(message.channel.id==s.channel && message.author.id!="762561860150362142"){ + let m; + if(s.embed){ + let embed = new EmbedBuilder() + .setDescription(s.message) + .setColor(s.embed_color) + m = await message.channel.send({embeds:[embed]}) + } else { + m = await message.channel.send(s.message) + } + if(s.last_message!='null'){ + try{ + let msg = await message.channel.messages.fetch(s.last_message) + msg.delete() + + } catch(e){} + } + db.Sticky.update({last_message: m.id},{ where: {id: s.id}}) + } + + } + //done w/ sticky + + //handle auto reactions + let a_react = await db.Auto_React.findAll(); + for(let a of a_react){ + if(message.channel.id==a.channel && message.author.id!="762561860150362142"){ + try{ + let m = await message.react(a.emote) + } catch(e){} + } + + } + //done w/ auto reactions + + //deal with commands + let remove = function(msg) {setTimeout(async()=>{try{await msg.delete()}catch(e){}},config["error-timeout"].value)} + let date = new Date() + let uid = message.member.id; + let mod = message.member.permissions!=null&&message.member.permissions?.has(PermissionsBitField.Flags.KickMembers) + if(message.content.startsWith("sns ")&&(!config["restrict-channels"].value.includes(message.channel.id)||(mod))){ + let com_string = message.content.split(" ") + com_string.shift() + let found = false; + let com_call = com_string[0].trim() + //keep this as a for loop incase we want to do sequential commands + for(let com of global.commands){ + if(com.command.includes(com_call)){ + found = true; + if(com.mod_only&&!mod){ + message.reply(config["error-message-auth"].value).then((msg)=>{remove(msg)}) + break; + } + com_string.shift() + com_string = parse_inp(com_string.join(" ")) + try{ + if(((!com.config.restrict||com.config.restrict.includes(message.channel))&& + (!com.config.restricted||!com.config.restricted.includes(message.channel)))||mod) + if(mod||com.config.cooldown==null||com.last_command[uid]==null||(date.getTime()-com.last_command[uid].getTime())/1000>com.config.cooldown){ + await com.main(client,Discord,message,com_string,com_call) + com.last_command[uid] = new Date() + } else message.reply("this command is on cooldown for "+((date.getTime()-com.last_command[uid].getTime())/1000).toFixed(2)+"/"+com.config.cooldown+"s").then((msg)=>{remove(msg)}) + else + message.reply(config["error-message-not-here"].value).then((msg)=>{remove(msg)}) + } catch(e) { + message.reply(config["error-message"].value + "\n```"+e.stack+"```").then((msg)=>{remove(msg)}) + console.log(e.stack) + } + break; + } + } + if(!found) + message.reply(config["error-message-not-found"].value).then((msg)=>{remove(msg)}) + } + //done w/ commands + }) + }, +}
\ No newline at end of file diff --git a/events/reaction-remove.js b/events/reaction-remove.js new file mode 100644 index 0000000..b46595b --- /dev/null +++ b/events/reaction-remove.js @@ -0,0 +1,20 @@ +const { ActivityType , PermissionsBitField} = require("discord.js"); +const fs = require('fs') +const path = require("path"); +const { EmbedBuilder } = require("discord.js"); +let db = require("../src/db") +let settings = require("../src/settings") +let config_loc = __filename+".json" +module.exports = { + name : "messageReactionRemove", + config_loc : config_loc, + async main (client,Discord){ + client.on("messageReactionRemoveEmoji",(m)=>{ + global.channels.logging.send({embeds:[new EmbedBuilder().setTitle("Emoji removed").setDescription((m.count??1)+" "+m.emoji.name+"(s) have been removed from "+m.message.url).setTimestamp(Date.now()).setColor(settings.defaultColor)]}) + }) + client.on("messageReactionRemoveAll",(m)=>{ + global.channels.logging.send({embeds:[new EmbedBuilder().setTitle("Bulk emoji remove").setDescription("All emojis have been removed from "+m.url).setTimestamp(Date.now()).setColor(settings.defaultColor)]}) + }) + + }, +}
\ No newline at end of file diff --git a/events/ready.js b/events/ready.js new file mode 100644 index 0000000..c694c00 --- /dev/null +++ b/events/ready.js @@ -0,0 +1,87 @@ +const { ActivityType } = require("discord.js"); +const fs = require('fs') +const path = require("path"); +const { EmbedBuilder } = require("discord.js"); +let db = require("../src/db") +let settings = require('../src/settings') +let config_loc = __filename+".json" +module.exports = { + name : "ready", + config_loc : config_loc, + async main (client,Discord){ + await db._raw.sync() + let config = JSON.parse(fs.readFileSync(config_loc)) + client.once("ready", () => { + //preload + global.channels = {} + for(let guild of Object.keys(settings.preloads)){ + + for(let chan of Object.keys(settings.preloads[guild])){ + let t_add = client.guilds.cache.get(guild).channels.cache.get(chan) + if(t_add==null) + console.log("failed to load "+chan+" from "+guild+", skipping"); + else + global.channels[settings.preloads[guild][chan].name] = t_add + } + } + //end + + //register slash commands + let passed = 0; + let failed = 0; + client.guilds.cache.forEach((g)=>{ + if(settings["allowed-servers"].includes(g.id)){ + g.commands.set(global.s_commands).catch((e)=>{ + console.log("unable to load commands for " + g.id + "\n\n****\n") + console.log(e) + }) + passed++; + } else { + failed++; + } + }) + console.log("loaded "+global.s_commands.length+" slash commands for "+passed+" guilds, and denied "+failed+" guilds") + //done w/ slash commands + + console.log("online!") + function set_pres() { + client.user.setPresence({ + activities: [{ name: config.status.value, type: ActivityType[config.type.value] }] + }); + } + set_pres() + setInterval(set_pres,36000) + setInterval(async()=>{ + //timed messages + let timed = await db.Timed_Message.findAll(); + let cur = new Date() + for(let t of timed){ + let delay = parseInt(t.delay) + if(t.last_message_time!='null') + t.last_message_time = parseInt(t.last_message_time) + //console.log(new Date(parseInt(t.last_message_time)),(new Date(t.last_message_time)).getTime(),delay) + if(t.last_message_time=='null'||cur.getTime()-(new Date(t.last_message_time)).getTime()>delay){ + + let gu = await client.guilds.fetch(t.guild) + let channel = await gu.channels.fetch(t.channel) + if(t.embed){ + let embed = new EmbedBuilder() + .setDescription(t.message) + .setColor(t.embed_color) + channel.send({embeds:[embed]}) + } else { + channel.send(t.message) + } + //console.log(new Date(t.last_message_time).getTime(),(new Date(t.last_message_time)).getTime()+delay) + if(t.last_message_time=='null') + db.Timed_Message.update({last_message_time : cur.getTime().toString()},{ where: {id: t.id}}) + else + db.Timed_Message.update({last_message_time : (new Date((new Date(t.last_message_time)).getTime()+delay)).getTime().toString()},{ where: {id: t.id}}) + } + } + //done w/ timed messages + },config.timed_interval.value) + }) + + }, +}
\ No newline at end of file |
