Added TPS

This commit is contained in:
HttpRafa 2022-01-08 23:32:57 +01:00
parent b1847debbb
commit 045c154f6c
35 changed files with 777 additions and 48 deletions

13
.idea/compiler.xml generated Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="WebConsole" />
</profile>
</annotationProcessing>
</component>
</project>

467
.idea/dbnavigator.xml generated Normal file
View File

@ -0,0 +1,467 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DataExportManager">
<export-instructions>
<create-header value="true" />
<friendly-headers value="false" />
<quote-values-containing-separator value="true" />
<quote-all-values value="false" />
<value-separator value="" />
<file-name value="" />
<file-location value="" />
<scope value="GLOBAL" />
<destination value="FILE" />
<format value="EXCEL" />
<charset value="windows-1252" />
</export-instructions>
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.EditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.ExecutionManager">
<retain-sticky-names value="false" />
</component>
<component name="DBNavigator.Project.MethodExecutionManager">
<method-browser />
<execution-history>
<group-entries value="true" />
<execution-inputs />
</execution-history>
<argument-values-cache />
</component>
<component name="DBNavigator.Project.ObjectDependencyManager">
<last-used-dependency-type value="INCOMING" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component>
<component name="DBNavigator.Project.ParserDiagnosticsManager">
<diagnostics-history />
</component>
<component name="DBNavigator.Project.ScriptExecutionManager" clear-outputs="true">
<recently-used-interfaces />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<tracking-columns>
<columnNames value="" />
<visible value="true" />
<editable value="false" />
</tracking-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="CSS" enabled="true" />
<content-type name="Java" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JavaScript" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="JSP" enabled="true" />
<content-type name="JSPx" enabled="true" />
<content-type name="Groovy" enabled="true" />
<content-type name="FTL" enabled="true" />
<content-type name="GSP" enabled="true" />
<content-type name="VTL" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Manifest" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="ASK" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
<component name="DBNavigator.Project.StatementExecutionManager">
<execution-variables />
</component>
</project>

7
.idea/discord.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="PROJECT_FILES" />
<option name="description" value="" />
</component>
</project>

30
.idea/jarRepositories.xml generated Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="spigot-repo" />
<option name="name" value="spigot-repo" />
<option name="url" value="https://hub.spigotmc.org/nexus/content/repositories/snapshots/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="bungeecord-repo" />
<option name="name" value="bungeecord-repo" />
<option name="url" value="https://oss.sonatype.org/content/repositories/snapshots" />
</remote-repository>
</component>
</project>

6
.idea/jsLibraryMappings.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="file://$PROJECT_DIR$" libraries="{bootstrap, jquery-3.3.1.slim, popper.js}" />
</component>
</project>

17
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<list size="1">
<item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" />
</list>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="openjdk-17" project-jdk-type="JavaSDK" />
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -113,6 +113,17 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-sm-3 mb-2">
<div class="card">
<div class="card-body">
<h5 class="card-title" id="tps_title">TPS</h5>
<p class="card-text"><span id="tps">0</span> Ticks / <span id="maxTps">0</span> Ticks</p>
<div class="progress flat-progressbar">
<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 0%;" id="TpsProgressBar"></div>
</div>
</div>
</div>
</div>
<div class="col-sm-3 mb-2"> <div class="col-sm-3 mb-2">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">

View File

