2020-03-30 13:44:18 +02:00
|
|
|
import {
|
|
|
|
openServerInfoBandwidth,
|
|
|
|
RequestInfoStatus,
|
|
|
|
ServerBandwidthInfoUpdateCallback
|
|
|
|
} from "tc-shared/ui/modal/ModalServerInfoBandwidth";
|
|
|
|
import {ServerEntry} from "tc-shared/ui/server";
|
|
|
|
import {CommandResult, ErrorID} from "tc-shared/connection/ServerConnectionDeclaration";
|
|
|
|
import {createErrorModal, createModal, Modal} from "tc-shared/ui/elements/Modal";
|
|
|
|
import {LogCategory} from "tc-shared/log";
|
|
|
|
import * as log from "tc-shared/log";
|
|
|
|
import * as tooltip from "tc-shared/ui/elements/Tooltip";
|
|
|
|
import * as i18nc from "tc-shared/i18n/country";
|
|
|
|
import {format_time, formatMessage} from "tc-shared/ui/frames/chat";
|
|
|
|
import {Hostbanner} from "tc-shared/ui/frames/hostbanner";
|
2020-03-31 15:47:25 +02:00
|
|
|
import * as moment from "moment";
|
2020-03-30 13:44:18 +02:00
|
|
|
|
|
|
|
export function openServerInfo(server: ServerEntry) {
|
|
|
|
let modal: Modal;
|
|
|
|
let update_callbacks: ServerBandwidthInfoUpdateCallback[] = [];
|
|
|
|
|
|
|
|
modal = createModal({
|
|
|
|
header: tr("Server Information: ") + server.properties.virtualserver_name,
|
|
|
|
body: () => {
|
|
|
|
const template = $("#tmpl_server_info").renderTag();
|
|
|
|
|
|
|
|
const children = template.children();
|
|
|
|
const top = template.find(".container-top");
|
|
|
|
const update_values = () => {
|
|
|
|
apply_hostbanner(server, top);
|
|
|
|
apply_category_1(server, children, update_callbacks);
|
|
|
|
apply_category_2(server, children, update_callbacks);
|
|
|
|
apply_category_3(server, children, update_callbacks);
|
|
|
|
};
|
|
|
|
|
|
|
|
const button_update = template.find(".button-update");
|
|
|
|
button_update.on('click', event => {
|
|
|
|
button_update.prop("disabled", true);
|
|
|
|
server.updateProperties().then(() => {
|
|
|
|
update_callbacks = [];
|
|
|
|
update_values();
|
|
|
|
}).catch(error => {
|
|
|
|
log.warn(LogCategory.CLIENT, tr("Failed to refresh server properties: %o"), error);
|
|
|
|
if(error instanceof CommandResult)
|
|
|
|
error = error.extra_message || error.message;
|
|
|
|
createErrorModal(tr("Refresh failed"), formatMessage(tr("Failed to refresh server properties.{:br:}Error: {}"), error)).open();
|
|
|
|
}).then(() => {
|
|
|
|
button_update.prop("disabled", false);
|
|
|
|
});
|
|
|
|
}).trigger('click');
|
|
|
|
|
|
|
|
update_values();
|
|
|
|
tooltip.initialize(template);
|
|
|
|
return template.children();
|
|
|
|
},
|
|
|
|
footer: null,
|
|
|
|
min_width: "25em"
|
|
|
|
});
|
|
|
|
|
|
|
|
const updater = setInterval(() => {
|
|
|
|
server.request_connection_info().then(info => update_callbacks.forEach(e => e(RequestInfoStatus.SUCCESS, info))).catch(error => {
|
|
|
|
if(error instanceof CommandResult && error.id == ErrorID.PERMISSION_ERROR) {
|
|
|
|
update_callbacks.forEach(e => e(RequestInfoStatus.NO_PERMISSION));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
update_callbacks.forEach(e => e(RequestInfoStatus.UNKNOWN));
|
2019-08-30 23:06:39 +02:00
|
|
|
});
|
2020-03-30 13:44:18 +02:00
|
|
|
}, 1000);
|
2019-08-30 23:06:39 +02:00
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
|
|
|
|
modal.htmlTag.find(".button-close").on('click', event => modal.close());
|
|
|
|
modal.htmlTag.find(".button-show-bandwidth").on('click', event => {
|
|
|
|
const custom_callbacks = [];
|
|
|
|
const custom_callback_caller = (status, info) => { custom_callbacks.forEach(e => e(status, info)); };
|
|
|
|
|
|
|
|
update_callbacks.push(custom_callback_caller);
|
|
|
|
openServerInfoBandwidth(server, custom_callbacks).close_listener.push(() => {
|
|
|
|
update_callbacks.remove(custom_callback_caller);
|
2019-08-30 23:06:39 +02:00
|
|
|
});
|
2020-03-30 13:44:18 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
modal.htmlTag.find(".modal-body").addClass("modal-server-info");
|
|
|
|
modal.open();
|
|
|
|
modal.close_listener.push(() => clearInterval(updater));
|
|
|
|
}
|
|
|
|
|
|
|
|
function apply_hostbanner(server: ServerEntry, tag: JQuery) {
|
|
|
|
let container: JQuery;
|
|
|
|
tag.empty().append(
|
|
|
|
container = $.spawn("div").addClass("container-hostbanner")
|
|
|
|
).addClass("hidden");
|
|
|
|
|
|
|
|
const htag = Hostbanner.generate_tag(server.properties.virtualserver_hostbanner_gfx_url, server.properties.virtualserver_hostbanner_gfx_interval, server.properties.virtualserver_hostbanner_mode);
|
|
|
|
htag.then(t => {
|
|
|
|
if(!t) return;
|
|
|
|
|
|
|
|
tag.removeClass("hidden");
|
|
|
|
container.append(t);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function apply_category_1(server: ServerEntry, tag: JQuery, update_callbacks: ServerBandwidthInfoUpdateCallback[]) {
|
|
|
|
/* server name */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-name");
|
|
|
|
container.text(server.properties.virtualserver_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* server region */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-region").empty();
|
|
|
|
container.append(
|
|
|
|
$.spawn("div").addClass("country flag-" + server.properties.virtualserver_country_code.toLowerCase()),
|
|
|
|
$.spawn("a").text(i18nc.country_name(server.properties.virtualserver_country_code, tr("Global")))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* slots */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-slots");
|
|
|
|
|
|
|
|
let text = server.properties.virtualserver_clientsonline + "/" + server.properties.virtualserver_maxclients;
|
|
|
|
if(server.properties.virtualserver_queryclientsonline)
|
|
|
|
text += " +" + (server.properties.virtualserver_queryclientsonline > 1 ?
|
|
|
|
server.properties.virtualserver_queryclientsonline + " " + tr("Queries") :
|
|
|
|
server.properties.virtualserver_queryclientsonline + " " + tr("Query"));
|
|
|
|
if(server.properties.virtualserver_reserved_slots)
|
|
|
|
text += " (" + server.properties.virtualserver_reserved_slots + " " + tr("Reserved") + ")";
|
2019-08-30 23:06:39 +02:00
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
container.text(text);
|
2019-08-30 23:06:39 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
/* first run */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-first-run");
|
2019-08-30 23:06:39 +02:00
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
container.text(
|
|
|
|
server.properties.virtualserver_created > 0 ?
|
|
|
|
moment(server.properties.virtualserver_created * 1000).format('MMMM Do YYYY, h:mm:ss a') :
|
|
|
|
tr("Unknown")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* uptime */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-uptime");
|
|
|
|
const update = () => container.text(format_time(server.calculateUptime() * 1000, tr("just started")));
|
|
|
|
update_callbacks.push(update);
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
}
|
2019-08-30 23:06:39 +02:00
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
function apply_category_2(server: ServerEntry, tag: JQuery, update_callbacks: ServerBandwidthInfoUpdateCallback[]) {
|
|
|
|
/* ip */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-ip");
|
|
|
|
container.text(server.remote_address.host + (server.remote_address.port == 9987 ? "" : (":" + server.remote_address.port)))
|
|
|
|
}
|
|
|
|
|
|
|
|
/* version */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-version");
|
|
|
|
|
|
|
|
let timestamp = -1;
|
|
|
|
const version = (server.properties.virtualserver_version || "unknwon").replace(/ ?\[build: ?([0-9]+)]/gmi, (group, ts) => {
|
|
|
|
timestamp = parseInt(ts);
|
|
|
|
return "";
|
2019-08-30 23:06:39 +02:00
|
|
|
});
|
2020-03-30 13:44:18 +02:00
|
|
|
|
|
|
|
container.find("a").text(version);
|
|
|
|
container.find(".container-tooltip").toggle(timestamp > 0).find(".tooltip a").text(
|
|
|
|
moment(timestamp * 1000).format('[Build timestamp:] YYYY-MM-DD HH:mm Z')
|
|
|
|
);
|
2019-08-30 23:06:39 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
/* platform */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-platform");
|
|
|
|
container.text(server.properties.virtualserver_platform);
|
2019-08-30 23:06:39 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
/* ping */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-ping");
|
|
|
|
container.text(tr("calculating..."));
|
|
|
|
update_callbacks.push((status, data) => {
|
|
|
|
if(status === RequestInfoStatus.SUCCESS)
|
|
|
|
container.text(data.connection_ping.toFixed(0) + " " + "ms");
|
|
|
|
else if(status === RequestInfoStatus.NO_PERMISSION)
|
|
|
|
container.text(tr("No Permissions"));
|
|
|
|
else
|
|
|
|
container.text(tr("receiving..."));
|
|
|
|
});
|
2019-08-30 23:06:39 +02:00
|
|
|
}
|
|
|
|
|
2020-03-30 13:44:18 +02:00
|
|
|
/* packet loss */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-packet-loss");
|
|
|
|
container.text(tr("receiving..."));
|
|
|
|
update_callbacks.push((status, data) => {
|
|
|
|
if(status === RequestInfoStatus.SUCCESS)
|
|
|
|
container.text(data.connection_packetloss_total.toFixed(2) + "%");
|
|
|
|
else if(status === RequestInfoStatus.NO_PERMISSION)
|
|
|
|
container.text(tr("No Permissions"));
|
2019-08-30 23:06:39 +02:00
|
|
|
else
|
2020-03-30 13:44:18 +02:00
|
|
|
container.text(tr("receiving..."));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function apply_category_3(server: ServerEntry, tag: JQuery, update_callbacks: ServerBandwidthInfoUpdateCallback[]) {
|
|
|
|
/* unique id */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-unique-id");
|
|
|
|
container.text(server.properties.virtualserver_unique_identifier || tr("Unknown"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* voice encryption */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-voice-encryption");
|
|
|
|
if(server.properties.virtualserver_codec_encryption_mode == 0)
|
|
|
|
container.text(tr("Globally off"));
|
|
|
|
else if(server.properties.virtualserver_codec_encryption_mode == 1)
|
|
|
|
container.text(tr("Individually configured per channel"));
|
|
|
|
else
|
|
|
|
container.text(tr("Globally on"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* channel count */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-channel-count");
|
|
|
|
container.text(server.properties.virtualserver_channelsonline);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* minimal security level */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-min-security-level");
|
|
|
|
container.text(server.properties.virtualserver_needed_identity_security_level);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* complains */
|
|
|
|
{
|
|
|
|
const container = tag.find(".server-complains");
|
|
|
|
container.text(server.properties.virtualserver_complain_autoban_count);
|
2019-08-30 23:06:39 +02:00
|
|
|
}
|
|
|
|
}
|