From 8b3fe48a747186a56d436d723c1ad7871961858b Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Mon, 5 Aug 2024 19:06:26 -0500 Subject: [PATCH] inital emoji support --- .dist/channel.js | 2 + .dist/emoji.js | 67 +++++++++++++++++++++++++ .dist/localuser.js | 56 ++++++++++++++++++++- .dist/member.js | 1 + EmojiList/credit.txt | 2 + emoji-packer.js | 115 +++++++++++++++++++++++++++++++++++++++++++ webpage/channel.ts | 3 +- webpage/emoji.bin | Bin 0 -> 40262 bytes webpage/emoji.ts | 75 ++++++++++++++++++++++++++++ webpage/localuser.ts | 58 ++++++++++++++++++++-- webpage/member.ts | 1 + webpage/style.css | 4 ++ 12 files changed, 377 insertions(+), 7 deletions(-) create mode 100644 .dist/emoji.js create mode 100644 EmojiList/credit.txt create mode 100644 emoji-packer.js create mode 100644 webpage/emoji.bin create mode 100644 webpage/emoji.ts diff --git a/.dist/channel.js b/.dist/channel.js index 2aa588d..62367db 100644 --- a/.dist/channel.js +++ b/.dist/channel.js @@ -8,6 +8,8 @@ import { Settings, RoleList } from "./settings.js"; import { Role } from "./role.js"; import { InfiniteScroller } from "./infiniteScroller.js"; import { SnowFlake } from "./snowflake.js"; +import { Emoji } from "./emoji.js"; +new Emoji(); class Channel { editing; type; diff --git a/.dist/emoji.js b/.dist/emoji.js new file mode 100644 index 0000000..9cdf783 --- /dev/null +++ b/.dist/emoji.js @@ -0,0 +1,67 @@ +class Emoji { + static emojis; + static decodeEmojiList(buffer) { + const view = new DataView(buffer, 0); + let i = 0; + function read16() { + const int = view.getUint16(i); + i += 2; + return int; + } + function read8() { + const int = view.getUint8(i); + i += 1; + return int; + } + function readString8() { + return readStringNo(read8()); + } + function readString16() { + return readStringNo(read16()); + } + function readStringNo(length) { + const array = new Uint8Array(length); + for (let i = 0; i < length; i++) { + array[i] = read8(); + } + const decoded = new TextDecoder("utf-8").decode(array.buffer); + ; + //console.log(array); + return decoded; + } + const build = []; + let cats = read16(); + for (; cats !== 0; cats--) { + const name = readString16(); + const emojis = []; + let emojinumber = read16(); + for (; emojinumber !== 0; emojinumber--) { + //console.log(emojis); + const name = readString8(); + const len = read8(); + const skin_tone_support = len > 127; + const emoji = readStringNo(len - (+skin_tone_support * 128)); + emojis.push({ + name, + skin_tone_support, + emoji + }); + } + build.push({ + name, + emojis + }); + } + this.emojis = build; + console.log(build); + } + static grabEmoji() { + fetch("/emoji.bin").then(e => { + return e.arrayBuffer(); + }).then(e => { + Emoji.decodeEmojiList(e); + }); + } +} +Emoji.grabEmoji(); +export { Emoji }; diff --git a/.dist/localuser.js b/.dist/localuser.js index ccdb395..9d1844d 100644 --- a/.dist/localuser.js +++ b/.dist/localuser.js @@ -363,7 +363,7 @@ class Localuser { const div = document.createElement("div"); div.classList.add("home", "servericon"); img.src = "/icons/home.svg"; - img.classList.add("svgtheme"); + img.classList.add("svgtheme", "svgicon"); img["all"] = this.guildids.get("@me"); this.guildids.get("@me").html = outdiv; const unread = document.createElement("div"); @@ -407,7 +407,7 @@ class Localuser { const guilddsdiv = document.createElement("div"); const guildDiscoveryContainer = document.createElement("img"); guildDiscoveryContainer.src = "/icons/explore.svg"; - guildDiscoveryContainer.classList.add("svgtheme"); + guildDiscoveryContainer.classList.add("svgtheme", "svgicon"); guilddsdiv.classList.add("home", "servericon"); guilddsdiv.appendChild(guildDiscoveryContainer); serverlist.appendChild(guilddsdiv); @@ -922,5 +922,57 @@ class Localuser { ]); botDialog.show(); } + //---------- resolving members code ----------- + waitingmembers = new Map(); + async resolvemember(id, guildid) { + console.warn("this function is currently non-functional, either due to a bug in the client or the server, it's currently unclear, use at your own risk"); + if (!this.waitingmembers.has(guildid)) { + this.waitingmembers.set(guildid, new Map()); + } + let res; + const promise = new Promise((r) => { + res = r; + }); + this.waitingmembers.get(guildid).set(id, res); + this.getmembers(); + return await promise; + } + fetchingmembers = new Map(); + async getmembers() { + if (this.ws) { + this.waitingmembers.forEach(async (value, guildid) => { + const keys = value.keys(); + if (this.fetchingmembers.has(guildid)) { + return; + } + const build = []; + for (const key of keys) { + build.push(key); + } + ; + let res; + const promise = new Promise((r) => { + res = r; + }); + this.ws.send(JSON.stringify({ + op: 8, + d: { + query: "", + user_ids: build, + guild_id: guildid, + limit: 100, + nonce: "" + Math.floor(Math.random() * 100000000) + } + })); + this.fetchingmembers.set(guildid, res); + const data = await promise; + for (const thing of data) { + value.get(thing.id)(thing); + value.delete(thing.id); + } + this.getmembers(); + }); + } + } } export { Localuser }; diff --git a/.dist/member.js b/.dist/member.js index 3252692..8681e49 100644 --- a/.dist/member.js +++ b/.dist/member.js @@ -101,6 +101,7 @@ class Member { } const prom1 = fetch(guild.info.api.toString() + "/users/" + id + "/profile?with_mutual_guilds=true&with_mutual_friends_count=true&guild_id=" + guild.snowflake, { headers: guild.headers }); prom1.catch(_ => { console.log(_); }); + guild.localuser.resolvemember(id?.id, guild.id); const promoise = prom1.then(_ => _.json()).then(json => { const memb = new Member(json, guild); Member.already[guild.id][id] = memb; diff --git a/EmojiList/credit.txt b/EmojiList/credit.txt new file mode 100644 index 0000000..e5e6031 --- /dev/null +++ b/EmojiList/credit.txt @@ -0,0 +1,2 @@ +https://github.com/muan/unicode-emoji-json/ +the list is from here, though the actual file isn't included, if you want to compile the binary yourself, just put data-by-group.json in this file and run the needed script. diff --git a/emoji-packer.js b/emoji-packer.js new file mode 100644 index 0000000..2c0845f --- /dev/null +++ b/emoji-packer.js @@ -0,0 +1,115 @@ +const emojilist=require("./EmojiList/data-by-group.json"); +console.log(emojilist); + +const buffer=new ArrayBuffer(2**26); +const view = new DataView(buffer, 0); +let i=0; +function write16(numb){ + view.setUint16(i,numb); + i+=2; +} +function write8(numb){ + view.setUint8(i,numb); + i+=1; +} +function writeString8(str){ + const encode=new TextEncoder("utf-8").encode(str); + write8(encode.length); + for(const thing of encode){ + write8(thing); + } +} +function writeString16(str){ + const encode=new TextEncoder("utf-8").encode(str); + write16(encode.length); + for(const thing of encode){ + write8(thing); + } +} +function writeStringNo(str){ + const encode=new TextEncoder("utf-8").encode(str); + for(const thing of encode){ + write8(thing); + } +} + +write16(emojilist.length); +for(const thing of emojilist){ + writeString16(thing.name); + write16(thing.emojis.length); + for(const emoji of thing.emojis){ + writeString8(emoji.name); + write8(new TextEncoder("utf-8").encode(emoji.emoji).length+128*emoji.skin_tone_support); + writeStringNo(emoji.emoji); + } +} +const out=new ArrayBuffer(i); +const ar=new Uint8Array(out); +const br=new Uint8Array(buffer) +for(const thing in ar){ + ar[thing]=br[thing]; +} +console.log(i,ar); + +function decodeEmojiList(buffer){ + const view = new DataView(buffer, 0); + let i=0; + function read16(){ + const int=view.getUint16(i); + i+=2; + return int; + } + function read8(){ + const int=view.getUint8(i); + i+=1; + return int; + } + function readString8(){ + return readStringNo(read8()); + } + function readString16(){ + return readStringNo(read16()); + } + function readStringNo(length){ + const array=new Uint8Array(length); + + for(let i=0;i127; + const emoji=readStringNo(len-skin_tone_support*128); + emojis.push({ + name, + skin_tone_support, + emoji + }) + } + build.push({ + name, + emojis + }) + } + return build; +} +console.log(JSON.stringify(decodeEmojiList(out))); + +const fs = require('fs'); +fs.writeFile("./webpage/emoji.bin",new Uint8Array(out),_=>{ + +}); diff --git a/webpage/channel.ts b/webpage/channel.ts index 1bcdd83..60af6fa 100644 --- a/webpage/channel.ts +++ b/webpage/channel.ts @@ -11,7 +11,8 @@ import { Role } from "./role.js"; import {InfiniteScroller} from "./infiniteScroller.js"; import { SnowFlake } from "./snowflake.js"; import { channeljson, messagejson, readyjson } from "./jsontypes.js"; - +import {Emoji} from "./emoji.js"; +new Emoji(); declare global { interface NotificationOptions { image?: string diff --git a/webpage/emoji.bin b/webpage/emoji.bin new file mode 100644 index 0000000000000000000000000000000000000000..d29585e15f271dda09ad3155091e0261e0591b01 GIT binary patch literal 40262 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 Xto}xI7lUDETS=~?d=>wQ|K|S#M5dSm literal 0 HcmV?d00001 diff --git a/webpage/emoji.ts b/webpage/emoji.ts new file mode 100644 index 0000000..9ed3c69 --- /dev/null +++ b/webpage/emoji.ts @@ -0,0 +1,75 @@ +class Emoji{ + static emojis:{ + name:string, + emojis:{ + name:string, + emoji:string, + }[] + }[]; + static decodeEmojiList(buffer:ArrayBuffer){ + const view = new DataView(buffer, 0); + let i=0; + function read16(){ + const int=view.getUint16(i); + i+=2; + return int; + } + function read8(){ + const int=view.getUint8(i); + i+=1; + return int; + } + function readString8(){ + return readStringNo(read8()); + } + function readString16(){ + return readStringNo(read16()); + } + function readStringNo(length:number){ + const array=new Uint8Array(length); + + for(let i=0;i127; + const emoji=readStringNo(len-(+skin_tone_support*128)); + emojis.push({ + name, + skin_tone_support, + emoji + }) + } + build.push({ + name, + emojis + }) + } + this.emojis=build; + console.log(build); + } + static grabEmoji(){ + fetch("/emoji.bin").then(e=>{ + return e.arrayBuffer() + }).then(e=>{ + Emoji.decodeEmojiList(e); + }) + } +} +Emoji.grabEmoji(); +export {Emoji}; diff --git a/webpage/localuser.ts b/webpage/localuser.ts index 4f9e1f5..72d25d4 100644 --- a/webpage/localuser.ts +++ b/webpage/localuser.ts @@ -7,7 +7,7 @@ import {Fullscreen} from "./fullscreen.js"; import {setTheme, Specialuser} from "./login.js"; import { SnowFlake } from "./snowflake.js"; import { Message } from "./message.js"; -import { channeljson, readyjson, userjson } from "./jsontypes.js"; +import { channeljson, guildjson, memberjson, readyjson, userjson } from "./jsontypes.js"; const wsCodesRetry=new Set([4000,4003,4005,4007,4008,4009]); @@ -295,7 +295,7 @@ class Localuser{ } }else if(temp.op===10){ - console.log("heartbeat down") + console.log("heartbeat down"); this.wsinterval=setInterval(_=>{ if (this.connectionSucceed===0) this.connectionSucceed=Date.now() @@ -375,7 +375,7 @@ class Localuser{ div.classList.add("home","servericon"); img.src="/icons/home.svg"; - img.classList.add("svgtheme") + img.classList.add("svgtheme","svgicon") img["all"]=this.guildids.get("@me"); this.guildids.get("@me").html=outdiv; const unread=document.createElement("div"); @@ -422,7 +422,7 @@ class Localuser{ const guilddsdiv=document.createElement("div"); const guildDiscoveryContainer=document.createElement("img"); guildDiscoveryContainer.src="/icons/explore.svg"; - guildDiscoveryContainer.classList.add("svgtheme"); + guildDiscoveryContainer.classList.add("svgtheme","svgicon"); guilddsdiv.classList.add("home","servericon"); guilddsdiv.appendChild(guildDiscoveryContainer); serverlist.appendChild(guilddsdiv); @@ -964,5 +964,55 @@ class Localuser{ ); botDialog.show(); } + + //---------- resolving members code ----------- + waitingmembers:Mapvoid>>=new Map(); + async resolvemember(id:string,guildid:string):Promise{ + console.warn("this function is currently non-functional, either due to a bug in the client or the server, it's currently unclear, use at your own risk"); + if(!this.waitingmembers.has(guildid)){ + this.waitingmembers.set(guildid,new Map()); + } + let res:(returns:memberjson|undefined)=>void; + const promise:Promise=new Promise((r)=>{ + res=r; + }) + this.waitingmembers.get(guildid).set(id,res); + this.getmembers(); + return await promise; + } + fetchingmembers:Mapvoid>=new Map(); + async getmembers(){ + if(this.ws){ + this.waitingmembers.forEach(async (value,guildid)=>{ + const keys=value.keys(); + if(this.fetchingmembers.has(guildid)){ + return; + } + const build:string[]=[]; + for(const key of keys){build.push(key)}; + let res:(r:memberjson[])=>void; + const promise:Promise=new Promise((r)=>{ + res=r; + }) + this.ws.send(JSON.stringify({ + op:8, + d:{ + query:"", + user_ids:build, + guild_id:guildid, + limit:100, + nonce:""+Math.floor(Math.random()*100000000) + } + })); + this.fetchingmembers.set(guildid,res); + const data=await promise; + for(const thing of data){ + value.get(thing.id)(thing); + value.delete(thing.id); + } + this.getmembers(); + }) + } + } } export {Localuser}; diff --git a/webpage/member.ts b/webpage/member.ts index 280aaa7..9d19df6 100644 --- a/webpage/member.ts +++ b/webpage/member.ts @@ -94,6 +94,7 @@ class Member{ } const prom1= fetch(guild.info.api.toString()+"/users/"+id+"/profile?with_mutual_guilds=true&with_mutual_friends_count=true&guild_id="+guild.snowflake,{headers:guild.headers}) prom1.catch(_=>{console.log(_)}) + guild.localuser.resolvemember(id?.id,guild.id); const promoise=prom1.then(_=>_.json()).then(json=>{ const memb=new Member(json,guild); Member.already[guild.id][id]=memb; diff --git a/webpage/style.css b/webpage/style.css index 0a849b5..42a328c 100644 --- a/webpage/style.css +++ b/webpage/style.css @@ -1532,3 +1532,7 @@ form div{ .hiddencat{ rotate:-90deg; } +.svgicon{ + width:.5in; + height:.5in; +} \ No newline at end of file