314 lines
9.2 KiB
JavaScript

// #region Loaded Servers
var loadedServers = {};
// Returns the currently active server, or null if none are active.
function getCurrentlyActiveServer() {
const activeServerAndId = Object.entries(loadedServers).find(([id, server]) => server.currentlyActive);
if (activeServerAndId === undefined)
return null;
var [id, activeServer] = activeServerAndId;
activeServer.id = id;
return activeServer;
}
// Returns the requested server from the provided snowflake id
function getServerFromSnowflake(guildId) {
const serverAndId = Object.entries(loadedServers).find(([id, server]) => server.guild_id == guildId);
if (serverAndId === undefined)
return null;
var [id, server] = serverAndId;
server.id = id;
return server;
}
function addToLoadedServers(server, selectNew=true) {
// Remove the 'id' property and add the 'currentlyActive' property
({id, ...rest} = server, server = {...rest, currentlyActive: false})
// Save the server as loaded
loadedServers[id] = server;
// Display the loaded server
addServerTemplate(id, sanitise(server.guild_id), sanitise(server.name), sanitise(server.icon), sanitise(server.permissions), sanitise(server.owner));
// Select the newly added server
if (selectNew) {
selectServer(id);
}
}
function removeFromLoadedServers(serverPrimaryKey) {
delete loadedServers[serverPrimaryKey];
removeServerTemplate(serverPrimaryKey);
$("#backToSelectServer").click();
}
// #endregion
// #region Server Back Btn
$("#backToSelectServer").on("click", function() {
$("#noSelectedServer").show();
$("#selectedServerContainer").hide();
});
// #endregion
// #region Server Modal
$("#serverOptionsRefreshBtn").on("click", async function() {
await loadServerOptions();
});
// Load server options into the 'Add Server' dropdown
async function loadServerOptions() {
// Disable controls while loading
$("#serverOptions").prop("disabled", true);
$("#serverOptionsRefreshBtn").prop("disabled", true).find("i.bi").addClass("spinning-360");
// Remove existing options
$("#serverOptions option").each(function() {
if ($(this).val()) {
$(this).remove();
}
});
// Deselect any selected option
$("#serverOptions").val(null).trigger("change");
// Fetch and append the server options
try {
const servers = await loadGuilds();
servers.forEach(server => {
$("#serverOptions").append($("<option>", {
value: server.id,
text: sanitise(server.name),
"data-icon": sanitise(server.icon),
"data-permissions": sanitise(server.permissions),
"data-isowner": sanitise(server.owner)
}));
});
}
catch (error) {
console.error(JSON.stringify(error, null, 4));
showToast("danger", `Error Loading Guilds: HTTP ${error.status}`, error.responseJSON.message, 15000);
}
finally {
// Re-enable controls
$("#serverOptions").prop("disabled", false);
$("#serverOptionsRefreshBtn").prop("disabled", false).find("i.bi").removeClass("spinning-360");
}
}
// #endregion
// #region Server Sidebar
// Load any existing 'saved guilds' from the database
async function loadSavedGuilds() {
try {
const response = await getSavedGuilds();
response.forEach(server => {
// 'Register' the server, by storing it for later and
// displaying it on the server list sidebar
addToLoadedServers(server, false);
});
}
catch (error) {
alert("Error loading saved guilds: " + error);
}
}
// Create an element for the added server and show it
function addServerTemplate(serverPrimaryKey, serverGuildId, serverName, serverIconHash, serverPermissions, serverIsOwner) {
template = $($("#serverItemTemplate").html());
template.find("img").attr("src", `https://cdn.discordapp.com/icons/${serverGuildId}/${serverIconHash}.webp?size=80`);
template.attr("data-id", serverPrimaryKey);
// Tooltips
template.attr("data-bs-title", serverName);
template.tooltip();
// Bind the button for selecting this server
template.find(".server-item-selector").off("click").on("click", function() {
selectServer(serverPrimaryKey);
});
$("#serverList").prepend(template);
}
function removeServerTemplate(serverPrimaryKey) {
$(`#serverList .server-item[data-id=${serverPrimaryKey}]`).remove();
}
// Open 'Add Server' Form Modal
$("#newServerBtn").on("click", function() {
newServerModal();
});
function newServerModal() {
$("#serverFormModal").modal("show");
}
// #endregion
// #region New Server
// Submit 'Add Server' Form
$("#serverForm").on("submit", async function(event) {
event.preventDefault();
var selectedOption = $("#serverOptions option:selected");
serverName = selectedOption.text();
serverGuildId = selectedOption.val();
serverIconHash = selectedOption.attr("data-icon");
serverPermissions = selectedOption.attr("data-permissions");
serverIsOwner = selectedOption.attr("data-isowner");
var serverPrimaryKey = await registerNewServer(serverName, serverGuildId, serverIconHash, serverPermissions, serverIsOwner);
if (serverPrimaryKey)
addToLoadedServers(await getSavedGuild(serverPrimaryKey));
$("#serverFormModal").modal("hide");
});
// Add a new 'saved guild' based on the info provided
// returns `response.id` if successful, else false
async function registerNewServer(serverName, serverGuildId, serverIconHash, serverPermissions, serverIsOwner) {
var formData = new FormData();
formData.append("name", serverName);
formData.append("guild_id", serverGuildId);
formData.append("icon", serverIconHash);
formData.append("added_by", currentUserId);
formData.append("permissions", serverPermissions);
formData.append("owner", serverIsOwner === "true");
try { response = await newSavedGuild(formData); }
catch (err) {
if (err.status === 409)
showToast("warning", "Server Conflict", `Can't add ${sanitise(serverName)} because it already exists.`, 10000);
else
console.error(JSON.stringify(err, null, 4));
return false;
}
return response.id;
}
// #endregion
// #region Select Server
function selectServer(primaryKey) {
var server = loadedServers[primaryKey];
// Change appearance of selected vs none-selected items
$("#serverList .server-item").removeClass("active")
$(`#serverList .server-item[data-id=${primaryKey}]`).addClass("active")
// Display details of the selected server
$("#selectedServerContainer .selected-server-name").text(sanitise(server.name));
$("#selectedServerContainer .selected-server-id").text(sanitise(server.guild_id));
$("#selectedServerContainer .selected-server-icon").attr("src", `https://cdn.discordapp.com/icons/${server.guild_id}/${server.icon}.webp?size=80`);
// Disable all loaded servers
$.each(loadedServers, function(serverPrimaryKey, server) {
server.currentlyActive = false;
});
// Activate current selected server
loadedServers[primaryKey].currentlyActive = true;
$("#noSelectedServer").hide();
$("#selectedServerContainer").show().css("display", "flex");
$(document).trigger("selectedServerChange");
}
// #endregion
// #region Delete Server Btn
$("#deleteSelectedServerBtn").on("click", async function() {
const notes = [
"No Subscriptions, Filters or Tracked Content will be deleted.",
"No data will be deleted for other users.",
"The server will no longer appear on your sidebar.",
"You can re-add the server",
"All Subscriptions, Filters and Tracked Content will be available when/if you re-add the server."
];
const notesString = arrayToHtmlList(notes).prop("outerHTML");
await confirmationModal(
"Close this server?",
`This is a safe, non-permanent action:<br><br>${notesString}`,
"warning",
deleteSelectedServer,
null
);
});
async function deleteSelectedServer() {
var activeServer = getCurrentlyActiveServer();
if (!activeServer) {
showToast("danger", "Error Deleting Server", "You must select a server to delete.");
return;
}
console.debug(`Deleting ${activeServer.id}: ${JSON.stringify(activeServer, null, 4)}`)
try {
await deleteSavedGuild(activeServer.id);
removeFromLoadedServers(activeServer.id);
}
catch (error) {
alert(error)
alert(JSON.stringify(error, null, 4))
}
};
// #endregion
$(document).on("selectedServerChange", function() {
resolveServerStrings();
$("#serverJoinAlert").hide();
})
// #region Resolve Strings
function resolveServerStrings() {
const server = getCurrentlyActiveServer();
// Server names
$(".resolve-to-server-name").text(sanitise(server.name));
// Server Guild Ids
$(".resolve-to-server-id").text(sanitise(server.guild_id))
// Bot Invite links
$(".resolve-to-invite-link").attr("href", `https://discord.com/oauth2/authorize
?client_id=${discordClientId}
&permissions=2147534848
&scope=bot+applications.commands
&guild_id=${sanitise(server.guild_id)}
&disable_guild_select=true`);
}
// #endregion