snowflake and cleaning up classes

This commit is contained in:
MathMan05 2024-07-23 23:01:45 -05:00
parent 14d1c69c7d
commit 7eb3ff6cab
21 changed files with 584 additions and 361 deletions

View file

@ -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,{