settings update :3

This commit is contained in:
MathMan05 2024-11-28 17:18:48 -06:00
parent 80cf770c8f
commit c66ee79241
5 changed files with 169 additions and 8 deletions

View file

@ -71,6 +71,8 @@ class Channel extends SnowFlake{
this.contextmenu.addbutton(()=>I18n.getTranslation("channel.settings"), function(this: Channel){ this.contextmenu.addbutton(()=>I18n.getTranslation("channel.settings"), function(this: Channel){
this.generateSettings(); this.generateSettings();
},null,function(){
return this.hasPermission("MANAGE_CHANNELS");
}); });
this.contextmenu.addbutton( this.contextmenu.addbutton(

View file

@ -3,7 +3,7 @@ import{ Localuser }from"./localuser.js";
import{ Contextmenu }from"./contextmenu.js"; import{ Contextmenu }from"./contextmenu.js";
import{ Role, RoleList }from"./role.js"; import{ Role, RoleList }from"./role.js";
import{ Member }from"./member.js"; import{ Member }from"./member.js";
import{ Dialog, Settings }from"./settings.js"; import{ Dialog, Options, Settings }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,memberjson,invitejson,rolesjson,}from"./jsontypes.js"; import{channeljson,guildjson,emojijson,memberjson,invitejson,rolesjson,}from"./jsontypes.js";
@ -67,13 +67,21 @@ class Guild extends SnowFlake{
Guild.contextmenu.addbutton( Guild.contextmenu.addbutton(
()=>I18n.getTranslation("guild.makeInvite"), ()=>I18n.getTranslation("guild.makeInvite"),
function(this: Guild){}, function(this: Guild){
const d=new Dialog("");
this.makeInviteMenu(d.options);
d.show();
},
null, null,
_=>true, _=>true,
_=>false function(){
return this.member.hasPermission("CREATE_INSTANT_INVITE");
}
); );
Guild.contextmenu.addbutton(()=>I18n.getTranslation("guild.settings"), function(this: Guild){ Guild.contextmenu.addbutton(()=>I18n.getTranslation("guild.settings"), function(this: Guild){
this.generateSettings(); this.generateSettings();
},null,function(){
return this.member.hasPermission("MANAGE_GUILD");
}); });
/* -----things left for later----- /* -----things left for later-----
guild.contextmenu.addbutton("Leave Guild",function(){ guild.contextmenu.addbutton("Leave Guild",function(){
@ -88,6 +96,10 @@ class Guild extends SnowFlake{
} }
generateSettings(){ generateSettings(){
const settings = new Settings(I18n.getTranslation("guild.settingsFor",this.properties.name)); const settings = new Settings(I18n.getTranslation("guild.settingsFor",this.properties.name));
const textChannels=this.channels.filter(e=>{
//TODO there are almost certainly more types. is Voice valid?
return new Set([0,5]).has(e.type);
});
{ {
const overview = settings.addButton(I18n.getTranslation("guild.overview")); const overview = settings.addButton(I18n.getTranslation("guild.overview"));
const form = overview.addForm("", _=>{}, { const form = overview.addForm("", _=>{}, {
@ -97,17 +109,60 @@ class Guild extends SnowFlake{
method: "PATCH", method: "PATCH",
}); });
form.addTextInput(I18n.getTranslation("guild.name:"), "name", { initText: this.properties.name }); form.addTextInput(I18n.getTranslation("guild.name:"), "name", { initText: this.properties.name });
form.addMDInput("Description:", "description", { form.addMDInput(I18n.getTranslation("guild.description:"), "description", {
initText: this.properties.description, initText: this.properties.description,
}); });
form.addFileInput(I18n.getTranslation("guild.banner:"), "banner", { clear: true }); form.addFileInput(I18n.getTranslation("guild.banner:"), "banner", { clear: true });
form.addFileInput(I18n.getTranslation("guild.icon:"), "icon", { clear: true }); form.addFileInput(I18n.getTranslation("guild.icon:"), "icon", { clear: true });
form.addHR();
const sysmap=[null,...textChannels.map(e=>e.id)];
form.addSelect(I18n.getTranslation("guild.systemSelect:"), "system_channel_id",
["No system messages",...textChannels.map(e=>e.name)],{defaultIndex:sysmap.indexOf(this.properties.system_channel_id)}
,sysmap);
form.addCheckboxInput(I18n.getTranslation("guild.sendrandomwelcome?"),"s1",{
initState:!(this.properties.system_channel_flags&1)
});
form.addCheckboxInput(I18n.getTranslation("guild.stickWelcomeReact?"),"s4",{
initState:!(this.properties.system_channel_flags&8)
});
form.addCheckboxInput(I18n.getTranslation("guild.boostMessage?"),"s2",{
initState:!(this.properties.system_channel_flags&2)
});
form.addCheckboxInput(I18n.getTranslation("guild.helpTips?"),"s3",{
initState:!(this.properties.system_channel_flags&4)
});
form.addPreprocessor((e:any)=>{
let bits=0;
bits+=(1-e.s1)*1;
delete e.s1;
bits+=(1-e.s2)*2;
delete e.s2;
bits+=(1-e.s3)*4;
delete e.s3;
bits+= (1-e.s4)*8;
delete e.s4;
e.system_channel_flags=bits;
})
form.addHR();
form.addSelect(I18n.getTranslation("guild.defaultNoti"),"default_message_notifications",
[I18n.getTranslation("guild.onlyMentions"),I18n.getTranslation("guild.all")],
{
defaultIndex:[1,0].indexOf(this.properties.default_message_notifications),
radio:true
},[1,0]);
form.addHR();
let region = this.properties.region; let region = this.properties.region;
if(!region){ if(!region){
region = ""; region = "";
} }
form.addTextInput(I18n.getTranslation("guild.region:"), "region", { initText: region }); form.addTextInput(I18n.getTranslation("guild.region:"), "region", { initText: region });
} }
this.makeInviteMenu(settings.addButton(I18n.getTranslation("invite.inviteMaker")),textChannels);
const s1 = settings.addButton(I18n.getTranslation("guild.roles")); const s1 = settings.addButton(I18n.getTranslation("guild.roles"));
const permlist: [Role, Permissions][] = []; const permlist: [Role, Permissions][] = [];
for(const thing of this.roles){ for(const thing of this.roles){
@ -118,6 +173,78 @@ class Guild extends SnowFlake{
); );
settings.show(); settings.show();
} }
makeInviteMenu(options:Options,valid:void|(Channel[])){
if(!valid){
valid=this.channels.filter(e=>{
//TODO there are almost certainly more types. is Voice valid?
return new Set([0,5]).has(e.type);
});
}
let channel=valid[0];
const div = document.createElement("div");
div.classList.add("invitediv");
const text = document.createElement("span");
text.classList.add("ellipsis");
div.append(text);
let uses = 0;
let expires = 1800;
const copycontainer = document.createElement("div");
copycontainer.classList.add("copycontainer");
const copy = document.createElement("span");
copy.classList.add("copybutton", "svgicon", "svg-copy");
copycontainer.append(copy);
copycontainer.onclick = _=>{
if(text.textContent){
navigator.clipboard.writeText(text.textContent);
}
};
div.append(copycontainer);
const update = ()=>{
fetch(`${this.info.api}/channels/${channel.id}/invites`, {
method: "POST",
headers: this.headers,
body: JSON.stringify({
flags: 0,
target_type: null,
target_user_id: null,
max_age: expires + "",
max_uses: uses,
temporary: uses !== 0
}),
})
.then(_=>_.json())
.then(json=>{
const params = new URLSearchParams("");
params.set("instance", this.info.wellknown);
const encoded = params.toString();
text.textContent = `${location.origin}/invite/${json.code}?${encoded}`;
});
};
options.addTitle(I18n.getTranslation("inviteOptions.title"));
const text2=options.addText("");
options.addSelect(I18n.getTranslation("invite.channel:"),()=>{},valid.map(e=>e.name))
.watchForChange((e)=>{
channel=valid[e];
text2.setText(I18n.getTranslation("invite.subtext",channel.name,this.properties.name));
})
options.addSelect(I18n.getTranslation("invite.expireAfter"),()=>{},
["30m","1h","6h","12h","1d","7d","30d","never"].map((e)=>I18n.getTranslation("inviteOptions."+e))
).onchange=(e)=>{expires=[1800, 3600, 21600, 43200, 86400, 604800, 2592000, 0][e];};
const timeOptions=["1","5","10","25","50","100"].map((e)=>I18n.getTranslation("inviteOptions.limit",e))
timeOptions.unshift(I18n.getTranslation("inviteOptions.noLimit"))
options.addSelect(I18n.getTranslation("invite.expireAfter"),()=>{},timeOptions)
.onchange=(e)=>{uses=[0, 1, 5, 10, 25, 50, 100][e];};
options.addButtonInput("",I18n.getTranslation("invite.createInvite"),()=>{
update();
})
options.addHTMLArea(div);
}
roleUpdate:(role:Role,added:-1|0|1)=>unknown=()=>{}; roleUpdate:(role:Role,added:-1|0|1)=>unknown=()=>{};
sortRoles(){ sortRoles(){
this.roles.sort((a,b)=>(b.position-a.position)); this.roles.sort((a,b)=>(b.position-a.position));

View file

@ -804,6 +804,12 @@ class Options implements OptionsElement<void>{
this.generate(text); this.generate(text);
return text; return text;
} }
addHR(){
const rule = new HorrizonalRule();
this.options.push(rule);
this.generate(rule);
return rule;
}
addTitle(str: string){ addTitle(str: string){
const text = new SettingsTitle(str); const text = new SettingsTitle(str);
this.options.push(text); this.options.push(text);
@ -1054,13 +1060,13 @@ class Form implements OptionsElement<object>{
(this.button.deref() as HTMLElement).hidden=false; (this.button.deref() as HTMLElement).hidden=false;
} }
} }
selectMap=new WeakMap<SelectInput,(number|string)[]>(); selectMap=new WeakMap<SelectInput,(number|string|null)[]>();
addSelect( addSelect(
label: string, label: string,
formName: string, formName: string,
selections: string[], selections: string[],
{ defaultIndex = 0, required = false,radio=false}={}, { defaultIndex = 0, required = false,radio=false}={},
correct:(string|number)[]=selections correct:(string|number|null)[]=selections
){ ){
const select = this.options.addSelect(label, _=>{}, selections, { const select = this.options.addSelect(label, _=>{}, selections, {
defaultIndex,radio defaultIndex,radio
@ -1160,6 +1166,9 @@ class Form implements OptionsElement<object>{
addText(str: string){ addText(str: string){
return this.options.addText(str); return this.options.addText(str);
} }
addHR(){
return this.options.addHR();
}
addTitle(str: string){ addTitle(str: string){
this.options.addTitle(str); this.options.addTitle(str);
} }
@ -1373,6 +1382,17 @@ class Form implements OptionsElement<object>{
element.textContent = message; element.textContent = message;
} }
} }
class HorrizonalRule implements OptionsElement<unknown>{
constructor(){}
generateHTML(): HTMLElement {
return document.createElement("hr");
}
watchForChange (_: (arg1: undefined) => void){
throw new Error("don't do this")
};
submit= () => {};
value=undefined;
}
class Settings extends Buttons{ class Settings extends Buttons{
static readonly Buttons = Buttons; static readonly Buttons = Buttons;
static readonly Options = Options; static readonly Options = Options;

View file

@ -1690,11 +1690,13 @@ fieldset input[type="radio"] {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
align-items: center; align-items: center;
position: relative;
} }
.copycontainer { .copycontainer {
flex: none; flex: none;
background: var(--button-bg); background: var(--button-bg);
cursor: pointer; cursor: pointer;
margin-left: auto;
} }
.copycontainer:hover { .copycontainer:hover {
background: var(--button-hover); background: var(--button-hover);

View file

@ -232,7 +232,14 @@
"disoveryTitle":"Guild discovery ($1) {{PLURAL:$1|entry|entries}}", "disoveryTitle":"Guild discovery ($1) {{PLURAL:$1|entry|entries}}",
"emptytitle":"Weird spot", "emptytitle":"Weird spot",
"emptytext":"You're in a weird spot, this guild has no channels", "emptytext":"You're in a weird spot, this guild has no channels",
"default":"Default ($1)" "default":"Default ($1)",
"description:":"Description:",
"systemSelect:":"Systems messages channel:",
"sendrandomwelcome?":"Send a random message when someone joins this guild",
"stickWelcomeReact?":"Prompt members of your guild to react with a sticker when someone joins!",
"boostMessage?":"Send a message when someone boosts your guild!",
"helpTips?":"Send helpful tips for your guild!",
"defaultNoti":"Set the default notification settings of your guild!"
}, },
"role":{ "role":{
"displaySettings":"Display settings", "displaySettings":"Display settings",
@ -348,7 +355,10 @@
"joinUsing":"Join using invite", "joinUsing":"Join using invite",
"inviteLinkCode":"Invite Link/Code", "inviteLinkCode":"Invite Link/Code",
"subtext":"to $1 in $2", "subtext":"to $1 in $2",
"expireAfter":"Expire after:" "expireAfter":"Expire after:",
"channel:":"Channel:",
"inviteMaker":"Invite Maker",
"createInvite":"Create invite"
}, },
"friends":{ "friends":{
"blocked":"Blocked", "blocked":"Blocked",