393 lines
12 KiB
JavaScript
393 lines
12 KiB
JavaScript
class guild{
|
|
static contextmenu=new contextmenu("guild menu");
|
|
static setupcontextmenu(){
|
|
guild.contextmenu.addbutton("Copy Guild id",function(){
|
|
console.log(this)
|
|
navigator.clipboard.writeText(this.id);
|
|
});
|
|
|
|
guild.contextmenu.addbutton("Mark as read",function(){
|
|
console.log(this)
|
|
this.markAsRead();
|
|
});
|
|
|
|
guild.contextmenu.addbutton("Leave guild",function(){
|
|
this.confirmleave();
|
|
},null,function(_){return _.properties.owner_id!==_.member.user.id});
|
|
|
|
guild.contextmenu.addbutton("Delete guild",function(){
|
|
this.confirmDelete();
|
|
},null,function(_){return _.properties.owner_id===_.member.user.id});
|
|
|
|
guild.contextmenu.addbutton("Create invite",function(){
|
|
console.log(this);
|
|
},null,_=>true,_=>false);
|
|
/* -----things left for later-----
|
|
guild.contextmenu.addbutton("Leave Guild",function(){
|
|
console.log(this)
|
|
this.deleteChannel();
|
|
},null,_=>{return thisuser.isAdmin()})
|
|
|
|
guild.contextmenu.addbutton("Mute Guild",function(){
|
|
editchannelf(this);
|
|
},null,_=>{return thisuser.isAdmin()})
|
|
*/
|
|
}
|
|
constructor(JSON,owner){
|
|
|
|
if(JSON===-1){
|
|
return;
|
|
}
|
|
this.owner=owner;
|
|
this.headers=this.owner.headers;
|
|
if(!this.owner){
|
|
console.error("Owner was not included, please fix")
|
|
}
|
|
this.channels=[];
|
|
this.channelids={};
|
|
this.id=JSON.id;
|
|
this.properties=JSON.properties;
|
|
this.roles=[];
|
|
this.roleids={};
|
|
this.prevchannel=undefined;
|
|
for(const roley of JSON.roles){
|
|
const roleh=new role(roley);
|
|
this.roles.push(roleh)
|
|
this.roleids[roleh.id]=roleh;
|
|
}
|
|
for(const thing of JSON.channels){
|
|
const temp=new channel(thing,this);
|
|
this.channels.push(temp);
|
|
this.channelids[temp.id]=temp;
|
|
}
|
|
this.headchannels=[];
|
|
for(const thing of this.channels){
|
|
if(thing.resolveparent(this)){
|
|
this.headchannels.push(thing);
|
|
}
|
|
}
|
|
}
|
|
confirmleave(){
|
|
const full= new fullscreen([
|
|
"vdiv",
|
|
["title",
|
|
"Are you sure you want to leave?"
|
|
],
|
|
["hdiv",
|
|
["button",
|
|
"",
|
|
"Yes, I'm sure",
|
|
_=>{
|
|
this.leave().then(_=>{
|
|
full.hide();
|
|
});
|
|
}
|
|
],
|
|
["button",
|
|
"",
|
|
"Nevermind",
|
|
_=>{
|
|
full.hide();
|
|
}
|
|
]
|
|
|
|
]
|
|
]);
|
|
full.show();
|
|
}
|
|
async leave(){
|
|
return fetch(info.api.toString()+"/users/@me/guilds/"+this.id,{
|
|
method:"DELETE",
|
|
headers:this.headers
|
|
})
|
|
}
|
|
printServers(){
|
|
let build=""
|
|
for(const thing of this.headchannels){
|
|
build+=(thing.name+":"+thing.position)+"\n";
|
|
for(const thingy of thing.children){
|
|
build+=(" "+thingy.name+":"+thingy.position)+"\n";
|
|
}
|
|
}
|
|
console.log(build);
|
|
}
|
|
calculateReorder(){
|
|
let position=-1;
|
|
let build=[];
|
|
for(const thing of this.headchannels){
|
|
const thisthing={id:thing.id}
|
|
if(thing.position<=position){
|
|
thing.position=(thisthing.position=position+1);
|
|
}
|
|
position=thing.position;
|
|
console.log(position);
|
|
if(thing.move_id&&thing.move_id!==thing.parent_id){
|
|
thing.parent_id=thing.move_id;
|
|
thisthing.parent_id=thing.parent_id;
|
|
thing.move_id=undefined;
|
|
}
|
|
if(thisthing.position||thisthing.parent_id){
|
|
build.push(thisthing);
|
|
console.log(this.channelids[thisthing.parent_id]);
|
|
}
|
|
if(thing.children.length>0){
|
|
const things=thing.calculateReorder()
|
|
for(const thing of things){
|
|
build.push(thing);
|
|
}
|
|
}
|
|
}
|
|
console.log(build)
|
|
this.printServers();
|
|
if(build.length===0){return}
|
|
const serverbug=false;
|
|
if(serverbug){
|
|
for(const thing of build){
|
|
console.log(build,thing)
|
|
fetch(info.api.toString()+"/v9/guilds/"+this.id+"/channels",{
|
|
method:"PATCH",
|
|
headers:this.headers,
|
|
body:JSON.stringify([thing])
|
|
});
|
|
}
|
|
}else{
|
|
fetch(info.api.toString()+"/v9/guilds/"+this.id+"/channels",{
|
|
method:"PATCH",
|
|
headers:this.headers,
|
|
body:JSON.stringify(build)
|
|
});
|
|
}
|
|
|
|
}
|
|
loadChannel(id){
|
|
this.owner.channelfocus=id;
|
|
this.channelids[id].getHTML();
|
|
}
|
|
sortchannels(){
|
|
this.headchannels.sort((a,b)=>{return a.position-b.position;});
|
|
}
|
|
generateGuildIcon(){
|
|
const divy=document.createElement("div");
|
|
divy.classList.add("servernoti");
|
|
|
|
const noti=document.createElement("div");
|
|
noti.classList.add("unread");
|
|
divy.append(noti);
|
|
this.owner.guildhtml[this.id]=divy;
|
|
if(this.properties.icon!=null){
|
|
const img=document.createElement("img");
|
|
img.classList.add("pfp","servericon");
|
|
img.src=info.cdn.toString()+"icons/"+this.properties.id+"/"+this.properties.icon+".png";
|
|
divy.appendChild(img)
|
|
img.onclick=()=>{
|
|
console.log(this.loadGuild)
|
|
this.loadGuild();
|
|
this.loadChannel();
|
|
}
|
|
guild.contextmenu.bind(img,this);
|
|
}else{
|
|
const div=document.createElement("div");
|
|
let build="";
|
|
for(const char of this.properties.name.split(" ")){
|
|
build+=char[0];
|
|
}
|
|
div.innerText=build;
|
|
div.classList.add("blankserver","servericon")
|
|
divy.appendChild(div)
|
|
div.onclick=()=>{
|
|
this.loadGuild();
|
|
this.loadChannel();
|
|
}
|
|
guild.contextmenu.bind(div,this)
|
|
}
|
|
return divy;
|
|
}
|
|
confirmDelete(){
|
|
let confirmname="";
|
|
const full= new fullscreen([
|
|
"vdiv",
|
|
["title",
|
|
"Are you sure you want to delete "+this.properties.name+"?"
|
|
],
|
|
["textbox",
|
|
"Name of server:",
|
|
"",
|
|
function(){
|
|
confirmname=this.value;
|
|
}
|
|
]
|
|
,
|
|
["hdiv",
|
|
["button",
|
|
"",
|
|
"Yes, I'm sure",
|
|
_=>{
|
|
console.log(confirmname)
|
|
if(confirmname!==this.properties.name){
|
|
return;
|
|
}
|
|
this.delete().then(_=>{
|
|
full.hide();
|
|
});
|
|
}
|
|
],
|
|
["button",
|
|
"",
|
|
"Nevermind",
|
|
_=>{
|
|
full.hide();
|
|
}
|
|
]
|
|
|
|
]
|
|
]);
|
|
full.show();
|
|
}
|
|
async delete(){
|
|
return fetch(info.api.toString()+"/guilds/"+this.id+"/delete",{
|
|
method:"POST",
|
|
headers:this.headers,
|
|
})
|
|
}
|
|
unreads(html){
|
|
if(html){
|
|
this.html=html;
|
|
}else{
|
|
html=this.html;
|
|
}
|
|
let read=true;
|
|
for(const thing of this.channels){
|
|
if(thing.hasunreads){
|
|
console.log(thing)
|
|
read=false;
|
|
break;
|
|
}
|
|
}
|
|
if(!html){return;}
|
|
if(read){
|
|
html.children[0].classList.remove("notiunread");
|
|
}else{
|
|
html.children[0].classList.add("notiunread");
|
|
}
|
|
}
|
|
getHTML(){
|
|
//this.printServers();
|
|
this.sortchannels();
|
|
this.printServers();
|
|
console.log("html")
|
|
const build=document.createElement("div");
|
|
for(const thing of this.headchannels){
|
|
build.appendChild(thing.createguildHTML(this.isAdmin()));
|
|
}
|
|
return build;
|
|
}
|
|
isAdmin(){
|
|
return this.member.isAdmin()
|
|
}
|
|
async markAsRead(){
|
|
const build={read_states:[]};
|
|
for(const thing of this.channels){
|
|
if(thing.hasunreads){
|
|
build.read_states.push({channel_id:thing.id,message_id:thing.lastmessageid,read_state_type:0});
|
|
thing.lastreadmessageid=thing.lastmessageid;
|
|
thing.myhtml.classList.remove("cunread");
|
|
}
|
|
}
|
|
this.unreads();
|
|
fetch(info.api.toString()+"/v9/read-states/ack-bulk",{
|
|
method:"POST",
|
|
headers:this.headers,
|
|
body:JSON.stringify(build)
|
|
})
|
|
}
|
|
fillMember(member){
|
|
member.guild=this;
|
|
const realroles=[];
|
|
for(const thing of member.roles){
|
|
realroles.push(this.getRole(thing));
|
|
}
|
|
member.guild=this;
|
|
member.roles=realroles;
|
|
return member;
|
|
}
|
|
giveMember(member){
|
|
this.fillMember(member);
|
|
this.member=member;
|
|
}
|
|
getRole(ID){
|
|
return this.roleids[ID];
|
|
}
|
|
hasRole(r){
|
|
console.log(typeof r,(typeof ""));
|
|
if((typeof r)!==(typeof "")){
|
|
r=r.id;
|
|
}
|
|
return this.member.hasRole(r);
|
|
}
|
|
loadChannel(ID){
|
|
if(ID&&this.channelids[ID]){
|
|
this.channelids[ID].getHTML();
|
|
return;
|
|
}
|
|
if(this.prevchannel){
|
|
console.log(this.prevchannel)
|
|
this.prevchannel.getHTML();
|
|
return;
|
|
}
|
|
for(const thing of this.channels){
|
|
if(thing.children.length===0){
|
|
thing.getHTML();
|
|
return
|
|
}
|
|
}
|
|
}
|
|
loadGuild(){
|
|
this.owner.loadGuild(this.id);
|
|
}
|
|
updateChannel(JSON){
|
|
this.channelids[JSON.id].updateChannel(JSON);
|
|
this.headchannels=[];
|
|
for(const thing of this.channels){
|
|
thing.children=[];
|
|
}
|
|
for(const thing of this.channels){
|
|
if(thing.resolveparent(this)){
|
|
this.headchannels.push(thing);
|
|
}
|
|
}
|
|
this.printServers();
|
|
}
|
|
createChannelpac(JSON){
|
|
const thischannel=new channel(JSON,this);
|
|
this.channelids[JSON.id]=thischannel;
|
|
this.channels.push(thischannel);
|
|
thischannel.resolveparent(this);
|
|
if(!thischannel.parrent){
|
|
this.headchannels.push(thischannel);
|
|
}
|
|
this.calculateReorder();
|
|
this.printServers();
|
|
}
|
|
delChannel(JSON){
|
|
delete this.channelids[JSON.id];
|
|
const build=[];
|
|
for(const thing of this.channels){
|
|
if(thing.id!==JSON.id){
|
|
build.push(thing)
|
|
}else{
|
|
if(thing.parrent){
|
|
thing.parrent.delChannel(JSON);
|
|
}
|
|
}
|
|
}
|
|
this.channels=build;
|
|
}
|
|
createChannel(name,type){
|
|
fetch(info.api.toString()+"/guilds/"+this.id+"/channels",{
|
|
method:"Post",
|
|
headers:this.headers,
|
|
body:JSON.stringify({name: name, type: type})
|
|
})
|
|
}
|
|
}
|
|
guild.setupcontextmenu();
|