@ -5,14 +5,14 @@
*/ */
/** /**
* Global variables * Global variables
*/ */
var persistenceManager = new WebConsolePersistenceManager(); const persistenceManager = new WebConsolePersistenceManager();
var connectionManager = new WebConsoleManager(); const connectionManager = new WebConsoleManager();
var lang; let lang;
var autoPasswordCompleted = false; //When true, saved password was used. If a 401 is received, then saved password is not correct let autoPasswordCompleted = false; //When true, saved password was used. If a 401 is received, then saved password is not correct
var statusCommandsInterval = -1; let statusCommandsInterval = -1;
var commandHistoryIndex = -1; //Saves current command history index. -1 when not browsing history. let commandHistoryIndex = -1; //Saves current command history index. -1 when not browsing history.
/** /**
* Load list of servers in file servers.json * Load list of servers in file servers.json
@ -61,10 +61,10 @@ function openServer(serverName){
connectionManager.loadConnection(serverName); connectionManager.loadConnection(serverName);
//Load saved messages //Load saved messages
var i; let i;
var messages = connectionManager.activeConnection.messages; const messages = connectionManager.activeConnection.messages;
for(i = 0; i < messages.length; i++){ for(i = 0; i < messages.length; i++){
if(messages[i].status != 401){ if(messages[i].status !== 401){
onWebSocketsMessage(messages[i]); onWebSocketsMessage(messages[i]);
} }
} }
@ -88,7 +88,7 @@ function onWebSocketsMessage(message){
$("#loggedUserTypeLabel").text(message.as); $("#loggedUserTypeLabel").text(message.as);
//Disable command bar if user is viewer //Disable command bar if user is viewer
if(message.as.toLowerCase() == "viewer"){ if(message.as.toLowerCase() === "viewer"){
$("#commandInput").prop("disabled", true); $("#commandInput").prop("disabled", true);
$("#sendCommandButton").prop("disabled", true); $("#sendCommandButton").prop("disabled", true);
} }
@ -106,7 +106,7 @@ function onWebSocketsMessage(message){
break; break;
case 401: case 401:
//Waiting for login. Show password modal or retrieve password //Waiting for login. Show password modal or retrieve password
var savedPwd = persistenceManager.getServer(connectionManager.activeConnection.serverName).serverPassword; const savedPwd = persistenceManager.getServer(connectionManager.activeConnection.serverName).serverPassword;
if(typeof savedPwd !== "undefined" && !autoPasswordCompleted){ if(typeof savedPwd !== "undefined" && !autoPasswordCompleted){
connectionManager.sendPassword(savedPwd); connectionManager.sendPassword(savedPwd);
autoPasswordCompleted = true; autoPasswordCompleted = true;
@ -127,13 +127,17 @@ function onWebSocketsMessage(message){
//RAM Usage //RAM Usage
writeRamInfo(message.free, message.used, message.max); writeRamInfo(message.free, message.used, message.max);
break; break;
case 1003:
//Server TPS
writeTpsInfo(message.tps, 20);
break;
default: default:
console.log('Unknown server response:'); console.log('Unknown server response:');
} }
console.log(message); console.log(message);
//Add interval for Players, CPU and RAM info, if not set //Add interval for Players, CPU and RAM info, if not set
if(statusCommandsInterval == -1 && message.status !== 401){ if(statusCommandsInterval === -1 && message.status !== 401){
statusCommandsInterval = setInterval(function(){ statusCommandsInterval = setInterval(function(){
connectionManager.askForInfo(); connectionManager.askForInfo();
}, 2500); }, 2500);
@ -144,7 +148,7 @@ function onWebSocketsMessage(message){
* Write to console * Write to console
*/ */
function writeToWebConsole(msg, time){ function writeToWebConsole(msg, time){
var isScrolledDown = document.getElementById("consoleTextArea").scrollHeight - document.getElementById("consoleTextArea").scrollTop - 40 == $("#consoleTextArea").height(); const isScrolledDown = document.getElementById("consoleTextArea").scrollHeight - document.getElementById("consoleTextArea").scrollTop - 40 === $("#consoleTextArea").height();
//Write to div, replacing < to &lt; (to avoid XSS) and replacing new line to br. //Write to div, replacing < to &lt; (to avoid XSS) and replacing new line to br.
msg = msg.replace(/</g, "&lt;"); msg = msg.replace(/</g, "&lt;");
@ -209,7 +213,7 @@ function writeToWebConsole(msg, time){
$("#consoleTextArea").append(msg + "<br>"); $("#consoleTextArea").append(msg + "<br>");
if(isScrolledDown){ if(isScrolledDown){
var textarea = document.getElementById('consoleTextArea'); const textarea = document.getElementById('consoleTextArea');
textarea.scrollTop = textarea.scrollHeight; textarea.scrollTop = textarea.scrollHeight;
} }
} }
@ -221,7 +225,7 @@ function writePlayerInfo(connected, maximum){
$("#connectedPlayers").text(connected); $("#connectedPlayers").text(connected);
$("#maxPlayers").text(maximum); $("#maxPlayers").text(maximum);
var percent = (connected/maximum)*100; const percent = (connected / maximum) * 100;
$("#playerProgressBar").width(percent + "%"); $("#playerProgressBar").width(percent + "%");
} }
@ -241,15 +245,29 @@ function writeRamInfo(free, used, total){
$("#usedRam").text(used); $("#usedRam").text(used);
$("#totalRam").text(total); $("#totalRam").text(total);
var percent = (used/total)*100; const percent = (used / total) * 100;
$("#RamProgressBar").width(percent + "%"); $("#RamProgressBar").width(percent + "%");
} }
/**
* Fill TPS info card
*/
function writeTpsInfo(tps, max){
if(tps > 20) {
tps = 20;
}
$("#tps").text(tps);
$("#maxTps").text(max);
const percent = (tps / max) * 100;
$("#TpsProgressBar").width(percent + "%");
}
/** /**
* Called from WebConsoleConnector only. * Called from WebConsoleConnector only.
*/ */
function closedConnection(serverName){ function closedConnection(serverName){
if(connectionManager.activeConnection.serverName == serverName){ if(connectionManager.activeConnection.serverName === serverName){
//Disable command input and button //Disable command input and button
$("#commandInput").prop("disabled", true); $("#commandInput").prop("disabled", true);
$("#sendCommandButton").prop("disabled", true); $("#sendCommandButton").prop("disabled", true);
@ -288,13 +306,13 @@ function updateServerList(){
$('.servermenuitem').remove(); $('.servermenuitem').remove();
//Add all servers //Add all servers
var servers = persistenceManager.getAllServers(); const servers = persistenceManager.getAllServers();
for(var i = 0; i < servers.length; i++){ for(let i = 0; i < servers.length; i++){
$('#ServerListDropDown').append('<a class="dropdown-item servermenuitem" href="#" onclick="openServer(\'' + servers[i].serverName + '\')">' + servers[i].serverName.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"").replace(/"/g,"") + '</a>'); $('#ServerListDropDown').append('<a class="dropdown-item servermenuitem" href="#" onclick="openServer(\'' + servers[i].serverName + '\')">' + servers[i].serverName.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"").replace(/"/g,"") + '</a>');
} }
//Show a "no servers" message when no servers are added //Show a "no servers" message when no servers are added
if(servers.length == 0){ if(servers.length === 0){
$('#ServerListDropDown').append('<a class="dropdown-item servermenuitem disabled" href="#" id="noServersAdded">No servers added</a>'); $('#ServerListDropDown').append('<a class="dropdown-item servermenuitem disabled" href="#" id="noServersAdded">No servers added</a>');
} }
} }

View File

@ -97,6 +97,11 @@ class WebConsoleManager {
command: "RAMUSAGE", command: "RAMUSAGE",
token: this.activeConnection.token, token: this.activeConnection.token,
}); });
this.activeConnection.sendToServer({
command: "TPS",
token: this.activeConnection.token,
});
} }
/** /**

View File

@ -34,6 +34,9 @@ players-message = Connected {0} players for a maximum of {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} free, {1} used, {2} maximum memory ram-usage-message = {0} free, {1} used, {2} maximum memory
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole version {0}. webconsole-version = WebConsole version {0}.
webconsole-no-connections = There are no logged in WebConsole connections now. webconsole-no-connections = There are no logged in WebConsole connections now.

View File

@ -34,6 +34,9 @@ players-message = Je připojeno {0} hráčů z maxima {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} volné, {1} použité, {2} maximální paměti ram-usage-message = {0} volné, {1} použité, {2} maximální paměti
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole verze {0}. webconsole-version = WebConsole verze {0}.
webconsole-no-connections = Nejsou žádné WebConsole připojení. webconsole-no-connections = Nejsou žádné WebConsole připojení.

View File

@ -34,6 +34,9 @@ players-message = {0} von {1} Spieler sind verbunden.
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} frei, {1} benutzt, {2} maximal ram-usage-message = {0} frei, {1} benutzt, {2} maximal
# TpsCommand.java
tps-message = {0} ticks von {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = Die WebConsole Version ist {0}. webconsole-version = Die WebConsole Version ist {0}.
webconsole-no-connections = Aktuell ist niemand mit der WebConsole verbunden webconsole-no-connections = Aktuell ist niemand mit der WebConsole verbunden

View File

@ -34,6 +34,9 @@ players-message = Connected {0} players for a maximum of {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} free, {1} used, {2} maximum memory ram-usage-message = {0} free, {1} used, {2} maximum memory
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole version {0}. webconsole-version = WebConsole version {0}.
webconsole-no-connections = There are no logged in WebConsole connections now. webconsole-no-connections = There are no logged in WebConsole connections now.

View File

@ -34,6 +34,9 @@ players-message = Actualmente conectados {0} jugadores de un máximo de {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = Memoria: {0} libre, {1} usada, {2} maxima ram-usage-message = Memoria: {0} libre, {1} usada, {2} maxima
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole version {0}. webconsole-version = WebConsole version {0}.
webconsole-no-connections = No hay ninguna conexión activa a WebConsole en este momento. webconsole-no-connections = No hay ninguna conexión activa a WebConsole en este momento.

View File

@ -34,6 +34,9 @@ players-message = Joueurs {0} connectés pour un maximum de {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} gratuit, {1} utilisé, {2} mémoire maximale ram-usage-message = {0} gratuit, {1} utilisé, {2} mémoire maximale
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = version WebConsole {0}. webconsole-version = version WebConsole {0}.
webconsole-no-connections = Aucune connexion WebConsole n'est connectée maintenant. webconsole-no-connections = Aucune connexion WebConsole n'est connectée maintenant.

View File

@ -34,6 +34,9 @@ players-message = Connessi {0} players su un massimo di {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} Libera, {1} Usata, {2} Memoria massima ram-usage-message = {0} Libera, {1} Usata, {2} Memoria massima
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = Versione WebConsole {0}. webconsole-version = Versione WebConsole {0}.
webconsole-no-connections = Non è stata effettuata ancora nessuna connessione tramite WebConsole. webconsole-no-connections = Non è stata effettuata ancora nessuna connessione tramite WebConsole.

View File

@ -34,6 +34,9 @@ players-message = 接続数 | {0} ,最大接続数 | {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} 空き, {1} 使用済み, {2} 最大メモリ ram-usage-message = {0} 空き, {1} 使用済み, {2} 最大メモリ
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsoleのバージョン {0}. webconsole-version = WebConsoleのバージョン {0}.
webconsole-no-connections = 現在、WebConsoleのログイン接続はありません。 webconsole-no-connections = 現在、WebConsoleのログイン接続はありません。

View File

@ -34,6 +34,9 @@ players-message = {0}/{1}명의 플레이어를 연결하였습니다
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} 여유, {1} 사용, {2} 최대 ram-usage-message = {0} 여유, {1} 사용, {2} 최대
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole 버전 {0}. webconsole-version = WebConsole 버전 {0}.
webconsole-no-connections = 현재 로그인된 사람이 없습니다. webconsole-no-connections = 현재 로그인된 사람이 없습니다.

View File

@ -34,6 +34,9 @@ players-message = {0} spelers verbonden voor een maximum van {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} ongebruikt, {1} gebruikt, {2} maximaal geheugen ram-usage-message = {0} ongebruikt, {1} gebruikt, {2} maximaal geheugen
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole versie {0}. webconsole-version = WebConsole versie {0}.
webconsole-no-connections = Er zijn nu geen ingelogde Web Console-verbindingen. webconsole-no-connections = Er zijn nu geen ingelogde Web Console-verbindingen.

View File

@ -34,6 +34,9 @@ players-message = Atualmente tem {0} jogador(es) de um total de {1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = Disponível: {0}, Consumo de RAM: {1} / {2} ram-usage-message = Disponível: {0}, Consumo de RAM: {1} / {2}
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole versão {0}. webconsole-version = WebConsole versão {0}.
webconsole-no-connections = Atualmente não tem nenhum usuário conectado. webconsole-no-connections = Atualmente não tem nenhum usuário conectado.

View File

@ -34,6 +34,9 @@ players-message = Подключено {0} игроков из максимум
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} свободно, {1} используется, {2} макс. памяти ram-usage-message = {0} свободно, {1} используется, {2} макс. памяти
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = Версия WebConsole {0}. webconsole-version = Версия WebConsole {0}.
webconsole-no-connections = В настоящее время нет подключений к WebConsole. webconsole-no-connections = В настоящее время нет подключений к WebConsole.

View File

@ -34,6 +34,9 @@ players-message = {0} oyuncu bağlandı, toplam {1} oyuncu bağlanabilir.
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = {0} boş, {1} kullanılıyor, {2} maksimum bellek ram-usage-message = {0} boş, {1} kullanılıyor, {2} maksimum bellek
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = WebConsole sürümü {0}. webconsole-version = WebConsole sürümü {0}.
webconsole-no-connections = Şuanda oturum açılmış WebSocket bağlantısı yok. webconsole-no-connections = Şuanda oturum açılmış WebSocket bağlantısı yok.

View File

@ -34,6 +34,9 @@ players-message = {0}玩家連接,最多{1}
# RamUsageCommand.java # RamUsageCommand.java
ram-usage-message = 空閒{0} , 已使用{1} , 最大內存{2} ram-usage-message = 空閒{0} , 已使用{1} , 最大內存{2}
# TpsCommand.java
tps-message = {0} ticks from {1}
# WebConsoleCommand.java # WebConsoleCommand.java
webconsole-version = 網站控制台版本 {0}. webconsole-version = 網站控制台版本 {0}.
webconsole-no-connections = 現在沒有連接登錄網站控制台。 webconsole-no-connections = 現在沒有連接登錄網站控制台。

View File

@ -23,7 +23,8 @@ import es.mesacarlos.webconsole.websocket.response.LoggedIn;
import es.mesacarlos.webconsole.websocket.response.UnknownCommand; import es.mesacarlos.webconsole.websocket.response.UnknownCommand;
public class WSServer extends WebSocketServer { public class WSServer extends WebSocketServer {
private HashMap<String, WSCommand> commands = WSCommandFactory.getCommandsHashMap();
private final HashMap<String, WSCommand> commands = WSCommandFactory.getCommandsHashMap();
public WSServer(InetSocketAddress address) { public WSServer(InetSocketAddress address) {
super(address); super(address);

View File

@ -0,0 +1,47 @@
package es.mesacarlos.webconsole.websocket.command;
//------------------------------
//
// This class was developed by Rafael K.
// On 1/8/2022 at 10:22 PM
// In the project WebConsole
//
//------------------------------
import es.mesacarlos.webconsole.util.Internationalization;
import es.mesacarlos.webconsole.websocket.WSServer;
import es.mesacarlos.webconsole.websocket.response.Tps;
import org.java_websocket.WebSocket;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TpsCommand implements WSCommand {
@Override
public void execute(WSServer wsServer, WebSocket conn, String params) {
try {
double tps = getTps()[0];
wsServer.sendToClient(conn, new Tps(Internationalization.getPhrase("tps-message", tps), tps));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return Current server Tps
*/
public double[] getTps() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {
Class<?> minecraftServerClass = Class.forName("net.minecraft.server.MinecraftServer");
Method getServerMethod = minecraftServerClass.getDeclaredMethod("getServer");
Object serverInstance = getServerMethod.invoke(null);
Field recentTpsField = serverInstance.getClass().getField("recentTps");
double[] recentTps = (double[]) recentTpsField.get(serverInstance);
for (int i = 0; i < recentTps.length; i++) {
recentTps[i] = Math.round(recentTps[i]);
}
return recentTps;
}
}

