forked from Simnation/Main
565 lines
No EOL
19 KiB
JavaScript
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();
|
|
}
|
|
});
|
|
}); |