diff --git a/css/modals.scss b/css/modals.scss index 3bf12e04..9e2211df 100644 --- a/css/modals.scss +++ b/css/modals.scss @@ -59,11 +59,22 @@ resize: none; } } + .properties_messages textarea { height: 70px; resize: none; } + .properties_misc { + .complains { + display: grid; + grid-template-columns: auto auto auto; + grid-template-rows: auto auto; + grid-column-gap: 5px; + margin-bottom: 10px; + } + } + .container { padding: 6px; } diff --git a/js/permission/GroupManager.ts b/js/permission/GroupManager.ts index 7c23210e..1d352ee7 100644 --- a/js/permission/GroupManager.ts +++ b/js/permission/GroupManager.ts @@ -12,6 +12,10 @@ enum GroupTarget { class GroupProperties { iconid: number = 0; + + sortid: number = 0; + savedb: boolean = false; + namemode: number = 0; } class Group { @@ -66,6 +70,21 @@ class GroupManager { this.handle.serverConnection.sendCommand("channelgrouplist"); } + static sorter() : (a: Group, b: Group) => number { + return (a, b) => { + if(a.properties.sortid < b.properties.sortid) + return 1; + if(a.properties.sortid > b.properties.sortid) + return -1; + + if(a.id < b.id) + return -1; + if(a.id > b.id) + return 1; + return 0; + } + } + serverGroup?(id: number) : Group { for(let group of this.serverGroups) if(group.id == id) return group; @@ -103,7 +122,7 @@ class GroupManager { continue; } - let group = new Group(this,target == GroupTarget.SERVER ? groupData["sgid"] : groupData["cgid"], target, type, groupData["name"]); + let group = new Group(this,parseInt(target == GroupTarget.SERVER ? groupData["sgid"] : groupData["cgid"]), target, type, groupData["name"]); for(let key in groupData as any) { if(key == "sgid") continue; if(key == "cgid") continue; diff --git a/js/ui/modal/ModalServerEdit.ts b/js/ui/modal/ModalServerEdit.ts index 89de6d74..6af4aaae 100644 --- a/js/ui/modal/ModalServerEdit.ts +++ b/js/ui/modal/ModalServerEdit.ts @@ -33,6 +33,8 @@ namespace Modals { server_applyHostListener(properties, server.properties, modal.htmlTag.find(".properties_host"), modal.htmlTag.find(".button_ok")); server_applyMessages(properties, server, modal.htmlTag.find(".properties_messages")); server_applyFlood(properties, server, modal.htmlTag.find(".properties_flood")); + server_applySecurity(properties, server, modal.htmlTag.find(".properties_security")); + server_applyMisc(properties, server, modal.htmlTag.find(".properties_misc")); modal.htmlTag.find(".button_ok").click(() => { modal.close(); @@ -63,6 +65,10 @@ namespace Modals { updateButton(); }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_NAME).granted(1)); + tag.find(".virtualserver_name_phonetic").change(function (this: HTMLInputElement) { + properties.virtualserver_name_phonetic = this.value; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_NAME).granted(1)); + tag.find(".virtualserver_password").change(function (this: HTMLInputElement) { properties.virtualserver_flag_password = this.value.length != 0; if(properties.virtualserver_flag_password) @@ -186,4 +192,120 @@ namespace Modals { properties.virtualserver_antiflood_points_needed_ip_block = this.valueAsNumber; }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_ANTIFLOOD).granted(1)); } + + + function server_applySecurity(properties: ServerProperties, server: ServerEntry, tag: JQuery) { + server.updateProperties().then(() => { + tag.find(".virtualserver_needed_identity_security_level").val(server.properties.virtualserver_needed_identity_security_level); + }); + + tag.find(".virtualserver_needed_identity_security_level").change(function (this: HTMLInputElement) { + properties.virtualserver_needed_identity_security_level = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_NEEDED_IDENTITY_SECURITY_LEVEL).granted(1)); + + tag.find(".virtualserver_codec_encryption_mode").change(function (this: HTMLSelectElement) { + properties.virtualserver_codec_encryption_mode = this.selectedIndex; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_ANTIFLOOD).granted(1)) + .find("option").eq(server.properties.virtualserver_codec_encryption_mode).prop('selected', true); + } + + function server_applyMisc(properties: ServerProperties, server: ServerEntry, tag: JQuery) { + { //TODO notify on tmp channeladmin group and vice versa + //virtualserver_default_server_group + //virtualserver_default_channel_group + //virtualserver_default_channel_admin_group + { + let groups_tag = tag.find(".default_server_group"); + groups_tag.change(function (this: HTMLSelectElement) { + properties.virtualserver_default_server_group = parseInt($(this.item(this.selectedIndex)).attr("group-id")); + }); + + for(let group of server.channelTree.client.groups.serverGroups.sort(GroupManager.sorter())) { + if(group.type != 2) continue; + let group_tag = $.spawn("option").text(group.name + " [" + (group.properties.savedb ? "perm" : "tmp") + "]").attr("group-id", group.id); + if(group.id == server.properties.virtualserver_default_server_group) + group_tag.prop("selected", true); + group_tag.appendTo(groups_tag); + } + } + + { + let groups_tag = tag.find(".default_channel_group"); + groups_tag.change(function (this: HTMLSelectElement) { + properties.virtualserver_default_channel_group = parseInt($(this.item(this.selectedIndex)).attr("group-id")); + }); + + for(let group of server.channelTree.client.groups.channelGroups.sort(GroupManager.sorter())) { + if(group.type != 2) continue; + let group_tag = $.spawn("option").text(group.name + " [" + (group.properties.savedb ? "perm" : "tmp") + "]").attr("group-id", group.id); + if(group.id == server.properties.virtualserver_default_channel_group) + group_tag.prop("selected", true); + group_tag.appendTo(groups_tag); + } + } + + { + let groups_tag = tag.find(".default_channel_admin_group"); + groups_tag.change(function (this: HTMLSelectElement) { + properties.virtualserver_default_channel_admin_group = parseInt($(this.item(this.selectedIndex)).attr("group-id")); + }); + + for(let group of server.channelTree.client.groups.channelGroups.sort(GroupManager.sorter())) { + if(group.type != 2) continue; + let group_tag = $.spawn("option").text(group.name + " [" + (group.properties.savedb ? "perm" : "tmp") + "]").attr("group-id", group.id); + if(group.id == server.properties.virtualserver_default_channel_admin_group) + group_tag.prop("selected", true); + group_tag.appendTo(groups_tag); + } + } + } + + server.updateProperties().then(() => { + //virtualserver_antiflood_points_needed_ip_block + //virtualserver_antiflood_points_needed_command_block + //virtualserver_antiflood_points_tick_reduce + + //virtualserver_complain_autoban_count + //virtualserver_complain_autoban_time + //virtualserver_complain_remove_time + tag.find(".virtualserver_antiflood_points_needed_ip_block").val(server.properties.virtualserver_antiflood_points_needed_ip_block); + tag.find(".virtualserver_antiflood_points_needed_command_block").val(server.properties.virtualserver_antiflood_points_needed_command_block); + tag.find(".virtualserver_antiflood_points_tick_reduce").val(server.properties.virtualserver_antiflood_points_tick_reduce); + tag.find(".virtualserver_complain_autoban_count").val(server.properties.virtualserver_complain_autoban_count); + tag.find(".virtualserver_complain_autoban_time").val(server.properties.virtualserver_complain_autoban_time); + tag.find(".virtualserver_complain_remove_time").val(server.properties.virtualserver_complain_remove_time); + + tag.find(".virtualserver_weblist_enabled").prop("checked", server.properties.virtualserver_weblist_enabled); + }); + + tag.find(".virtualserver_antiflood_points_needed_ip_block").change(function (this: HTMLInputElement) { + properties.virtualserver_antiflood_points_needed_ip_block = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_ANTIFLOOD).granted(1)); + + tag.find(".virtualserver_antiflood_points_needed_command_block").change(function (this: HTMLInputElement) { + properties.virtualserver_antiflood_points_needed_command_block = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_ANTIFLOOD).granted(1)); + + tag.find(".virtualserver_antiflood_points_tick_reduce").change(function (this: HTMLInputElement) { + properties.virtualserver_antiflood_points_tick_reduce = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_ANTIFLOOD).granted(1)); + + + tag.find(".virtualserver_complain_autoban_count").change(function (this: HTMLInputElement) { + properties.virtualserver_complain_autoban_count = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_COMPLAIN).granted(1)); + + tag.find(".virtualserver_complain_autoban_time").change(function (this: HTMLInputElement) { + properties.virtualserver_complain_autoban_time = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_COMPLAIN).granted(1)); + + tag.find(".virtualserver_complain_remove_time").change(function (this: HTMLInputElement) { + properties.virtualserver_complain_remove_time = this.valueAsNumber; + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_COMPLAIN).granted(1)); + + + tag.find(".virtualserver_weblist_enabled").change(function (this: HTMLInputElement) { + properties.virtualserver_weblist_enabled = $(this).prop("checked"); + }).prop("disabled", !globalClient.permissions.neededPermission(PermissionType.B_VIRTUALSERVER_MODIFY_WEBLIST).granted(1)); + } } \ No newline at end of file diff --git a/js/ui/server.ts b/js/ui/server.ts index 70cf603c..ef2241b2 100644 --- a/js/ui/server.ts +++ b/js/ui/server.ts @@ -6,6 +6,7 @@ class ServerProperties { virtualserver_port: number = 0; virtualserver_name: string = ""; + virtualserver_name_phonetic: string = ""; virtualserver_icon_id: number = 0; virtualserver_version: string = "unknown"; virtualserver_platform: string = "unknown"; @@ -35,6 +36,12 @@ class ServerProperties { virtualserver_hostbutton_url: string = ""; virtualserver_hostbutton_gfx_url: string = ""; + virtualserver_codec_encryption_mode: number = 0; + + virtualserver_default_server_group: number = 0; + virtualserver_default_channel_group: number = 0; + virtualserver_default_channel_admin_group: number = 0; + //Special requested properties virtualserver_default_client_description: string = ""; virtualserver_default_channel_description: string = ""; @@ -43,6 +50,14 @@ class ServerProperties { virtualserver_antiflood_points_tick_reduce: number = 0; virtualserver_antiflood_points_needed_command_block: number = 0; virtualserver_antiflood_points_needed_ip_block: number = 0; + + 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; } interface ServerAddress { diff --git a/templates.html b/templates.html index 17c837d1..52dfd72d 100644 --- a/templates.html +++ b/templates.html @@ -108,6 +108,8 @@
Name: + Phonetic Name: + Password: @@ -228,16 +230,77 @@ Security - TODO! + +
+
+
Needed Security Level:
+ +
Channel voice data encryption:
+ +
+
+
Misc - TODO! + +
+
+
Default groups
+
+
Server group
+ + +
Channel group
+ + +
Channel Admin group
+ +
+
+
+
Complain
+
+
Autoban Count
+
Autoban Time
+
Remove Time
+ + + + +
+
+
+
Minimum clients is channel before silence:
+ + +
Priority speaker dim modificator:
+ + +
Delete delay for temporary channels
+ +
+ +
+
Server list
+
+ Enable reporting to the TeamSpeak server list
+ Enable reporting to the TeaSpeak server list (TeaSpeak does not support this setting) +
+
+
+
+ Messages