resolve members better and with the WS

This commit is contained in:
MathMan05 2024-08-14 14:01:51 -05:00
parent a45188c1fc
commit 6f97a06cd3
10 changed files with 170 additions and 159 deletions

View file

@ -5,6 +5,7 @@ import { Dialog } from "./dialog.js";
import { Member } from "./member.js"; import { Member } from "./member.js";
import { Settings, RoleList } from "./settings.js"; import { Settings, RoleList } from "./settings.js";
import { SnowFlake } from "./snowflake.js"; import { SnowFlake } from "./snowflake.js";
import { User } from "./user.js";
class Guild { class Guild {
owner; owner;
headers; headers;
@ -92,7 +93,12 @@ class Guild {
this.roles.push(roleh); this.roles.push(roleh);
this.roleids.set(roleh.snowflake, roleh); this.roleids.set(roleh.snowflake, roleh);
} }
Member.resolve(member, this).then(_ => this.member = _); if (member instanceof User) {
Member.resolveMember(member, this).then(_ => this.member = _);
}
else {
Member.new(member, this).then(_ => this.member = _);
}
for (const thing of json.channels) { for (const thing of json.channels) {
const temp = new Channel(thing, this); const temp = new Channel(thing, this);
this.channels.push(temp); this.channels.push(temp);

View file

@ -161,7 +161,7 @@ class Localuser {
if (temp.op === 0 && temp.t === "READY") { if (temp.op === 0 && temp.t === "READY") {
returny(); returny();
} }
this.handleEvent(temp); await this.handleEvent(temp);
} }
catch { } catch { }
} }
@ -196,7 +196,7 @@ class Localuser {
if (temp.op === 0 && temp.t === "READY") { if (temp.op === 0 && temp.t === "READY") {
returny(); returny();
} }
this.handleEvent(temp); await this.handleEvent(temp);
} }
catch (e) { catch (e) {
console.error(e); console.error(e);
@ -240,7 +240,7 @@ class Localuser {
await promise; await promise;
return; return;
} }
handleEvent(temp) { async handleEvent(temp) {
console.debug(temp); console.debug(temp);
if (temp.s) if (temp.s)
this.lastSequence = temp.s; this.lastSequence = temp.s;
@ -314,7 +314,7 @@ class Localuser {
const guild = SnowFlake.getSnowFlakeFromID(temp.d.guild_id, Guild).getObject(); const guild = SnowFlake.getSnowFlakeFromID(temp.d.guild_id, Guild).getObject();
let thing; let thing;
if (temp.d.member) { if (temp.d.member) {
thing = new Member(temp.d.member, guild); thing = await Member.new(temp.d.member, guild);
} }
else { else {
thing = { id: temp.d.user_id }; thing = { id: temp.d.user_id };
@ -1033,8 +1033,6 @@ class Localuser {
//---------- resolving members code ----------- //---------- resolving members code -----------
waitingmembers = new Map(); waitingmembers = new Map();
async resolvemember(id, guildid) { async resolvemember(id, guildid) {
console.warn("this function may or may not work on any instance, use at your own risk");
//throw new Error("Not implemented on the server side and not fully implemented, do not use");
if (!this.waitingmembers.has(guildid)) { if (!this.waitingmembers.has(guildid)) {
this.waitingmembers.set(guildid, new Map()); this.waitingmembers.set(guildid, new Map());
} }

View file

@ -1,14 +1,12 @@
import { User } from "./user.js"; import { User } from "./user.js";
import { Role } from "./role.js"; import { Role } from "./role.js";
import { Guild } from "./guild.js";
import { Contextmenu } from "./contextmenu.js"; import { Contextmenu } from "./contextmenu.js";
import { SnowFlake } from "./snowflake.js"; import { SnowFlake } from "./snowflake.js";
class Member { class Member {
static already = {}; static already = {};
owner; owner;
user; user;
roles; roles = [];
error;
id; id;
static contextmenu = new Contextmenu("User Menu"); static contextmenu = new Contextmenu("User Menu");
static setUpContextMenu() { static setUpContextMenu() {
@ -22,19 +20,15 @@ class Member {
}); });
}); });
} }
constructor(memberjson, owner, error = false) { constructor(memberjson, owner) {
this.error = error; if (User.userids[memberjson.id]) {
this.owner = owner; this.user = User.userids[memberjson.id];
let membery = memberjson;
this.roles = [];
if (!error) {
if (memberjson["guild_member"]) {
memberjson = memberjson;
membery = memberjson.guild_member;
}
} }
membery = membery; else {
for (const thing of Object.keys(membery)) { this.user = new User(memberjson.user, owner.localuser);
}
this.owner = owner;
for (const thing of Object.keys(memberjson)) {
if (thing === "guild") { if (thing === "guild") {
continue; continue;
} }
@ -42,23 +36,17 @@ class Member {
continue; continue;
} }
if (thing === "roles") { if (thing === "roles") {
for (const strrole of membery["roles"]) { for (const strrole of memberjson["roles"]) {
const role = SnowFlake.getSnowFlakeFromID(strrole, Role).getObject(); const role = SnowFlake.getSnowFlakeFromID(strrole, Role).getObject();
this.roles.push(role); this.roles.push(role);
} }
continue; continue;
} }
this[thing] = membery[thing]; this[thing] = memberjson[thing];
} }
if (error) { if (SnowFlake.getSnowFlakeFromID(this?.id, User)) {
this.user = memberjson; this.user = SnowFlake.getSnowFlakeFromID(this.id, User).getObject();
} return;
else {
if (SnowFlake.getSnowFlakeFromID(this?.id, User)) {
this.user = SnowFlake.getSnowFlakeFromID(this.id, User).getObject();
return;
}
this.user = new User(membery.user, owner.localuser);
} }
} }
get guild() { get guild() {
@ -70,53 +58,59 @@ class Member {
get info() { get info() {
return this.owner.info; return this.owner.info;
} }
static async resolve(unkown, guild) { static async new(memberjson, owner) {
if (!(guild instanceof Guild)) { const user = new User(memberjson.user, owner.localuser);
console.error(guild); if (user.members.has(owner)) {
} let memb = user.members.get(owner);
let user; if (memb === undefined) {
let id; memb = new Member(memberjson, owner);
if (unkown instanceof User) { user.members.set(owner, memb);
user = unkown; return memb;
id = user.snowflake; }
} else if (memb instanceof Promise) {
else if (typeof unkown === typeof "") { return await memb; //I should do something else, though for now this is "good enough"
id = new SnowFlake(unkown, undefined); }
else {
return memb;
}
} }
else { else {
return new Member(unkown, guild); const memb = new Member(memberjson, owner);
user.members.set(owner, memb);
return memb;
} }
if (guild.id === "@me") { }
return null; static async resolveMember(user, guild) {
} const maybe = user.members.get(guild);
if (!Member.already[guild.id]) { if (!user.members.has(guild)) {
Member.already[guild.id] = {}; const membpromise = guild.localuser.resolvemember(user.id, guild.id);
} let res;
else if (Member.already[guild.id][id]) { const promise = new Promise(r => { res = r; });
const memb = Member.already[guild.id][id]; user.members.set(guild, promise);
if (memb instanceof Promise) { const membjson = await membpromise;
return await memb; if (membjson === undefined) {
res(undefined);
return undefined;
}
else {
const member = new Member(membjson, guild);
res(member);
return member;
} }
return memb;
} }
guild.localuser.resolvemember(id.id, guild.id); if (maybe instanceof Promise) {
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 }); return await maybe;
prom1.catch(_ => { console.log(_); });
const promoise = prom1.then(_ => _.json()).then(json => {
const memb = new Member(json, guild);
Member.already[guild.id][id] = memb;
return memb;
});
Member.already[guild.id][id] = promoise;
try {
return await promoise;
} }
catch (_) { else {
const memb = new Member(user, guild, true); return maybe;
Member.already[guild.id][id] = memb;
return memb;
} }
} }
/**
* @todo
*/
highInfo() {
fetch(this.info.api + "/users/" + this.id + "/profile?with_mutual_guilds=true&with_mutual_friends_count=true&guild_id=" + this.guild.id, { headers: this.guild.headers });
}
hasRole(ID) { hasRole(ID) {
console.log(this.roles, ID); console.log(this.roles, ID);
for (const thing of this.roles) { for (const thing of this.roles) {
@ -149,13 +143,11 @@ class Member {
return; return;
} }
; ;
if (this.error) { /*
const error = document.createElement("span"); if(this.error){
error.textContent = "!";
error.classList.add("membererror");
html.after(error);
return;
} }
*/
html.style.color = this.getColor(); html.style.color = this.getColor();
} }
this.profileclick(html); this.profileclick(html);

View file

@ -107,7 +107,7 @@ class Message {
continue; continue;
} }
else if (thing === "member") { else if (thing === "member") {
this.member = new Member(messagejson.member, this.guild); Member.new(messagejson.member, this.guild).then(_ => { this.member = _; });
continue; continue;
} }
else if (thing === "embeds") { else if (thing === "embeds") {

View file

@ -21,6 +21,7 @@ class User {
premium_type; premium_type;
theme_colors; theme_colors;
badge_ids; badge_ids;
members = new WeakMap();
clone() { clone() {
return new User({ return new User({
username: this.username, username: this.username,
@ -97,7 +98,7 @@ class User {
} }
} }
async resolvemember(guild) { async resolvemember(guild) {
return await Member.resolve(this, guild); return await Member.resolveMember(this, guild);
} }
buildpfp() { buildpfp() {
const pfp = document.createElement('img'); const pfp = document.createElement('img');
@ -114,7 +115,14 @@ class User {
} }
bind(html, guild = null) { bind(html, guild = null) {
if (guild && guild.id !== "@me") { if (guild && guild.id !== "@me") {
Member.resolve(this, guild).then(_ => { Member.resolveMember(this, guild).then(_ => {
if (_ === undefined) {
const error = document.createElement("span");
error.textContent = "!";
error.classList.add("membererror");
html.after(error);
return;
}
_.bind(html); _.bind(html);
}).catch(_ => { }).catch(_ => {
console.log(_); console.log(_);

View file

@ -7,7 +7,8 @@ import {Member} from "./member.js";
import {Settings,RoleList} from "./settings.js"; import {Settings,RoleList} from "./settings.js";
import {Permissions} from "./permissions.js"; import {Permissions} from "./permissions.js";
import { SnowFlake } from "./snowflake.js"; import { SnowFlake } from "./snowflake.js";
import { channeljson, guildjson, emojijson } from "./jsontypes.js"; import { channeljson, guildjson, emojijson, memberjson } from "./jsontypes.js";
import { User } from "./user.js";
class Guild{ class Guild{
owner:Localuser; owner:Localuser;
headers:Localuser["headers"]; headers:Localuser["headers"];
@ -81,7 +82,7 @@ class Guild{
s1.options.push(new RoleList(permlist,this,this.updateRolePermissions.bind(this))); s1.options.push(new RoleList(permlist,this,this.updateRolePermissions.bind(this)));
settings.show(); settings.show();
} }
constructor(json:guildjson|-1,owner:Localuser,member){ constructor(json:guildjson|-1,owner:Localuser,member:memberjson|User){
if(json===-1){ if(json===-1){
return; return;
} }
@ -101,7 +102,12 @@ class Guild{
this.roles.push(roleh) this.roles.push(roleh)
this.roleids.set(roleh.snowflake,roleh); this.roleids.set(roleh.snowflake,roleh);
} }
Member.resolve(member,this).then(_=>this.member=_); if(member instanceof User){
Member.resolveMember(member,this).then(_=>this.member=_);
}else{
Member.new(member,this).then(_=>this.member=_);
}
for(const thing of json.channels){ for(const thing of json.channels){
const temp=new Channel(thing,this); const temp=new Channel(thing,this);
this.channels.push(temp); this.channels.push(temp);

View file

@ -167,7 +167,7 @@ class Localuser{
if(temp.op===0&&temp.t==="READY"){ if(temp.op===0&&temp.t==="READY"){
returny(); returny();
} }
this.handleEvent(temp); await this.handleEvent(temp);
}catch{} }catch{}
} }
})(); })();
@ -205,7 +205,7 @@ class Localuser{
if(temp.op===0&&temp.t==="READY"){ if(temp.op===0&&temp.t==="READY"){
returny(); returny();
} }
this.handleEvent(temp); await this.handleEvent(temp);
}catch(e){ }catch(e){
console.error(e); console.error(e);
}finally{ }finally{
@ -247,7 +247,7 @@ class Localuser{
await promise; await promise;
return; return;
} }
handleEvent(temp){ async handleEvent(temp){
console.debug(temp); console.debug(temp);
if (temp.s) this.lastSequence=temp.s; if (temp.s) this.lastSequence=temp.s;
if(temp.op==0){ if(temp.op==0){
@ -320,7 +320,7 @@ class Localuser{
const guild=SnowFlake.getSnowFlakeFromID(temp.d.guild_id,Guild).getObject(); const guild=SnowFlake.getSnowFlakeFromID(temp.d.guild_id,Guild).getObject();
let thing:Member|{id:string}; let thing:Member|{id:string};
if(temp.d.member){ if(temp.d.member){
thing=new Member(temp.d.member,guild); thing=await Member.new(temp.d.member,guild);
}else{ }else{
thing={id:temp.d.user_id} thing={id:temp.d.user_id}
} }
@ -1065,8 +1065,6 @@ class Localuser{
//---------- resolving members code ----------- //---------- resolving members code -----------
waitingmembers:Map<string,Map<string,(returns:memberjson|undefined)=>void>>=new Map(); waitingmembers:Map<string,Map<string,(returns:memberjson|undefined)=>void>>=new Map();
async resolvemember(id:string,guildid:string):Promise<memberjson|undefined>{ async resolvemember(id:string,guildid:string):Promise<memberjson|undefined>{
console.warn("this function may or may not work on any instance, use at your own risk");
//throw new Error("Not implemented on the server side and not fully implemented, do not use");
if(!this.waitingmembers.has(guildid)){ if(!this.waitingmembers.has(guildid)){
this.waitingmembers.set(guildid,new Map()); this.waitingmembers.set(guildid,new Map());
} }

View file

@ -9,8 +9,7 @@ class Member{
static already={}; static already={};
owner:Guild; owner:Guild;
user:User; user:User;
roles:Role[]; roles:Role[]=[];
error:boolean;
id:string; id:string;
static contextmenu:Contextmenu=new Contextmenu("User Menu"); static contextmenu:Contextmenu=new Contextmenu("User Menu");
static setUpContextMenu(){ static setUpContextMenu(){
@ -25,39 +24,31 @@ class Member{
}); });
}); });
} }
constructor(memberjson:memberjson|User|{guild_member:memberjson,user:userjson},owner:Guild,error=false){ private constructor(memberjson:memberjson,owner:Guild){
this.error=error; if(User.userids[memberjson.id]){
this.owner=owner; this.user=User.userids[memberjson.id];
let membery=memberjson; }else{
this.roles=[]; this.user=new User(memberjson.user,owner.localuser);
if(!error){
if(memberjson["guild_member"]){
memberjson=memberjson as {guild_member:memberjson,user:userjson};
membery=memberjson.guild_member;
}
} }
membery=membery as User|memberjson; this.owner=owner;
for(const thing of Object.keys(membery)){ for(const thing of Object.keys(memberjson)){
if(thing==="guild"){continue} if(thing==="guild"){continue}
if(thing==="owner"){continue} if(thing==="owner"){continue}
if(thing==="roles"){ if(thing==="roles"){
for(const strrole of membery["roles"]){ for(const strrole of memberjson["roles"]){
const role=SnowFlake.getSnowFlakeFromID(strrole,Role).getObject(); const role=SnowFlake.getSnowFlakeFromID(strrole,Role).getObject();
this.roles.push(role); this.roles.push(role);
} }
continue; continue;
} }
this[thing]=membery[thing]; this[thing]=memberjson[thing];
} }
if(error){ if(SnowFlake.getSnowFlakeFromID(this?.id,User)){
this.user=memberjson as User; this.user=SnowFlake.getSnowFlakeFromID(this.id,User).getObject();
}else{ return;
if(SnowFlake.getSnowFlakeFromID(this?.id,User)){
this.user=SnowFlake.getSnowFlakeFromID(this.id,User).getObject();
return;
}
this.user=new User((membery as memberjson).user,owner.localuser);
} }
} }
get guild(){ get guild(){
return this.owner; return this.owner;
@ -68,47 +59,53 @@ class Member{
get info(){ get info(){
return this.owner.info; return this.owner.info;
} }
static async resolve(unkown:User|memberjson|string,guild:Guild):Promise<Member>{ static async new(memberjson:memberjson,owner:Guild):Promise<Member>{
if(!(guild instanceof Guild)){ const user=new User(memberjson.user,owner.localuser);
console.error(guild) if(user.members.has(owner)){
} let memb=user.members.get(owner)
let user:User; if(memb===undefined){
let id:SnowFlake<User>; memb=new Member(memberjson,owner);
if(unkown instanceof User){ user.members.set(owner,memb);
user=unkown as User; return memb
id=user.snowflake; }else if(memb instanceof Promise){
}else if(typeof unkown===typeof ""){ return await memb;//I should do something else, though for now this is "good enough"
id=new SnowFlake(unkown as string,undefined); }else{
}else{ return memb;
return new Member(unkown as User|memberjson,guild);
}
if(guild.id==="@me"){return null}
if(!Member.already[guild.id]){
Member.already[guild.id]={};
}else if(Member.already[guild.id][id]){
const memb=Member.already[guild.id][id]
if(memb instanceof Promise){
return await memb;
} }
}else{
const memb=new Member(memberjson,owner);
user.members.set(owner,memb);
return memb; return memb;
} }
guild.localuser.resolvemember(id.id,guild.id); }
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}) static async resolveMember(user:User,guild:Guild):Promise<Member|undefined>{
prom1.catch(_=>{console.log(_)}) const maybe=user.members.get(guild);
const promoise=prom1.then(_=>_.json()).then(json=>{ if(!user.members.has(guild)){
const memb=new Member(json,guild); const membpromise=guild.localuser.resolvemember(user.id,guild.id);
Member.already[guild.id][id]=memb; let res:Function;
return memb const promise=new Promise<Member|undefined>(r=>{res=r})
}) user.members.set(guild,promise);
Member.already[guild.id][id]=promoise; const membjson=await membpromise;
try{ if(membjson===undefined){
return await promoise res(undefined);
}catch(_){ return undefined;
}else{
const memb=new Member(user,guild,true); const member=new Member(membjson,guild);
Member.already[guild.id][id]=memb; res(member);
return memb; return member;
}
} }
if(maybe instanceof Promise){
return await maybe;
}else{
return maybe
}
}
/**
* @todo
*/
highInfo(){
fetch(this.info.api+"/users/"+this.id+"/profile?with_mutual_guilds=true&with_mutual_friends_count=true&guild_id="+this.guild.id,{headers:this.guild.headers})
} }
hasRole(ID:string){ hasRole(ID:string){
console.log(this.roles,ID); console.log(this.roles,ID);
@ -139,13 +136,11 @@ class Member{
bind(html:HTMLElement){ bind(html:HTMLElement){
if(html.tagName==="SPAN"){ if(html.tagName==="SPAN"){
if(!this) {return}; if(!this) {return};
/*
if(this.error){ if(this.error){
const error=document.createElement("span");
error.textContent="!";
error.classList.add("membererror");
html.after(error);
return;
} }
*/
html.style.color=this.getColor(); html.style.color=this.getColor();
} }

View file

@ -111,7 +111,7 @@ class Message{
this.snowflake=new SnowFlake(messagejson.id,this); this.snowflake=new SnowFlake(messagejson.id,this);
continue; continue;
}else if(thing==="member"){ }else if(thing==="member"){
this.member=new Member(messagejson.member,this.guild); Member.new(messagejson.member,this.guild).then(_=>{this.member=_});
continue; continue;
}else if(thing ==="embeds"){ }else if(thing ==="embeds"){
this.embeds=[]; this.embeds=[];

View file

@ -25,6 +25,7 @@ class User{
premium_type: number; premium_type: number;
theme_colors: string; theme_colors: string;
badge_ids: string; badge_ids: string;
members: WeakMap<Guild, Member|undefined|Promise<Member|undefined>>=new WeakMap();
clone(){ clone(){
return new User({ return new User({
username:this.username, username:this.username,
@ -98,7 +99,7 @@ class User{
} }
} }
async resolvemember(guild:Guild){ async resolvemember(guild:Guild){
return await Member.resolve(this,guild); return await Member.resolveMember(this,guild);
} }
buildpfp(){ buildpfp(){
const pfp=document.createElement('img'); const pfp=document.createElement('img');
@ -115,7 +116,14 @@ class User{
} }
bind(html:HTMLElement,guild:Guild=null){ bind(html:HTMLElement,guild:Guild=null){
if(guild&&guild.id!=="@me"){ if(guild&&guild.id!=="@me"){
Member.resolve(this,guild).then(_=>{ Member.resolveMember(this,guild).then(_=>{
if(_===undefined){
const error=document.createElement("span");
error.textContent="!";
error.classList.add("membererror");
html.after(error);
return;
}
_.bind(html); _.bind(html);
}).catch(_=>{ }).catch(_=>{
console.log(_) console.log(_)