177 lines
4.8 KiB
TypeScript
177 lines
4.8 KiB
TypeScript
import {Guild} from "./guild.js";
|
|
import {I18n} from "./i18n.js";
|
|
import {webhookType} from "./jsontypes.js";
|
|
import {Member} from "./member.js";
|
|
import {Dialog, Options} from "./settings.js";
|
|
import {SnowFlake} from "./snowflake.js";
|
|
import {User} from "./user.js";
|
|
|
|
async function webhookMenu(
|
|
guild: Guild,
|
|
hookURL: string,
|
|
webhooks: Options,
|
|
channelId: false | string = false,
|
|
) {
|
|
const moveChannels = guild.channels.filter(
|
|
(_) => _.hasPermission("MANAGE_WEBHOOKS") && _.type !== 4,
|
|
);
|
|
async function regenArea() {
|
|
webhooks.removeAll();
|
|
|
|
webhooks.addButtonInput("", I18n.webhooks.newWebHook(), () => {
|
|
const nameBox = new Dialog(I18n.webhooks.EnterWebhookName());
|
|
const options = nameBox.float.options;
|
|
const defualts = I18n.webhooks.sillyDefaults().split("\n");
|
|
let channel = channelId || moveChannels[0].id;
|
|
options.addTextInput(
|
|
I18n.webhooks.name(),
|
|
async (name) => {
|
|
const json = await (
|
|
await fetch(`${guild.info.api}/channels/${channel}/webhooks/`, {
|
|
method: "POST",
|
|
headers: guild.headers,
|
|
body: JSON.stringify({name}),
|
|
})
|
|
).json();
|
|
makeHook(json);
|
|
},
|
|
{
|
|
initText: defualts[Math.floor(Math.random() * defualts.length)],
|
|
},
|
|
);
|
|
if (!channelId) {
|
|
const select = options.addSelect(
|
|
I18n.webhooks.channel(),
|
|
() => {},
|
|
moveChannels.map((_) => _.name),
|
|
{
|
|
defaultIndex: 0,
|
|
},
|
|
);
|
|
select.watchForChange((i: number) => {
|
|
channel = moveChannels[i].id;
|
|
});
|
|
}
|
|
options.addButtonInput("", I18n.submit(), () => {
|
|
options.submit();
|
|
nameBox.hide();
|
|
});
|
|
nameBox.show();
|
|
});
|
|
const hooks = (await (await fetch(hookURL, {headers: guild.headers})).json()) as webhookType[];
|
|
for (const hook of hooks) {
|
|
makeHook(hook);
|
|
}
|
|
}
|
|
|
|
const makeHook = (hook: webhookType) => {
|
|
const div = document.createElement("div");
|
|
div.classList.add("flexltr", "webhookArea");
|
|
const pfp = document.createElement("img");
|
|
if (hook.avatar) {
|
|
pfp.src = `${guild.info.cdn}/avatars/${hook.id}/${hook.avatar}`;
|
|
} else {
|
|
const int = Number((BigInt(hook.id) >> 22n) % 6n);
|
|
pfp.src = `${guild.info.cdn}/embed/avatars/${int}.png`;
|
|
}
|
|
pfp.classList.add("webhookpfppreview");
|
|
|
|
const namePlate = document.createElement("div");
|
|
namePlate.classList.add("flexttb");
|
|
|
|
const name = document.createElement("b");
|
|
name.textContent = hook.name;
|
|
|
|
const createdAt = document.createElement("span");
|
|
createdAt.textContent = I18n.webhooks.createdAt(
|
|
new Intl.DateTimeFormat(I18n.lang).format(SnowFlake.stringToUnixTime(hook.id)),
|
|
);
|
|
|
|
const wtype = document.createElement("span");
|
|
let typeText: string;
|
|
switch (hook.type) {
|
|
case 1:
|
|
typeText = I18n.webhooks.type1();
|
|
break;
|
|
case 2:
|
|
typeText = I18n.webhooks.type2();
|
|
break;
|
|
case 3:
|
|
typeText = I18n.webhooks.type3();
|
|
break;
|
|
}
|
|
wtype.textContent = I18n.webhooks.type(typeText);
|
|
|
|
namePlate.append(name, createdAt, wtype);
|
|
|
|
const icon = document.createElement("span");
|
|
icon.classList.add("svg-intoMenu", "svgicon");
|
|
|
|
div.append(pfp, namePlate, icon);
|
|
|
|
div.onclick = () => {
|
|
const form = webhooks.addSubForm(
|
|
hook.name,
|
|
(e) => {
|
|
regenArea();
|
|
console.log(e);
|
|
},
|
|
{
|
|
traditionalSubmit: true,
|
|
method: "PATCH",
|
|
fetchURL: guild.info.api + "/webhooks/" + hook.id,
|
|
headers: guild.headers,
|
|
},
|
|
);
|
|
form.addTextInput(I18n.webhooks.name(), "name", {initText: hook.name});
|
|
form.addFileInput(I18n.webhooks.avatar(), "avatar", {clear: true});
|
|
|
|
form.addSelect(
|
|
I18n.webhooks.channel(),
|
|
"channel_id",
|
|
moveChannels.map((_) => _.name),
|
|
{
|
|
defaultIndex: moveChannels.findIndex((_) => _.id === hook.channel_id),
|
|
},
|
|
moveChannels.map((_) => _.id),
|
|
);
|
|
|
|
form.addMDText(I18n.webhooks.token(hook.token));
|
|
form.addMDText(I18n.webhooks.url(hook.url));
|
|
form.addText(I18n.webhooks.type(typeText));
|
|
form.addButtonInput("", I18n.webhooks.copyURL(), () => {
|
|
navigator.clipboard.writeText(hook.url);
|
|
});
|
|
|
|
form.addText(I18n.webhooks.createdBy());
|
|
|
|
try {
|
|
const user = new User(hook.user, guild.localuser);
|
|
const div = user.createWidget(guild);
|
|
form.addHTMLArea(div);
|
|
} catch {}
|
|
form.addButtonInput("", I18n.webhooks.deleteWebhook(), () => {
|
|
const d = new Dialog("areYouSureDelete");
|
|
const opt = d.options;
|
|
opt.addTitle(I18n.webhooks.areYouSureDelete(hook.name));
|
|
const opt2 = opt.addOptions("", {ltr: true});
|
|
opt2.addButtonInput("", I18n.yes(), () => {
|
|
fetch(guild.info.api + "/webhooks/" + hook.id, {
|
|
method: "DELETE",
|
|
headers: guild.headers,
|
|
}).then(() => {
|
|
d.hide();
|
|
regenArea();
|
|
});
|
|
});
|
|
opt2.addButtonInput("", I18n.no(), () => {
|
|
d.hide();
|
|
});
|
|
d.show();
|
|
});
|
|
};
|
|
webhooks.addHTMLArea(div);
|
|
};
|
|
regenArea();
|
|
}
|
|
export {webhookMenu};
|