2018-02-27 17:20:49 +01:00
|
|
|
/// <reference path="channel.ts" />
|
2018-08-11 15:02:11 +02:00
|
|
|
/// <reference path="modal/ModalServerEdit.ts" />
|
2018-02-27 17:20:49 +01:00
|
|
|
|
2018-06-20 21:05:35 +02:00
|
|
|
class ServerProperties {
|
2018-08-11 15:02:11 +02:00
|
|
|
virtualserver_host: string = "";
|
|
|
|
virtualserver_port: number = 0;
|
|
|
|
|
2018-06-20 21:05:35 +02:00
|
|
|
virtualserver_name: string = "";
|
2018-08-13 13:06:42 +02:00
|
|
|
virtualserver_name_phonetic: string = "";
|
2018-06-20 21:05:35 +02:00
|
|
|
virtualserver_icon_id: number = 0;
|
|
|
|
virtualserver_version: string = "unknown";
|
|
|
|
virtualserver_platform: string = "unknown";
|
|
|
|
virtualserver_unique_identifier: string = "";
|
|
|
|
|
|
|
|
virtualserver_clientsonline: number = 0;
|
|
|
|
virtualserver_queryclientsonline: number = 0;
|
|
|
|
virtualserver_channelsonline: number = 0;
|
|
|
|
virtualserver_uptime: number = 0;
|
2018-08-11 15:02:11 +02:00
|
|
|
virtualserver_maxclients: number = 0;
|
|
|
|
virtualserver_reserved_slots: number = 0;
|
|
|
|
|
|
|
|
virtualserver_password: string = "";
|
|
|
|
virtualserver_flag_password: boolean = false;
|
|
|
|
|
|
|
|
virtualserver_welcomemessage: string = "";
|
|
|
|
|
|
|
|
virtualserver_hostmessage: string = "";
|
|
|
|
virtualserver_hostmessage_mode: number = 0;
|
|
|
|
|
|
|
|
virtualserver_hostbanner_url: string = "";
|
|
|
|
virtualserver_hostbanner_gfx_url: string = "";
|
|
|
|
virtualserver_hostbanner_gfx_interval: number = 0;
|
|
|
|
virtualserver_hostbanner_mode: number = 0;
|
|
|
|
|
|
|
|
virtualserver_hostbutton_tooltip: string = "";
|
|
|
|
virtualserver_hostbutton_url: string = "";
|
|
|
|
virtualserver_hostbutton_gfx_url: string = "";
|
2018-08-13 11:03:55 +02:00
|
|
|
|
2018-08-13 13:06:42 +02:00
|
|
|
virtualserver_codec_encryption_mode: number = 0;
|
|
|
|
|
2018-09-24 21:21:48 +02:00
|
|
|
virtualserver_default_music_group: number = 0;
|
2018-08-13 13:06:42 +02:00
|
|
|
virtualserver_default_server_group: number = 0;
|
|
|
|
virtualserver_default_channel_group: number = 0;
|
|
|
|
virtualserver_default_channel_admin_group: number = 0;
|
|
|
|
|
2018-08-13 11:03:55 +02:00
|
|
|
//Special requested properties
|
|
|
|
virtualserver_default_client_description: string = "";
|
|
|
|
virtualserver_default_channel_description: string = "";
|
|
|
|
virtualserver_default_channel_topic: string = "";
|
2018-08-13 11:28:33 +02:00
|
|
|
|
|
|
|
virtualserver_antiflood_points_tick_reduce: number = 0;
|
|
|
|
virtualserver_antiflood_points_needed_command_block: number = 0;
|
|
|
|
virtualserver_antiflood_points_needed_ip_block: number = 0;
|
2018-08-13 13:06:42 +02:00
|
|
|
|
|
|
|
virtualserver_complain_autoban_count: number = 0;
|
|
|
|
virtualserver_complain_autoban_time: number = 0;
|
|
|
|
virtualserver_complain_remove_time: number = 0;
|
|
|
|
|
|
|
|
virtualserver_needed_identity_security_level: number = 8;
|
|
|
|
virtualserver_weblist_enabled: boolean = false;
|
|
|
|
virtualserver_min_clients_in_channel_before_forced_silence: number = 0;
|
2018-11-04 14:20:38 +01:00
|
|
|
|
|
|
|
virtualserver_max_upload_total_bandwidth: number = 0;
|
|
|
|
virtualserver_upload_quota: number = 0;
|
|
|
|
virtualserver_max_download_total_bandwidth: number = 0;
|
|
|
|
virtualserver_download_quota: number = 0;
|
2018-06-20 21:05:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
interface ServerAddress {
|
|
|
|
host: string;
|
|
|
|
port: number;
|
|
|
|
}
|
|
|
|
|
2018-02-27 17:20:49 +01:00
|
|
|
class ServerEntry {
|
2018-06-20 21:05:35 +02:00
|
|
|
remote_address: ServerAddress;
|
2018-02-27 17:20:49 +01:00
|
|
|
channelTree: ChannelTree;
|
2018-06-20 21:05:35 +02:00
|
|
|
properties: ServerProperties;
|
2018-02-27 17:20:49 +01:00
|
|
|
|
2018-08-13 11:03:55 +02:00
|
|
|
private info_request_promise: Promise<void> = undefined;
|
|
|
|
private info_request_promise_resolve: any = undefined;
|
|
|
|
private info_request_promise_reject: any = undefined;
|
|
|
|
|
2018-02-27 17:20:49 +01:00
|
|
|
lastInfoRequest: number = 0;
|
|
|
|
nextInfoRequest: number = 0;
|
|
|
|
private _htmlTag: JQuery<HTMLElement>;
|
|
|
|
|
2018-06-20 21:05:35 +02:00
|
|
|
constructor(tree, name, address: ServerAddress) {
|
|
|
|
this.properties = new ServerProperties();
|
2018-02-27 17:20:49 +01:00
|
|
|
this.channelTree = tree;
|
2018-06-20 21:05:35 +02:00
|
|
|
this.remote_address = address;
|
2018-02-27 17:20:49 +01:00
|
|
|
this.properties.virtualserver_name = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
get htmlTag() {
|
|
|
|
if(this._htmlTag) return this._htmlTag;
|
|
|
|
|
2019-02-17 16:08:10 +01:00
|
|
|
let tag = $.spawn("div").addClass("tree-entry server");
|
|
|
|
|
|
|
|
tag.append(
|
|
|
|
$.spawn("div")
|
|
|
|
.addClass("server_type icon client-server_green")
|
|
|
|
);
|
|
|
|
|
|
|
|
tag.append(
|
|
|
|
$.spawn("div")
|
|
|
|
.addClass("name")
|
|
|
|
.text(this.properties.virtualserver_name)
|
|
|
|
);
|
|
|
|
|
|
|
|
tag.append(
|
|
|
|
$.spawn("div")
|
|
|
|
.addClass("icon_property icon_empty")
|
|
|
|
);
|
2018-02-27 17:20:49 +01:00
|
|
|
|
|
|
|
return this._htmlTag = tag;
|
|
|
|
}
|
|
|
|
|
|
|
|
initializeListener(){
|
2018-11-04 13:54:18 +01:00
|
|
|
this._htmlTag.click(() => {
|
|
|
|
this.channelTree.onSelect(this);
|
2018-02-27 17:20:49 +01:00
|
|
|
});
|
2018-04-16 20:38:35 +02:00
|
|
|
|
|
|
|
if(!settings.static(Settings.KEY_DISABLE_CONTEXT_MENU, false)) {
|
2018-11-04 13:54:18 +01:00
|
|
|
this.htmlTag.on("contextmenu", (event) => {
|
2018-04-16 20:38:35 +02:00
|
|
|
event.preventDefault();
|
2018-11-04 13:54:18 +01:00
|
|
|
if($.isArray(this.channelTree.currently_selected)) { //Multiselect
|
|
|
|
(this.channelTree.currently_selected_context_callback || ((_) => null))(event);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.channelTree.onSelect(this, true);
|
|
|
|
this.spawnContextMenu(event.pageX, event.pageY, () => { this.channelTree.onSelect(undefined, true); });
|
2018-04-16 20:38:35 +02:00
|
|
|
});
|
|
|
|
}
|
2018-02-27 17:20:49 +01:00
|
|
|
}
|
|
|
|
|
2018-04-16 20:38:35 +02:00
|
|
|
spawnContextMenu(x: number, y: number, on_close: () => void = () => {}) {
|
2019-03-07 15:30:53 +01:00
|
|
|
let trigger_close = true;
|
2018-09-30 21:50:59 +02:00
|
|
|
spawn_context_menu(x, y, {
|
2019-03-07 15:30:53 +01:00
|
|
|
type: MenuEntryType.ENTRY,
|
|
|
|
name: tr("Show server info"),
|
|
|
|
callback: () => {
|
|
|
|
trigger_close = false;
|
2019-04-04 21:47:52 +02:00
|
|
|
this.channelTree.client.select_info.open_popover()
|
2019-03-07 15:30:53 +01:00
|
|
|
},
|
|
|
|
icon: "client-about",
|
2019-04-04 21:47:52 +02:00
|
|
|
visible: this.channelTree.client.select_info.is_popover()
|
2019-03-07 15:30:53 +01:00
|
|
|
}, {
|
|
|
|
type: MenuEntryType.HR,
|
2019-04-04 21:47:52 +02:00
|
|
|
visible: this.channelTree.client.select_info.is_popover(),
|
2019-03-07 15:30:53 +01:00
|
|
|
name: ''
|
|
|
|
}, {
|
2018-02-27 17:20:49 +01:00
|
|
|
type: MenuEntryType.ENTRY,
|
2018-08-13 13:16:10 +02:00
|
|
|
icon: "client-virtualserver_edit",
|
2018-12-05 20:46:33 +01:00
|
|
|
name: tr("Edit"),
|
2018-08-11 15:02:11 +02:00
|
|
|
callback: () => {
|
|
|
|
Modals.createServerModal(this, properties => {
|
2018-12-05 20:46:33 +01:00
|
|
|
log.info(LogCategory.SERVER, tr("Changing server properties %o"), properties);
|
|
|
|
console.log(tr("Changed properties: %o"), properties);
|
2018-08-11 15:02:11 +02:00
|
|
|
if (properties)
|
2019-02-23 14:15:22 +01:00
|
|
|
this.channelTree.client.serverConnection.send_command("serveredit", properties).then(() => {
|
2019-04-04 21:47:52 +02:00
|
|
|
this.channelTree.client.sound.play(Sound.SERVER_EDITED_SELF);
|
2018-11-04 00:39:29 +01:00
|
|
|
});
|
2018-08-11 15:02:11 +02:00
|
|
|
});
|
|
|
|
}
|
2019-03-25 20:04:04 +01:00
|
|
|
}, {
|
|
|
|
type: MenuEntryType.ENTRY,
|
|
|
|
icon: "client-iconviewer",
|
|
|
|
name: tr("View icons"),
|
|
|
|
callback: () => Modals.spawnIconSelect(this.channelTree.client)
|
|
|
|
}, {
|
|
|
|
type: MenuEntryType.ENTRY,
|
|
|
|
icon: 'client-iconsview',
|
|
|
|
name: tr("View avatars"),
|
|
|
|
callback: () => Modals.spawnAvatarList(this.channelTree.client)
|
2019-01-20 18:43:14 +01:00
|
|
|
}, {
|
|
|
|
type: MenuEntryType.ENTRY,
|
|
|
|
icon: "client-invite_buddy",
|
|
|
|
name: tr("Invite buddy"),
|
2019-05-25 17:54:26 +02:00
|
|
|
callback: () => Modals.spawnInviteEditor(this.channelTree.client)
|
2018-02-27 17:20:49 +01:00
|
|
|
},
|
2019-03-07 15:30:53 +01:00
|
|
|
MenuEntry.CLOSE(() => (trigger_close ? on_close : () => {})())
|
2018-02-27 17:20:49 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2018-08-13 11:03:55 +02:00
|
|
|
updateVariables(is_self_notify: boolean, ...variables: {key: string, value: string}[]) {
|
2018-12-05 20:46:33 +01:00
|
|
|
let group = log.group(log.LogType.DEBUG, LogCategory.SERVER, tr("Update properties (%i)"), variables.length);
|
2018-06-20 21:05:35 +02:00
|
|
|
|
2019-03-25 20:04:04 +01:00
|
|
|
{
|
|
|
|
const entries = [];
|
|
|
|
for(const variable of variables)
|
|
|
|
entries.push({
|
|
|
|
key: variable.key,
|
|
|
|
value: variable.value,
|
|
|
|
type: typeof (this.properties[variable.key])
|
|
|
|
});
|
|
|
|
log.table("Server update properties", entries);
|
|
|
|
}
|
|
|
|
|
2018-11-03 12:16:13 +01:00
|
|
|
let update_bannner = false;
|
2018-06-20 21:05:35 +02:00
|
|
|
for(let variable of variables) {
|
2018-08-10 21:30:58 +02:00
|
|
|
JSON.map_field_to(this.properties, variable.value, variable.key);
|
|
|
|
|
2018-06-20 21:05:35 +02:00
|
|
|
if(variable.key == "virtualserver_name") {
|
|
|
|
this.htmlTag.find(".name").text(variable.value);
|
2019-04-04 21:47:52 +02:00
|
|
|
this.channelTree.client.tag_connection_handler.find(".server-name").text(variable.value);
|
|
|
|
server_connections.update_ui();
|
2018-06-20 21:05:35 +02:00
|
|
|
} else if(variable.key == "virtualserver_icon_id") {
|
2019-04-25 20:21:50 +02:00
|
|
|
/* For more detail lookup client::updateVariables and client_icon_id!
|
|
|
|
* ATTENTION: This is required!
|
|
|
|
*/
|
|
|
|
this.properties.virtualserver_icon_id = variable.value as any >>> 0;
|
|
|
|
|
2018-06-20 21:05:35 +02:00
|
|
|
if(this.channelTree.client.fileManager && this.channelTree.client.fileManager.icons)
|
|
|
|
this.htmlTag.find(".icon_property").replaceWith(this.channelTree.client.fileManager.icons.generateTag(this.properties.virtualserver_icon_id).addClass("icon_property"));
|
2018-11-03 12:16:13 +01:00
|
|
|
} else if(variable.key.indexOf('hostbanner') != -1) {
|
|
|
|
update_bannner = true;
|
2018-06-20 21:05:35 +02:00
|
|
|
}
|
2018-02-27 17:20:49 +01:00
|
|
|
}
|
2018-11-03 12:16:13 +01:00
|
|
|
if(update_bannner)
|
2019-04-04 21:47:52 +02:00
|
|
|
this.channelTree.client.select_info.update_banner();
|
2018-06-20 21:05:35 +02:00
|
|
|
|
|
|
|
group.end();
|
2018-08-13 11:03:55 +02:00
|
|
|
if(is_self_notify && this.info_request_promise_resolve) {
|
|
|
|
this.info_request_promise_resolve();
|
|
|
|
this.info_request_promise = undefined;
|
|
|
|
this.info_request_promise_reject = undefined;
|
|
|
|
this.info_request_promise_resolve = undefined;
|
|
|
|
}
|
2018-02-27 17:20:49 +01:00
|
|
|
}
|
|
|
|
|
2018-08-13 11:03:55 +02:00
|
|
|
updateProperties() : Promise<void> {
|
|
|
|
if(this.info_request_promise && Date.now() - this.lastInfoRequest < 1000) return this.info_request_promise;
|
|
|
|
this.lastInfoRequest = Date.now();
|
2018-02-27 17:20:49 +01:00
|
|
|
this.nextInfoRequest = this.lastInfoRequest + 10 * 1000;
|
2019-02-23 14:15:22 +01:00
|
|
|
this.channelTree.client.serverConnection.send_command("servergetvariables").catch(error => {
|
2018-08-13 11:03:55 +02:00
|
|
|
this.info_request_promise_reject(error);
|
|
|
|
this.info_request_promise = undefined;
|
|
|
|
this.info_request_promise_reject = undefined;
|
|
|
|
this.info_request_promise_resolve = undefined;
|
|
|
|
});
|
|
|
|
|
|
|
|
return this.info_request_promise = new Promise<void>((resolve, reject) => {
|
|
|
|
this.info_request_promise_reject = reject;
|
|
|
|
this.info_request_promise_resolve = resolve;
|
|
|
|
});
|
2018-02-27 17:20:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
shouldUpdateProperties() : boolean {
|
2018-04-30 23:57:21 +02:00
|
|
|
return this.nextInfoRequest < Date.now();
|
2018-02-27 17:20:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
calculateUptime() : number {
|
2018-06-20 21:05:35 +02:00
|
|
|
if(this.properties.virtualserver_uptime == 0 || this.lastInfoRequest == 0) return this.properties.virtualserver_uptime;
|
|
|
|
return this.properties.virtualserver_uptime + (new Date().getTime() - this.lastInfoRequest) / 1000;
|
2018-02-27 17:20:49 +01:00
|
|
|
}
|
|
|
|
}
|