snowflake and cleaning up classes
This commit is contained in:
parent
14d1c69c7d
commit
7eb3ff6cab
21 changed files with 584 additions and 361 deletions
|
@ -3,14 +3,14 @@ import { Message } from "./message.js";
|
|||
import {Voice} from "./audio.js";
|
||||
import {Contextmenu} from "./contextmenu.js";
|
||||
import {Fullscreen} from "./fullscreen.js";
|
||||
import {MarkDown} from "./markdown.js";
|
||||
import {Guild} from "./guild.js";
|
||||
import { Localuser } from "./localuser.js";
|
||||
import { Permissions } from "./permissions.js";
|
||||
import { Settings, RoleList } from "./settings.js";
|
||||
import { Role } from "./role.js";
|
||||
import {InfiniteScroller} from "./infiniteScroller.js"
|
||||
Settings;
|
||||
import {InfiniteScroller} from "./infiniteScroller.js";
|
||||
import { SnowFlake } from "./snowflake.js";
|
||||
|
||||
declare global {
|
||||
interface NotificationOptions {
|
||||
image?: string
|
||||
|
@ -22,30 +22,30 @@ class Channel{
|
|||
owner:Guild;
|
||||
headers:Localuser["headers"];
|
||||
name:string;
|
||||
id:string;
|
||||
parent_id:string;
|
||||
id:SnowFlake<Channel>;
|
||||
parent_id:SnowFlake<Channel>;
|
||||
parent:Channel;
|
||||
children:Channel[];
|
||||
guild_id:string;
|
||||
messageids:{[key : string]:Message};
|
||||
permission_overwrites:{[key:string]:Permissions};
|
||||
permission_overwritesar:[string,Permissions][]
|
||||
messageids:Map<SnowFlake<Message>,Message>;
|
||||
permission_overwrites:Map<string,Permissions>;
|
||||
permission_overwritesar:[SnowFlake<Role>,Permissions][]
|
||||
topic:string;
|
||||
nsfw:boolean;
|
||||
position:number;
|
||||
lastreadmessageid:string;
|
||||
lastmessageid:string;
|
||||
lastreadmessageid:SnowFlake<Message>;
|
||||
lastmessageid:SnowFlake<Message>;
|
||||
mentions:number;
|
||||
lastpin:string;
|
||||
move_id:string;
|
||||
move_id:SnowFlake<Channel>;
|
||||
typing:number;
|
||||
message_notifications:number;
|
||||
allthewayup:boolean;
|
||||
static contextmenu=new Contextmenu("channel menu");
|
||||
replyingto:Message;
|
||||
infinite:InfiniteScroller;
|
||||
idToPrev:{[key:string]:string}={};
|
||||
idToNext:{[key:string]:string}={};
|
||||
idToPrev:Map<SnowFlake<Message>,SnowFlake<Message>>=new Map();
|
||||
idToNext:Map<SnowFlake<Message>,SnowFlake<Message>>=new Map();
|
||||
static setupcontextmenu(){
|
||||
this.contextmenu.addbutton("Copy channel id",function(){
|
||||
console.log(this)
|
||||
|
@ -87,26 +87,28 @@ class Channel{
|
|||
}
|
||||
setUpInfiniteScroller(){
|
||||
const ids:{[key:string]:Function}={};
|
||||
this.infinite=new InfiniteScroller(async function(id:string,offset:number){
|
||||
this.infinite=new InfiniteScroller(async function(this:Channel,id:string,offset:number):Promise<string>{
|
||||
const snowflake=SnowFlake.getSnowFlakeFromID(id,Message) as SnowFlake<Message>;
|
||||
if(offset===1){
|
||||
if(this.idToPrev[id]){
|
||||
return this.idToPrev[id];
|
||||
if(this.idToPrev.get(snowflake)){
|
||||
return this.idToPrev.get(snowflake)?.id;
|
||||
}else{
|
||||
await this.grabmoremessages(id);
|
||||
return this.idToPrev[id];
|
||||
await this.grabBefore(id);
|
||||
return this.idToPrev.get(snowflake)?.id;
|
||||
}
|
||||
}else{
|
||||
return this.idToNext[id];
|
||||
return this.idToNext.get(snowflake)?.id;
|
||||
}
|
||||
}.bind(this),
|
||||
function(this:Channel,id:string){
|
||||
let res:Function;
|
||||
const promise=new Promise(_=>{res=_;}) as Promise<void>;
|
||||
const html=this.messageids[id].buildhtml(this.messageids[this.idToPrev[id]],promise);
|
||||
const snowflake=SnowFlake.getSnowFlakeFromID(id,Message) as SnowFlake<Message>;
|
||||
const html=this.messageids.get(snowflake).buildhtml(this.messageids.get(this.idToPrev.get(snowflake)),promise);
|
||||
ids[id]=res;
|
||||
return html;
|
||||
}.bind(this),
|
||||
async function(id:string){
|
||||
async function(this:Channel,id:string){
|
||||
ids[id]();
|
||||
delete ids[id];
|
||||
return true;
|
||||
|
@ -125,26 +127,25 @@ class Channel{
|
|||
this.owner=owner;
|
||||
this.headers=this.owner.headers;
|
||||
this.name=JSON.name;
|
||||
this.id=JSON.id;
|
||||
this.parent_id=JSON.parent_id;
|
||||
this.id=new SnowFlake(JSON.id,this);
|
||||
this.parent_id=new SnowFlake(JSON.parent_id,undefined);
|
||||
this.parent=null;
|
||||
this.children=[];
|
||||
this.guild_id=JSON.guild_id;
|
||||
this.messageids={};
|
||||
this.permission_overwrites={};
|
||||
this.messageids=new Map();
|
||||
this.permission_overwrites=new Map();
|
||||
this.permission_overwritesar=[];
|
||||
for(const thing of JSON.permission_overwrites){
|
||||
console.log(thing);
|
||||
if(thing.id==="1182819038095799904"||thing.id==="1182820803700625444"){continue;};
|
||||
this.permission_overwrites[thing.id]=new Permissions(thing.allow,thing.deny);
|
||||
this.permission_overwritesar.push([thing.id,this.permission_overwrites[thing.id]]);
|
||||
this.permission_overwrites.set(thing.id,new Permissions(thing.allow,thing.deny));
|
||||
this.permission_overwritesar.push([thing.id,this.permission_overwrites.get(thing.id)]);
|
||||
}
|
||||
|
||||
this.topic=JSON.topic;
|
||||
this.nsfw=JSON.nsfw;
|
||||
this.position=JSON.position;
|
||||
this.lastreadmessageid=null;
|
||||
this.lastmessageid=JSON.last_message_id;
|
||||
this.lastmessageid=SnowFlake.getSnowFlakeFromID(JSON.last_message_id,Message);
|
||||
this.setUpInfiniteScroller();
|
||||
}
|
||||
isAdmin(){
|
||||
|
@ -160,22 +161,22 @@ class Channel{
|
|||
return this.owner.info;
|
||||
}
|
||||
readStateInfo(json){
|
||||
this.lastreadmessageid=json.last_message_id;
|
||||
this.lastreadmessageid=SnowFlake.getSnowFlakeFromID(json.last_message_id,Message);
|
||||
this.mentions=json.mention_count;
|
||||
this.mentions??=0;
|
||||
this.lastpin=json.last_pin_timestamp;
|
||||
}
|
||||
get hasunreads():boolean{
|
||||
if(!this.hasPermission("VIEW_CHANNEL")){return false;}
|
||||
return this.lastmessageid!==this.lastreadmessageid&&this.type!==4;
|
||||
return this.lastmessageid!==this.lastreadmessageid&&this.type!==4&&!!this.lastmessageid.id;
|
||||
}
|
||||
hasPermission(name:string,member=this.guild.member):boolean{
|
||||
if(member.isAdmin()){
|
||||
return true;
|
||||
}
|
||||
for(const thing of member.roles){
|
||||
if(this.permission_overwrites[thing.id]){
|
||||
let perm=this.permission_overwrites[thing.id].getPermission(name);
|
||||
if(this.permission_overwrites.get(thing.id.id)){
|
||||
let perm=this.permission_overwrites.get(thing.id.id).getPermission(name);
|
||||
if(perm){
|
||||
return perm===1;
|
||||
}
|
||||
|
@ -196,7 +197,7 @@ class Channel{
|
|||
this.children.sort((a,b)=>{return a.position-b.position});
|
||||
}
|
||||
resolveparent(guild:Guild){
|
||||
this.parent=guild.channelids[this.parent_id];
|
||||
this.parent=guild.channelids[this.parent_id?.id];
|
||||
this.parent??=null;
|
||||
if(this.parent!==null){
|
||||
this.parent.children.push(this);
|
||||
|
@ -354,7 +355,7 @@ class Channel{
|
|||
if(!this.hasunreads){
|
||||
return;
|
||||
}
|
||||
fetch(this.info.api.toString()+"/v9/channels/"+this.id+"/messages/"+this.lastmessageid+"/ack",{
|
||||
fetch(this.info.api.toString()+"/channels/"+this.id+"/messages/"+this.lastmessageid+"/ack",{
|
||||
method:"POST",
|
||||
headers:this.headers,
|
||||
body:JSON.stringify({})
|
||||
|
@ -445,8 +446,8 @@ class Channel{
|
|||
["textbox","Channel name:",this.name,function(){name=this.value}],
|
||||
["mdbox","Channel topic:",this.topic,function(){topic=this.value}],
|
||||
["checkbox","NSFW Channel",this.nsfw,function(){nsfw=this.checked}],
|
||||
["button","","submit",function(){
|
||||
fetch(this.info.api.toString()+"/v9/channels/"+thisid,{
|
||||
["button","","submit",()=>{
|
||||
fetch(this.info.api.toString()+"/channels/"+thisid,{
|
||||
method:"PATCH",
|
||||
headers:this.headers,
|
||||
body:JSON.stringify({
|
||||
|
@ -470,7 +471,7 @@ class Channel{
|
|||
console.log(full)
|
||||
}
|
||||
deleteChannel(){
|
||||
fetch(this.info.api.toString()+"/v9/channels/"+this.id,{
|
||||
fetch(this.info.api.toString()+"/channels/"+this.id,{
|
||||
method:"DELETE",
|
||||
headers:this.headers
|
||||
})
|
||||
|
@ -508,10 +509,11 @@ class Channel{
|
|||
}
|
||||
}
|
||||
async getmessage(id:string):Promise<Message>{
|
||||
if(this.messageids[id]){
|
||||
return this.messageids[id];
|
||||
const snowflake=SnowFlake.getSnowFlakeFromID(id,Message) as SnowFlake<Message>;
|
||||
if(snowflake.getObject()){
|
||||
return snowflake.getObject();
|
||||
}else{
|
||||
const gety=await fetch(this.info.api.toString()+"/v9/channels/"+this.id+"/messages?limit=1&around="+id,{headers:this.headers})
|
||||
const gety=await fetch(this.info.api.toString()+"/channels/"+this.id+"/messages?limit=1&around="+id,{headers:this.headers})
|
||||
const json=await gety.json();
|
||||
return new Message(json[0],this);
|
||||
}
|
||||
|
@ -539,13 +541,15 @@ class Channel{
|
|||
history.pushState(null, null,"/channels/"+this.guild_id+"/"+this.id);
|
||||
document.getElementById("channelname").textContent="#"+this.name;
|
||||
console.log(this);
|
||||
(document.getElementById("typebox") as HTMLInputElement).disabled=!this.canMessage;
|
||||
(document.getElementById("typebox") as HTMLInputElement).contentEditable=""+this.canMessage;
|
||||
}
|
||||
lastmessage:Message;
|
||||
async putmessages(){
|
||||
if(this.allthewayup){return};
|
||||
const j=await fetch(this.info.api.toString()+"/channels/"+this.id+"/messages?limit=100",{
|
||||
headers: this.headers,
|
||||
})
|
||||
});
|
||||
|
||||
const response=await j.json();
|
||||
if(response.length!==100){
|
||||
this.allthewayup=true;
|
||||
|
@ -554,12 +558,14 @@ class Channel{
|
|||
for(const thing of response){
|
||||
const message=new Message(thing,this);
|
||||
if(prev){
|
||||
this.idToNext[message.id]=prev.id;
|
||||
this.idToPrev[prev.id]=message.id;
|
||||
this.idToNext.set(message.id,prev.id);
|
||||
this.idToPrev.set(prev.id,message.id);
|
||||
}else{
|
||||
this.lastmessage=message;
|
||||
}
|
||||
prev=message;
|
||||
if(this.messageids[message.id]===undefined){
|
||||
this.messageids[message.id]=message;
|
||||
if(this.messageids.get(message.id)===undefined){
|
||||
this.messageids.set(message.id,message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -572,7 +578,7 @@ class Channel{
|
|||
}
|
||||
this.children=build;
|
||||
}
|
||||
async grabmoremessages(id:string){
|
||||
async grabBefore(id:string){
|
||||
if(this.allthewayup){
|
||||
return;
|
||||
}
|
||||
|
@ -584,7 +590,7 @@ class Channel{
|
|||
if(response.length===0){
|
||||
this.allthewayup=true;
|
||||
}
|
||||
let previd=id;
|
||||
let previd=SnowFlake.getSnowFlakeFromID(id,Message) as SnowFlake<Message>;
|
||||
for(const i in response){
|
||||
let messager:Message;
|
||||
if(!next){
|
||||
|
@ -598,11 +604,11 @@ class Channel{
|
|||
next=undefined;
|
||||
console.log("ohno",+i+1);
|
||||
}
|
||||
if(this.messageids[messager.id]===undefined){
|
||||
this.idToNext[messager.id]=previd;
|
||||
this.idToPrev[previd]=messager.id;
|
||||
if(this.messageids.get(messager.id)===undefined){
|
||||
this.idToNext.set(messager.id,previd);
|
||||
this.idToPrev.set(previd,messager.id);
|
||||
previd=messager.id;
|
||||
this.messageids[messager.id]=messager;
|
||||
this.messageids.set(messager.id,messager);
|
||||
}else{
|
||||
console.log("How???")
|
||||
}
|
||||
|
@ -618,17 +624,42 @@ class Channel{
|
|||
buildmessages(){
|
||||
const messages=document.getElementById("channelw");
|
||||
messages.innerHTML="";
|
||||
messages.append(this.infinite.getDiv(this.lastmessageid));
|
||||
let id:SnowFlake<Message>;
|
||||
if(this.messageids.get(this.lastreadmessageid)){
|
||||
id=this.lastreadmessageid;
|
||||
}else if(this.lastmessage.id){
|
||||
id=this.goBackIds(this.lastmessage.id,50);
|
||||
console.log("shouldn't")
|
||||
}
|
||||
messages.append(this.infinite.getDiv(id.id));
|
||||
}
|
||||
private goBackIds(id:SnowFlake<Message>,back:number):SnowFlake<Message>{
|
||||
while(back!==0){
|
||||
const nextid=this.idToPrev.get(id);
|
||||
if(nextid){
|
||||
id=nextid;
|
||||
console.log(id);
|
||||
back--;
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return id;
|
||||
}
|
||||
updateChannel(JSON){
|
||||
this.type=JSON.type;
|
||||
this.name=JSON.name;
|
||||
this.parent_id=JSON.parent_id;
|
||||
this.parent_id=new SnowFlake(JSON.parent_id,undefined);
|
||||
this.parent=null;
|
||||
this.children=[];
|
||||
this.guild_id=JSON.guild_id;
|
||||
this.messageids={};
|
||||
this.permission_overwrites=JSON.permission_overwrites;
|
||||
this.messageids=new Map();
|
||||
this.permission_overwrites=new Map();
|
||||
for(const thing of JSON.permission_overwrites){
|
||||
if(thing.id==="1182819038095799904"||thing.id==="1182820803700625444"){continue;};
|
||||
this.permission_overwrites.set(thing.id,new Permissions(thing.allow,thing.deny));
|
||||
this.permission_overwritesar.push([thing.id,this.permission_overwrites.get(thing.id)]);
|
||||
}
|
||||
this.topic=JSON.topic;
|
||||
this.nsfw=JSON.nsfw;
|
||||
}
|
||||
|
@ -707,10 +738,11 @@ class Channel{
|
|||
messageCreate(messagep:any):void{
|
||||
if(!this.hasPermission("VIEW_CHANNEL")){return}
|
||||
const messagez=new Message(messagep.d,this);
|
||||
this.idToNext[this.lastmessageid]=messagez.id;
|
||||
this.idToPrev[messagez.id]=this.lastmessageid;
|
||||
console.log(this.lastmessageid,messagez.id,":3");
|
||||
this.idToNext.set(this.lastmessageid,messagez.id);
|
||||
this.idToPrev.set(messagez.id,this.lastmessageid);
|
||||
this.lastmessageid=messagez.id;
|
||||
this.messageids[messagez.id]=messagez;
|
||||
this.messageids.set(messagez.id,messagez);
|
||||
if(messagez.author===this.localuser.user){
|
||||
this.lastreadmessageid=messagez.id;
|
||||
if(this.myhtml){
|
||||
|
@ -785,11 +817,11 @@ class Channel{
|
|||
})
|
||||
})
|
||||
const perm=new Permissions("0","0");
|
||||
this.permission_overwrites[role.id]=perm;
|
||||
this.permission_overwrites.set(role.id.id,perm);
|
||||
this.permission_overwritesar.push([role.id,perm]);
|
||||
}
|
||||
async updateRolePermissions(id:string,perms:Permissions){
|
||||
const permission=this.permission_overwrites[id];
|
||||
const permission=this.permission_overwrites.get(id);
|
||||
permission.allow=perms.allow;
|
||||
permission.deny=perms.deny;
|
||||
await fetch(this.info.api.toString()+"/channels/"+this.id+"/permissions/"+id,{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue