aboutsummaryrefslogtreecommitdiff
path: root/commands/mod
diff options
context:
space:
mode:
Diffstat (limited to 'commands/mod')
-rw-r--r--commands/mod/autoreact.js57
-rw-r--r--commands/mod/defaults/autoreact.js.json2
-rw-r--r--commands/mod/defaults/log.js.json2
-rw-r--r--commands/mod/defaults/motw.js.json2
-rw-r--r--commands/mod/defaults/search.js.json2
-rw-r--r--commands/mod/defaults/sticky.js.json2
-rw-r--r--commands/mod/defaults/ticket.js.json2
-rw-r--r--commands/mod/defaults/timed-message.js.json2
-rw-r--r--commands/mod/defaults/whois.js.json2
-rw-r--r--commands/mod/log.js27
-rw-r--r--commands/mod/motw.js34
-rw-r--r--commands/mod/search.js70
-rw-r--r--commands/mod/sticky.js57
-rw-r--r--commands/mod/ticket.js96
-rw-r--r--commands/mod/timed-message.js76
-rw-r--r--commands/mod/whois.js120
16 files changed, 553 insertions, 0 deletions
diff --git a/commands/mod/autoreact.js b/commands/mod/autoreact.js
new file mode 100644
index 0000000..229116b
--- /dev/null
+++ b/commands/mod/autoreact.js
@@ -0,0 +1,57 @@
+const fs = require('fs')
+const path = require("path");
+const db = require("../../src/db")
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+const {upload_limit} = require("../../src/util")
+module.exports = {
+ name : "autoreact",
+ command: ["react"],
+ mod_only: true,
+ config:config,
+ config_loc:config_loc,
+ async main (client,Discord,message,args){
+ switch(args[0]){
+ case 'add':
+ case 'a':
+ if(args.length<3){
+ message.reply("not enough parameters, try `sns help react`")
+ break;
+ }
+ db.Auto_React.create({channel:args[1],emote:args[2]});
+ message.react("✅")
+ break;
+ case 'rem':
+ case 'remove':
+ case 'r':
+ if(args.length<2){
+ message.reply("not enough parameters, try `sns help react`")
+ break;
+ }
+ let initial = await db.Auto_React.count()
+ await db.Auto_React.destroy({
+ where: {
+ channel: args[1]
+ }
+ });
+ message.reply("removed "+(initial-(await db.Auto_React.count()))+" item(s)")
+ break;
+ case 'dump':
+ case 'list':
+ let list = await db.Auto_React.findAll()
+ let flist = "channel : emote"
+ for(let l of list)
+ flist+=l.channel+" : "+l.emote+"\n"
+ let filename = "/tmp/autoreact.json"
+ fs.writeFileSync(filename,flist)
+ let stats = fs.statSync(filename)
+ if(stats.size / (1024*1024) > upload_limit(message.guild))
+ return message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb")
+ message.reply({files:[filename]})
+ break;
+ default:
+ message.reply("unknown action, try `sns help react`")
+ }
+
+ },
+} \ No newline at end of file
diff --git a/commands/mod/defaults/autoreact.js.json b/commands/mod/defaults/autoreact.js.json
new file mode 100644
index 0000000..7f976dc
--- /dev/null
+++ b/commands/mod/defaults/autoreact.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"React to every new post in channel:3","restrict":[],"restricted":[],
+"usage":"{command} {add {channel} {emote}|rem {channel}|dump}"} \ No newline at end of file
diff --git a/commands/mod/defaults/log.js.json b/commands/mod/defaults/log.js.json
new file mode 100644
index 0000000..a5edd7d
--- /dev/null
+++ b/commands/mod/defaults/log.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Print logs","restrict":[],"restricted":[],
+"usage":"{command}"} \ No newline at end of file
diff --git a/commands/mod/defaults/motw.js.json b/commands/mod/defaults/motw.js.json
new file mode 100644
index 0000000..9412b0b
--- /dev/null
+++ b/commands/mod/defaults/motw.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Announce the Member of the Week","restrict":[],"restricted":[],
+"usage":"{command} {user} {image}"} \ No newline at end of file
diff --git a/commands/mod/defaults/search.js.json b/commands/mod/defaults/search.js.json
new file mode 100644
index 0000000..0ef94c9
--- /dev/null
+++ b/commands/mod/defaults/search.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Search for a username/nickname","restrict":[],"restricted":[],
+"usage":"{command} {name} [percent (end with %)]"} \ No newline at end of file
diff --git a/commands/mod/defaults/sticky.js.json b/commands/mod/defaults/sticky.js.json
new file mode 100644
index 0000000..4717847
--- /dev/null
+++ b/commands/mod/defaults/sticky.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Make a message sticky (i douse it in honey)! Message will always stay at the bottom of the feed","restrict":[],"restricted":[],
+"usage":"{command} {add {channel} {message}|rem {channel}|dump} [embed]","embed_color":"#fcc356"} \ No newline at end of file
diff --git a/commands/mod/defaults/ticket.js.json b/commands/mod/defaults/ticket.js.json
new file mode 100644
index 0000000..095cdef
--- /dev/null
+++ b/commands/mod/defaults/ticket.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Interact with the tickets database, and respond to them.","restrict":[],"restricted":[],
+"usage":"{command} {reply {ticket} [message] [attachments]|close {ticket}|dump {ticket}"} \ No newline at end of file
diff --git a/commands/mod/defaults/timed-message.js.json b/commands/mod/defaults/timed-message.js.json
new file mode 100644
index 0000000..a330425
--- /dev/null
+++ b/commands/mod/defaults/timed-message.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Send a message per interval:)","restrict":[],"restricted":[],
+"usage":"{command} {add {channel} {message} {delay (in s,m,h,d)} |rem {channel}|dump} [embed]","embed_color":"#fcc356"} \ No newline at end of file
diff --git a/commands/mod/defaults/whois.js.json b/commands/mod/defaults/whois.js.json
new file mode 100644
index 0000000..ef027ae
--- /dev/null
+++ b/commands/mod/defaults/whois.js.json
@@ -0,0 +1,2 @@
+{"cooldown":-1,"desc":"Get info on user or role","restrict":[],"restricted":[],
+"usage":"{command} {userid|roleid|mention}"} \ No newline at end of file
diff --git a/commands/mod/log.js b/commands/mod/log.js
new file mode 100644
index 0000000..170f48e
--- /dev/null
+++ b/commands/mod/log.js
@@ -0,0 +1,27 @@
+const Discord = require("discord.js")
+const settings = require("../../src/settings")
+const fs = require('fs')
+const {upload_limit} = require("../../src/util")
+const path = require('path')
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+module.exports = {
+ name: "log",
+ command: ["log"],
+ mod_only:true,
+ config:config,
+ config_loc:config_loc,
+ main(client,Discord,message,args) {
+ this.exec(message)
+ },
+ s_main(client,Discord,interaction){
+ this.exec(interaction)
+ },
+ exec(message){
+ let filename = path.join(__dirname+"../../../log")
+ let stats = fs.statSync(filename)
+ if(stats.size / (1024*1024) > upload_limit(message.guild))
+ return message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb")
+ message.reply({files:[filename]})
+ }
+}; \ No newline at end of file
diff --git a/commands/mod/motw.js b/commands/mod/motw.js
new file mode 100644
index 0000000..a5984c4
--- /dev/null
+++ b/commands/mod/motw.js
@@ -0,0 +1,34 @@
+const Discord = require("discord.js")
+const { EmbedBuilder } = require("discord.js");
+const { PermissionsBitField } = require('discord.js');
+const settings = require("../../src/settings")
+const fs = require('fs')
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+module.exports = {
+ name: "motw",
+ command: ["motw"],
+ mod_only:true,
+ config:config,
+ config_loc:config_loc,
+ main(client,Discord,message,args) {
+ var cmd = message.content.slice(9).split(/ +/g);
+ var name = cmd.shift();
+ var image = cmd.join(" ");
+ this.exec(client,{message:message,name:name,image:image})
+ },
+ s_options:[{type:"user",name:"user",desc:"member of the week!",required:true,autocomplete:false},
+ {type:"string",name:"image",desc:"your fancy motw image:3",required:true,autocomplete:false}],
+ s_main(client,Discord,interaction){
+ this.exec(client,{name:"<@!"+interaction.options.getUser("user").id+">",image:interaction.options.getString("image"),message:interaction})
+ interaction.reply({content:"all done:3",ephemeral: true})
+ },
+ exec(client,param){
+ const motw = new EmbedBuilder()
+ .setTitle("Member of the Week")
+ .setColor(settings.defaultColor)
+ .setDescription(param.name)
+ .setImage(param.image);
+ param.message.channel.send({ embeds: [motw] });
+ }
+}; \ No newline at end of file
diff --git a/commands/mod/search.js b/commands/mod/search.js
new file mode 100644
index 0000000..e81c3c8
--- /dev/null
+++ b/commands/mod/search.js
@@ -0,0 +1,70 @@
+const Discord = require("discord.js")
+const { EmbedBuilder } = require("discord.js");
+const { PermissionsBitField } = require('discord.js');
+const settings = require("../../src/settings")
+const {similarity} = require("../../src/util")
+const fs = require('fs')
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+module.exports = {
+ name: "search",
+ command: ["search"],
+ mod_only:true,
+ config:config,
+ config_loc:config_loc,
+ async main(client,Discord,message,args) {
+ let per = 60;
+ for(let a of args){
+ if(a.length>=2&&a[a.length-1]=="%"&&a[a.length-2]!="%"){
+ a[a.length-1]=""
+ per = parseInt(a)
+ args.splice(args.indexOf(a), 1);
+ }
+ }
+ let dec = per/100
+ let mem = Object.fromEntries(await message.guild.members.fetch())
+ let found = []
+ let count = 0
+ for(let k of Object.keys(mem)){
+ let s = similarity(mem[k].user.username.toLowerCase(),args[0].toLowerCase())
+ if(mem[k].nickname!=null){
+ s=Math.max(s,similarity(mem[k].nickname.toLowerCase(),args[0].toLowerCase()))
+ }
+ if(s>dec){
+ found.push({sim:s,id:mem[k].id})
+ count++;
+ }
+ }
+ if(count==0)
+ return message.reply("no usernames/nicknames found (within a "+per+"% similarity)")
+ for(let i = 0; i<count-1; i++){
+ if(i<0)i=0
+ if(found[i+1].sim>found[i].sim){
+ let t = found[i+1]
+ found[i+1] = found[i]
+ found[i] = t
+ i-=2;
+ }
+ }
+ let p_found = ""
+ for(let i = 0; i!=count; i++){
+ let new_m = "(<@"+found[i].id+"> @ " + Math.floor(found[i].sim * 100) + "%) "
+ if((p_found+new_m).length>1024-3){
+ p_found+="..."
+ break;
+ }
+ p_found+=new_m
+ }
+ message.channel.send("loading ids").then(async(m)=>{
+ await m.edit(p_found)
+ m.delete()
+ })
+ let embed = new EmbedBuilder()
+ .setTitle("Usernames close to '"+args[0]+"' (≥"+per+"%)")
+ .setDescription(p_found)
+ .setColor(settings.defaultColor)
+ .setFooter({text:count+' user(s) found • Up to '+Math.floor(found[0].sim * 100) + '% similarity'})
+ message.channel.send({embeds:[embed]})
+
+ }
+}; \ No newline at end of file
diff --git a/commands/mod/sticky.js b/commands/mod/sticky.js
new file mode 100644
index 0000000..b3dc055
--- /dev/null
+++ b/commands/mod/sticky.js
@@ -0,0 +1,57 @@
+const fs = require('fs')
+const path = require("path");
+const db = require("../../src/db")
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+const {upload_limit} = require("../../src/util")
+module.exports = {
+ name : "sticky",
+ command: ["sticky"],
+ mod_only: true,
+ config:config,
+ config_loc:config_loc,
+ async main (client,Discord,message,args){
+ switch(args[0]){
+ case 'add':
+ case 'a':
+ if(args.length<3){
+ message.reply("not enough parameters, try `sns help sticky`")
+ break;
+ }
+ db.Sticky.create({channel:args[1],message:args[2],last_message:'null',embed:args.includes("embed"),embed_color:config.embed_color});
+ message.react("✅")
+ break;
+ case 'rem':
+ case 'remove':
+ case 'r':
+ if(args.length<2){
+ message.reply("not enough parameters, try `sns help sticky`")
+ break;
+ }
+ let initial = await db.Sticky.count()
+ await db.Sticky.destroy({
+ where: {
+ channel: args[1]
+ }
+ });
+ message.reply("removed "+(initial-(await db.Sticky.count()))+" item(s)")
+ break;
+ case 'dump':
+ case 'list':
+ let list = await db.Sticky.findAll()
+ let flist = "channelid : message : last message\n"
+ for(let l of list)
+ flist+=l.channel+" : "+l.message+" : "+l.last_message+"\n"
+ let filename = "/tmp/sticky.json"
+ fs.writeFileSync(filename,flist)
+ let stats = fs.statSync(filename)
+ if(stats.size / (1024*1024) > upload_limit(message.guild))
+ return message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb")
+ message.reply({files:[filename]})
+ break;
+ default:
+ message.reply("unknown action, try `sns help sticky`")
+ }
+
+ },
+} \ No newline at end of file
diff --git a/commands/mod/ticket.js b/commands/mod/ticket.js
new file mode 100644
index 0000000..5e69ed7
--- /dev/null
+++ b/commands/mod/ticket.js
@@ -0,0 +1,96 @@
+const Discord = require("discord.js")
+const { EmbedBuilder } = require("discord.js");
+const { PermissionsBitField, MessageAttachment } = require('discord.js');
+const {upload_limit} = require("../../src/util")
+const settings = require("../../src/settings")
+const fs = require('fs');
+let db = require("../../src/db")
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+module.exports = {
+ name: "ticket",
+ command: ["ticket"],
+ mod_only:true,
+ config:config,
+ config_loc:config_loc,
+ async main(client,Discord,message,args) {
+ let matt = Array.from(message.attachments, ([name, value]) => ({ name, value }))
+
+ let action = args[0];
+ let ticket_id = args[1];
+ args.shift();args.shift();
+ let r_message = args.join(' ')
+
+ this.exec(client,{att:matt,action:action,ticket_id:ticket_id,r_message:r_message,message:message})
+ },
+ s_options:[{type:"string",name:"ticket",desc:"ticket id",required:true,autocomplete: async function(){ let tik = await db.Tickets.findAll({attributes:['ticket'],where:{status:'open'}}); let out = []; for(let t of tik) out.push(t.ticket); return out; }},
+ {type:"string",name:"action",desc:"operation to perform",required:true,autocomplete:["reply","close","dump"]},
+ {type:"string",name:"message",desc:"message to reply with",required:false,autocomplete:false},
+ {type:"attachment",name:"attachment",desc:"attachment to reply with",required:false,autocomplete:false}],
+ async s_main(client,Discord,interaction){
+ this.exec(client,{message:interaction,att:[interaction.options.getAttachment("attachment")] ?? [],action:interaction.options.getString("action"),
+ ticket_id:interaction.options.getString("ticket"),r_message:interaction.options.getString("message")})
+ },
+ async exec(client,param){
+ let tickets;
+ let date = new Date().toLocaleString()
+ switch(param.action){
+ case 'reply':
+ case 'respond':
+ case 'r':
+ if(param.r_message==null&&param.att==null)
+ return param.message.reply("you must provide a message or attachment")
+ tickets = await db.Tickets.findAll({where:{status:'open',ticket:param.ticket_id}})
+ if(tickets.length==0){
+ tickets = await db.Tickets.findAll({where:{ticket:param.ticket_id}})
+ if(tickets.length==0)
+ return param.message.reply("ticket not found:c")
+ return param.message.reply("ticket is not open")
+ }
+ let ticket = tickets[0]
+ let messages = JSON.parse(ticket.messages)
+ messages.push({message:param.r_message,attachments:param.att,mod:true})
+ db.Tickets.update({'messages':JSON.stringify(messages)},{where:{id:ticket.id}})
+
+ const embed = new EmbedBuilder()
+ .setTitle("Updated Ticket | "+ticket.ticket)
+ .setColor(settings.defaultColor)
+ .setDescription("Message: '"+param.r_message+"'")
+ .setFooter({text:"Created: "+date})
+ let smatt = []
+ for(let att of param.att){
+ if(att!=null)
+ smatt.push({attachment:att?.value?.url ?? att?.url})
+ }
+ param.message.client.users.cache.get(ticket.author).send({embeds:[embed],files:smatt})
+ param.message.reply("updated ticket "+ticket.ticket);
+ break;
+ case 'close':
+ tickets = await db.Tickets.findAll({where:{status:'open',ticket:param.ticket_id}})
+ if(tickets.length==0){
+ tickets = await db.Tickets.findAll({where:{ticket:param.ticket_id}})
+ if(ticket.length==0)
+ return param.message.reply("ticket not found:c")
+ return param.message.reply("ticket is already closed")
+ }
+ db.Tickets.update({'status':'closed'},{where:{id:tickets[0].id}})
+ param.message.reply("closed ticket "+tickets[0].ticket);
+ break;
+ case 'dump':
+ case 'list':
+ tickets = await db.Tickets.findAll({where:{ticket:param.ticket_id}})
+ if(tickets.length==0){
+ return param.message.reply("ticket not found:c")
+ }
+ let filename = "/tmp/"+tickets[0].ticket+".json"
+ fs.writeFileSync(filename,tickets[0].messages)
+ let stats = fs.statSync(filename)
+ if(stats.size / (1024*1024) > upload_limit(param.message.guild))
+ return param.message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb")
+ param.message.reply({files:[filename]})
+ break;
+ default:
+ param.message.reply("unknown action, try `sns help ticket`")
+ }
+ }
+}; \ No newline at end of file
diff --git a/commands/mod/timed-message.js b/commands/mod/timed-message.js
new file mode 100644
index 0000000..35789da
--- /dev/null
+++ b/commands/mod/timed-message.js
@@ -0,0 +1,76 @@
+const fs = require('fs')
+const path = require("path");
+const db = require("../../src/db")
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+const {upload_limit} = require("../../src/util")
+let valid_times = {"s":1000,"m":60000,"h":3.6e+6,"d":8.64e+7}
+module.exports = {
+ name : "timed message",
+ command: ["timed"],
+ mod_only: true,
+ config:config,
+ config_loc:config_loc,
+ async main (client,Discord,message,args){
+ switch(args[0]){
+ case 'add':
+ case 'a':
+ if(args.length<3){
+ message.reply("not enough parameters, try `sns help timed`")
+ break;
+ }
+ let del_ind = args.indexOf("delay")
+ if(del_ind==-1||del_ind==args.length-1){
+ message.reply("invalid usage! i need a delay")
+ break;
+ }
+ if(!Object.keys(valid_times).includes(args[del_ind+1][args[del_ind+1].length-1])){
+ message.reply("please end your delay with either s,m,h, or d")
+ break;
+ }
+ let time = args[del_ind+1]
+ let ind = time[time.length-1]
+ time[time.length-1] = '';
+ time = valid_times[ind] * parseInt(time)
+ if(time==NaN){
+ message.reply("invalid delay")
+ break;
+ }
+ db.Timed_Message.create({channel:args[1],message:args[2],last_message:'null',last_message_time:'null',embed:args.includes("embed"),embed_color:config.embed_color,delay:time,guild:message.guild.id})
+ //db.Sticky.create({channel:args[1],message:args[2],last_message:'null',embed:args.includes("embed"),embed_color:config.embed_color});
+ message.react("✅")
+ break;
+ case 'rem':
+ case 'remove':
+ case 'r':
+ if(args.length<2){
+ message.reply("not enough parameters, try `sns help timed`")
+ break;
+ }
+ let initial = await db.Timed_Message.count()
+ await db.Timed_Message.destroy({
+ where: {
+ channel: args[1]
+ }
+ });
+ message.reply("removed "+(initial-(await db.Timed_Message.count()))+" item(s)")
+ break;
+ case 'dump':
+ case 'list':
+ let list = await db.Timed_Message.findAll()
+ let flist = "channelid : message : last message : last message time : delay : color\n"
+ for(let l of list)
+ flist+=l.channel+" : "+l.message+" : "+l.last_message+" : "+l.last_message_time+" : " + l.delay + " : " + l.embed_color + "\n"
+ let filename = "/tmp/timed.json"
+ fs.writeFileSync(filename,flist)
+ let stats = fs.statSync(filename)
+ if(stats.size / (1024*1024) > upload_limit(message.guild))
+ return message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb")
+ message.reply({files:[filename]})
+ break;
+ default:
+ message.reply("unknown action, try `sns help timed`")
+ }
+
+ },
+} \ No newline at end of file
diff --git a/commands/mod/whois.js b/commands/mod/whois.js
new file mode 100644
index 0000000..56d2645
--- /dev/null
+++ b/commands/mod/whois.js
@@ -0,0 +1,120 @@
+const Discord = require("discord.js")
+const settings = require("../../src/settings")
+const { EmbedBuilder, PermissionsBitField } = require("discord.js");
+const fs = require('fs')
+const {upload_limit} = require("../../src/util")
+const path = require('path')
+let config_loc = __filename+".json"
+let config = JSON.parse(fs.readFileSync(config_loc))
+module.exports = {
+ name: "whois",
+ command: ["whois","getuser","getrole"],
+ mod_only:true,
+ config:config,
+ config_loc:config_loc,
+ async main(client,Discord,message,args) {
+ if(args.length==0)
+ return message.reply("bad usage, try `sns help whois`")
+ await message.guild.members.fetch()
+
+ let error = ""
+ let users_m = Object.fromEntries(message.mentions.users)
+ for(let k of Object.keys(users_m)){
+ let user = message.guild.members.cache.get(users_m[k].id)
+ if(user==null)
+ error+=("user "+users_m[k].id+" not found\n")
+ else
+ this.p_user(client,Discord,message,user)
+ }
+ let roles_m = Object.fromEntries(message.mentions.roles)
+ for(let k of Object.keys(roles_m)){
+ let role = message.guild.roles.cache.get(roles_m[k].id)
+ if(role==null)
+ error+=("role "+roles_m[k].id+" not found\n")
+ else
+ this.p_role(client,Discord,message,role)
+ }
+ for(let a of args){
+ if(a[0]!='<'){
+ let role = message.guild.roles.cache.get(a)
+ let user = message.guild.members.cache.get(a)
+ if(role!=null)
+ this.p_role(client,Discord,message,role)
+ else if(user!=null)
+ this.p_user(client,Discord,message,user)
+ else
+ error+=("user or role "+a+" not found\n")
+ }
+ }
+ if(error!="")
+ message.reply(error)
+ //this.p_user(client,Discord,message,user)
+ },
+ s_options:[{type:"role",name:"role",desc:"roles to get info on",required:false,autocomplete:false},
+ {type:"user",name:"user",desc:"users to get info on",required:false,autocomplete:false}],
+ async s_main(client,Discord,interaction){
+ let role = interaction.options.getRole("role")
+ let user = interaction.options.getUser("user")
+ if(role==null&&user==null)
+ return interaction.reply({content:"select atleast one option",ephemeral: true})
+ if(role!=null)
+ this.p_role(client,Discord,interaction,role)
+ if(user!=null){
+ await interaction.guild.members.fetch()
+ user = interaction.guild.members.cache.get(user.id)
+ this.p_user(client,Discord,interaction,user)
+ }
+ },
+ p_user(client,Discord,message,user){
+ let join = new Date(parseInt(user.joinedTimestamp / 1000, 10)*1000).toLocaleDateString(undefined,{ weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
+ let created = new Date(parseInt(user.user.createdAt / 1000, 10)*1000).toLocaleDateString(undefined,{ weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
+ let mod = user.permissions!=null&&user.permissions?.has(PermissionsBitField.Flags.KickMembers)
+ let roles = ""
+ //console.log(message.mentions.users)
+ message.channel.send("loading ids").then(async(m)=>{
+ await m.edit("<@!"+user.id+">")
+ m.delete()
+ })
+ for(let r of user._roles)
+ roles+="<@&"+r+"> "
+ const embed = new EmbedBuilder()
+ .setAuthor({name:user.user.username,iconURL:user.displayAvatarURL()})
+ .setThumbnail(user.displayAvatarURL())
+ .setDescription("<@!"+user.id+">"+(mod?" +able to use mod commands":""))
+ .addFields([{ name: 'Joined', value:join , inline: true },
+ { name: 'Created', value:created , inline: true },
+ { name: 'Roles ['+user._roles.length+']', value:roles }])
+ .setFooter({text:"id:"+user.id})
+ .setColor(settings.defaultColor)
+ message.reply({embeds:[embed]})
+ },
+ async p_role(client,Discord,message,role){
+ let members = " "
+ //console.log(message.guild.members)
+ let members_m = Object.fromEntries(message.guild.roles.cache.get(role.id).members)
+ let members_a = []
+ for(let k of Object.keys(members_m)){
+ let new_m = "<@"+members_m[k].id+"> "
+ if((members+new_m).length>1024-3){
+ members+="..."
+ break;
+ }
+ members+=new_m
+ }
+ if(members!=" "){
+ message.channel.send("loading ids").then(async(m)=>{
+ await m.edit(members)
+ m.delete()
+ })
+ }
+ let mod = role.permissions!=null&&role.permissions?.has(PermissionsBitField.Flags.KickMembers)
+ const embed = new EmbedBuilder()
+ .setTitle(role.name)
+ .setDescription("<@&"+role.id+">"+(mod?" +able to use mod commands":""))
+ .addFields([{ name: 'Mentionable', value:(role.mentionable?"true":"false"), inline: true },
+ {name: 'Users ['+role.members.size+"]",value:members}])
+ .setFooter({text:"id:"+role.id})
+ .setColor(settings.defaultColor)
+ message.reply({embeds:[embed]})
+ }
+};