2018-02-27 16:20:49 +00:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
2018-03-24 22:38:01 +00:00
< title > TeaSpeak-Web client templates< / title >
2018-02-27 16:20:49 +00:00
< / head >
< body >
2018-10-03 20:04:29 +00:00
<!-- main frame -->
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_main" type = "text/html" >
2018-10-03 20:04:29 +00:00
< div class = "app-container" >
< div class = "app" >
<!-- Container -->
< div style = "height: 45px; width: 100%; border-radius: 2px 0px 0px 0px; border-bottom-width: 0px; background-color: lightgrey"
class="main_container">
< div id = "control_bar" class = "control_bar" >
< div class = "button btn_connect" title = "Connect to a server" >
< div class = "icon_x32 client-connect" > < / div >
< / div >
< div class = "button btn_disconnect" title = "Disconnect from server" style = "display: none" >
< div class = "icon_x32 client-disconnect" > < / div >
< / div >
<!-- <div class="button btn_disconnect"><div class="icon_x32 client - disconnect"></div></div> -->
< div class = "divider" > < / div >
< div class = "button-dropdown btn_away" title = "Toggle away status" >
< div class = "buttons" >
< div class = "button icon_x32 client-away btn_away_toggle" > < / div >
< div class = "button-dropdown" >
< div class = "arrow" > < / div >
< / div >
< / div >
< div class = "dropdown" >
< div class = "btn_away_toggle" > < div class = "icon client-away" > < / div > < a > Toggle away status< / a > < / div >
< div class = "btn_away_message" > < div class = "icon client-away" > < / div > < a > Set away message< / a > < / div >
< / div >
< / div >
< div class = "button btn_mute_input" >
< div class = "icon_x32 client-input_muted" title = "Mute/unmute microphone" > < / div >
< / div >
< div class = "button btn_mute_output" >
< div class = "icon_x32 client-output_muted" title = "Mute/unmute headphones" > < / div >
< / div >
< div class = "divider" > < / div >
< div class = "button-dropdown btn_token" title = "Use token" >
< div class = "buttons" >
< div class = "button icon_x32 client-token btn_token_use" > < / div >
< div class = "button-dropdown" >
< div class = "arrow" > < / div >
< / div >
< / div >
< div class = "dropdown" >
< div class = "btn_token_list" > < div class = "icon client-token" > < / div > < a > List tokens< / a > < / div >
< div class = "btn_token_use" > < div class = "icon client-token_use" > < / div > < a > Use token< / a > < / div >
< / div >
< / div >
< div style = "width: 100%" > < / div >
2018-10-20 17:58:06 +00:00
< div class = "button btn_banlist" title = "Banlist" >
< div class = "icon_x32 client-ban_list" > < / div >
< / div >
2018-10-03 20:04:29 +00:00
< div class = "button btn_permissions" title = "View/edit permissions" >
< div class = "icon_x32 client-permission_overview" > < / div >
< / div >
< div class = "divider" > < / div >
< div class = "button btn_open_settings" title = "Edit global client settings" >
< div class = "icon_x32 client-settings" > < / div >
< / div >
< / div >
< / div >
2018-11-03 11:16:13 +00:00
< div style = "flex-direction: row; height: 100%; width: 100%; display: flex; justify-content: stretch;" >
< div class = "container-channel-chat" >
< div class = "container-channel" class = "main_container" >
2018-10-03 20:04:29 +00:00
< div class = "channelTree" id = "channelTree" > < / div >
2018-11-03 11:16:13 +00:00
< / div >
<!-- Channel tree -->
< div class = "main_container container-chat" >
2018-10-03 20:04:29 +00:00
< div id = "chat" >
< div class = "messages" >
< div class = "message_box" > < / div >
< / div >
< div class = "chats" > < / div >
< div class = "input" >
<!-- <div contentEditable="true" class="input_box"></div> -->
< textarea class = "input_box" title = "" > < / textarea >
< button > Send< / button >
< / div >
< / div >
< / div > <!-- Chat window -->
< / div >
2018-11-03 11:16:13 +00:00
< div class = "main_container container-info" >
2018-10-03 20:04:29 +00:00
< div id = "select_info" class = "select_info" style = "width: 100%; max-width: 100%" >
2018-11-03 11:16:13 +00:00
< div class = "container-banner" > < / div >
< div class = "container-select-info" > < / div >
2018-10-03 20:04:29 +00:00
< / div >
< / div > <!-- Selection info -->
< / div >
< / div >
< / div >
< div id = "contextMenu" class = "context-menu" > < / div >
< / script >
2018-09-30 19:50:59 +00:00
<!-- Template for the connect modal -->
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_connect" type = "text/html" >
2018-09-30 19:50:59 +00:00
< div style = "margin-top: 5px;" >
< div style = "display: flex; flex-direction: row; width: 100%; justify-content: space-between" >
< div style = "width: 68%; margin-bottom: 5px" >
< div > Remote address and port:< / div >
< input type = "text" style = "width: 100%" class = "connect_address" value = "unknown" >
< / div >
< div style = "width: 20%" >
< div > Server password:< / div >
< form name = "server_password_form" onsubmit = "return false;" >
< input type = "password" if = "connect_server_password_{{rnd '0~13377331'/}}" autocomplete = "off" style = "width: 100%" class = "connect_password" >
< / form >
< / div >
< / div >
< div >
< div > Nickname:< / div >
< input type = "text" style = "width: 100%" class = "connect_nickname" value = "" >
< / div >
< hr >
< div class = "group_box" >
< div style = "display: flex; justify-content: space-between;" >
< div style = "text-align: right;" > Identity Settings< / div >
< select class = "identity_select" >
< option name = "identity_type" value = "TEAFORO" > Forum Account< / option >
< option name = "identity_type" value = "TEAMSPEAK" > TeamSpeak< / option >
< option name = "identity_type" value = "NICKNAME" > Nickname (Debug purposes only!)< / option > <!-- Only available on localhost for debug -->
< / select >
< / div >
< hr >
< div class = "identity_config_TEAMSPEAK identity_config" >
Please enter your exported TS3 Identity string bellow or select your exported Identity< br >
< div style = "width: 100%; display: flex; flex-direction: row" >
< input placeholder = "Identity string" style = "width: 70%; margin: 5px;" class = "identity_string" >
< div style = "width: 30%; margin: 5px" > < input class = "identity_file" type = "file" > < / div >
< / div >
< / div >
< div class = "identity_config_TEAFORO identity_config" >
2018-10-07 16:21:28 +00:00
< div class = "connected" >
You're using your forum account as verification
< / div >
< div class = "disconnected" >
You cant use your TeaSpeak forum account.< br >
You're not connected!< br >
Click {{if !client}}< a href = "{{:forum_path}}login.php" > here< / a > {{else}}< a href = "#" class = "native-teaforo-login" > here< / a > {{/if}} to login via the TeaSpeak forum.
< / div >
2018-09-30 19:50:59 +00:00
< / div >
< div class = "identity_config_NICKNAME identity_config" >
This is just for debug and uses the name as unique identifier
< / div >
< div style = "background-color: red; border-radius: 1px; display: none" class = "error_message" > < / div >
< / div > <!-- <a href="<?php echo authPath() . "login.php"; ?>">Login</a> via the TeaSpeak forum. -->
< / div >
< / script >
2018-10-20 17:58:06 +00:00
<!-- Template for channel create & edit -->
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_channel_edit" type = "text/html" >
2018-08-11 13:02:11 +00:00
< div class = "align_column general_properties" >
< div class = "properties" >
2018-04-16 18:38:35 +00:00
< a class = "key" > Name:< / a >
2018-06-24 11:38:53 +00:00
< input class = "value channel_name" value = "{{>channel_name}}" / >
2018-08-11 13:02:11 +00:00
2018-04-16 18:38:35 +00:00
< a class = "key" > Password:< / a >
2018-06-24 11:38:53 +00:00
<!-- Use a random id to trick the default browser password manager. (I think something like a default password is really useless and -->
<!-- Just display a random value here -->
< input class = "value channel_password" type = "password" id = "field_channel_password_{{rnd '0~13377331'/}}" { { if channel_flag_password } } value = "WolverinDEV" { { / if } } / >
2018-08-11 13:02:11 +00:00
2018-04-16 18:38:35 +00:00
< a class = "key" > Topic:< / a >
2018-06-24 11:38:53 +00:00
< input class = "value channel_topic" value = "{{>channel_topic}}" / >
2018-08-11 13:02:11 +00:00
2018-04-16 18:38:35 +00:00
< a class = "key" > Description:< / a >
2018-06-24 11:38:53 +00:00
< textarea class = "value channel_description" style = "height: 150px; resize: none" > {{>channel_description}}< / textarea >
2018-04-16 18:38:35 +00:00
< / div >
< / div >
< div style = "margin-bottom: 5px" > < / div >
2018-02-27 16:20:49 +00:00
< x-tab >
< x-entry >
< x-tag > Standard< / x-tag >
< x-content >
2018-04-16 18:38:35 +00:00
< div class = "settings_standard" style = "display: flex; flex-direction: row; width: 100%; justify-content: space-evenly" >
2018-02-27 16:20:49 +00:00
< div style = "vertical-align: center; margin: 20px;" >
< a > Channel Type< / a > < br >
2018-08-11 13:02:11 +00:00
< fieldset style = "border: 2px solid gray;border-radius: 0px 6px 6px 6px;" >
2018-07-03 10:33:31 +00:00
< div > < input type = "radio" name = "channel_type" value = "temp" { { if ! channel_flag_semi_permanent & & ! channel_flag_permanent } } checked { { / if } } > Temporary< / div >
< div > < input type = "radio" name = "channel_type" value = "semi" { { if channel_flag_semi_permanent } } checked { { / if } } > Semi-Permanent< / div >
< div > < input type = "radio" name = "channel_type" value = "perm" { { if channel_flag_permanent } } checked { { / if } } > Permanent< / div >
2018-02-27 16:20:49 +00:00
< hr style = "width: 100%;" >
< div > < input type = "checkbox" name = "channel_default" id = "default" value = "def" > Default Channel< / div >
< / fieldset >
< / div >
< div style = "border-left:1px solid #000;height: auto;" > < / div >
< div style = "flex-direction: column; align-content: stretch; vertical-align: center; margin: 20px;" >
< div >
< div > Sort this channel after:< / div >
< select class = "order_id" style = "width: 150px" >
< / select >
< / div >
< div style = "margin-top: 20px" >
< div > Needed Talk Power:< / div >
2018-04-16 18:38:35 +00:00
< input type = "number" min = "0" value = "0" name = "talk_power" style = "width: 150px" >
2018-02-27 16:20:49 +00:00
< / div >
< / div >
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Audio< / x-tag >
2018-08-13 15:50:55 +00:00
< x-content >
< div class = "container" >
< div class = "settings_audio" >
< div class = "group_box" >
< div class = "header" > Presets< / div >
< div class = "content" >
< fieldset style = "" >
< div > < input type = "radio" name = "voice_template" value = "voice_mobile" > Voice Mobile< / div >
< div > < input type = "radio" name = "voice_template" value = "voice_desktop" > Voice Desktop< / div >
< div > < input type = "radio" name = "voice_template" value = "music" > Music< / div >
< div > < input type = "radio" name = "voice_template" value = "custom" > Custom< / div >
< / fieldset >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Custom Settings< / div >
< div class = "content" >
< div class = "custom" >
< div > Codec:< / div >
< select class = "voice_codec" >
< option value = "speex_narrow" > Speex Narrowband < div class = "icon_entry icon client-conflict-icon" title = "You don't support this codec" > < / div > < / option >
< option value = "speex_wide" > Speex Wideband < div class = "icon_entry icon client-conflict-icon" title = "You don't support this codec" > < / div > < / option >
< option value = "speex_ultra_wide" > Speex Ultra-Wideband < div class = "icon_entry icon client-conflict-icon" title = "You don't support this codec" > < / div > < / option >
< option value = "celt" > CELT Mono < div class = "icon_entry icon client-conflict-icon" title = "You don't support this codec" > < / div > < / option >
< option value = "opus_voice" > Opus Voice< / option >
< option value = "opus_music" > Opus Music< / option >
< / select >
< div > Quality:< / div >
< div class = "quality" >
< input class = "voice_quality_slider" type = "range" min = "1" max = "10" value = "6" >
< div class = "voice_quality_number" > 6< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / x-content >
2018-02-27 16:20:49 +00:00
< / x-entry >
< x-entry >
< x-tag > Permissions< / x-tag >
< x-content >
2018-07-03 10:33:31 +00:00
< div style = "display: flex; justify-content: space-evenly" class = "settings_permissions" >
2018-08-13 15:50:55 +00:00
< div class = "group_box" >
< div class = "header" > Regular needed powers:< / div >
< div class = "content" >
< table class = "channel_perm_tbl" >
< tr > < td class = "key" > Join:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" permission = "i_channel_needed_join_power" > < / td > < / tr >
< tr > < td class = "key" > View:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" permission = "i_channel_needed_view_power" > < / td > < / tr >
< tr > < td class = "key" > Subscribe:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" permission = "i_channel_needed_subscribe_power" > < / td > < / tr >
< tr > < td class = "key" > Desc. view:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" permission = "i_channel_needed_description_view_power" > < / td > < / tr >
< tr > < td class = "key" > Modify:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" permission = "i_channel_needed_modify_power" > < / td > < / tr >
< tr > < td class = "key" > Delete:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" permission = "i_channel_needed_delete_power" > < / td > < / tr >
< / table >
< / div >
2018-02-27 16:20:49 +00:00
< / div >
2018-08-13 15:50:55 +00:00
< div class = "group_box" >
< div class = "header" > File transfer needed powers:< / div >
< div class = "content" >
< table class = "channel_perm_tbl" >
< tr > < td class = "key" > Join:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" > < / td > < / tr >
< tr > < td class = "key" > Subscribe:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" > < / td > < / tr >
< tr > < td class = "key" > Desc. view:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" > < / td > < / tr >
< tr > < td class = "key" > Modify:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" > < / td > < / tr >
< tr > < td class = "key" > Delete:< / td > < td > < input type = "number" min = "0" value = "0" class = "value" > < / td > < / tr >
< / table >
< / div >
2018-02-27 16:20:49 +00:00
< / div >
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Advanced< / x-tag >
2018-08-13 15:50:55 +00:00
< x-content >
< div class = "container settings_advanced" >
< div class = "group_box" >
< div class = "header" > Other Settings< / div >
< div class = "content properties" >
< div class = "key" > Phonetic Name:< / div >
< input class = "value channel_name_phonetic" value = "{{>channel_name_phonetic}}" >
< div class = "key" > Delete delay:< / div >
< input class = "value channel_delete_delay" type = "number" min = "0" max = "99999999" value = "{{:channel_delete_delay}}" > <!-- Implement max? -->
< div > < input class = "channel_codec_is_unencrypted" type = "checkbox" style = "margin-left: 0px" { { if ! channel_codec_is_unencrypted } } checked { { / if } } > Voice Data encrypted< / div >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Max users< / div >
< div class = "content max_users" >
< fieldset >
< div > < input type = "radio" name = "max_users" value = "infinity" { { if channel_flag_maxclients_unlimited } } checked { { / if } } > Unlimited< / div >
< div class = "max_limited" > < input type = "radio" name = "max_users" value = "limited" { { if ! channel_flag_maxclients_unlimited } } checked { { / if } } > Limited
< input style = "margin-left: 25px;" class = "value channel_maxclients" value = "{{:channel_maxclients}}" type = "number" min = "0" max = "99999999" > < / div >
< / fieldset >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Family Max users< / div >
< div class = "content max_users" >
< fieldset >
< div > < input type = "radio" name = "max_users_family" value = "inherited" { { if channel_flag_maxfamilyclients_inherited } } checked { { / if } } > Inherited< / div >
< div > < input type = "radio" name = "max_users_family" value = "infinity" { { if channel_flag_maxfamilyclients_unlimited } } checked { { / if } } > Unlimited< / div >
< div class = "max_limited" > < input type = "radio" name = "max_users_family" value = "limited" { { if ! channel_flag_maxfamilyclients_unlimited & & ! channel_flag_maxfamilyclients_inherited } } checked { { / if } } > Limited
< input style = "margin-left: 25px;" class = "value channel_maxfamilyclients" type = "number" value = "{{:channel_maxfamilyclients}}" min = "0" max = "99999999" > < / div >
< / fieldset >
< / div >
< / div >
< / div >
< / x-content >
2018-02-27 16:20:49 +00:00
< / x-entry >
< / x-tab >
2018-06-24 11:38:53 +00:00
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_server_edit" type = "text/html" >
2018-08-11 13:02:11 +00:00
< div class = "align_column properties_general server_properties" >
< div class = "properties" >
< a class = "key" > Name:< / a >
< input class = "value virtualserver_name" value = "{{>virtualserver_name}}" / >
2018-08-13 11:06:42 +00:00
< a class = "key" > Phonetic Name:< / a >
< input class = "value virtualserver_name_phonetic" value = "{{>virtualserver_name_phonetic}}" / >
2018-08-11 13:02:11 +00:00
< a class = "key" > Password:< / a >
<!-- Use a random id to trick the default browser password manager. (I think something like a default password is really useless and -->
<!-- Just display a random value here -->
< input class = "value virtualserver_password" type = "password" id = "field_server_password_{{rnd '0~13377331'/}}" { { if virtualserver_flag_password } } value = "WolverinDEV" { { / if } } / >
< / div >
< hr >
< div class = "properties" >
< a > Maximum Clients:< / a >
< div >
< input type = "number" min = "0" max = "1024" value = "{{:virtualserver_maxclients}}" class = "value virtualserver_maxclients" >
< a > Reserved slots:< / a >
< input type = "number" min = "0" max = "{{*: data.virtualserver_maxclients - 1 }}" value = "{{:virtualserver_reserved_slots}}" class = "value virtualserver_reserved_slots" >
< / div >
< div class = "key" > Welcome Message:< / div >
< textarea class = "value virtualserver_welcomemessage" > {{>virtualserver_welcomemessage}}< / textarea >
< / div >
< hr >
< / div >
< div style = "margin-bottom: 5px" > < / div >
< x-tab >
< x-entry >
< x-tag > Host< / x-tag >
< x-content >
< div class = "container properties_host" >
< div class = "group_box" >
< div class = "header" > Binding< / div >
< div class = "content" >
< div class = "properties" >
< div class = "key" > Host:< / div >
< input class = "value virtualserver_host" value = "{{>virtualserver_host}}" / >
< div class = "key" > Port:< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_port}}" class = "value virtualserver_port" >
< / div >
< a > Note: These settings require a virtual server restart to take effect!< / a >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Host message< / div >
< div class = "content properties" >
< div class = "key" > Message:< / div >
< input class = "value virtualserver_hostmessage" value = "{{>virtualserver_hostmessage}}" / >
< div class = "key" > Message Mode:< / div >
< select class = "value virtualserver_hostmessage_mode" >
< option value = "none" > No message< / option >
< option value = "log" > Show message in log< / option >
< option value = "modal" > Show message as modal< / option >
< option value = "modal_exit" > Show message as modal and disconnect the client< / option >
< / select >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Host banner< / div >
< div class = "content properties" >
< div class = "key" > URL:< / div >
< input class = "value virtualserver_hostbanner_url" value = "{{>virtualserver_hostbanner_url}}" / >
< div class = "key" > Banner Gfx URL:< / div >
< input class = "value virtualserver_hostbanner_gfx_url" value = "{{>virtualserver_hostbanner_gfx_url}}" / >
< div class = "key" > Gfx Interval:< / div >
< div class = "value" >
< input type = "number" min = "60" value = "{{:virtualserver_hostbanner_gfx_interval}}" class = "value virtualserver_hostbanner_gfx_interval" >
< a > Resize:< / a >
< select class = "value virtualserver_hostbanner_mode" >
< option value = "none" > Do not adjust< / option >
< option value = "ignore_ratio" > Adjust but ignore ratio aspect< / option >
< option value = "keep_ratio" > Adjust and keep ratio aspect< / option >
< / select >
< / div >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Host Button< / div >
< div class = "content properties" >
< div class = "key" > Tooltip:< / div >
< input class = "value virtualserver_hostbutton_tooltip" value = "{{>virtualserver_hostbutton_tooltip}}" / >
< div class = "key" > URL:< / div >
< input class = "value virtualserver_hostbutton_url" value = "{{>virtualserver_hostbutton_url}}" / >
< div class = "key" > Icon URL:< / div >
< input class = "value virtualserver_hostbutton_gfx_url" value = "{{>virtualserver_hostbutton_gfx_url}}" / >
< / div >
< / div >
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Transfers< / x-tag >
2018-11-03 23:39:29 +00:00
< x-content > This needs to be implemented :)< / x-content >
2018-08-11 13:02:11 +00:00
< / x-entry >
< x-entry >
< x-tag > Anti-Flood< / x-tag >
2018-08-13 09:28:33 +00:00
< x-content >
< div class = "container properties_flood" >
< div class = "properties" >
< div class = "key" > Reduced points per tick:< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_antiflood_points_tick_reduce}}" class = "value virtualserver_antiflood_points_tick_reduce" >
< div class = "key" > Points needed to block commands:< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_antiflood_points_needed_command_block}}" class = "value virtualserver_antiflood_points_needed_command_block" >
< div class = "key" > Points needed to block IP:< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_antiflood_points_needed_ip_block}}" class = "value virtualserver_antiflood_points_needed_ip_block" >
< / div >
< / div >
< / x-content >
2018-08-11 13:02:11 +00:00
< / x-entry >
< x-entry >
< x-tag > Security< / x-tag >
2018-08-13 11:06:42 +00:00
< x-content >
< div class = "container properties_security" >
< div class = "properties" >
< div class = "key" > Needed Security Level:< / div >
< input type = "number" min = "1" max = "64" value = "{{:virtualserver_needed_identity_security_level}}" class = "value virtualserver_needed_identity_security_level" >
< div class = "key" > Channel voice data encryption:< / div >
< select class = "value virtualserver_codec_encryption_mode" >
< option value = "unset" > Edit per channel individually< / option >
< option value = "off" > Globally disabled< / option >
< option value = "on" > Globally enabled (recommended)< / option >
< / select >
< / div >
< / div >
< / x-content >
2018-08-11 13:02:11 +00:00
< / x-entry >
< x-entry >
< x-tag > Misc< / x-tag >
2018-08-13 11:06:42 +00:00
< x-content >
< div class = "container properties_misc" >
< div class = "group_box" >
< div class = "header" > Default groups< / div >
< div class = "content properties" >
< div class = "key" > Server group< / div >
< select class = "value default_server_group" > < / select >
2018-09-24 19:21:48 +00:00
< div class = "key" > Music bot group< / div >
< select class = "value default_music_group" > < / select >
2018-08-13 11:06:42 +00:00
< div class = "key" > Channel group< / div >
< select class = "value default_channel_group" > < / select >
< div class = "key" > Channel Admin group< / div >
< select class = "value default_channel_admin_group" > < / select >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Complain< / div >
< div class = "content complains" >
< div class = "key" > Autoban Count< / div >
< div class = "key" > Autoban Time< / div >
< div class = "key" > Remove Time< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_complain_autoban_count}}" class = "value virtualserver_complain_autoban_count" >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_complain_autoban_time}}" class = "value virtualserver_complain_autoban_time" >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_complain_remove_time}}" class = "value virtualserver_complain_remove_time" >
< / div >
< / div >
< div class = "properties" >
< div class = "key" > Minimum clients is channel before silence:< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_min_clients_in_channel_before_forced_silence}}" class = "value virtualserver_min_clients_in_channel_before_forced_silence" >
< div class = "key" > Priority speaker dim modificator:< / div >
< input type = "number" min = "-100" max = "0" value = "{{:virtualserver_priority_speaker_dimm_modificator}}" class = "value virtualserver_priority_speaker_dimm_modificator" >
< div class = "key" > Delete delay for temporary channels< / div >
< input type = "number" min = "1" max = "65536" value = "{{:virtualserver_channel_temp_delete_delay_default}}" class = "value virtualserver_channel_temp_delete_delay_default" >
< / div >
< div class = "group_box" >
< div class = "header" > Server list< / div >
< div class = "content" >
< input type = "checkbox" class = "value virtualserver_weblist_enabled" checked = "{{:virtualserver_weblist_enabled}}" > Enable reporting to the TeamSpeak server list< br >
< input type = "checkbox" class = "value" checked = "false" disabled > < del > Enable reporting to the TeaSpeak server list< / del > (TeaSpeak does not support this setting)
< / div >
< / div >
< / div >
< / x-content >
2018-08-11 13:02:11 +00:00
< / x-entry >
2018-08-13 11:06:42 +00:00
<!-- TeaSpeak don't have any configurable log section
2018-08-11 13:02:11 +00:00
< x-entry >
< x-tag > Log< / x-tag >
< x-content > TODO!< / x-content >
< / x-entry >
2018-08-13 11:06:42 +00:00
-->
2018-08-11 13:02:11 +00:00
< x-entry >
< x-tag > Messages< / x-tag >
2018-08-13 09:03:55 +00:00
< x-content >
< div > <!-- We have to move the shit one layer up -->
< div class = "container properties_messages" >
< div class = "group_box" >
< div class = "header" > Channel< / div >
< div class = "content properties" >
< div class = "key" > Default Topic:< / div >
< textarea class = "value virtualserver_default_channel_topic" > {{>virtualserver_default_channel_topic}}< / textarea >
< div class = "key" > Default Description< / div >
< textarea class = "value virtualserver_default_channel_description" > {{>virtualserver_default_channel_description}}< / textarea >
< / div >
< / div >
< div class = "group_box" >
< div class = "header" > Client< / div >
< div class = "content properties" >
< div class = "key" > Default Description< / div >
< textarea class = "value virtualserver_default_client_description" > {{>virtualserver_default_client_description}}< / textarea >
< / div >
< / div >
2018-08-13 11:16:10 +00:00
Note: These settings require a virtual server restart to take effect!
2018-08-13 09:03:55 +00:00
< / div >
< / div >
< / x-content >
2018-08-11 13:02:11 +00:00
< / x-entry >
< / x-tab >
< / script >
2018-03-24 22:38:01 +00:00
<!-- Template for the settings -->
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_settings" type = "text/html" >
2018-03-07 18:06:52 +00:00
< x-tab >
< x-entry >
< x-tag > General< / x-tag >
< x-content > Didnt setuped yet!< / x-content >
< / x-entry >
< x-entry >
2018-10-28 17:25:43 +00:00
< x-tag > Audio< / x-tag >
2018-03-07 18:06:52 +00:00
< x-content >
2018-10-28 17:25:43 +00:00
< div class = "settings_audio" >
< div class = "group_box" >
< div class = "header" > Microphone< / div >
< div class = "content settings-microphone" >
< div class = "settings-device settings-device-microphone" >
< div class = "settings-device-error" > < / div >
< div class = "settings-device-select" >
< a > Device:< / a >
< div > < select class = "audio-select-microphone" > < / select > < / div >
2018-03-17 07:05:37 +00:00
< / div >
2018-10-28 17:25:43 +00:00
< / div >
< div class = "settings-vad-container" >
< div class = "group_box" >
< div class = "header" > Voice Activity Detection< / div >
< div class = "content" >
< fieldset >
< div > < input type = "radio" name = "vad_type" value = "pt" display = "Always active" > Always active< / div >
< div > < input type = "radio" name = "vad_type" value = "vad" display = "Voice activity detection" > Voice activity detection< / div >
< div > < input type = "radio" name = "vad_type" value = "ppt" display = "Push to talk" > Push to talk< / div >
< / fieldset >
< / div >
< / div >
< div class = "settings-vad-impl" >
< div class = "settings-vad-impl-entry setting-vad-pt" >
There are no setting entries for an < b > always< / b > online voice detection.
< / div >
< div class = "settings-vad-impl-entry setting-vad-ppt" >
< a > Push to talk key:< / a >
< button class = "vat_ppt_key" > Uninitialised< / button >
< / div >
< div class = "settings-vad-impl-entry setting-vad-vad" >
< div > Voice activity threshold (< a class = "vad_vad_slider_value" > 20< / a > %)< / div >
< div class = "vad_vad_threshold_selector" >
< div class = "vad_vad_bar" >
< div style = "width: 100%; height: 100%; position: absolute" >
< div class = "vad_vad_bar_filler" > < / div >
< / div >
< input type = "range" min = "0" max = "100" value = "50" class = "vad_vad_slider" >
2018-03-17 07:05:37 +00:00
< / div >
2018-03-08 14:40:31 +00:00
< / div >
< / div >
2018-03-07 18:06:52 +00:00
< / div >
< / div >
< / div >
< / div >
2018-10-28 17:25:43 +00:00
< div class = "group_box" >
< div class = "header" > Speaker< / div >
< div class = "content settings-speaker" >
< div class = "settings-device settings-device-speaker" >
< div class = "settings-device-error" > < / div >
< div class = "settings-device-select" >
< a > Device:< / a >
< div > < select class = "audio-select-speaker" > < / select > < / div >
< / div >
< / div >
< / div >
< / div >
2018-03-07 18:06:52 +00:00
< / div >
< / x-content >
< / x-entry >
< / x-tab >
2018-06-24 11:38:53 +00:00
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_change_volume" type = "text/html" >
2018-04-11 15:56:09 +00:00
< div style = "display: flex; justify-content: center; vertical-align: center" >
< input type = "range" min = "0" max = "200" value = "100" class = "volume_slider" style = "width: 100%" >
< div class = "display_volume" style = "width: 60px; align-self: center; text-align: center" > ± 0 %< / div >
< / div >
2018-06-24 11:38:53 +00:00
< / script >
2018-09-30 19:50:59 +00:00
<!-- Permission overview -->
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_server_permissions" type = "text/html" >
2018-09-30 19:50:59 +00:00
< x-tab >
< x-entry >
< x-tag > Server Groups< / x-tag >
< x-content >
< div class = "layout-group-server" >
< div class = "list-group-server" >
< div class = "entries" > < / div >
< / div >
2018-10-14 11:27:48 +00:00
< div class = "horizontal-stretch" >
< node key = "permissions_group_server" / >
< / div >
2018-09-30 19:50:59 +00:00
< div class = "list-group-server-clients" > < / div >
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Channel Groups< / x-tag >
< x-content >
< div class = "layout-group-channel" >
< div class = "list-group-channel" >
< div class = "entries" > < / div >
< / div >
2018-10-14 11:27:48 +00:00
< div class = "horizontal-stretch" >
< node key = "permissions_group_channel" / >
< / div >
2018-09-30 19:50:59 +00:00
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Channel permissions< / x-tag >
< x-content >
< div class = "layout-channel" >
< div class = "list-channel" >
< div class = "entries" > < / div >
< / div >
2018-10-14 11:27:48 +00:00
< div class = "horizontal-stretch" >
< node key = "permissions_channel" / >
< / div >
2018-09-30 19:50:59 +00:00
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Client permissions< / x-tag >
< x-content >
< div class = "layout-client" >
< div class = "client-info" >
< div class = "client-select" >
< a > Client unique ID:< / a >
< input type = "text" class = "client-select-uid" >
< / div >
< hr >
< div class = "client-info" >
< a > Nickname:< / a >
< input class = "client-name" >
< a > Unique ID:< / a >
< input class = "client-uid" >
< a > Cleint database ID:< / a >
< input class = "client-dbid" >
< / div >
< / div >
2018-10-14 11:27:48 +00:00
< div class = "horizontal-stretch" >
< node key = "permissions_client" / >
< / div >
2018-09-30 19:50:59 +00:00
< / div >
< / x-content >
< / x-entry >
< x-entry >
< x-tag > Client channel permissions< / x-tag >
< x-content >
< div class = "layout-client-channel" >
< div class = "client-info" >
< div class = "client-select" >
< a > Client unique ID:< / a >
< input type = "text" class = "client-select-uid" >
< / div >
< hr >
< div class = "client-info" >
< a > Nickname:< / a >
< input class = "client-name" >
< a > Unique ID:< / a >
< input class = "client-uid" >
< a > Cleint database ID:< / a >
< input class = "client-dbid" >
< / div >
< hr >
< div class = "list-channel" >
< div class = "entries" > < / div >
< / div >
< / div >
2018-10-14 11:27:48 +00:00
< div class = "horizontal-stretch" >
< node key = "permissions_client_channel" / >
< / div >
2018-09-30 19:50:59 +00:00
< / div >
< / x-content >
< / x-entry >
< / x-tab >
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_server_group_assignment" type = "text/html" >
2018-09-30 19:50:59 +00:00
< div class = "group-assignment-list" >
< a > Changing groups of < b > {{>client_name}}< / b > < / a >
< div class = "group-list" >
{{for groups}}
< div class = "group-entry" >
< label class = "checkbox {{if disabled}}disabled{{/if}}" >
< input type = "checkbox" group-id = "{{>id}}" { { if assigned } } checked { { / if } } >
< span class = "checkmark" > < / span >
< / label >
< node key = "icon_{{>id}}" > < / node >
< a > {{>name}} ({{>id}})< / a >
< / div >
{{/for}}
< / div >
< / div >
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_permission_entry" type = "text/html" >
{{if type == "entry"}}
< div class = "entry {{if unset}}unset{{/if}} permission {{>permission_name}}" >
< div class = "permission-name filter-key" > {{>permission_name}}< / div >
< div class = "permission-value" >
{{if permission_name.startsWith("b_") }}
< label class = "checkbox" >
< input type = "checkbox" >
< span class = "checkmark" > < / span >
< / label >
{{else}}
< input type = "number" min-value = "-1" max-value = "9999999999" / >
{{/if}}
2018-09-30 19:50:59 +00:00
< / div >
2018-10-14 11:27:48 +00:00
< div class = "permission-skip" >
< label class = "checkbox" >
< input type = "checkbox" >
< span class = "checkmark" > < / span >
< / label >
2018-09-30 19:50:59 +00:00
< / div >
2018-10-14 11:27:48 +00:00
< div class = "permission-negate" >
< label class = "checkbox" >
< input type = "checkbox" >
< span class = "checkmark" > < / span >
< / label >
< / div >
< div class = "permission-grant" >
< input type = "number" min-value = "-1" max-value = "9999999999" / >
2018-09-30 19:50:59 +00:00
< / div >
< / div >
2018-10-14 11:27:48 +00:00
{{else}}
2018-09-30 19:50:59 +00:00
< div class = "entry group" >
< div class = "title" > < div class = "arrow down" > < / div > < a > {{>name}}< / a > < / div >
< div class = "group-entries" >
2018-10-14 11:27:48 +00:00
{{for entries tmpl="tmpl_permission_entry"/}}
< / div >
< / div >
{{/if}}
< / script >
< script class = "jsrender-template" id = "tmpl_permission_explorer" type = "text/html" >
< div class = "container-permissions" >
< div class = "align_row permission-explorer" >
< div class = "bar-filter" >
< div > < a > Filter:< / a > < / div >
< div > < input type = "text" class = "filter-input" > < / div >
< div > < input type = "checkbox" class = "filter-granted" > < a > Show granted permissions only< / a > < / div >
< / div >
< div class = "list" >
< div class = "entry header" >
< div > Permission Name< / div >
< div > Value< / div >
< div > Skip< / div >
< div > Negate< / div >
< div > Granted< / div >
< / div >
< div class = "entries" >
{{for permissions tmpl="tmpl_permission_entry" /}}
< / div >
<!--
< div class = "entry" >
< div > this_is_a_test_permission< / div >
< div > value< / div >
< div > skip< / div >
< div > negate< / div >
< div > granted< / div >
< / div >
< div class = "entry group" >
< div class = "title" > < div class = "arrow right" > < / div > < a > Test group< / a > < / div >
< div class = "group-entries" >
< div class = "entry" >
< div > Grouped entry A< / div >
< div > value< / div >
< div > skip< / div >
< div > negate< / div >
< div > granted< / div >
< / div >
< div class = "entry" >
< div > Grouped entry B< / div >
< div > value< / div >
< div > skip< / div >
< div > negate< / div >
< div > granted< / div >
< / div >
< / div >
< / div >
-->
< div class = "overlay-disabled" > < / div >
< / div >
< div >
< button class = "button-update" > < div class = "icon client-check_update" > < / div > Update< / button >
< / div >
2018-09-30 19:50:59 +00:00
< / div >
< / div >
< / script >
2018-10-20 17:58:06 +00:00
<!-- General management templates -->
< script class = "jsrender-template" id = "tmpl_ban_list" type = "text/html" >
< div class = "banlist" >
< div class = "frame-container" >
< div class = "top-menu" >
< div class = "manage-buttons" >
< button class = "button-add" > Add< / button >
< button class = "button-edit" > Edit< / button >
< button class = "button-remove" > Remove< / button >
< / div >
< div class = "search" >
< input type = "text" class = "entry-filter" >
< / div >
< / div >
< div class = "entry-container" >
< div class = "table-container" >
< table >
< thead >
< tr >
< th class = "field-properties" > Name/IP/UID/HWID< / th >
< th class = "field-reason" > Reason< / th >
< th class = "field-invoker" > Creator< / th >
< th class = "field-timestamp" > Created / Expires< / th >
< / tr >
< / thead >
< tbody class = "ban-entry-list" >
<!--
< tr class = "ban-entry" >
< td class = "field-properties" >
< a class = "property property-name" > name=WolverasdasdinDEV< / a >
< a class = "property property-ip" > ip=WolverasdasdinDEV< / a >
< a class = "property property-unique-id" > uid=WolverasdasdinDEV< / a >
< a class = "property property-hardware-id" > hwid=WolverasdasdinDEV< / a >
< / td >
< td class = "field-reason" > Insult< / td >
< td class = "field-invoker" > WolverinDEV< / td >
< td class = "field-timestamp" > 1.1.2013 12:22 / 1.21.2013 12:22< / td >
< / tr >
< tr class = "ban-entry" >
< td class = "field-properties" >
< a class = "property property-name" > name=WolverasdasdinDEV< / a >
< a class = "property property-ip" > ip=WolverasdasdinDEV< / a >
< a class = "property property-unique-id" > uid=WolverasdasdinDEV< / a >
< a class = "property property-hardware-id" > hwid=WolverasdasdinDEV< / a >
< / td >
< td class = "field-reason" > Insult< / td >
< td class = "field-invoker" > WolverinDEV< / td >
< td class = "field-timestamp" >
< a class = "timestamp-created" > Created: 1.1.2013 12:22< / a >
< a class = "timestamp-expires" > Expires: 1.21.2013 12:22< / a >
< / td >
< / tr >
-->
< / tbody >
< / table >
< / div >
< / div >
< div class = "bottom-menu" >
< div class = "left" >
< button class = "button-refresh" > Reload< / button >
< div > < input type = "checkbox" class = "filter-flag-force-own" > Show only own bans< / div >
< div > < input type = "checkbox" class = "filter-flag-highlight-own" > Highlight own bans< / div >
< / div >
< div class = "right" >
< a class = "entry-count-info" > < / a >
< button class = "button-close" > Close< / button >
< / div >
< / div >
< / div >
< / div >
< / script >
< script class = "jsrender-template" id = "tmpl_client_ban" type = "text/html" >
< div class = "align_column" >
< div class = "align_column" style = "margin: 5px" >
< a > Name:< / a >
< input value = "{{>client_name}}" readonly >
< / div >
< div class = "align_column" style = "margin: 5px" >
< a > Reason:< / a >
< textarea style = "height: 32px; resize: vertical; max-height: 150px; min-height: 32px" maxlength = "512" class = "ban_reason" > < / textarea >
< / div >
< div class = "align_row" style = "margin: 5px; justify-content: space-between" >
< a > Duration:< / a >
< div class = "align_row" >
< input type = "number" value = "1" class = "ban_duration" style = "margin-right: 7px" min = "1" >
< select class = "ban_duration_type" >
< option value = "sec" > seconds< / option >
< option value = "min" > minutes< / option >
< option value = "hours" > hours< / option >
< option value = "days" > days< / option >
< option value = "perm" > permanent< / option >
< / select >
< / div >
< / div >
< div class = "group_box container-ban-type" >
< div class = "header" > Ban client by< / div >
< div class = "content ban-types" >
< div >
< input type = "checkbox" class = "ban-type-nickname" >
< a > Nickname< / a >
< div class = "help-tip tip-right tip-small" checked >
< p >
Bans the client by his current nickname.< br >
The currently nickname cant be used until the ban expired
< / p >
< / div >
< / div >
< div >
< input type = "checkbox" class = "ban-type-hardware-id" checked >
< a > Hardware ID< / a >
< div class = "help-tip tip-right tip-small" >
< p >
Bans the client by his hardware id.< br >
The hardware id has different meanings, depends on the users agent< br >
TeaClient: The hardware id will be equal to the mac address< br >
TeaWeb: The TeaSpeak web client hasn't a hardware id, it will be random< br >
TeamSpeak 3 client: The hardware id will be a result of some hashes from hardware specific properties
< / p >
< / div >
< / div >
< div >
< input type = "checkbox" class = "ban-type-ip" checked >
< a > IP Address< / a >
< / div >
< / div >
< / div >
< / div >
< / script >
< script class = "jsrender-template" id = "tmpl_ban_entry" type = "text/html" >
< tr class = "ban-entry {{if server_id == 0}}ban-entry-global{{/if}} {{if flag_own}}ban-entry-own{{/if}}" ban-id = {{ > banid}} server-id={{>server_id}}>
< td class = "field-properties" >
{{if name }}< a class = "property property-name" > name={{>name}}< / a > {{/if}}
{{if ip }} < a class = "property property-ip" > ip={{>ip}}< / a > {{/if}}
{{if unique_id }} < a class = "property property-unique-id" > uid={{>unique_id}}< / a > {{/if}}
{{if hardware_id }}< a class = "property property-hardware-id" > hwid={{>hardware_id}}< / a > {{/if}}
< / td >
< td class = "field-reason" > {{>reason}}< / td >
< td class = "field-invoker" > {{>invoker_name}}< / td >
< td class = "field-timestamp" >
< a class = "timestamp-created" > Created: {{fmt_date timestamp_created "DD.MM.YYYY HH:mm" /}}< / a >
< a class = "timestamp-expire" > Expire: {{if (!timestamp_expire || timestamp_expire.getTime() == 0) }}never{{else}}{{fmt_date timestamp_expire "DD.MM.YYYY HH:mm" /}}{{/if}}< / a >
< / td >
< / tr >
< / script >
<!-- `hwid` VARCHAR(" CLIENT_UID_LENGTH "), `uid` VARCHAR(" CLIENT_UID_LENGTH "), `name` VARCHAR(" CLIENT_NAME_LENGTH "), `ip` VARCHAR(128) -->
< script class = "jsrender-template" id = "tmpl_ban_create" type = "text/html" >
< div class = "bancreate" >
< div class = "frame-container" >
< div class = "container container-ip" >
< a > IP:< / a >
< input class = "input-ip" type = "text" maxlength = "128" >
< / div >
< div class = "container container-name" >
< a > Name:< / a >
< input class = "input-name" type = "text" maxlength = "128" >
< div class = "container-name-type" >
< a > Interpret IP/Name as:< / a >
< select class = "input-name-type" >
< option value = "wildcard-4" > Wildcard IPv4< / option >
< option value = "wildcard-6" > Wildcard IPv6< / option >
< option value = "fixed" selected > Fixed string< / option >
< option value = "regex" > Regular Expression< / option >
< / select >
< / div >
< / div >
< div class = "container container-uid" >
< a > Unique ID:< / a >
< div > < input class = "input-uid" type = "text" maxlength = "64" > < / div >
< / div >
< div class = "container container-hwid" >
< a > Hardware ID:< / a >
< input class = "input-hwid" type = "text" max = "64" >
< / div >
< div class = "container container-reason" >
< a > Reason< / a >
< textarea class = "input-reason" > < / textarea >
< / div >
< div class = "container container-time" >
< a > Duration< / a >
< div class = "container-time-input" >
< input type = "number" value = "1" class = "input-time" style = "margin-right: 7px" min = "1" >
< select class = "input-time-unit" >
< option value = "sec" > seconds< / option >
< option value = "min" > minutes< / option >
< option value = "hours" > hours< / option >
< option value = "days" > days< / option >
< option value = "perm" > permanent< / option >
< / select >
< / div >
< / div >
< div class = "footer" >
< div >
< div class = "container-global" >
< input type = "checkbox" class = "input-global" >
< a > Use this ban as a global ban< / a >
< div class = "help-tip tip-center tip-small" >
< p >
Global bans are bans which apply instance wide.< br >
This means that (if this rule apply to a victim) cant join < b > any< / b > virtual server!< br >
Global bans are by default shown to every server admin group,< br >
but could only be created with query rights
< / p >
< / div >
< / div >
< / div >
< div class = "container-buttons modal-button-group" style = "text-align: right; margin-top: 3px; margin-bottom: 6px;" >
< button class = "button-close" > Cancel< / button >
< button class = "button-success" > OK< / button >
< / div >
< / div >
< / div >
< / div >
< / script >
2018-09-30 19:50:59 +00:00
<!-- Music interface -->
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_music_frame" type = "text/html" >
2018-06-24 11:38:53 +00:00
<!-- First we want to define some variables if not defined yet. -->
{{if !thumbnail}}
2018-08-10 19:30:58 +00:00
{{*
data.thumbnail = "img/music/no_thumbnail.svg";
}}
2018-06-24 11:38:53 +00:00
{{/if}}
2018-08-10 19:30:58 +00:00
{{*
if(!data.song_max_width) data.song_max_width = 300;
let width = calculate_width(data.song_name);
if(width > data.song_max_width)
data.song_use_scroller = true;
}}
2018-04-30 21:57:21 +00:00
< div class = "music-wrapper" >
< div class = "container" >
< div class = "left" >
< div class = "static-card" >
2018-06-24 11:38:53 +00:00
< img src = "{{:thumbnail}}" alt = "Thumbnail" class = "thumbnail" >
2018-04-30 21:57:21 +00:00
< / div >
< / div >
< div class = "right" >
< div class = "controls hover" >
< label class = "btn-forward" > < span > < / span > < / label >
< label class = "btn-rewind" > < span > < / span > < / label >
< label class = "btn-settings" > < span > < / span > < / label >
< / div >
< div class = "flip-card" >
2018-06-24 11:38:53 +00:00
< img src = "{{:thumbnail}}" alt = "Thumbnail" class = "thumbnail" >
2018-04-30 21:57:21 +00:00
< / div >
< / div >
< / div >
< div class = "controls-overlay" >
< div class = "timer" >
< div >
2018-08-10 19:30:58 +00:00
< svg class = "button button_play" x = "0px" y = "0px" viewBox = "0 0 4.5 6.9" style = "enable-background:new 0 0 4.5 6.9;" >
2018-04-30 21:57:21 +00:00
< defs >
< filter id = "shadow" >
< feDropShadow dx = "4" dy = "8" stdDeviation = "4" / >
< / filter >
< / defs >
< polyline style = "filter:url(#shadow);" class = "button" points = "0.6,0.3 3.9,3.4 0.6,6.6 " > < / polyline >
< / svg >
2018-08-10 19:30:58 +00:00
< svg class = "button button_pause" x = "0px" y = "0px" viewBox = "0 0 4.5 6.9" style = "enable-background:new 0 0 4.5 6.9;" >
2018-04-30 21:57:21 +00:00
< defs >
< filter id = "shadow" >
< feDropShadow dx = "4" dy = "8" stdDeviation = "4" / >
< / filter >
< / defs >
< g style = "filter:url(#shadow);" >
< line x1 = "0.4" y1 = "0.1" x2 = "0.4" y2 = "6.8" > < / line >
< line x1 = "4.1" y1 = "0.1" x2 = "4.1" y2 = "6.8" > < / line >
< / g >
< / svg >
< / div >
< div class = "timeline" >
< div class = "buffered" > < / div >
< div class = "played" > < / div >
< div class = "slider" > < / div >
< / div >
2018-08-10 19:30:58 +00:00
< div class = "time player_time" > --:--< / div >
< / div >
< div class = "song" >
{{if song_use_scroller}}
< div class = "scroll-left" >
< p class = "name" > {{>song_name}}< / p >
< / div >
{{else}}
< div class = "name" style = "" > {{>song_name}}< / div >
{{/if}}
2018-04-30 21:57:21 +00:00
< / div >
< / div >
< / div >
2018-06-24 11:38:53 +00:00
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_music_frame_empty" type = "text/html" >
2018-04-30 21:57:21 +00:00
< div class = "music-wrapper empty" >
< img src = "img/music/empty_disk.svg" >
< a > Not playing any music< / a >
< / div >
2018-10-03 20:04:29 +00:00
< / script >
2018-06-20 17:06:55 +00:00
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_selected_client" type = "text/html" >
2018-06-20 19:05:35 +00:00
< table class = "select_info_table" >
2018-06-20 17:06:55 +00:00
< tr >
< td > Name:< / td >
2018-06-20 19:05:35 +00:00
< td > < node key = "client_name" / > < / td >
2018-06-20 17:06:55 +00:00
< / tr >
{{if property_client_description.length > 0}}
< tr >
< td > Description:< / td >
2018-06-20 19:05:35 +00:00
< td > {{>property_client_description}}< / td >
2018-06-20 17:06:55 +00:00
< / tr >
{{/if}}
< tr >
< td > Version:< / td >
2018-06-20 19:05:35 +00:00
< td > < a title = "{{>property_client_version}}" > {{*: data.property_client_version.split(" ")[0]; }}< / a > on {{>property_client_platform}}< / td >
2018-06-20 17:06:55 +00:00
< / tr >
< tr >
< td > Online since:< / td >
2018-06-20 19:05:35 +00:00
< td class = "update_onlinetime" > {{:client_onlinetime}}< / td >
2018-06-20 17:06:55 +00:00
< / tr >
< tr >
< td > Volume:< / td >
2018-06-20 19:05:35 +00:00
< td > {{:sound_volume}}%< / td >
2018-06-20 17:06:55 +00:00
< / tr >
{{if client_teaforum_id > 0}}
< tr >
< td > TeaSpeak Account:< / td >
2018-06-20 19:05:35 +00:00
< td > < a href = "//forum.teaspeak.de/index.php?members/{{:property_client_teaforum_id}}" target = "_blank" > {{>property_client_teaforum_name}}< / a > < / td >
2018-06-20 17:06:55 +00:00
< / tr >
{{/if}}
< / table >
<!-- Server groups -->
< div style = "display: flex; flex-direction: column;" >
< div style = "display:flex;margin-top:5px;align-items:center" >
< div class = "icon client-permission_server_groups" > < / div >
< div style = "margin-left:3px;font-weight:bold" > Server groups:< / div >
< / div >
{{for group_server}}
< div style = "display: flex; margin-top: 1px; margin-left: 10px; align-items: center;" >
< node key = "group_{{:group_id}}_icon" / >
2018-09-30 20:47:41 +00:00
< div style = "margin-left: 3px" > {{>group_name}}< / div >
2018-06-20 17:06:55 +00:00
< / div >
{{/for}}
< / div >
<!-- Channel group -->
< div style = "display: flex; flex-direction: column; margin-bottom: 20px" >
< div style = "display:flex;margin-top:10px;align-items:center" >
< div class = "icon client-permission_channel" > < / div >
< div style = "margin-left:3px;font-weight:bold" > Channel group:< / div >
< / div >
< div style = "display: flex; margin-top: 1px; margin-left: 10px; align-items: center;" >
< node key = "group_{{:group_channel}}_icon" / >
< div style = "margin-left: 3px" > {{*: data["group_" + data.group_channel + "_name"]}}< / div >
< / div >
< / div >
2018-06-20 19:05:35 +00:00
<!-- Costume tags/icons -->
2018-09-25 10:57:47 +00:00
<!-- Client is away -->
{{if property_client_away}}
< div style = "display: inline-flex" >
< div class = "icon_x32 client-away" style = "margin-right: 5px" > < / div >
< a style = "align-self: center" > Away
{{if property_client_away_message & & property_client_away_message.length > 0}}
({{>property_client_away_message}})
{{/if}}
< / a >
< / div >
{{/if}}
2018-06-20 19:05:35 +00:00
<!-- Speakers/Headphones disabled -->
{{if !property_client_output_hardware}}
< div style = "display: inline-flex" >
< div class = "icon_x32 client-hardware_output_muted" style = "margin-right: 5px" > < / div >
< a style = "align-self: center" > Speakers/Headphones disabled< / a >
< / div >
{{/if}}
<!-- Microphone disabled -->
{{if !property_client_input_hardware}}
< div style = "display: inline-flex" >
< div class = "icon_x32 client-hardware_input_muted" style = "margin-right: 5px" > < / div >
< a style = "align-self: center" > Microphone disabled< / a >
< / div >
{{/if}}
<!-- Speakers/Headphones Muted -->
{{if property_client_output_muted}}
< div style = "display: inline-flex" >
< div class = "icon_x32 client-output_muted" style = "margin-right: 5px" > < / div >
< a style = "align-self: center" > Speakers/Headphones Muted< / a >
< / div >
{{/if}}
<!-- Microphone Muted -->
{{if property_client_input_muted}}
< div style = "display: inline-flex" >
< div class = "icon_x32 client-input_muted" style = "margin-right: 5px" > < / div >
< a style = "align-self: center" > Microphone Muted< / a >
< / div >
{{/if}}
2018-08-12 14:38:38 +00:00
{{if property_client_flag_avatar & & property_client_flag_avatar.length > 0}}
2018-08-12 16:58:15 +00:00
< div style = "margin-top: 10px;" >
2018-08-12 14:38:38 +00:00
< node key = "client_avatar" / >
< / div >
{{/if}}
2018-06-20 19:05:35 +00:00
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_selected_music" type = "text/html" >
2018-08-10 19:30:58 +00:00
< table class = "select_info_table" >
< tr >
< td > Name:< / td >
< td > < node key = "client_name" / > < / td >
< / tr >
{{if property_client_description.length > 0}}
< tr >
< td > Description:< / td >
< td > {{>property_client_description}}< / td >
< / tr >
{{/if}}
< tr >
< td > Livetime:< / td >
< td class = "update_onlinetime" > {{:client_onlinetime}}< / td >
< / tr >
<!-- player_volume -->
< tr >
< td > Remote Volume:< / td >
< td > {{*: data.property_player_volume * 100 }}%< / td >
< / tr >
< tr >
< td > Local Volume:< / td >
< td > {{>sound_volume}}%< / td >
< / tr >
<!-- TODO: Created by -->
< / table >
<!-- Server groups -->
< div style = "display: flex; flex-direction: column;" >
< div style = "display:flex;margin-top:5px;align-items:center" >
< div class = "icon client-permission_server_groups" > < / div >
< div style = "margin-left:3px;font-weight:bold" > Server groups:< / div >
< / div >
{{for group_server}}
< div style = "display: flex; margin-top: 1px; margin-left: 10px; align-items: center;" >
< node key = "group_{{:group_id}}_icon" / >
< div style = "margin-left: 3px" > {{:group_name}}< / div >
< / div >
{{/for}}
< / div >
<!-- Channel group -->
< div style = "display: flex; flex-direction: column; margin-bottom: 20px" >
< div style = "display:flex;margin-top:10px;align-items:center" >
< div class = "icon client-permission_channel" > < / div >
< div style = "margin-left:3px;font-weight:bold" > Channel group:< / div >
< / div >
< div style = "display: flex; margin-top: 1px; margin-left: 10px; align-items: center;" >
< node key = "group_{{:group_channel}}_icon" / >
< div style = "margin-left: 3px" > {{*: data["group_" + data.group_channel + "_name"]}}< / div >
< / div >
< / div >
< div >
< node key = "music_player" / >
< / div >
< / script >
2018-11-03 11:16:13 +00:00
< script class = "jsrender-template" id = "tmpl_selected_hostbanner" type = "text/html" >
< div class = "hostbanner" >
2018-11-03 23:39:29 +00:00
< a href = "{{:property_virtualserver_hostbanner_url}}" style = "display: flex; flex-direction: row; justify-content: center;" >
2018-11-03 11:16:13 +00:00
< img src = "
{{:property_virtualserver_hostbanner_gfx_url}}
{{if property_virtualserver_hostbanner_gfx_interval > 0}}
{{*
date = Math.floor(Date.now() / 1000);
if (data.property_virtualserver_hostbanner_gfx_interval < = 60)
data.property_virtualserver_hostbanner_gfx_interval = 60;
date = Math.floor(date / data.property_virtualserver_hostbanner_gfx_interval) * data.property_virtualserver_hostbanner_gfx_interval;
}}
?ts={{*:date}}
{{/if}}
"
{{if property_virtualserver_hostbanner_mode == 0}}
{{else property_virtualserver_hostbanner_mode == 1}}
style="width: 100%; height: 100%;"
{{else property_virtualserver_hostbanner_mode == 2}}
style="width: 100%; height: auto;"
{{/if}}
alt="Host banner"
>
< / a >
< / div >
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_selected_server" type = "text/html" >
2018-09-25 15:39:38 +00:00
< div class = "select_server" >
2018-11-03 11:16:13 +00:00
< div class = "container" >
<!--
virtualserver_hostbanner_url: string = "";
virtualserver_hostbanner_gfx_url: string = "";
virtualserver_hostbanner_gfx_interval: number = 0;
virtualserver_hostbanner_mode: number = 0;
-->
< table class = "select_info_table" >
< tr >
< td > Name:< / td >
< td > < node key = "server_name" / > < / td >
< / tr >
< tr >
< td > Address:< / td >
< td > {{>server_address}}< / td >
< / tr >
< tr >
< td > Type:< / td >
< td > TeaSpeak< / td >
< / tr >
< tr >
< td > Version:< / td >
< td > < a title = "{{>property_virtualserver_version}}" > {{*: data.property_virtualserver_version.split(" ")[0]; }}< / a > on {{>property_virtualserver_platform}}< / td >
< / tr >
< tr >
< td > Uptime:< / td >
< td class = "update_onlinetime" > {{:server_onlinetime}}< / td >
< / tr >
< tr >
< td > Current Channels:< / td >
< td > {{:property_virtualserver_channelsonline}}< / td >
< / tr >
< tr >
< td > Current Clients:< / td >
< td > {{:property_virtualserver_clientsonline}}< / td >
< / tr >
< tr >
< td > Current Queries:< / td >
< td > {{:property_virtualserver_queryclientsonline}}< / td >
< / tr >
< / table >
< / div >
2018-09-25 15:39:38 +00:00
< button class = "button-update btn_update" > Update info< / button >
< / div >
2018-06-20 19:05:35 +00:00
< / script >
2018-10-14 11:27:48 +00:00
< script class = "jsrender-template" id = "tmpl_selected_channel" type = "text/html" >
2018-06-20 19:05:35 +00:00
< table class = "select_info_table" >
< tr >
< td > Name:< / td >
< td > < node key = "channel_name" / > < / td >
< / tr >
2018-08-12 11:26:56 +00:00
{{if property_channel_topic}}
2018-06-20 19:05:35 +00:00
< tr >
< td > Topic:< / td >
< td > {{>property_channel_topic}}< / td >
< / tr >
2018-08-12 11:26:56 +00:00
{{/if}}
2018-06-20 19:05:35 +00:00
< tr >
< td > Codec:< / td >
< td > {{>property_channel_codec}}< / td >
< / tr >
< tr >
< td > Codec Quality:< / td >
< td > {{>property_channel_codec_quality}}< / td >
< / tr >
< tr >
< td > Type:< / td >
< td > {{>channel_type}}< / td >
< / tr >
< tr >
< td > Current clients:< / td >
< td >
{{>channel_clients}} /
{{if property_channel_maxclients == -1}}
Unlimited
{{else}}
{{>property_channel_maxclients}}
{{/if}}
< / td >
< / tr >
< tr >
< td > Subscription Status:< / td >
< td >
{{if channel_subscribed}}
Subscribed
{{else}}
Unsubscribed
{{/if}}
< / td >
< / tr >
< tr >
< td > Voice Data Encryption:< / td >
< td >
{{if property_channel_codec_is_unencrypted}}
Unencrypted
{{else}}
Encrypted
{{/if}}
< / td >
< / tr >
< / table >
2018-08-13 09:03:55 +00:00
< div style = "margin-top: 10px" >
< b style = "margin-bottom: 2px" > Description< / b >
2018-08-12 17:17:57 +00:00
< node key = "bbcode_channel_description" > < / node >
< / div >
2018-06-20 17:06:55 +00:00
< / script >
2018-11-03 23:39:29 +00:00
< script class = "jsrender-template" id = "tmpl_poke_popup" type = "text/html" >
< div class = "container-poke" >
< div class = "container-information" >
< a > You have been poked by < / a > < node key = "invoker" > < / node > < a > :< / a >
< / div >
< div class = "container-message" >
< a class = "message" > {{>message}}< / a >
< / div >
< button class = "button-close" > close< / button >
< / div >
< / script >
2018-02-27 16:20:49 +00:00
< / body >
< / html >