jank-client-fork/webpage/guild.js

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();