diff options
-rw-r--r-- | commands/mod/confirm.js | 99 | ||||
-rw-r--r-- | commands/mod/defaults/confirm.js.json | 2 | ||||
-rw-r--r-- | events/message.js | 7 | ||||
-rw-r--r-- | events/ready.js | 10 | ||||
-rw-r--r-- | readme.md | 2 | ||||
-rw-r--r-- | src/util.js | 10 |
6 files changed, 123 insertions, 7 deletions
diff --git a/commands/mod/confirm.js b/commands/mod/confirm.js new file mode 100644 index 0000000..bc53d22 --- /dev/null +++ b/commands/mod/confirm.js @@ -0,0 +1,99 @@ +const Discord = require("discord.js") +const { EmbedBuilder, ActionRowBuilder,ButtonBuilder,ButtonStyle,ChannelType } = require("discord.js"); +const { PermissionsBitField } = require('discord.js'); +const settings = require("../../src/settings") +const fs = require('fs'); +const message = require("../../events/message"); +let config_loc = __filename+".json" +let config = JSON.parse(fs.readFileSync(config_loc)) +module.exports = { + name: "sns", + command: ["sns"], + mod_only:true, + config:config, + config_loc:config_loc, + main(client,Discord,message,args) { + + }, + s_options:[{type:"sub",name:"ban",options:[ + {type:"user",name:"user",desc:"message to be sent",required:true,autocomplete:false}, + {type:"string",name:"ban-reason",desc:"ban reason to be sent to the user",required:true,autocomplete:false}, + {type:"string",name:"details",desc:"staff note (mod side only)",required:false,autocomplete:false}, + {type:"boolean",name:"send-appeal",desc:"whether to send your user id for appealing (default : false)", required:false,autocomplete:false}]}, + ], + s_main(client,Discord,interaction){ + this.exec(client, { + message : interaction, + user : interaction.guild.members.cache.get(interaction.options.getUser("user").id), + reason : interaction.options.getString("ban-reason"), + details : interaction.options.getString("details"), + appeal : interaction.options.getBoolean("send-appeal"), + }) + }, + async exec(client,param){ + let embed = new EmbedBuilder() + .setTitle("Waiting for Confirmation") + .setThumbnail(param.user.displayAvatarURL()) + .setFooter({text:"0 confirmations"}) + .setColor(settings.defaultColor) + + embed.addFields( + {name : "Confirmed by Staff:", value: "<@!"+param.message.author.id+">", inline : true}, + {name : "User:", value: "<@!"+param.user.id+">", inline : true}, + {name : "Ban Reason:", value : param.reason}, + ) + if(param.details) embed.addFields({name : "Staff Note:", value : param.details}) + + const confirm_button = new ButtonBuilder() + .setCustomId('confirm') + .setLabel('Confirm') + .setStyle(ButtonStyle.Primary) + const row = new ActionRowBuilder() + .addComponents(confirm_button); + + let confirms = [param.message.author.id] + let mess = await param.message.reply({embeds:[embed],components:[row]}) + let th = await client.channels.cache.get(param.message.channelId).threads.create({ + name: param.user.user.username, + reason: 'Ban request discussion', + autoArchiveDuration: 60, + type: ChannelType.PublicThread, + }) + + async function rec_read(){ + const collectorFilter = i => i.user.id != param.message.author.id && !confirms.includes(i.user.id); + try { + const confirmation = await mess.awaitMessageComponent({ filter: collectorFilter, time: 60000000 }); + if(confirmation.customId == "confirm"){ + confirms.push(confirmation.author.id) + let comb_mod = "" + for(let mod of confirms){ + comb_mod += "<@" + mod + ">" + if(mod != confirms[confirms.length-1]) comb_mod += "," + } + embed.setFooter({text:confirms.length - 1 + "/2 confirmations"}) + embed.data.fields[0].value = comb_mod + + if(confirms.length >= 3){ + let ban_embed = new EmbedBuilder() + .setTitle("Banned from Supernoobs") + .setFooter({text:"You have been banned from this server. Maybe in another life, we could have been friends. But not in this one. 💔"}) + .setColor(settings.defaultColor) + .setFields({name : "Reason", value : param.reason}) + if(param.appeal) ban_embed.addFields({name : "Appeal id", value : "" + param.message.author.id}) + param.message.client.users.cache.get(param.user.id).send({embeds:[ban_embed]}) + embed.setTitle("Ban Confirmed | " + param.user.user.username); + mess.edit({embeds:[embed],components:[]}) + } else { + mess.edit({embeds:[embed]}) + rec_read() + confirmation.deferUpdate() + } + } + } catch (e) { + console.log(e) + } + } + await rec_read(); + } +};
\ No newline at end of file diff --git a/commands/mod/defaults/confirm.js.json b/commands/mod/defaults/confirm.js.json new file mode 100644 index 0000000..83df9de --- /dev/null +++ b/commands/mod/defaults/confirm.js.json @@ -0,0 +1,2 @@ +{"cooldown":-1,"desc":"Creates a vote to ban/kick","restrict":[],"restricted":[], +"usage":"{command} {action} {user} {desc}"}
\ No newline at end of file diff --git a/events/message.js b/events/message.js index b93f081..c9234e0 100644 --- a/events/message.js +++ b/events/message.js @@ -19,6 +19,7 @@ module.exports = { if(!settings["allowed-servers"].includes(message.guild.id)||message.author.bot||message.member==null) return; + //spam messages for(let i = 0; i < global.recent_messages.length; i++){ let diff = util.diff((new Date(message.createdTimestamp)).getUTCSeconds(),(new Date(global.recent_messages[i].createdTimestamp)).getUTCSeconds()); @@ -37,7 +38,7 @@ module.exports = { } } global.recent_messages.push(message) - if(matching_ids.length > 3){ + if(false && matching_ids.length > 3){ //let temp_msg = global.recent_messages; global.recent_messages = global.recent_messages.filter(x => x.author != message.author) let could_timeout = true @@ -47,8 +48,8 @@ module.exports = { could_timeout = false; } for(let mm of matching_ids){ - mm.delete(); - //try { await mm.delete(); } catch (e) {} + //mm.delete(); + mm.delete().then().catch(); } let embed = new EmbedBuilder() diff --git a/events/ready.js b/events/ready.js index c694c00..889c0b1 100644 --- a/events/ready.js +++ b/events/ready.js @@ -11,17 +11,21 @@ module.exports = { async main (client,Discord){ await db._raw.sync() let config = JSON.parse(fs.readFileSync(config_loc)) - client.once("ready", () => { + client.once("ready", async () => { //preload global.channels = {} for(let guild of Object.keys(settings.preloads)){ - + let mem = Object.fromEntries(await client.guilds.cache.get(guild).members.fetch()) + console.log(Object.keys(mem)) + 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 + global.channels[settings.preloads[guild][chan].name] = t_add; + + } } //end @@ -10,7 +10,7 @@ made for linux or unix systems, running elsewhere isnt supported but should prob - `npm i` - put tokens and api keys in .env-example, and move it to .env - `sh buildconfig.sh` -- `node .` or `sh snschan.sh` (to restart on error) +- `node index.js` or `sh snschan.sh` (to restart on error) ## todo ~ diff --git a/src/util.js b/src/util.js index 3321744..880c3c4 100644 --- a/src/util.js +++ b/src/util.js @@ -1,6 +1,16 @@ const rem_emp = function (e) {return e !== "";} module.exports = { + 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 + }, diff(a,b){ return (a>b)?(a-b):(b-a); }, |