inital emoji support

This commit is contained in:
MathMan05 2024-08-05 19:06:26 -05:00
parent d2294d9ac7
commit 8b3fe48a74
12 changed files with 377 additions and 7 deletions

View file

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

BIN
webpage/emoji.bin Normal file

Binary file not shown.

75
webpage/emoji.ts Normal file
View file

@ -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;i<length;i++){
array[i]=read8();
}
const decoded=new TextDecoder("utf-8").decode(array.buffer);;
//console.log(array);
return decoded;
}
const build:{name:string,emojis:{name:string,emoji:string}[]}[]=[];
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};

View file

@ -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:Map<string,Map<string,(returns:memberjson|undefined)=>void>>=new Map();
async resolvemember(id:string,guildid:string):Promise<memberjson|undefined>{
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<memberjson|undefined>=new Promise((r)=>{
res=r;
})
this.waitingmembers.get(guildid).set(id,res);
this.getmembers();
return await promise;
}
fetchingmembers:Map<string,(r:memberjson[])=>void>=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<memberjson[]>=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};

View file

@ -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;

View file

@ -1532,3 +1532,7 @@ form div{
.hiddencat{
rotate:-90deg;
}
.svgicon{
width:.5in;
height:.5in;
}