From 3ccb7e63e13aa8b0bf3f2037a1d259aef1e592e1 Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Wed, 21 Aug 2024 12:06:37 -0500 Subject: [PATCH] Banning/kicking members --- .dist/member.js | 57 +++++++++++++++++++++++++++++++++++++++ .dist/user.js | 28 +++++++++++++++++++ webpage/contextmenu.ts | 6 ++--- webpage/member.ts | 61 ++++++++++++++++++++++++++++++++++++++++++ webpage/user.ts | 26 ++++++++++++++++++ 5 files changed, 175 insertions(+), 3 deletions(-) diff --git a/.dist/member.js b/.dist/member.js index cc99394..c1fbef3 100644 --- a/.dist/member.js +++ b/.dist/member.js @@ -1,6 +1,7 @@ import { User } from "./user.js"; import { Role } from "./role.js"; import { SnowFlake } from "./snowflake.js"; +import { Dialog } from "./dialog.js"; class Member { static already = {}; owner; @@ -161,5 +162,61 @@ class Member { profileclick(html) { //to be implemented } + get name() { + return this.nick || this.user.username; + } + kick() { + let reason = ""; + const menu = new Dialog(["vdiv", + ["title", "Kick " + this.name + " from " + this.guild.properties.name], + ["textbox", "Reason:", "", function (e) { + reason = e.target.value; + }], + ["button", "", "submit", () => { + this.kickAPI(reason); + menu.hide(); + }]]); + menu.show(); + } + kickAPI(reason) { + const headers = structuredClone(this.guild.headers); + headers["x-audit-log-reason"] = reason; + fetch(`${this.info.api}/guilds/${this.guild.id}/members/${this.id}`, { + method: "DELETE", + headers, + }); + } + ban() { + let reason = ""; + const menu = new Dialog(["vdiv", + ["title", "Ban " + this.name + " from " + this.guild.properties.name], + ["textbox", "Reason:", "", function (e) { + reason = e.target.value; + }], + ["button", "", "submit", () => { + this.banAPI(reason); + menu.hide(); + }]]); + menu.show(); + } + banAPI(reason) { + const headers = structuredClone(this.guild.headers); + headers["x-audit-log-reason"] = reason; + fetch(`${this.info.api}/guilds/${this.guild.id}/bans/${this.id}`, { + method: "PUT", + headers + }); + } + hasPermission(name) { + if (this.isAdmin()) { + return true; + } + for (const thing of this.roles) { + if (thing.permissions.getPermission(name)) { + return true; + } + } + return false; + } } export { Member }; diff --git a/.dist/user.js b/.dist/user.js index f88fc3e..c30bb8c 100644 --- a/.dist/user.js +++ b/.dist/user.js @@ -96,6 +96,34 @@ class User { }) }); }); + this.contextmenu.addbutton("Kick member", function (member) { + member.kick(); + }, null, function (member) { + if (!member) + return false; + const us = member.guild.member; + if (member.id === us.id) { + return false; + } + if (member.id === member.guild.properties.owner_id) { + return false; + } + return (us.hasPermission("KICK_MEMBERS")) || false; + }); + this.contextmenu.addbutton("Ban member", function (member) { + member.ban(); + }, null, function (member) { + if (!member) + return false; + const us = member.guild.member; + if (member.id === us.id) { + return false; + } + if (member.id === member.guild.properties.owner_id) { + return false; + } + return (us.hasPermission("BAN_MEMBERS")) || false; + }); } static clear() { this.userids = {}; diff --git a/webpage/contextmenu.ts b/webpage/contextmenu.ts index e95e8c9..fce7c02 100644 --- a/webpage/contextmenu.ts +++ b/webpage/contextmenu.ts @@ -1,7 +1,7 @@ class Contextmenu{ static currentmenu; name:string; - buttons:[string,(e:MouseEvent)=>void,string|null,(this:x,arg:y)=>boolean,(this:x,arg:y)=>boolean,string][]; + buttons:[string,(this:x,arg:y,e:MouseEvent)=>void,string|null,(this:x,arg:y)=>boolean,(this:x,arg:y)=>boolean,string][]; div:HTMLDivElement; static setup(){ Contextmenu.currentmenu=""; @@ -19,11 +19,11 @@ class Contextmenu{ this.name=name; this.buttons=[] } - addbutton(text:string,onclick:(e:MouseEvent)=>void,img:null|string=null,shown:(this:x,arg:y)=>boolean=_=>true,enabled:(this:x,arg:y)=>boolean=_=>true){ + addbutton(text:string,onclick:(this:x,arg:y,e:MouseEvent)=>void,img:null|string=null,shown:(this:x,arg:y)=>boolean=_=>true,enabled:(this:x,arg:y)=>boolean=_=>true){ this.buttons.push([text,onclick,img,shown,enabled,"button"]); return {}; } - addsubmenu(text:string,onclick:(e:MouseEvent)=>void,img=null,shown:(this:x,arg:y)=>boolean=_=>true,enabled:(this:x,arg:y)=>boolean=_=>true){ + addsubmenu(text:string,onclick:(this:x,arg:y,e:MouseEvent)=>void,img=null,shown:(this:x,arg:y)=>boolean=_=>true,enabled:(this:x,arg:y)=>boolean=_=>true){ this.buttons.push([text,onclick,img,shown,enabled,"submenu"]) return {}; } diff --git a/webpage/member.ts b/webpage/member.ts index 0fd9215..b982740 100644 --- a/webpage/member.ts +++ b/webpage/member.ts @@ -3,6 +3,7 @@ import {Role} from "./role.js"; import {Guild} from "./guild.js"; import { SnowFlake } from "./snowflake.js"; import { memberjson, presencejson, userjson } from "./jsontypes.js"; +import { Dialog } from "./dialog.js"; class Member{ static already={}; @@ -152,5 +153,65 @@ class Member{ profileclick(html:HTMLElement){ //to be implemented } + get name(){ + return this.nick||this.user.username; + } + kick(){ + let reason="" + const menu=new Dialog(["vdiv", + ["title","Kick "+this.name+" from "+this.guild.properties.name], + ["textbox","Reason:","",function(e:Event){ + reason=(e.target as HTMLInputElement).value; + }], + ["button","","submit",()=>{ + this.kickAPI(reason); + menu.hide(); + }] + ]); + menu.show(); + } + kickAPI(reason:string){ + const headers=structuredClone(this.guild.headers); + headers["x-audit-log-reason"]=reason + fetch(`${this.info.api}/guilds/${this.guild.id}/members/${this.id}`,{ + method:"DELETE", + headers, + + }) + } + ban(){ + let reason="" + const menu=new Dialog(["vdiv", + ["title","Ban "+this.name+" from "+this.guild.properties.name], + ["textbox","Reason:","",function(e:Event){ + reason=(e.target as HTMLInputElement).value; + }], + ["button","","submit",()=>{ + this.banAPI(reason); + menu.hide(); + }] + ]); + menu.show(); + } + banAPI(reason:string){ + const headers=structuredClone(this.guild.headers); + headers["x-audit-log-reason"]=reason + fetch(`${this.info.api}/guilds/${this.guild.id}/bans/${this.id}`,{ + method:"PUT", + headers + + }) + } + hasPermission(name:string):boolean{ + if(this.isAdmin()){ + return true; + } + for(const thing of this.roles){ + if(thing.permissions.getPermission(name)){ + return true; + } + } + return false; + } } export {Member}; diff --git a/webpage/user.ts b/webpage/user.ts index 2273a8c..8c79766 100644 --- a/webpage/user.ts +++ b/webpage/user.ts @@ -100,6 +100,32 @@ class User{ }) }) }); + this.contextmenu.addbutton("Kick member",function(this:User,member:Member){ + member.kick(); + },null,function(member){ + if(!member) return false; + const us=member.guild.member; + if(member.id===us.id){ + return false; + } + if(member.id===member.guild.properties.owner_id){ + return false; + } + return (us.hasPermission("KICK_MEMBERS"))||false; + }); + this.contextmenu.addbutton("Ban member",function(this:User,member:Member){ + member.ban(); + },null,function(member){ + if(!member) return false; + const us=member.guild.member; + if(member.id===us.id){ + return false; + } + if(member.id===member.guild.properties.owner_id){ + return false; + } + return (us.hasPermission("BAN_MEMBERS"))||false; + }); } static clear(){ this.userids={};