1
0
Fork 0
forked from Simnation/Main
Main/resources/[creator]/trackers_creator/html/index.js
2025-06-07 08:51:21 +02:00

565 lines
No EOL
19 KiB
JavaScript

const resName = GetParentResourceName();
/* Forms stuff */
var forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.prototype.slice.call(forms)
.forEach(function (form) {
form.addEventListener('submit', function (event) {
event.preventDefault();
form.classList.add('was-validated')
}, false)
})
async function getJobLabel(jobName) {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getJobLabel`, JSON.stringify({jobName: jobName}), function(jobLabel) {
resolve(jobLabel);
})
})
}
/* Language stuff */
let TRANSLATIONS = {};
let ENGLISH_TRANSLATIONS = {};
function translateEverything() {
$("body").find("[data-translation-id], [data-bs-toggle='tooltip']").each(function() {
let translationId = $(this).data("translationId")
if( $(this).data("bsToggle") == "tooltip" ) {
$(this).prop("title", getLocalizedText(translationId));
$(this).tooltip();
} else {
$(this).prop("innerHTML", getLocalizedText(translationId));
}
})
}
async function refreshTranslations(locale) {
let rawEnglishTranslations = await $.get("menu_translations/en.json");
ENGLISH_TRANSLATIONS = typeof rawEnglishTranslations == "object" ? rawEnglishTranslations : JSON.parse(rawEnglishTranslations);
let rawTranslations = await $.get(`menu_translations/${locale}.json`);
TRANSLATIONS = typeof rawTranslations == "object" ? rawTranslations : JSON.parse(rawTranslations);
translateEverything();
}
async function loadTranslations() {
const locale = await $.post(`https://${resName}/getLocale`);
refreshTranslations(locale);
} loadTranslations();
function getLocalizedText(text) {
return TRANSLATIONS[text] || ENGLISH_TRANSLATIONS[text] || text;
}
/* Utils */
function getFramework() {
return new Promise((resolve) => {
$.post(`https://${resName}/getFramework`, {}, (framework) => {
resolve(framework)
})
})
}
async function getCurrentCoords() {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getCurrentCoords`, {}, function(coords) {
resolve(coords);
})
});
}
async function getCurrentCoordsAndHeading() {
return new Promise((resolve, reject) => {
$.post(`https://${resName}/getCurrentCoordsAndHeading`, {}, function(data) {
resolve(data);
})
});
}
// Open/Close menu
function openMenu(version, fullConfig) {
$("#trackers-creator-version").text(version);
loadTrackers();
loadSettings(fullConfig);
$("#trackers-creator").show()
}
function closeMenu() {
// Resets current active tab
$("#trackers-creator").find(".nav-link, .tab-pane").each(function() {
if($(this).data("isDefault") == "1") {
$(this).addClass(["active", "show"])
} else {
$(this).removeClass(["active", "show"])
}
})
$("#trackers-creator").hide();
$.post(`https://${resName}/close`, {})
}
$("#close-main-btn").click(closeMenu);
// Messages received by client
window.addEventListener('message', (event) => {
let data = event.data;
let action = data.action;
switch(action) {
case "openMenu": {
openMenu(data.version, data.fullConfig);
break;
}
}
});
/*
███████ ███████ ████████ ████████ ██ ███ ██ ██████ ███████
██ ██ ██ ██ ██ ████ ██ ██ ██
███████ █████ ██ ██ ██ ██ ██ ██ ██ ███ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
███████ ███████ ██ ██ ██ ██ ████ ██████ ███████
*/
$("#settings-private-tracker-customize-blip-btn").click(async function() {
let oldBlipData = $(this).data("privateTrackerBlipData");
let newBlipData = await blipDialog(oldBlipData);
$(this).data("privateTrackerBlipData", newBlipData);
})
/* Discord logs */
function toggleDiscordLogsInSettings(enable) {
$("#settings-mainDiscordWebhook").prop("disabled", !enable);
$("#settings-mainDiscordWebhook").prop("required", enable);
$("#settings-specific-webooks-div").find(`.form-control`).prop("disabled", !enable);
}
$("#settings-areDiscordLogsActive").change(function() {
let enabled = $(this).prop("checked");
toggleDiscordLogsInSettings(enabled);
})
function getSeparatedDiscordWebhooks() {
let webhooks = {};
$("#settings-specific-webooks-div").find(".form-control").each(function(index, element) {
let logType = $(element).data("logType");
let webhook = $(element).val();
if(webhook) {
webhooks[logType] = webhook;
}
});
return webhooks;
}
/* Discord logs END */
function loadSettings(fullConfig) {
// Language
$("#settings-locale").val(fullConfig.locale);
// Generic
$("#settings-ace-permission").val(fullConfig.acePermission);
$("#settings-enable-detailed-blip-sprite").prop("checked", fullConfig.enableDetailedBlipSprite);
// Panic button
$("#settings-panic-button-default-key").val(fullConfig.defaultPanicButton);
$("#settings-panic-button-blip-sprite").val(fullConfig.panicButtonBlip.sprite);
$("#settings-panic-button-blip-color").val(fullConfig.panicButtonBlip.color);
$("#settings-panic-button-blip-scale").val(fullConfig.panicButtonBlip.scale);
$("#settings-panic-button-blip-duration").val(fullConfig.panicButtonBlip.duration);
$("#settings-panic-button-emits-sound").prop("checked", fullConfig.doesPanicButtonEmitsSound);
$("#settings-panic-button-enable-hotkey").prop("checked", fullConfig.enablePanicButtonHotkey);
// Private tracker
$("#settings-private-tracker-enabled").prop("checked", fullConfig.privateTrackerOptions.isEnabled);
$("#settings-private-tracker-use-roleplay-name-as-blip-name").prop("checked", fullConfig.privateTrackerOptions.useRoleplayNameAsBlipName);
$("#settings-private-tracker-refresh-time").val(fullConfig.privateTrackerOptions.refreshTime);
$("#settings-private-tracker-item-name").val(fullConfig.privateTrackerOptions.itemName);
$("#settings-private-tracker-max-frequency").val(fullConfig.privateTrackerOptions.maxFrequency);
$("#settings-private-tracker-customize-blip-btn").data("privateTrackerBlipData", fullConfig.privateTrackerOptions.blipData);
// Discord logs
$("#settings-areDiscordLogsActive").prop("checked", fullConfig.areDiscordLogsActive);
$("#settings-mainDiscordWebhook").val(fullConfig.mainDiscordWebhook);
toggleDiscordLogsInSettings(fullConfig.areDiscordLogsActive);
for(const[logType, webhook] of Object.entries(fullConfig.specificWebhooks)) {
$("#settings-specific-webooks-div").find(`[data-log-type="${logType}"]`).val(webhook);
}
// Discord logs - END
}
$("#settings").submit(function(event) {
if (!this.checkValidity()) {
event.preventDefault();
event.stopPropagation();
return;
} else {
$(this).removeClass("was-validated");
}
let clientSettings = {
defaultPanicButton: $("#settings-panic-button-default-key").val(),
panicButtonBlip: {
sprite: parseInt( $("#settings-panic-button-blip-sprite").val() ),
color: parseInt( $("#settings-panic-button-blip-color").val() ),
scale: parseInt( $("#settings-panic-button-blip-scale").val() ),
duration: parseInt( $("#settings-panic-button-blip-duration").val() ),
},
doesPanicButtonEmitsSound: $("#settings-panic-button-emits-sound").prop("checked"),
enablePanicButtonHotkey: $("#settings-panic-button-enable-hotkey").prop("checked"),
}
let sharedSettings = {
locale: $("#settings-locale").val(),
enableDetailedBlipSprite: $("#settings-enable-detailed-blip-sprite").prop("checked"),
}
let serverSettings = {
// Generic
acePermission: $("#settings-ace-permission").val(),
// Discord logs
areDiscordLogsActive: $("#settings-areDiscordLogsActive").prop("checked"),
mainDiscordWebhook: $("#settings-mainDiscordWebhook").val(),
specificWebhooks: getSeparatedDiscordWebhooks(),
// Private tracker
privateTrackerOptions: {
isEnabled: $("#settings-private-tracker-enabled").prop("checked"),
useRoleplayNameAsBlipName: $("#settings-private-tracker-use-roleplay-name-as-blip-name").prop("checked"),
refreshTime: parseInt( $("#settings-private-tracker-refresh-time").val() ),
itemName: $("#settings-private-tracker-item-name").val(),
maxFrequency: parseInt( $("#settings-private-tracker-max-frequency").val() ),
blipData: $("#settings-private-tracker-customize-blip-btn").data("privateTrackerBlipData"),
}
}
$.post(`https://${resName}/saveSettings`, JSON.stringify({
clientSettings: clientSettings,
sharedSettings: sharedSettings,
serverSettings: serverSettings,
}));
refreshTranslations(sharedSettings.locale);
});
/*
████████ ██████ █████ ██████ ██ ██ ███████ ██████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██████ ███████ ██ █████ █████ ██████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ██████ ██ ██ ███████ ██ ██ ███████
*/
let trackersDatatable = $("#trackers-container").DataTable( {
"lengthMenu": [10, 15, 20],
"createdRow": function ( row, data, index ) {
$(row).addClass("clickable");
$(row).click(function() {
let id = parseInt( data[0] );
editTracker(id);
})
},
});
let trackers = {};
function loadTrackers() {
$.post(`https://${resName}/getAllTrackers`, {}, async function(rawTrackers) {
// Manually create the table to avoid incompatibilities due table indexing
trackers = {};
for(const[k, trackerData] of Object.entries(rawTrackers)) {
trackers[trackerData.id] = trackerData;
}
trackersDatatable.clear();
for(const[id, trackerData] of Object.entries(trackers)) {
trackersDatatable.row.add([
id,
trackerData.label,
]);
}
trackersDatatable.draw();
})
}
function setDefaultDataOfTracker() {
$("#tracker-label").val("Default");
$("#tracker-refresh-time").val(5);
$("#tracker-send-options-requires-item").prop("checked", false).change();
$("#tracker-receive-options-requires-item").prop("checked", false).change();
$("#tracker-use-rp-name-as-blip-name").prop("checked", false).change();
let trackerModal = $("#tracker-modal");
trackerModal.data("blipData", getDefaultBlipCustomization());
trackerModal.data("signalLostBlipData", getDefaultBlipCustomizationForSignalLost());
setSendOptionsAllowedJobs(null);
trackerModal.data("receiveOptionsAllowedJobs", null);
}
function setSendOptionsAllowedJobs(jobs) {
$("#tracker-modal").data("sendOptionsAllowedJobs", jobs);
const btnDiv = $("#tracker-send-options-can-use-panic-button-div");
if(jobs) {
btnDiv.show(jobs);
} else {
btnDiv.hide(jobs);
$("#tracker-send-options-can-use-panic-button").prop("checked", false);
}
}
$("#tracker-send-options-requires-item").change(function() {
const enabled = $(this).prop("checked");
$("#tracker-send-options-item-name").prop("disabled", !enabled).prop("required", enabled);
$("#tracker-send-options-item-min-quantity").prop("disabled", !enabled).prop("required", enabled);
$("#tracker-send-options-choose-item-btn").prop("disabled", !enabled);
if(!enabled) {
$("#tracker-send-options-item-name").val("");
$("#tracker-send-options-item-min-quantity").val("");
}
// Signal lost
$("#signal-lost-div").toggle(enabled);
if(!enabled) {
$("#tracker-signal-lost-notification-enabled").prop("checked", false).change();
}
});
$("#tracker-signal-lost-notification-enabled").change(function() {
const enabled = $(this).prop("checked");
$("#tracker-signal-lost-duration").prop("required", enabled).prop("disabled", !enabled);
$("#tracker-signal-lost-customize-blip-btn").prop("disabled", !enabled);
});
$("#tracker-signal-lost-customize-blip-btn").click(async function() {
let trackerModal = $("#tracker-modal");
let oldBlipData = trackerModal.data("signalLostBlipData");
let newBlipData = await blipDialog(oldBlipData);
trackerModal.data("signalLostBlipData", newBlipData);
});
$("#tracker-send-options-choose-item-btn").click(async function() {
const itemName = await itemsDialog();
$("#tracker-send-options-item-name").val(itemName);
});
$("#tracker-receive-options-choose-item-btn").click(async function() {
const itemName = await itemsDialog();
$("#tracker-receive-options-item-name").val(itemName);
});
$("#tracker-receive-options-requires-item").change(function() {
const enabled = $(this).prop("checked");
$("#tracker-receive-options-item-name").prop("disabled", !enabled).prop("required", enabled);
$("#tracker-receive-options-item-min-quantity").prop("disabled", !enabled).prop("required", enabled);
$("#tracker-receive-options-choose-item-btn").prop("disabled", !enabled);
if(!enabled) {
$("#tracker-receive-options-item-name").val("");
$("#tracker-receive-options-item-min-quantity").val("");
}
});
$("#tracker-receive-options-allowed-jobs-btn").click(async function() {
let trackerModal = $("#tracker-modal");
let oldAllowedJobs = trackerModal.data("receiveOptionsAllowedJobs");
let newAllowedJobs = await jobsDialog(oldAllowedJobs);
trackerModal.data("receiveOptionsAllowedJobs", newAllowedJobs);
});
$("#tracker-send-options-allowed-jobs-btn").click(async function() {
let trackerModal = $("#tracker-modal");
let oldAllowedJobs = trackerModal.data("sendOptionsAllowedJobs");
let newAllowedJobs = await jobsDialog(oldAllowedJobs);
setSendOptionsAllowedJobs(newAllowedJobs);
});
$("#tracker-customize-blip-btn").click(async function() {
let trackerModal = $("#tracker-modal");
let oldBlipData = trackerModal.data("blipData");
let newBlipData = await blipDialog(oldBlipData);
trackerModal.data("blipData", newBlipData);
});
$("#new-tracker-btn").click(function() {
let trackerModal = $("#tracker-modal");
// Converts from edit modal to create modal
trackerModal.data("action", "create");
$("#delete-tracker-btn").hide();
$("#save-tracker-btn").text( getLocalizedText("menu:create") );
setDefaultDataOfTracker();
trackerModal.modal("show");
});
function editTracker(id) {
let trackerModal = $("#tracker-modal");
// Converts from create modal to edit modal
trackerModal.data("action", "edit");
trackerModal.data("trackerId", id);
$("#delete-tracker-btn").show();
$("#save-tracker-btn").text( getLocalizedText("menu:save") );
let trackerInfo = trackers[id];
let trackerData = trackerInfo.data;
$("#tracker-label").val(trackerInfo.label);
$("#tracker-refresh-time").val(trackerData.refreshTime);
$("#tracker-use-rp-name-as-blip-name").prop("checked", trackerData.useRoleplayNameAsBlipName).change();
// Send signal
$("#tracker-send-options-requires-item").prop("checked", trackerData.sendSignalOptions.requiredItem != null).change();
if(trackerData.sendSignalOptions.requiredItem) {
$("#tracker-send-options-item-name").val(trackerData.sendSignalOptions.requiredItem.name);
$("#tracker-send-options-item-min-quantity").val(trackerData.sendSignalOptions.requiredItem.minQuantity);
}
$("#tracker-signal-lost-notification-enabled").prop("checked", trackerData.sendSignalOptions.hasSignalLostNotification).change();
$("#tracker-signal-lost-duration").val(trackerData.sendSignalOptions.signalLostDuration);
$("#tracker-send-options-can-use-panic-button").prop("checked", trackerData.sendSignalOptions.canUsePanicButton);
// Receive signal
$("#tracker-receive-options-requires-item").prop("checked", trackerData.receiveSignalOptions.requiredItem != null).change();
if(trackerData.receiveSignalOptions.requiredItem) {
$("#tracker-receive-options-item-name").val(trackerData.receiveSignalOptions.requiredItem.name);
$("#tracker-receive-options-item-min-quantity").val(trackerData.receiveSignalOptions.requiredItem.minQuantity);
}
trackerModal.data("blipData", trackerData.blipData);
trackerModal.data("signalLostBlipData", trackerData.sendSignalOptions.signalLostBlipData);
setSendOptionsAllowedJobs(trackerData.sendSignalOptions.allowedJobs);
trackerModal.data("receiveOptionsAllowedJobs", trackerData.receiveSignalOptions.allowedJobs);
trackerModal.modal("show");
}
$("#tracker-form").submit(function(event) {
if (!this.checkValidity()) {
event.preventDefault();
event.stopPropagation();
return;
} else {
$(this).removeClass("was-validated");
}
let trackerModal = $("#tracker-modal");
let action = trackerModal.data("action");
let trackerData = {
label: $("#tracker-label").val(),
data: {
blipData: trackerModal.data("blipData") || [getDefaultBlipCustomization()],
refreshTime: parseInt( $("#tracker-refresh-time").val() ),
useRoleplayNameAsBlipName: $("#tracker-use-rp-name-as-blip-name").prop("checked"),
sendSignalOptions: {
allowedJobs: trackerModal.data("sendOptionsAllowedJobs") || null,
requiredItem: $("#tracker-send-options-requires-item").prop("checked") ? {
name: $("#tracker-send-options-item-name").val(),
minQuantity: parseInt( $("#tracker-send-options-item-min-quantity").val() )
} : null,
hasSignalLostNotification: $("#tracker-signal-lost-notification-enabled").prop("checked"),
signalLostDuration: parseInt( $("#tracker-signal-lost-duration").val() ),
signalLostBlipData: trackerModal.data("signalLostBlipData") || [getDefaultBlipCustomizationForSignalLost()],
canUsePanicButton: $("#tracker-send-options-can-use-panic-button").prop("checked")
},
receiveSignalOptions: {
allowedJobs: trackerModal.data("receiveOptionsAllowedJobs") || null,
requiredItem: $("#tracker-receive-options-requires-item").prop("checked") ? {
name: $("#tracker-receive-options-item-name").val(),
minQuantity: parseInt( $("#tracker-receive-options-item-min-quantity").val() )
} : null
}
}
}
switch(action) {
case "create": {
$.post(`https://${resName}/createTracker`, JSON.stringify(trackerData), function(isSuccessful) {
if(isSuccessful) {
trackerModal.modal("hide");
loadTrackers();
}
});
break;
}
case "edit": {
$.post(`https://${resName}/updateTracker`, JSON.stringify({trackerId: trackerModal.data("trackerId"), trackerData: trackerData}), function(isSuccessful) {
if(isSuccessful) {
trackerModal.modal("hide");
loadTrackers();
}
});
break;
}
}
})
$("#delete-tracker-btn").click(function() {
let trackerModal = $("#tracker-modal");
let trackerId = trackerModal.data("trackerId");
$.post(`https://${resName}/deleteTracker`, JSON.stringify({trackerId: trackerId}), function(isSuccessful) {
if(isSuccessful) {
trackerModal.modal("hide");
loadTrackers();
}
});
});