View File

@ -11,6 +11,7 @@ public class WSCommandFactory {
commands.put("PLAYERS", new PlayersCommand()); commands.put("PLAYERS", new PlayersCommand());
commands.put("CPUUSAGE", new CpuUsageCommand()); commands.put("CPUUSAGE", new CpuUsageCommand());
commands.put("RAMUSAGE", new RamUsageCommand()); commands.put("RAMUSAGE", new RamUsageCommand());
commands.put("TPS", new TpsCommand());
commands.put("READLOGFILE", new ReadLogFileCommand()); commands.put("READLOGFILE", new ReadLogFileCommand());
return commands; return commands;
} }

View File

@ -2,9 +2,10 @@ package es.mesacarlos.webconsole.websocket.response;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
public class ConsoleOutput implements JSONOutput{ public class ConsoleOutput implements JSONOutput {
private String message;
private String time; private final String message;
private final String time;
public ConsoleOutput(String message, String time) { public ConsoleOutput(String message, String time) {
this.message = message; this.message = message;

View File

@ -2,9 +2,10 @@ package es.mesacarlos.webconsole.websocket.response;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
public class CpuUsage implements JSONOutput{ public class CpuUsage implements JSONOutput {
private String message;
private double usage; private final String message;
private final double usage;
public CpuUsage(String message, double usage) { public CpuUsage(String message, double usage) {
this.message = message; this.message = message;

View File

@ -4,8 +4,9 @@ import com.google.gson.JsonObject;
import es.mesacarlos.webconsole.config.UserType; import es.mesacarlos.webconsole.config.UserType;
public class LoggedIn implements JSONOutput{ public class LoggedIn implements JSONOutput {
private String message;
private final String message;
private String respondsTo; private String respondsTo;
private String username; private String username;
private UserType as; private UserType as;

View File

@ -2,8 +2,9 @@ package es.mesacarlos.webconsole.websocket.response;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
public class LoginRequired implements JSONOutput{ public class LoginRequired implements JSONOutput {
private String message;
private final String message;
public LoginRequired(String message) { public LoginRequired(String message) {
this.message = message; this.message = message;

View File

@ -5,11 +5,12 @@ import java.util.List;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
public class Players implements JSONOutput{ public class Players implements JSONOutput {
private String message;
private int connectedPlayers; private final String message;
private int maxPlayers; private final int connectedPlayers;
private List<String> connectedPlayersList; private final int maxPlayers;
private final List<String> connectedPlayersList;
public Players(String message, int connectedPlayers, int maxPlayers, List<String> connectedPlayersList) { public Players(String message, int connectedPlayers, int maxPlayers, List<String> connectedPlayersList) {
this.message = message; this.message = message;

View File

@ -3,10 +3,11 @@ package es.mesacarlos.webconsole.websocket.response;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
public class RamUsage implements JSONOutput { public class RamUsage implements JSONOutput {
private String message;
private long free; private final String message;
private long used; private final long free;
private long max; private final long used;
private final long max;
public RamUsage(String message, long free, long used, long max) { public RamUsage(String message, long free, long used, long max) {
this.message = message; this.message = message;

View File

@ -0,0 +1,51 @@
package es.mesacarlos.webconsole.websocket.response;
//------------------------------
//
// This class was developed by Rafael K.
// On 1/8/2022 at 10:23 PM
// In the project WebConsole
//
//------------------------------
import com.google.gson.JsonObject;
public class Tps implements JSONOutput {
private final String message;
private final double tps;
public Tps(String message, double tps) {
this.message = message;
this.tps = tps;
}
@Override
public int getStatusCode() {
return 1003;
}
@Override
public String getMessage() {
return message;
}
/**
* Gets current server TPS
* @return Global Server TPS
*/
public double getTps() {
return tps;
}
@Override
public String toJSON() {
JsonObject object = new JsonObject();
object.addProperty("status", getStatusCode());
object.addProperty("statusDescription", "TPS Usage");
object.addProperty("tps", getTps());
object.addProperty("message", getMessage());
return object.toString();
}
}

View File

@ -2,9 +2,10 @@ package es.mesacarlos.webconsole.websocket.response;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
public class UnknownCommand implements JSONOutput{ public class UnknownCommand implements JSONOutput {
private String message;
private String respondsTo; private final String message;
private final String respondsTo;
public UnknownCommand(String message, String respondsTo) { public UnknownCommand(String message, String respondsTo) {
this.message = message; this.message = message;