jank-client-fork/src/webpage/bot.ts
2024-10-31 22:58:37 -05:00

278 lines
7.4 KiB
TypeScript

import { mainuserjson } from "./jsontypes.js";
import { Localuser } from "./localuser.js";
import { MarkDown } from "./markdown.js";
import { Form, Settings } from "./settings.js";
import { User } from "./user.js";
import {guildjson} from "./jsontypes.js";
import { PermissionToggle } from "./role.js";
import { Permissions } from "./permissions.js";
import { I18n } from "./i18n.js";
class Bot{
readonly owner:Localuser;
readonly token:string;
readonly json:mainuserjson;
headers: { "Content-type": string; Authorization: string };
get localuser(){
return this.owner;
}
get info(){
return this.localuser.info;
}
constructor(json:mainuserjson,token:string,owner:Localuser){
this.owner=owner;
this.token=token;
this.json=json;
this.headers={
"Content-type": "application/json; charset=UTF-8",
Authorization: token,
};
}
settings(){
const settings = new Settings(I18n.getTranslation("botSettings"));
const botOptions = settings.addButton("Profile",{ltr:true});
const bot=new User(this.json,this.localuser);
{
const hypotheticalProfile = document.createElement("div");
let file: undefined | File | null;
let newpronouns: string | undefined;
let newbio: string | undefined;
const hypouser = bot.clone();
let color: string;
async function regen(){
hypotheticalProfile.textContent = "";
const hypoprofile = await hypouser.buildprofile(-1, -1);
hypotheticalProfile.appendChild(hypoprofile);
}
regen();
const settingsLeft = botOptions.addOptions("");
const settingsRight = botOptions.addOptions("");
settingsRight.addHTMLArea(hypotheticalProfile);
const finput = settingsLeft.addFileInput(
I18n.getTranslation("uploadPfp"),
_=>{
if(file){
this.updatepfp(file);
}
},
{ clear: true }
);
finput.watchForChange(_=>{
if(!_){
file = null;
hypouser.avatar = null;
hypouser.hypotheticalpfp = true;
regen();
return;
}
if(_.length){
file = _[0];
const blob = URL.createObjectURL(file);
hypouser.avatar = blob;
hypouser.hypotheticalpfp = true;
regen();
}
});
let bfile: undefined | File | null;
const binput = settingsLeft.addFileInput(
I18n.getTranslation("uploadBanner"),
_=>{
if(bfile !== undefined){
this.updatebanner(bfile);
}
},
{ clear: true }
);
binput.watchForChange(_=>{
if(!_){
bfile = null;
hypouser.banner = undefined;
hypouser.hypotheticalbanner = true;
regen();
return;
}
if(_.length){
bfile = _[0];
const blob = URL.createObjectURL(bfile);
hypouser.banner = blob;
hypouser.hypotheticalbanner = true;
regen();
}
});
let changed = false;
const pronounbox = settingsLeft.addTextInput(
I18n.getTranslation("pronouns"),
_=>{
if(newpronouns || newbio || changed){
this.updateProfile({
pronouns: newpronouns,
bio: newbio,
accent_color: Number.parseInt("0x" + color.substr(1), 16),
});
}
},
{ initText: bot.pronouns }
);
pronounbox.watchForChange(_=>{
hypouser.pronouns = _;
newpronouns = _;
regen();
});
const bioBox = settingsLeft.addMDInput(I18n.getTranslation("bio"), _=>{}, {
initText: bot.bio.rawString,
});
bioBox.watchForChange(_=>{
newbio = _;
hypouser.bio = new MarkDown(_, this.owner);
regen();
});
if(bot.accent_color){
color = "#" + bot.accent_color.toString(16);
}else{
color = "transparent";
}
const colorPicker = settingsLeft.addColorInput(
I18n.getTranslation("profileColor"),
_=>{},
{ initColor: color }
);
colorPicker.watchForChange(_=>{
console.log();
color = _;
hypouser.accent_color = Number.parseInt("0x" + _.substr(1), 16);
changed = true;
regen();
});
}
{
const guildsettings=settings.addButton("Guilds");
guildsettings.addTitle(I18n.getTranslation("botGuilds"));
fetch(this.info.api+"/users/@me/guilds/",{
headers:this.headers
}).then(_=>_.json()).then((json:(guildjson["properties"])[])=>{
for(const guild of json){
const content = document.createElement("div");
content.classList.add("discovery-guild");
if(guild.banner){
const banner = document.createElement("img");
banner.classList.add("banner");
banner.crossOrigin = "anonymous";
banner.src = this.info.cdn + "/icons/" + guild.id + "/" + guild.banner + ".png?size=256";
banner.alt = "";
content.appendChild(banner);
}
const nameContainer = document.createElement("div");
nameContainer.classList.add("flex");
const img = document.createElement("img");
img.classList.add("icon");
img.crossOrigin = "anonymous";
img.src = this.info.cdn + (guild.icon? "/icons/" + guild.id + "/" + guild.icon + ".png?size=48": "/embed/avatars/3.png");
img.alt = "";
nameContainer.appendChild(img);
const name = document.createElement("h3");
name.textContent = guild.name;
nameContainer.appendChild(name);
content.appendChild(nameContainer);
const desc = document.createElement("p");
desc.textContent = guild.description;
content.appendChild(desc);
guildsettings.addHTMLArea(content);
content.onclick=()=>{
const guildsetting=guildsettings.addSubOptions(guild.name);
guildsetting.addHTMLArea(content);
guildsetting.addButtonInput("",I18n.getTranslation("leaveGuild"),()=>{
if(confirm(I18n.getTranslation("confirmGuildLeave",guild.name))){
fetch(this.info.api+"/users/@me/guilds/"+guild.id,{
method:"DELETE",
headers:this.headers
})
}
})
}
}
})
}
settings.show();
}
updatepfp(file: Blob): void{
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = ()=>{
fetch(this.info.api + "/users/@me", {
method: "PATCH",
headers: this.headers,
body: JSON.stringify({
avatar: reader.result,
}),
});
};
}
updatebanner(file: Blob | null): void{
if(file){
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = ()=>{
fetch(this.info.api + "/users/@me", {
method: "PATCH",
headers: this.headers,
body: JSON.stringify({
banner: reader.result,
}),
});
};
}else{
fetch(this.info.api + "/users/@me", {
method: "PATCH",
headers: this.headers,
body: JSON.stringify({
banner: null,
}),
});
}
}
updateProfile(json: {
bio?: string;
pronouns?: string;
accent_color?: number;
}){
fetch(this.info.api + "/users/@me/profile", {
method: "PATCH",
headers: this.headers,
body: JSON.stringify(json),
});
}
static InviteMaker(id:string,container:Form,info:Localuser["info"]){
const gen=container.addSubOptions(I18n.getTranslation("UrlGen"),{
noSubmit:true
});
const params = new URLSearchParams("");
params.set("instance", info.wellknown);
params.set("client_id", id);
params.set("scope", "bot");
const url=gen.addText("");
const perms=new Permissions("0");
for(const perm of Permissions.info()){
const permsisions=new PermissionToggle(perm,perms,gen);
gen.options.push(permsisions);
gen.generate(permsisions);
}
const cancel=setInterval(()=>{
if(!gen.container.deref()){
clearInterval(cancel);
}
params.set("permissions",perms.allow.toString());
const encoded = params.toString();
url.setText(`${location.origin}/oauth2/authorize?${encoded}`);
},100)
}
}
export {Bot};