mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-02-16 04:11:47 +01:00
Scheduled Export of Server pages
This commit is contained in:
parent
d1123525ac
commit
3a3ba7e801
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Player Analytics (Plan).
|
||||||
|
*
|
||||||
|
* Plan is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License v3 as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Plan is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.djrapitops.plan.delivery.export;
|
||||||
|
|
||||||
|
import com.djrapitops.plan.TaskSystem;
|
||||||
|
import com.djrapitops.plan.delivery.upkeep.ExportTask;
|
||||||
|
import com.djrapitops.plan.identification.Server;
|
||||||
|
import com.djrapitops.plan.settings.config.PlanConfig;
|
||||||
|
import com.djrapitops.plan.settings.config.paths.ExportSettings;
|
||||||
|
import com.djrapitops.plan.storage.database.DBSystem;
|
||||||
|
import com.djrapitops.plan.storage.database.queries.objects.ServerQueries;
|
||||||
|
import com.djrapitops.plugin.api.TimeAmount;
|
||||||
|
import com.djrapitops.plugin.logging.console.PluginLogger;
|
||||||
|
import com.djrapitops.plugin.logging.error.ErrorHandler;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules export tasks so that they are not all run at once.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ExportScheduler {
|
||||||
|
|
||||||
|
private final PlanConfig config;
|
||||||
|
private final DBSystem dbSystem;
|
||||||
|
private final TaskSystem taskSystem;
|
||||||
|
|
||||||
|
private final Exporter exporter;
|
||||||
|
private final PluginLogger logger;
|
||||||
|
private final ErrorHandler errorHandler;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ExportScheduler(
|
||||||
|
PlanConfig config,
|
||||||
|
DBSystem dbSystem,
|
||||||
|
TaskSystem taskSystem,
|
||||||
|
Exporter exporter,
|
||||||
|
PluginLogger logger,
|
||||||
|
ErrorHandler errorHandler
|
||||||
|
) {
|
||||||
|
this.config = config;
|
||||||
|
this.dbSystem = dbSystem;
|
||||||
|
this.taskSystem = taskSystem;
|
||||||
|
this.exporter = exporter;
|
||||||
|
this.logger = logger;
|
||||||
|
this.errorHandler = errorHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scheduleExport() {
|
||||||
|
scheduleServerPageExport();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void scheduleServerPageExport() {
|
||||||
|
if (!config.get(ExportSettings.SERVER_PAGE)) return;
|
||||||
|
|
||||||
|
Collection<Server> servers = dbSystem.getDatabase().query(ServerQueries.fetchPlanServerInformationCollection());
|
||||||
|
int serverCount = servers.size();
|
||||||
|
if (serverCount == 0) return;
|
||||||
|
|
||||||
|
long period = TimeAmount.toTicks(config.get(ExportSettings.EXPORT_PERIOD), TimeUnit.MILLISECONDS);
|
||||||
|
long offset = period / serverCount;
|
||||||
|
|
||||||
|
Optional<Server> proxy = servers.stream().filter(Server::isProxy).findFirst();
|
||||||
|
proxy.ifPresent(server -> taskSystem.registerTask("Server export",
|
||||||
|
new ExportTask(exporter, exporter -> exporter.exportServerPage(server), logger, errorHandler))
|
||||||
|
.runTaskTimerAsynchronously(0L, period)
|
||||||
|
);
|
||||||
|
|
||||||
|
int offsetMultiplier = proxy.isPresent() ? 1 : 0; // Delay first server export if on a network.
|
||||||
|
for (Server server : servers) {
|
||||||
|
taskSystem.registerTask("Server export",
|
||||||
|
new ExportTask(exporter, exporter -> exporter.exportServerPage(server), logger, errorHandler))
|
||||||
|
.runTaskTimerAsynchronously(offset * offsetMultiplier, period);
|
||||||
|
offsetMultiplier++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -40,6 +40,7 @@ public class ExportSystem implements SubSystem {
|
|||||||
private final DBSystem dbSystem;
|
private final DBSystem dbSystem;
|
||||||
private final ServerInfo serverInfo;
|
private final ServerInfo serverInfo;
|
||||||
private final Processing processing;
|
private final Processing processing;
|
||||||
|
private final ExportScheduler exportScheduler;
|
||||||
private final HtmlExport htmlExport;
|
private final HtmlExport htmlExport;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
@ -48,12 +49,14 @@ public class ExportSystem implements SubSystem {
|
|||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
ServerInfo serverInfo,
|
ServerInfo serverInfo,
|
||||||
Processing processing,
|
Processing processing,
|
||||||
|
ExportScheduler exportScheduler,
|
||||||
HtmlExport htmlExport
|
HtmlExport htmlExport
|
||||||
) {
|
) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
this.serverInfo = serverInfo;
|
this.serverInfo = serverInfo;
|
||||||
this.processing = processing;
|
this.processing = processing;
|
||||||
|
this.exportScheduler = exportScheduler;
|
||||||
this.htmlExport = htmlExport;
|
this.htmlExport = htmlExport;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,20 +68,11 @@ public class ExportSystem implements SubSystem {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.isTrue(ExportSettings.JS_AND_CSS)) {
|
exportScheduler.scheduleExport();
|
||||||
// processing.submitNonCritical(htmlExport::exportJs);
|
|
||||||
// processing.submitNonCritical(htmlExport::exportCss);
|
|
||||||
// processing.submitNonCritical(htmlExport::exportPlugins);
|
|
||||||
}
|
|
||||||
if (config.isTrue(ExportSettings.PLAYERS_PAGE)) {
|
if (config.isTrue(ExportSettings.PLAYERS_PAGE)) {
|
||||||
processing.submitNonCritical(htmlExport::exportPlayersPage);
|
processing.submitNonCritical(htmlExport::exportPlayersPage);
|
||||||
}
|
}
|
||||||
if (config.isTrue(ExportSettings.PLAYER_PAGES)) {
|
|
||||||
processing.submitNonCritical(htmlExport::exportAvailablePlayers);
|
|
||||||
}
|
|
||||||
if (config.isTrue(ExportSettings.SERVER_PAGE)) {
|
|
||||||
processing.submitNonCritical(htmlExport::exportAvailableServerPages);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -132,7 +132,9 @@ public class ConfigUpdater {
|
|||||||
new ConfigChange.Removed("Display_options.Sessions.Show_most_played_world_in_title"),
|
new ConfigChange.Removed("Display_options.Sessions.Show_most_played_world_in_title"),
|
||||||
new ConfigChange.Removed("Time.Thresholds.Activity_index.Login_threshold"),
|
new ConfigChange.Removed("Time.Thresholds.Activity_index.Login_threshold"),
|
||||||
new ConfigChange.Removed("Time.Periodic_tasks.Clean_caches_every"),
|
new ConfigChange.Removed("Time.Periodic_tasks.Clean_caches_every"),
|
||||||
new ConfigChange.Removed("Display_options.Show_player_IPs")
|
new ConfigChange.Removed("Time.Periodic_tasks.Analysis_refresh_every"),
|
||||||
|
new ConfigChange.Removed("Display_options.Show_player_IPs"),
|
||||||
|
new ConfigChange.Removed("Export.Parts.JavaScript_and_CSS")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package com.djrapitops.plan.settings.config.paths;
|
|||||||
import com.djrapitops.plan.settings.config.paths.key.BooleanSetting;
|
import com.djrapitops.plan.settings.config.paths.key.BooleanSetting;
|
||||||
import com.djrapitops.plan.settings.config.paths.key.Setting;
|
import com.djrapitops.plan.settings.config.paths.key.Setting;
|
||||||
import com.djrapitops.plan.settings.config.paths.key.StringSetting;
|
import com.djrapitops.plan.settings.config.paths.key.StringSetting;
|
||||||
|
import com.djrapitops.plan.settings.config.paths.key.TimeSetting;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link Setting} values that are in "Export" section.
|
* {@link Setting} values that are in "Export" section.
|
||||||
@ -29,13 +30,13 @@ public class ExportSettings {
|
|||||||
|
|
||||||
public static final Setting<String> HTML_EXPORT_PATH = new StringSetting("Export.HTML_Export_path");
|
public static final Setting<String> HTML_EXPORT_PATH = new StringSetting("Export.HTML_Export_path");
|
||||||
public static final Setting<String> JSON_EXPORT_PATH = new StringSetting("Export.JSON_Export_path");
|
public static final Setting<String> JSON_EXPORT_PATH = new StringSetting("Export.JSON_Export_path");
|
||||||
public static final Setting<Boolean> JS_AND_CSS = new BooleanSetting("Export.Parts.JavaScript_and_CSS");
|
|
||||||
public static final Setting<Boolean> PLAYER_PAGES = new BooleanSetting("Export.Parts.Player_pages");
|
public static final Setting<Boolean> PLAYER_PAGES = new BooleanSetting("Export.Parts.Player_pages");
|
||||||
public static final Setting<Boolean> PLAYER_JSON = new BooleanSetting("Export.Parts.Player_JSON");
|
public static final Setting<Boolean> PLAYER_JSON = new BooleanSetting("Export.Parts.Player_JSON");
|
||||||
public static final Setting<Boolean> PLAYERS_PAGE = new BooleanSetting("Export.Parts.Players_page");
|
public static final Setting<Boolean> PLAYERS_PAGE = new BooleanSetting("Export.Parts.Players_page");
|
||||||
public static final Setting<Boolean> SERVER_PAGE = new BooleanSetting("Export.Parts.Server_page");
|
public static final Setting<Boolean> SERVER_PAGE = new BooleanSetting("Export.Parts.Server_page");
|
||||||
public static final Setting<Boolean> SERVER_JSON = new BooleanSetting("Export.Parts.Server_JSON");
|
public static final Setting<Boolean> SERVER_JSON = new BooleanSetting("Export.Parts.Server_JSON");
|
||||||
public static final Setting<Boolean> EXPORT_ON_ONLINE_STATUS_CHANGE = new BooleanSetting("Export.Export_player_on_login_and_logout");
|
public static final Setting<Boolean> EXPORT_ON_ONLINE_STATUS_CHANGE = new BooleanSetting("Export.Export_player_on_login_and_logout");
|
||||||
|
public static final Setting<Long> EXPORT_PERIOD = new TimeSetting("Export.Server_refresh_period");
|
||||||
|
|
||||||
private ExportSettings() {
|
private ExportSettings() {
|
||||||
/* static variable class */
|
/* static variable class */
|
||||||
|
@ -81,7 +81,6 @@ Time:
|
|||||||
# The index is a number from 0 to 5.
|
# The index is a number from 0 to 5.
|
||||||
# These numbers were calibrated with data of 250 players (Small sample size).
|
# These numbers were calibrated with data of 250 players (Small sample size).
|
||||||
Activity_index:
|
Activity_index:
|
||||||
Login_threshold: 2
|
|
||||||
Playtime_threshold: 30
|
Playtime_threshold: 30
|
||||||
Unit: MINUTES
|
Unit: MINUTES
|
||||||
Remove_inactive_player_data_after: 180
|
Remove_inactive_player_data_after: 180
|
||||||
@ -96,8 +95,6 @@ Time:
|
|||||||
Unit: HOURS
|
Unit: HOURS
|
||||||
Check_DB_for_server_config_files_every: 1
|
Check_DB_for_server_config_files_every: 1
|
||||||
Unit: MINUTES
|
Unit: MINUTES
|
||||||
Clean_caches_every: 10
|
|
||||||
Unit: MINUTES
|
|
||||||
Clean_Database_every: 1
|
Clean_Database_every: 1
|
||||||
Unit: HOURS
|
Unit: HOURS
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
@ -114,7 +111,6 @@ Display_options:
|
|||||||
Show_on_server_page: 2500
|
Show_on_server_page: 2500
|
||||||
Show_on_players_page: 25000
|
Show_on_players_page: 25000
|
||||||
Open_player_links_in_new_tab: false
|
Open_player_links_in_new_tab: false
|
||||||
Show_player_IPs: true
|
|
||||||
Graphs:
|
Graphs:
|
||||||
Show_gaps_in_data: false
|
Show_gaps_in_data: false
|
||||||
TPS:
|
TPS:
|
||||||
@ -161,12 +157,12 @@ World_aliases:
|
|||||||
# These settings will make Plan write .js, .css, .json and .html files to some location on disk.
|
# These settings will make Plan write .js, .css, .json and .html files to some location on disk.
|
||||||
# Relative path will render to /plugins/Plan/path
|
# Relative path will render to /plugins/Plan/path
|
||||||
# Make sure user running the server has write permissions to the path.
|
# Make sure user running the server has write permissions to the path.
|
||||||
|
# On networks export is disabled on Bukkit/Sponge servers.
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
Export:
|
Export:
|
||||||
HTML_Export_path: 'Analysis Results'
|
HTML_Export_path: 'Analysis Results'
|
||||||
JSON_Export_path: 'Raw JSON'
|
JSON_Export_path: 'Raw JSON'
|
||||||
Parts:
|
Parts:
|
||||||
JavaScript_and_CSS: false
|
|
||||||
# Player pages/JSON are only written on join/leave.
|
# Player pages/JSON are only written on join/leave.
|
||||||
Player_pages: false
|
Player_pages: false
|
||||||
Player_JSON: false
|
Player_JSON: false
|
||||||
@ -174,6 +170,10 @@ Export:
|
|||||||
Server_page: false
|
Server_page: false
|
||||||
Server_JSON: false
|
Server_JSON: false
|
||||||
Export_player_on_login_and_logout: false
|
Export_player_on_login_and_logout: false
|
||||||
|
# If there are multiple servers the period is divided evenly to avoid export of all servers at once
|
||||||
|
# Also affects Players page export
|
||||||
|
Server_refresh_period: 20
|
||||||
|
Unit: MINUTES
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
# These settings affect Plugin data integration.
|
# These settings affect Plugin data integration.
|
||||||
# If a plugin is causing issues the integration can be disabled by setting Plugin_name.Enabled: false
|
# If a plugin is causing issues the integration can be disabled by setting Plugin_name.Enabled: false
|
||||||
|
@ -86,7 +86,6 @@ Time:
|
|||||||
# The index is a number from 0 to 5.
|
# The index is a number from 0 to 5.
|
||||||
# These numbers were calibrated with data of 250 players (Small sample size).
|
# These numbers were calibrated with data of 250 players (Small sample size).
|
||||||
Activity_index:
|
Activity_index:
|
||||||
Login_threshold: 2
|
|
||||||
Playtime_threshold: 30
|
Playtime_threshold: 30
|
||||||
Unit: MINUTES
|
Unit: MINUTES
|
||||||
Remove_inactive_player_data_after: 180
|
Remove_inactive_player_data_after: 180
|
||||||
@ -97,14 +96,10 @@ Time:
|
|||||||
Remove_ping_data_after: 14
|
Remove_ping_data_after: 14
|
||||||
Unit: DAYS
|
Unit: DAYS
|
||||||
Periodic_tasks:
|
Periodic_tasks:
|
||||||
Analysis_refresh_every: 60
|
|
||||||
Unit: MINUTES
|
|
||||||
Extension_data_refresh_every: 1
|
Extension_data_refresh_every: 1
|
||||||
Unit: HOURS
|
Unit: HOURS
|
||||||
Check_DB_for_server_config_files_every: 1
|
Check_DB_for_server_config_files_every: 1
|
||||||
Unit: MINUTES
|
Unit: MINUTES
|
||||||
Clean_caches_every: 10
|
|
||||||
Unit: MINUTES
|
|
||||||
Clean_Database_every: 1
|
Clean_Database_every: 1
|
||||||
Unit: HOURS
|
Unit: HOURS
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
@ -121,7 +116,6 @@ Display_options:
|
|||||||
Show_on_server_page: 2500
|
Show_on_server_page: 2500
|
||||||
Show_on_players_page: 25000
|
Show_on_players_page: 25000
|
||||||
Open_player_links_in_new_tab: false
|
Open_player_links_in_new_tab: false
|
||||||
Show_player_IPs: true
|
|
||||||
Graphs:
|
Graphs:
|
||||||
Show_gaps_in_data: false
|
Show_gaps_in_data: false
|
||||||
TPS:
|
TPS:
|
||||||
@ -168,12 +162,12 @@ World_aliases:
|
|||||||
# These settings will make Plan write .js, .css, .json and .html files to some location on disk.
|
# These settings will make Plan write .js, .css, .json and .html files to some location on disk.
|
||||||
# Relative path will render to /plugins/Plan/path
|
# Relative path will render to /plugins/Plan/path
|
||||||
# Make sure user running the server has write permissions to the path.
|
# Make sure user running the server has write permissions to the path.
|
||||||
|
# On networks export is disabled on Bukkit/Sponge servers.
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
Export:
|
Export:
|
||||||
HTML_Export_path: 'Analysis Results'
|
HTML_Export_path: 'Analysis Results'
|
||||||
JSON_Export_path: 'Raw JSON'
|
JSON_Export_path: 'Raw JSON'
|
||||||
Parts:
|
Parts:
|
||||||
JavaScript_and_CSS: false
|
|
||||||
# Player pages/JSON are only written on join/leave.
|
# Player pages/JSON are only written on join/leave.
|
||||||
Player_pages: false
|
Player_pages: false
|
||||||
Player_JSON: false
|
Player_JSON: false
|
||||||
@ -182,6 +176,10 @@ Export:
|
|||||||
Server_JSON: false
|
Server_JSON: false
|
||||||
# All player pages/JSON can be exported by using /plan m export players
|
# All player pages/JSON can be exported by using /plan m export players
|
||||||
Export_player_on_login_and_logout: false
|
Export_player_on_login_and_logout: false
|
||||||
|
# If there are multiple servers the period is divided evenly to avoid export of all servers at once
|
||||||
|
# Also affects Players page export
|
||||||
|
Server_refresh_period: 20
|
||||||
|
Unit: MINUTES
|
||||||
# -----------------------------------------------------
|
# -----------------------------------------------------
|
||||||
# These settings affect Plugin data integration.
|
# These settings affect Plugin data integration.
|
||||||
# If a plugin is causing issues the integration can be disabled by setting Plugin_name.Enabled: false
|
# If a plugin is causing issues the integration can be disabled by setting Plugin_name.Enabled: false
|
||||||
|
Loading…
Reference in New Issue
Block a user