diff --git a/.dist/channel.js b/.dist/channel.js index 6646d45..1e11de5 100644 --- a/.dist/channel.js +++ b/.dist/channel.js @@ -9,13 +9,12 @@ import { RoleList } from "./role.js"; import { InfiniteScroller } from "./infiniteScroller.js"; import { SnowFlake } from "./snowflake.js"; import { MarkDown } from "./markdown.js"; -class Channel { +class Channel extends SnowFlake { editing; type; owner; headers; name; - snowflake; parent_id; parent; children; @@ -39,9 +38,6 @@ class Channel { idToPrev = new Map(); idToNext = new Map(); messages = new Map(); - get id() { - return this.snowflake.id; - } static setupcontextmenu() { this.contextmenu.addbutton("Copy channel id", function () { console.log(this); @@ -155,23 +151,22 @@ class Channel { } setUpInfiniteScroller() { this.infinite = new InfiniteScroller((async (id, offset) => { - const snowflake = id; if (offset === 1) { - if (this.idToPrev.has(snowflake)) { - return this.idToPrev.get(snowflake); + if (this.idToPrev.has(id)) { + return this.idToPrev.get(id); } else { await this.grabBefore(id); - return this.idToPrev.get(snowflake); + return this.idToPrev.get(id); } } else { - if (this.idToNext.has(snowflake)) { - return this.idToNext.get(snowflake); + if (this.idToNext.has(id)) { + return this.idToNext.get(id); } else if (this.lastmessage?.id !== id) { await this.grabAfter(id); - return this.idToNext.get(snowflake); + return this.idToNext.get(id); } else { console.log("at bottom"); @@ -207,7 +202,8 @@ class Channel { return false; }), this.readbottom.bind(this)); } - constructor(json, owner) { + constructor(json, owner, id = json === -1 ? undefined : json.id) { + super(id); if (json === -1) { return; } @@ -216,7 +212,6 @@ class Channel { this.owner = owner; this.headers = this.owner.headers; this.name = json.name; - this.snowflake = new SnowFlake(json.id); if (json.parent_id) { this.parent_id = json.parent_id; } @@ -491,7 +486,7 @@ class Channel { if (!this.hasunreads) { return; } - fetch(this.info.api + "/channels/" + this.snowflake + "/messages/" + this.lastmessageid + "/ack", { + fetch(this.info.api + "/channels/" + this.id + "/messages/" + this.lastmessageid + "/ack", { method: "POST", headers: this.headers, body: JSON.stringify({}) @@ -578,7 +573,7 @@ class Channel { let name = this.name; let topic = this.topic; let nsfw = this.nsfw; - const thisid = this.snowflake; + const thisid = this.id; const thistype = this.type; const full = new Dialog(["hdiv", ["vdiv", @@ -614,7 +609,7 @@ class Channel { console.log(full); } deleteChannel() { - fetch(this.info.api + "/channels/" + this.snowflake, { + fetch(this.info.api + "/channels/" + this.id, { method: "DELETE", headers: this.headers }); @@ -661,7 +656,7 @@ class Channel { return message; } else { - const gety = await fetch(this.info.api + "/channels/" + this.snowflake + "/messages?limit=1&around=" + id, { headers: this.headers }); + const gety = await fetch(this.info.api + "/channels/" + this.id + "/messages?limit=1&around=" + id, { headers: this.headers }); const json = await gety.json(); return new Message(json[0], this); } @@ -684,7 +679,7 @@ class Channel { this.guild.prevchannel = this; this.localuser.channelfocus = this; const prom = this.infinite.delete(); - history.pushState(null, "", "/channels/" + this.guild_id + "/" + this.snowflake); + history.pushState(null, "", "/channels/" + this.guild_id + "/" + this.id); this.localuser.pageTitle("#" + this.name); const channelTopic = document.getElementById("channelTopic"); if (this.topic) { @@ -737,7 +732,7 @@ class Channel { if (this.lastreadmessageid && this.messages.has(this.lastreadmessageid)) { return; } - const j = await fetch(this.info.api + "/channels/" + this.snowflake + "/messages?limit=100", { + const j = await fetch(this.info.api + "/channels/" + this.id + "/messages?limit=100", { headers: this.headers, }); const response = await j.json(); @@ -846,11 +841,6 @@ class Channel { throw new Error("please don't call this, no one has implemented it :P"); } async buildmessages() { - /* - if(((!this.lastmessage)||(!this.lastmessage.snowflake)||(!this.goBackIds(this.lastmessage.snowflake,50,false)))&&this.lastreadmessageid){ - await this.grabAfter(this.lastreadmessageid.id); - } - */ this.infinitefocus = false; this.tryfocusinfinate(); } @@ -968,7 +958,7 @@ class Channel { return; } this.typing = Date.now() + 6000; - fetch(this.info.api + "/channels/" + this.snowflake + "/typing", { + fetch(this.info.api + "/channels/" + this.id + "/typing", { method: "POST", headers: this.headers }); @@ -1009,7 +999,7 @@ class Channel { if (replyjson) { body.message_reference = replyjson; } - return await fetch(this.info.api + "/channels/" + this.snowflake + "/messages", { + return await fetch(this.info.api + "/channels/" + this.id + "/messages", { method: "POST", headers: this.headers, body: JSON.stringify(body) @@ -1029,7 +1019,7 @@ class Channel { for (const i in attachments) { formData.append("files[" + i + "]", attachments[i]); } - return await fetch(this.info.api + "/channels/" + this.snowflake + "/messages", { + return await fetch(this.info.api + "/channels/" + this.id + "/messages", { method: "POST", body: formData, headers: { Authorization: this.headers.Authorization } @@ -1121,7 +1111,7 @@ class Channel { } } async addRoleToPerms(role) { - await fetch(this.info.api + "/channels/" + this.snowflake + "/permissions/" + role.snowflake, { + await fetch(this.info.api + "/channels/" + this.id + "/permissions/" + role.id, { method: "PUT", headers: this.headers, body: JSON.stringify({ @@ -1140,7 +1130,7 @@ class Channel { if (permission) { permission.allow = perms.allow; permission.deny = perms.deny; - await fetch(this.info.api + "/channels/" + this.snowflake + "/permissions/" + id, { + await fetch(this.info.api + "/channels/" + this.id + "/permissions/" + id, { method: "PUT", headers: this.headers, body: JSON.stringify({ diff --git a/.dist/direct.js b/.dist/direct.js index 27c8fc9..e675b66 100644 --- a/.dist/direct.js +++ b/.dist/direct.js @@ -2,7 +2,6 @@ import { Guild } from "./guild.js"; import { Channel } from "./channel.js"; import { Message } from "./message.js"; import { User } from "./user.js"; -import { SnowFlake } from "./snowflake.js"; import { Permissions } from "./permissions.js"; class Direct extends Guild { constructor(json, owner) { @@ -15,7 +14,6 @@ class Direct extends Guild { this.headers = this.localuser.headers; this.channels = []; this.channelids = {}; - this.snowflake = new SnowFlake("@me"); this.properties = {}; this.roles = []; this.roleids = new Map(); @@ -77,7 +75,7 @@ dmPermissions.setPermission("USE_VAD", 1); class Group extends Channel { user; constructor(json, owner) { - super(-1, owner); + super(-1, owner, json.id); this.owner = owner; this.headers = this.guild.headers; this.name = json.recipients[0]?.username; @@ -88,7 +86,6 @@ class Group extends Channel { this.user = this.localuser.user; } this.name ??= this.localuser.user.username; - this.snowflake = new SnowFlake(json.id); this.parent_id = null; this.parent = null; this.children = []; @@ -100,7 +97,7 @@ class Group extends Channel { if (this.lastmessageid) { this.position = Number((BigInt(this.lastmessageid) >> 22n) + 1420070400000n); } - this.position = -Math.max(this.position, this.snowflake.getUnixTime()); + this.position = -Math.max(this.position, this.getUnixTime()); } createguildHTML() { const div = document.createElement("div"); diff --git a/.dist/guild.js b/.dist/guild.js index 5bc7b87..8395262 100644 --- a/.dist/guild.js +++ b/.dist/guild.js @@ -6,12 +6,11 @@ import { Member } from "./member.js"; import { Settings } from "./settings.js"; import { SnowFlake } from "./snowflake.js"; import { User } from "./user.js"; -class Guild { +class Guild extends SnowFlake { owner; headers; channels; channelids; - snowflake; properties; roles; roleids; @@ -23,9 +22,6 @@ class Guild { member; html; emojis; - get id() { - return this.snowflake.id; - } static contextmenu = new Contextmenu("guild menu"); static setupcontextmenu() { Guild.contextmenu.addbutton("Copy Guild id", function () { @@ -78,18 +74,19 @@ class Guild { settings.show(); } constructor(json, owner, member) { - if (json === -1 || member === null) { + if (json === -1) { + super("@me"); return; } if (json.stickers.length) { console.log(json.stickers, ":3"); } + super(json.id); this.emojis = json.emojis; this.owner = owner; this.headers = this.owner.headers; this.channels = []; this.channelids = {}; - this.snowflake = new SnowFlake(json.id); this.properties = json.properties; this.roles = []; this.roleids = new Map(); @@ -192,7 +189,7 @@ class Guild { full.show(); } async leave() { - return fetch(this.info.api + "/users/@me/guilds/" + this.snowflake, { + return fetch(this.info.api + "/users/@me/guilds/" + this.id, { method: "DELETE", headers: this.headers }); @@ -340,7 +337,7 @@ class Guild { full.show(); } async delete() { - return fetch(this.info.api + "/guilds/" + this.snowflake + "/delete", { + return fetch(this.info.api + "/guilds/" + this.id + "/delete", { method: "POST", headers: this.headers, }); @@ -528,7 +525,7 @@ class Guild { }); } async createRole(name) { - const fetched = await fetch(this.info.api + "/guilds/" + this.snowflake + "roles", { + const fetched = await fetch(this.info.api + "/guilds/" + this.id + "roles", { method: "POST", headers: this.headers, body: JSON.stringify({ @@ -547,7 +544,7 @@ class Guild { const role = this.roleids[id]; role.permissions.allow = perms.allow; role.permissions.deny = perms.deny; - await fetch(this.info.api + "/guilds/" + this.snowflake + "/roles/" + this.snowflake, { + await fetch(this.info.api + "/guilds/" + this.id + "/roles/" + role.id, { method: "PATCH", headers: this.headers, body: JSON.stringify({ diff --git a/.dist/localuser.js b/.dist/localuser.js index 8d90608..62fbd03 100644 --- a/.dist/localuser.js +++ b/.dist/localuser.js @@ -95,8 +95,7 @@ class Localuser { if (guild === undefined) { continue; } - const guildid = guild.snowflake; - this.guildids.get(guildid.id).channelids[thing.channel_id].readStateInfo(thing); + guild.channelids[thing.channel_id].readStateInfo(thing); } for (const thing of ready.d.relationships) { const user = new User(thing.user, this); diff --git a/.dist/message.js b/.dist/message.js index a24fd62..e7517c8 100644 --- a/.dist/message.js +++ b/.dist/message.js @@ -6,7 +6,7 @@ import { Embed } from "./embed.js"; import { File } from "./file.js"; import { SnowFlake } from "./snowflake.js"; import { Emoji } from "./emoji.js"; -class Message { +class Message extends SnowFlake { static contextmenu = new Contextmenu("message menu"); owner; headers; @@ -15,7 +15,6 @@ class Message { mentions; mention_roles; attachments; //probably should be its own class tbh, should be Attachments[] - snowflake; message_reference; type; timestamp; @@ -38,9 +37,6 @@ class Message { div; member; reactions; - get id() { - return this.snowflake.id; - } static setup() { this.del = new Promise(_ => { this.resolve = _; @@ -77,6 +73,7 @@ class Message { }); } constructor(messagejson, owner) { + super(messagejson.id); this.owner = owner; this.headers = this.owner.headers; this.giveData(messagejson); @@ -117,7 +114,6 @@ class Message { continue; } else if (thing === "id") { - this.snowflake = new SnowFlake(messagejson.id); continue; } else if (thing === "member") { @@ -160,7 +156,7 @@ class Message { func(); } canDelete() { - return this.channel.hasPermission("MANAGE_MESSAGES") || this.author.snowflake === this.localuser.user.snowflake; + return this.channel.hasPermission("MANAGE_MESSAGES") || this.author === this.localuser.user; } get channel() { return this.owner; @@ -208,14 +204,14 @@ class Message { return build; } async edit(content) { - return await fetch(this.info.api + "/channels/" + this.channel.snowflake + "/messages/" + this.id, { + return await fetch(this.info.api + "/channels/" + this.channel.id + "/messages/" + this.id, { method: "PATCH", headers: this.headers, body: JSON.stringify({ content }) }); } delete() { - fetch(`${this.info.api}/channels/${this.channel.snowflake}/messages/${this.id}`, { + fetch(`${this.info.api}/channels/${this.channel.id}/messages/${this.id}`, { headers: this.headers, method: "DELETE", }); @@ -387,7 +383,7 @@ class Message { const newt = (new Date(this.timestamp).getTime()) / 1000; current = (newt - old) > 600; } - const combine = (premessage?.author?.snowflake != this.author.snowflake) || (current) || this.message_reference; + const combine = (premessage?.author != this.author) || (current) || this.message_reference; if (combine) { const pfp = this.author.buildpfp(); this.author.bind(pfp, this.guild, false); @@ -574,7 +570,7 @@ class Message { } buildhtml(premessage) { if (this.div) { - console.error(`HTML for ${this.snowflake} already exists, aborting`); + console.error(`HTML for ${this.id} already exists, aborting`); return this.div; } try { diff --git a/.dist/role.js b/.dist/role.js index 213dda3..f1c0e70 100644 --- a/.dist/role.js +++ b/.dist/role.js @@ -1,10 +1,9 @@ import { Permissions } from "./permissions.js"; import { SnowFlake } from "./snowflake.js"; -class Role { +class Role extends SnowFlake { permissions; owner; color; - snowflake; name; info; hoist; @@ -12,15 +11,12 @@ class Role { mentionable; unicode_emoji; headers; - get id() { - return this.snowflake.id; - } constructor(json, owner) { + super(json.id); this.headers = owner.headers; this.info = owner.info; for (const thing of Object.keys(json)) { if (thing === "id") { - this.snowflake = new SnowFlake(json.id); continue; } this[thing] = json[thing]; diff --git a/.dist/snowflake.js b/.dist/snowflake.js index 03098fa..51a06c0 100644 --- a/.dist/snowflake.js +++ b/.dist/snowflake.js @@ -4,11 +4,14 @@ class SnowFlake { this.id = id; } getUnixTime() { + return SnowFlake.stringToUnixTime(this.id); + } + static stringToUnixTime(str) { try { - return Number((BigInt(this.id) >> 22n) + 1420070400000n); + return Number((BigInt(str) >> 22n) + 1420070400000n); } catch { - console.error(`The ID is corrupted, it's ${this.id} when it should be some number.`); + console.error(`The ID is corrupted, it's ${str} when it should be some number.`); return 0; } } diff --git a/.dist/user.js b/.dist/user.js index a472c7c..7d04c48 100644 --- a/.dist/user.js +++ b/.dist/user.js @@ -3,10 +3,9 @@ import { Member } from "./member.js"; import { MarkDown } from "./markdown.js"; import { Contextmenu } from "./contextmenu.js"; import { SnowFlake } from "./snowflake.js"; -class User { +class User extends SnowFlake { owner; hypotheticalpfp; - snowflake; avatar; username; nickname = null; @@ -62,9 +61,6 @@ class User { return "offline"; } } - get id() { - return this.snowflake.id; - } static contextmenu = new Contextmenu("User Menu"); static setUpContextMenu() { this.contextmenu.addbutton("Copy user id", function () { @@ -141,6 +137,7 @@ class User { return this.owner; } constructor(userjson, owner, dontclone = false) { + super(userjson.id); this.owner = owner; if (!owner) { console.error("missing localuser"); @@ -152,7 +149,6 @@ class User { continue; } if (thing === "id") { - this.snowflake = new SnowFlake(userjson[thing]); continue; } this[thing] = userjson[thing]; diff --git a/webpage/channel.ts b/webpage/channel.ts index 94905db..647f4cf 100644 --- a/webpage/channel.ts +++ b/webpage/channel.ts @@ -18,13 +18,12 @@ declare global { image?: string|null|undefined } } -class Channel{ +class Channel extends SnowFlake{ editing:Message|null; type:number; owner:Guild; headers:Localuser["headers"]; name:string; - snowflake:SnowFlake; parent_id?:string; parent:Channel|null; children:Channel[]; @@ -48,9 +47,6 @@ class Channel{ idToPrev:Map=new Map(); idToNext:Map=new Map(); messages:Map=new Map(); - get id(){ - return this.snowflake.id; - } static setupcontextmenu(){ this.contextmenu.addbutton("Copy channel id",function(this:Channel){ console.log(this); @@ -171,20 +167,19 @@ class Channel{ } setUpInfiniteScroller(){ this.infinite=new InfiniteScroller((async (id:string,offset:number):Promise=>{ - const snowflake=id; if(offset===1){ - if(this.idToPrev.has(snowflake)){ - return this.idToPrev.get(snowflake); + if(this.idToPrev.has(id)){ + return this.idToPrev.get(id); }else{ await this.grabBefore(id); - return this.idToPrev.get(snowflake); + return this.idToPrev.get(id); } }else{ - if(this.idToNext.has(snowflake)){ - return this.idToNext.get(snowflake); + if(this.idToNext.has(id)){ + return this.idToNext.get(id); }else if(this.lastmessage?.id!==id){ await this.grabAfter(id); - return this.idToNext.get(snowflake); + return this.idToNext.get(id); }else{ console.log("at bottom"); } @@ -219,7 +214,8 @@ class Channel{ this.readbottom.bind(this) ); } - constructor(json:channeljson|-1,owner:Guild){ + constructor(json:channeljson|-1,owner:Guild,id:string=json===-1?undefined:json.id){ + super(id); if(json===-1){ return; } @@ -228,7 +224,6 @@ class Channel{ this.owner=owner; this.headers=this.owner.headers; this.name=json.name; - this.snowflake=new SnowFlake(json.id); if(json.parent_id){ this.parent_id=json.parent_id; } @@ -500,7 +495,7 @@ class Channel{ if(!this.hasunreads){ return; } - fetch(this.info.api+"/channels/"+this.snowflake+"/messages/"+this.lastmessageid+"/ack",{ + fetch(this.info.api+"/channels/"+this.id+"/messages/"+this.lastmessageid+"/ack",{ method: "POST", headers: this.headers, body: JSON.stringify({}) @@ -586,7 +581,7 @@ class Channel{ let name=this.name; let topic=this.topic; let nsfw=this.nsfw; - const thisid=this.snowflake; + const thisid=this.id; const thistype=this.type; const full=new Dialog( ["hdiv", @@ -625,7 +620,7 @@ class Channel{ console.log(full); } deleteChannel(){ - fetch(this.info.api+"/channels/"+this.snowflake,{ + fetch(this.info.api+"/channels/"+this.id,{ method: "DELETE", headers: this.headers }); @@ -669,7 +664,7 @@ class Channel{ if(message){ return message; }else{ - const gety=await fetch(this.info.api+"/channels/"+this.snowflake+"/messages?limit=1&around="+id,{headers: this.headers}); + const gety=await fetch(this.info.api+"/channels/"+this.id+"/messages?limit=1&around="+id,{headers: this.headers}); const json=await gety.json(); return new Message(json[0],this); } @@ -692,7 +687,7 @@ class Channel{ this.guild.prevchannel=this; this.localuser.channelfocus=this; const prom=this.infinite.delete(); - history.pushState(null, "","/channels/"+this.guild_id+"/"+this.snowflake); + history.pushState(null, "","/channels/"+this.guild_id+"/"+this.id); this.localuser.pageTitle("#"+this.name); const channelTopic=document.getElementById("channelTopic") as HTMLSpanElement; @@ -746,7 +741,7 @@ class Channel{ if(this.lastreadmessageid&&this.messages.has(this.lastreadmessageid)){ return; } - const j=await fetch(this.info.api+"/channels/"+this.snowflake+"/messages?limit=100",{ + const j=await fetch(this.info.api+"/channels/"+this.id+"/messages?limit=100",{ headers: this.headers, }); @@ -856,11 +851,6 @@ class Channel{ throw new Error("please don't call this, no one has implemented it :P"); } async buildmessages(){ - /* - if(((!this.lastmessage)||(!this.lastmessage.snowflake)||(!this.goBackIds(this.lastmessage.snowflake,50,false)))&&this.lastreadmessageid){ - await this.grabAfter(this.lastreadmessageid.id); - } - */ this.infinitefocus=false; this.tryfocusinfinate(); } @@ -973,7 +963,7 @@ class Channel{ return; } this.typing=Date.now()+6000; - fetch(this.info.api+"/channels/"+this.snowflake+"/typing",{ + fetch(this.info.api+"/channels/"+this.id+"/typing",{ method: "POST", headers: this.headers }); @@ -1015,7 +1005,7 @@ class Channel{ if(replyjson){ body.message_reference=replyjson; } - return await fetch(this.info.api+"/channels/"+this.snowflake+"/messages",{ + return await fetch(this.info.api+"/channels/"+this.id+"/messages",{ method: "POST", headers: this.headers, body: JSON.stringify(body) @@ -1034,7 +1024,7 @@ class Channel{ for(const i in attachments){ formData.append("files["+i+"]",attachments[i]); } - return await fetch(this.info.api+"/channels/"+this.snowflake+"/messages", { + return await fetch(this.info.api+"/channels/"+this.id+"/messages", { method: "POST", body: formData, headers: {Authorization: this.headers.Authorization} @@ -1125,7 +1115,7 @@ class Channel{ } } async addRoleToPerms(role:Role){ - await fetch(this.info.api+"/channels/"+this.snowflake+"/permissions/"+role.snowflake,{ + await fetch(this.info.api+"/channels/"+this.id+"/permissions/"+role.id,{ method: "PUT", headers: this.headers, body: JSON.stringify({ @@ -1144,7 +1134,7 @@ class Channel{ if(permission){ permission.allow=perms.allow; permission.deny=perms.deny; - await fetch(this.info.api+"/channels/"+this.snowflake+"/permissions/"+id,{ + await fetch(this.info.api+"/channels/"+this.id+"/permissions/"+id,{ method: "PUT", headers: this.headers, body: JSON.stringify({ diff --git a/webpage/direct.ts b/webpage/direct.ts index 9ab3988..78f5e75 100644 --- a/webpage/direct.ts +++ b/webpage/direct.ts @@ -4,7 +4,6 @@ import{ Message }from"./message.js"; import{ Localuser }from"./localuser.js"; import{User}from"./user.js"; import{ Member }from"./member.js"; -import{ SnowFlake }from"./snowflake.js"; import{ dirrectjson, memberjson }from"./jsontypes.js"; import{ Permissions }from"./permissions.js"; @@ -19,7 +18,6 @@ class Direct extends Guild{ this.headers=this.localuser.headers; this.channels=[]; this.channelids={}; - this.snowflake=new SnowFlake("@me"); this.properties={}; this.roles=[]; this.roleids=new Map(); @@ -84,7 +82,7 @@ dmPermissions.setPermission("USE_VAD",1); class Group extends Channel{ user:User; constructor(json:dirrectjson,owner:Direct){ - super(-1,owner); + super(-1,owner,json.id); this.owner=owner; this.headers=this.guild.headers; this.name=json.recipients[0]?.username; @@ -94,7 +92,6 @@ class Group extends Channel{ this.user=this.localuser.user; } this.name??=this.localuser.user.username; - this.snowflake=new SnowFlake(json.id); this.parent_id=null; this.parent=null; this.children=[]; @@ -106,7 +103,8 @@ class Group extends Channel{ if(this.lastmessageid){ this.position=Number((BigInt(this.lastmessageid)>>22n)+1420070400000n); } - this.position=-Math.max(this.position,this.snowflake.getUnixTime()); + + this.position=-Math.max(this.position,this.getUnixTime()); } createguildHTML(){ const div=document.createElement("div"); diff --git a/webpage/guild.ts b/webpage/guild.ts index 2935c04..9e02b94 100644 --- a/webpage/guild.ts +++ b/webpage/guild.ts @@ -10,12 +10,11 @@ import{ SnowFlake }from"./snowflake.js"; import{ channeljson, guildjson, emojijson, memberjson }from"./jsontypes.js"; import{ User }from"./user.js"; import{ Message }from"./message.js"; -class Guild{ +class Guild extends SnowFlake{ owner:Localuser; headers:Localuser["headers"]; channels:Channel[]; channelids:{[key:string]:Channel}; - snowflake:SnowFlake; properties; roles:Role[]; roleids:Map; @@ -27,9 +26,6 @@ class Guild{ member:Member; html:HTMLElement; emojis:emojijson[]; - get id(){ - return this.snowflake.id; - } static contextmenu=new Contextmenu("guild menu"); static setupcontextmenu(){ Guild.contextmenu.addbutton("Copy Guild id",function(this:Guild){ @@ -87,20 +83,20 @@ class Guild{ s1.options.push(new RoleList(permlist,this,this.updateRolePermissions.bind(this))); settings.show(); } - constructor(json:guildjson|-1,owner:Localuser,member:memberjson|User|null){ - if(json===-1||member===null){ + constructor(json:guildjson|-1,owner:Localuser,member:memberjson|User){ + if(json===-1){ + super("@me"); return; } if(json.stickers.length){ console.log(json.stickers,":3"); } - + super(json.id); this.emojis = json.emojis; this.owner=owner; this.headers=this.owner.headers; this.channels=[]; this.channelids={}; - this.snowflake=new SnowFlake(json.id); this.properties=json.properties; this.roles=[]; this.roleids=new Map(); @@ -203,7 +199,7 @@ class Guild{ full.show(); } async leave(){ - return fetch(this.info.api+"/users/@me/guilds/"+this.snowflake,{ + return fetch(this.info.api+"/users/@me/guilds/"+this.id,{ method: "DELETE", headers: this.headers }); @@ -351,7 +347,7 @@ class Guild{ full.show(); } async delete(){ - return fetch(this.info.api+"/guilds/"+this.snowflake+"/delete",{ + return fetch(this.info.api+"/guilds/"+this.id+"/delete",{ method: "POST", headers: this.headers, }); @@ -543,7 +539,7 @@ class Guild{ }); } async createRole(name:string){ - const fetched=await fetch(this.info.api+"/guilds/"+this.snowflake+"roles",{ + const fetched=await fetch(this.info.api+"/guilds/"+this.id+"roles",{ method: "POST", headers: this.headers, body: JSON.stringify({ @@ -563,7 +559,7 @@ class Guild{ role.permissions.allow=perms.allow; role.permissions.deny=perms.deny; - await fetch(this.info.api+"/guilds/"+this.snowflake+"/roles/"+this.snowflake,{ + await fetch(this.info.api+"/guilds/"+this.id+"/roles/"+role.id,{ method: "PATCH", headers: this.headers, body: JSON.stringify({ diff --git a/webpage/localuser.ts b/webpage/localuser.ts index 80af78a..c160836 100644 --- a/webpage/localuser.ts +++ b/webpage/localuser.ts @@ -106,8 +106,7 @@ class Localuser{ if(guild===undefined){ continue; } - const guildid=guild.snowflake; - (this.guildids.get(guildid.id) as Guild).channelids[thing.channel_id].readStateInfo(thing); + guild.channelids[thing.channel_id].readStateInfo(thing); } for(const thing of ready.d.relationships){ const user=new User(thing.user,this); diff --git a/webpage/message.ts b/webpage/message.ts index 593a181..916ba6a 100644 --- a/webpage/message.ts +++ b/webpage/message.ts @@ -11,7 +11,7 @@ import{ SnowFlake }from"./snowflake.js"; import{ memberjson, messagejson }from"./jsontypes.js"; import{Emoji}from"./emoji.js"; -class Message{ +class Message extends SnowFlake{ static contextmenu=new Contextmenu("message menu"); owner:Channel; headers:Localuser["headers"]; @@ -20,7 +20,6 @@ class Message{ mentions:User[]; mention_roles:Role[]; attachments:File[];//probably should be its own class tbh, should be Attachments[] - snowflake:SnowFlake; message_reference; type:number; timestamp:number; @@ -43,9 +42,6 @@ class Message{ div:HTMLDivElement|undefined; member:Member|undefined; reactions:messagejson["reactions"]; - get id(){ - return this.snowflake.id; - } static setup(){ this.del=new Promise(_=>{ this.resolve=_; @@ -82,6 +78,7 @@ class Message{ }); } constructor(messagejson:messagejson,owner:Channel){ + super(messagejson.id); this.owner=owner; this.headers=this.owner.headers; this.giveData(messagejson); @@ -119,7 +116,6 @@ class Message{ this.content=new MarkDown(messagejson[thing],this.channel); continue; }else if(thing ==="id"){ - this.snowflake=new SnowFlake(messagejson.id); continue; }else if(thing==="member"){ Member.new(messagejson.member as memberjson,this.guild).then(_=>{ @@ -161,7 +157,7 @@ class Message{ func(); } canDelete(){ - return this.channel.hasPermission("MANAGE_MESSAGES")||this.author.snowflake===this.localuser.user.snowflake; + return this.channel.hasPermission("MANAGE_MESSAGES")||this.author===this.localuser.user; } get channel(){ return this.owner; @@ -206,14 +202,14 @@ class Message{ return build; } async edit(content){ - return await fetch(this.info.api+"/channels/"+this.channel.snowflake+"/messages/"+this.id,{ + return await fetch(this.info.api+"/channels/"+this.channel.id+"/messages/"+this.id,{ method: "PATCH", headers: this.headers, body: JSON.stringify({content}) }); } delete(){ - fetch(`${this.info.api}/channels/${this.channel.snowflake}/messages/${this.id}`,{ + fetch(`${this.info.api}/channels/${this.channel.id}/messages/${this.id}`,{ headers: this.headers, method: "DELETE", }); @@ -381,7 +377,7 @@ class Message{ const newt=(new Date(this.timestamp).getTime())/1000; current=(newt-old)>600; } - const combine=(premessage?.author?.snowflake!=this.author.snowflake)||(current)||this.message_reference; + const combine=(premessage?.author!=this.author)||(current)||this.message_reference; if(combine){ const pfp=this.author.buildpfp(); this.author.bind(pfp,this.guild,false); @@ -567,7 +563,7 @@ class Message{ } buildhtml(premessage?:Message|undefined):HTMLElement{ if(this.div){ - console.error(`HTML for ${this.snowflake} already exists, aborting`);return this.div; + console.error(`HTML for ${this.id} already exists, aborting`);return this.div; } try{ const div=document.createElement("div"); diff --git a/webpage/role.ts b/webpage/role.ts index 3ba0c37..17863f1 100644 --- a/webpage/role.ts +++ b/webpage/role.ts @@ -4,11 +4,10 @@ import{Localuser}from"./localuser.js"; import{Guild}from"./guild.js"; import{ SnowFlake }from"./snowflake.js"; import{ rolesjson }from"./jsontypes.js"; -class Role{ +class Role extends SnowFlake{ permissions:Permissions; owner:Guild; color:number; - readonly snowflake:SnowFlake; name:string; info:Guild["info"]; hoist:boolean; @@ -16,15 +15,12 @@ class Role{ mentionable:boolean; unicode_emoji:string; headers:Guild["headers"]; - get id(){ - return this.snowflake.id; - } constructor(json:rolesjson, owner:Guild){ + super(json.id); this.headers=owner.headers; this.info=owner.info; for(const thing of Object.keys(json)){ if(thing==="id"){ - this.snowflake=new SnowFlake(json.id); continue; } this[thing]=json[thing]; diff --git a/webpage/snowflake.ts b/webpage/snowflake.ts index 557cec2..f436253 100644 --- a/webpage/snowflake.ts +++ b/webpage/snowflake.ts @@ -1,13 +1,16 @@ -class SnowFlake{ +abstract class SnowFlake{ public readonly id:string; constructor(id:string){ this.id=id; } getUnixTime():number{ + return SnowFlake.stringToUnixTime(this.id); + } + static stringToUnixTime(str:string){ try{ - return Number((BigInt(this.id)>>22n)+1420070400000n); + return Number((BigInt(str)>>22n)+1420070400000n); }catch{ - console.error(`The ID is corrupted, it's ${this.id} when it should be some number.`); + console.error(`The ID is corrupted, it's ${str} when it should be some number.`); return 0; } } diff --git a/webpage/user.ts b/webpage/user.ts index d666dac..8bb1230 100644 --- a/webpage/user.ts +++ b/webpage/user.ts @@ -7,10 +7,9 @@ import{Guild}from"./guild.js"; import{ SnowFlake }from"./snowflake.js"; import{ presencejson, userjson }from"./jsontypes.js"; -class User{ +class User extends SnowFlake{ owner:Localuser; hypotheticalpfp:boolean; - snowflake:SnowFlake; avatar:string|null; username:string; nickname:string|null=null; @@ -64,9 +63,6 @@ class User{ return"offline"; } } - get id(){ - return this.snowflake.id; - } static contextmenu=new Contextmenu("User Menu"); static setUpContextMenu(){ this.contextmenu.addbutton("Copy user id",function(this:User){ @@ -142,6 +138,7 @@ class User{ return this.owner; } constructor(userjson:userjson,owner:Localuser,dontclone=false){ + super(userjson.id); this.owner=owner; if(!owner){ console.error("missing localuser"); @@ -153,7 +150,6 @@ class User{ continue; } if(thing === "id"){ - this.snowflake=new SnowFlake(userjson[thing]); continue; } this[thing]=userjson[thing];