emoji autofill
This commit is contained in:
parent
79689b8d42
commit
f36b9382f1
5 changed files with 96 additions and 38 deletions
|
@ -1,18 +1,20 @@
|
||||||
import{ Contextmenu }from"./contextmenu.js";
|
import{ Contextmenu }from"./contextmenu.js";
|
||||||
import{ Guild }from"./guild.js";
|
import{ Guild }from"./guild.js";
|
||||||
|
import { emojijson } from "./jsontypes.js";
|
||||||
import{ Localuser }from"./localuser.js";
|
import{ Localuser }from"./localuser.js";
|
||||||
|
|
||||||
//I need to recompile the emoji format for translation
|
//I need to recompile the emoji format for translation
|
||||||
class Emoji{
|
class Emoji{
|
||||||
static emojis: {
|
static emojis: {
|
||||||
name: string;
|
name: string;
|
||||||
emojis: {
|
emojis: {
|
||||||
name: string;
|
name: string;
|
||||||
emoji: string;
|
emoji: string;
|
||||||
}[];
|
}[];
|
||||||
}[];
|
}[];
|
||||||
name: string;
|
name: string;
|
||||||
id: string;
|
id?: string;
|
||||||
|
emoji?:string;
|
||||||
animated: boolean;
|
animated: boolean;
|
||||||
owner: Guild | Localuser;
|
owner: Guild | Localuser;
|
||||||
get guild(){
|
get guild(){
|
||||||
|
@ -32,30 +34,34 @@ class Emoji{
|
||||||
return this.owner.info;
|
return this.owner.info;
|
||||||
}
|
}
|
||||||
constructor(
|
constructor(
|
||||||
json: { name: string; id: string; animated: boolean },
|
json: emojijson,
|
||||||
owner: Guild | Localuser
|
owner: Guild | Localuser
|
||||||
){
|
){
|
||||||
this.name = json.name;
|
this.name = json.name;
|
||||||
this.id = json.id;
|
this.id = json.id;
|
||||||
this.animated = json.animated;
|
this.animated = json.animated||false;
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
|
this.emoji=json.emoji;
|
||||||
}
|
}
|
||||||
getHTML(bigemoji: boolean = false){
|
getHTML(bigemoji: boolean = false){
|
||||||
const emojiElem = document.createElement("img");
|
if(this.id){
|
||||||
emojiElem.classList.add("md-emoji");
|
const emojiElem = document.createElement("img");
|
||||||
emojiElem.classList.add(bigemoji ? "bigemoji" : "smallemoji");
|
emojiElem.classList.add("md-emoji");
|
||||||
emojiElem.crossOrigin = "anonymous";
|
emojiElem.classList.add(bigemoji ? "bigemoji" : "smallemoji");
|
||||||
emojiElem.src =
|
emojiElem.crossOrigin = "anonymous";
|
||||||
this.info.cdn +
|
emojiElem.src =this.info.cdn+"/emojis/"+this.id+"."+(this.animated ? "gif" : "png")+"?size=32";
|
||||||
"/emojis/" +
|
emojiElem.alt = this.name;
|
||||||
this.id +
|
emojiElem.loading = "lazy";
|
||||||
"." +
|
return emojiElem;
|
||||||
(this.animated ? "gif" : "png") +
|
}else if(this.emoji){
|
||||||
"?size=32";
|
const emojiElem = document.createElement("span");
|
||||||
|
emojiElem.classList.add("md-emoji");
|
||||||
emojiElem.alt = this.name;
|
emojiElem.classList.add(bigemoji ? "bigemoji" : "smallemoji");
|
||||||
emojiElem.loading = "lazy";
|
emojiElem.textContent=this.emoji;
|
||||||
return emojiElem;
|
return emojiElem;
|
||||||
|
}else{
|
||||||
|
throw new Error("This path should *never* be gone down, this means a malformed emoji");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
static decodeEmojiList(buffer: ArrayBuffer){
|
static decodeEmojiList(buffer: ArrayBuffer){
|
||||||
const view = new DataView(buffer, 0);
|
const view = new DataView(buffer, 0);
|
||||||
|
@ -92,10 +98,10 @@ class Emoji{
|
||||||
for(; cats !== 0; cats--){
|
for(; cats !== 0; cats--){
|
||||||
const name = readString16();
|
const name = readString16();
|
||||||
const emojis: {
|
const emojis: {
|
||||||
name: string;
|
name: string;
|
||||||
skin_tone_support: boolean;
|
skin_tone_support: boolean;
|
||||||
emoji: string;
|
emoji: string;
|
||||||
}[] = [];
|
}[] = [];
|
||||||
let emojinumber = read16();
|
let emojinumber = read16();
|
||||||
for(; emojinumber !== 0; emojinumber--){
|
for(; emojinumber !== 0; emojinumber--){
|
||||||
//console.log(emojis);
|
//console.log(emojis);
|
||||||
|
@ -248,6 +254,40 @@ class Emoji{
|
||||||
menu.append(body);
|
menu.append(body);
|
||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
static searchEmoji(search:string,localuser:Localuser,results=50):[Emoji,number][]{
|
||||||
|
const ranked:[emojijson,number][]=[];
|
||||||
|
function similar(json:emojijson){
|
||||||
|
if(json.name.includes(search)){
|
||||||
|
ranked.push([json,search.length/json.name.length]);
|
||||||
|
return true;
|
||||||
|
}else if(json.name.toLowerCase().includes(search.toLowerCase())){
|
||||||
|
ranked.push([json,search.length/json.name.length/1.4]);
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(const group of this.emojis){
|
||||||
|
for(const emoji of group.emojis){
|
||||||
|
similar(emoji)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const weakGuild=new WeakMap<emojijson,Guild>();
|
||||||
|
for(const guild of localuser.guilds){
|
||||||
|
if(guild.id!=="@me"&&guild.emojis.length!==0){
|
||||||
|
for(const emoji of guild.emojis){
|
||||||
|
if(similar(emoji)){
|
||||||
|
weakGuild.set(emoji,guild);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ranked.sort((a,b)=>b[1]-a[1]);
|
||||||
|
return ranked.splice(0,results).map(a=>{
|
||||||
|
return [new Emoji(a[0],weakGuild.get(a[0])||localuser),a[1]];
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Emoji.grabEmoji();
|
Emoji.grabEmoji();
|
||||||
export{ Emoji };
|
export{ Emoji };
|
||||||
|
|
|
@ -166,6 +166,7 @@ type emojijson = {
|
||||||
name: string;
|
name: string;
|
||||||
id?: string;
|
id?: string;
|
||||||
animated?: boolean;
|
animated?: boolean;
|
||||||
|
emoji?:string
|
||||||
};
|
};
|
||||||
|
|
||||||
type guildjson = {
|
type guildjson = {
|
||||||
|
|
|
@ -5,14 +5,15 @@ import{ AVoice }from"./audio.js";
|
||||||
import{ User }from"./user.js";
|
import{ User }from"./user.js";
|
||||||
import{ Dialog }from"./dialog.js";
|
import{ Dialog }from"./dialog.js";
|
||||||
import{ getapiurls, getBulkInfo, setTheme, Specialuser, SW }from"./login.js";
|
import{ getapiurls, getBulkInfo, setTheme, Specialuser, SW }from"./login.js";
|
||||||
import{channeljson,guildjson,mainuserjson,memberjson,memberlistupdatejson,messageCreateJson,presencejson,readyjson,startTypingjson,userjson,wsjson,}from"./jsontypes.js";
|
import{channeljson,guildjson,mainuserjson,memberjson,memberlistupdatejson,messageCreateJson,presencejson,readyjson,startTypingjson,wsjson,}from"./jsontypes.js";
|
||||||
import{ Member }from"./member.js";
|
import{ Member }from"./member.js";
|
||||||
import{ Form, FormError, Options, Settings }from"./settings.js";
|
import{ Form, FormError, Options, Settings }from"./settings.js";
|
||||||
import{ getTextNodeAtPosition, MarkDown, saveCaretPosition }from"./markdown.js";
|
import{ getTextNodeAtPosition, MarkDown }from"./markdown.js";
|
||||||
import { Bot } from "./bot.js";
|
import { Bot } from "./bot.js";
|
||||||
import { Role } from "./role.js";
|
import { Role } from "./role.js";
|
||||||
import { VoiceFactory } from "./voice.js";
|
import { VoiceFactory } from "./voice.js";
|
||||||
import { I18n, langmap } from "./i18n.js";
|
import { I18n, langmap } from "./i18n.js";
|
||||||
|
import { Emoji } from "./emoji.js";
|
||||||
|
|
||||||
const wsCodesRetry = new Set([4000,4001,4002, 4003, 4005, 4007, 4008, 4009]);
|
const wsCodesRetry = new Set([4000,4001,4002, 4003, 4005, 4007, 4008, 4009]);
|
||||||
|
|
||||||
|
@ -1738,7 +1739,7 @@ class Localuser{
|
||||||
this.typeMd.txt = raw.split("");
|
this.typeMd.txt = raw.split("");
|
||||||
this.typeMd.boxupdate(typebox);
|
this.typeMd.boxupdate(typebox);
|
||||||
}
|
}
|
||||||
MDSearchOptions(options:[string,string][],original:string){
|
MDSearchOptions(options:[string,string,void|HTMLElement][],original:string){
|
||||||
const div=document.getElementById("searchOptions");
|
const div=document.getElementById("searchOptions");
|
||||||
if(!div)return;
|
if(!div)return;
|
||||||
div.innerHTML="";
|
div.innerHTML="";
|
||||||
|
@ -1751,7 +1752,12 @@ class Localuser{
|
||||||
i++;
|
i++;
|
||||||
const span=document.createElement("span");
|
const span=document.createElement("span");
|
||||||
htmloptions.push(span);
|
htmloptions.push(span);
|
||||||
span.textContent=thing[0];
|
if(thing[2]){
|
||||||
|
console.log(thing);
|
||||||
|
span.append(thing[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
span.append(thing[0]);
|
||||||
span.onclick=(e)=>{
|
span.onclick=(e)=>{
|
||||||
|
|
||||||
if(e){
|
if(e){
|
||||||
|
@ -1838,7 +1844,7 @@ class Localuser{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
maybe.sort((a,b)=>b[0]-a[0]);
|
maybe.sort((a,b)=>b[0]-a[0]);
|
||||||
this.MDSearchOptions(maybe.map((a)=>["# "+a[1].name,`<#${a[1].id}> `]),orginal);
|
this.MDSearchOptions(maybe.map((a)=>["# "+a[1].name,`<#${a[1].id}> `,undefined]),orginal);
|
||||||
}
|
}
|
||||||
async getUser(id:string){
|
async getUser(id:string){
|
||||||
if(this.userMap.has(id)){
|
if(this.userMap.has(id)){
|
||||||
|
@ -1857,7 +1863,7 @@ class Localuser{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
members.sort((a,b)=>b[1]-a[1]);
|
members.sort((a,b)=>b[1]-a[1]);
|
||||||
this.MDSearchOptions(members.map((a)=>["@"+a[0].name,`<@${a[0].id}> `]),original);
|
this.MDSearchOptions(members.map((a)=>["@"+a[0].name,`<@${a[0].id}> `,undefined]),original);
|
||||||
}
|
}
|
||||||
MDFindMention(name:string,original:string){
|
MDFindMention(name:string,original:string){
|
||||||
if(this.ws&&this.lookingguild){
|
if(this.ws&&this.lookingguild){
|
||||||
|
@ -1901,6 +1907,13 @@ class Localuser{
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
findEmoji(search:string,orginal:string){
|
||||||
|
const emj=Emoji.searchEmoji(search,this,10);
|
||||||
|
const map=emj.map(([emoji]):[string,string,HTMLElement]=>{
|
||||||
|
return [emoji.name,emoji.id?`<${emoji.animated?"a":""}:${emoji.name}:${emoji.id}`:emoji.emoji as string,emoji.getHTML()]
|
||||||
|
})
|
||||||
|
this.MDSearchOptions(map,orginal);
|
||||||
|
}
|
||||||
search(str:string,pre:boolean){
|
search(str:string,pre:boolean){
|
||||||
if(!pre){
|
if(!pre){
|
||||||
const match=str.match(this.autofillregex);
|
const match=str.match(this.autofillregex);
|
||||||
|
@ -1916,7 +1929,9 @@ class Localuser{
|
||||||
break;
|
break;
|
||||||
case ":":
|
case ":":
|
||||||
if(search.length>=2){
|
if(search.length>=2){
|
||||||
console.log("implement me");
|
this.findEmoji(search,str)
|
||||||
|
}else{
|
||||||
|
this.MDSearchOptions([],"");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -612,8 +612,7 @@ txt[j + 1] === undefined)
|
||||||
appendcurrent();
|
appendcurrent();
|
||||||
i = j;
|
i = j;
|
||||||
const isEmojiOnly = txt.join("").trim() === buildjoin.trim();
|
const isEmojiOnly = txt.join("").trim() === buildjoin.trim();
|
||||||
const owner =
|
const owner = this.owner instanceof Channel ? this.owner.guild : this.owner;
|
||||||
this.owner instanceof Channel ? this.owner.guild : this.owner;
|
|
||||||
if(!owner) continue;
|
if(!owner) continue;
|
||||||
const emoji = new Emoji(
|
const emoji = new Emoji(
|
||||||
{ name: buildjoin, id: parts[2], animated: Boolean(parts[1]) },
|
{ name: buildjoin, id: parts[2], animated: Boolean(parts[1]) },
|
||||||
|
|
|
@ -29,13 +29,16 @@ body {
|
||||||
bottom:0;
|
bottom:0;
|
||||||
width: calc(100% - 32px);
|
width: calc(100% - 32px);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
span {
|
> span {
|
||||||
transition: background .1s;
|
transition: background .1s;
|
||||||
margin-bottom:.025in;
|
margin-bottom:.025in;
|
||||||
margin-top:.025in;
|
margin-top:.025in;
|
||||||
padding:.075in .05in;
|
padding:.075in .05in;
|
||||||
border-radius:.03in;
|
border-radius:.03in;
|
||||||
cursor:pointer;
|
cursor:pointer;
|
||||||
|
> span, img{
|
||||||
|
margin-right:.05in;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
span.selected{
|
span.selected{
|
||||||
background:var(--button-bg);
|
background:var(--button-bg);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue