aboutsummaryrefslogtreecommitdiff
path: root/events
diff options
context:
space:
mode:
Diffstat (limited to 'events')
-rw-r--r--events/defaults/dm.js.json5
-rw-r--r--events/defaults/interaction.js.json3
-rw-r--r--events/defaults/message.js.json6
-rw-r--r--events/defaults/reaction-remove.js.json1
-rw-r--r--events/defaults/ready.js.json5
-rw-r--r--events/dm.js104
-rw-r--r--events/interaction.js57
-rw-r--r--events/message.js100
-rw-r--r--events/reaction-remove.js20
-rw-r--r--events/ready.js87
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