314 lines
9.2 KiB
JavaScript
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
|