settings: new option to postpone the activation of the given settings file

This commit is contained in:
nemunaire 2019-01-17 13:03:15 +01:00
parent 8e6b8829ea
commit 9be56fb9a2
5 changed files with 47 additions and 16 deletions

View File

@ -421,6 +421,7 @@ angular.module("FICApp")
$rootScope.settings.start = new Date(response.start); $rootScope.settings.start = new Date(response.start);
$rootScope.settings.end = new Date(response.end); $rootScope.settings.end = new Date(response.end);
$rootScope.settings.generation = new Date(response.generation); $rootScope.settings.generation = new Date(response.generation);
$rootScope.settings.activateTime = new Date(response.activateTime);
}) })
$scope.configro = ROSettings.get(); $scope.configro = ROSettings.get();
$scope.duration = 240; $scope.duration = 240;
@ -430,11 +431,13 @@ angular.module("FICApp")
var nStart = this.config.start; var nStart = this.config.start;
var nEnd = this.config.end; var nEnd = this.config.end;
var nGen = this.config.generation; var nGen = this.config.generation;
var aTime = this.config.activateTime;
this.config.$update(function() { this.config.$update(function() {
$rootScope.newBox('success', msg); $rootScope.newBox('success', msg);
$rootScope.settings.start = new Date(nStart); $rootScope.settings.start = new Date(nStart);
$rootScope.settings.end = new Date(nEnd); $rootScope.settings.end = new Date(nEnd);
$rootScope.settings.generation = new Date(nGen); $rootScope.settings.generation = new Date(nGen);
$rootScope.settings.activateTime = new Date(aTime);
}, function(response) { }, function(response) {
$rootScope.newBox('danger', 'An error occurs when saving settings:', response.data.errmsg); $rootScope.newBox('danger', 'An error occurs when saving settings:', response.data.errmsg);
}); });
@ -456,6 +459,11 @@ angular.module("FICApp")
$scope.saveSettings(); $scope.saveSettings();
}); });
} }
$scope.updActivateTime = function() {
var ts = Date.now() - Date.now() % 60000;
var d = new Date(ts + 120000);
this.config.activateTime = d.toISOString();
}
$scope.reset = function(type) { $scope.reset = function(type) {
if (confirm("Êtes-vous sûr ?")) { if (confirm("Êtes-vous sûr ?")) {
$http.post("/api/reset", {"type": type}).then(function(time) { $http.post("/api/reset", {"type": type}).then(function(time) {

View File

@ -83,6 +83,14 @@
</div> </div>
<div class="form-group row"> <div class="form-group row">
<div class="col">
<div class="input-group" style="margin-top: 5px;">
<div class="input-group-prepend">
<button ng-click="updActivateTime()" class="btn btn-sm btn-secondary" type="button"><span class="glyphicon glyphicon-record" aria-hidden="true"></span> Propager plus tard</button>
</div>
<input type="text" class="form-control form-control-sm" id="activateTime" ng-model="config.activateTime">
</div>
</div>
<div class="col text-right"> <div class="col text-right">
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-save" aria-hidden="true"></span> Propager ces paramètres</button> <button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-save" aria-hidden="true"></span> Propager ces paramètres</button>
</div> </div>

View File

@ -84,11 +84,15 @@ angular.module("FICApp", ["ngRoute", "ngSanitize"])
refreshSettingsInterval = $interval(refreshSettings, Math.floor(Math.random() * 24000) + 32000); refreshSettingsInterval = $interval(refreshSettings, Math.floor(Math.random() * 24000) + 32000);
$http.get("/settings.json").then(function(response) { $http.get("/settings.json").then(function(response) {
$rootScope.recvTime(response); var time = $rootScope.recvTime(response);
response.data.start = new Date(response.data.start); response.data.start = new Date(response.data.start);
response.data.end = new Date(response.data.end); response.data.end = new Date(response.data.end);
response.data.generation = new Date(response.data.generation); response.data.generation = new Date(response.data.generation);
$rootScope.settings = response.data; response.data.activateTime = new Date(response.data.activateTime);
if (response.data.activateTime <= new Date(Date.now() + (time.cu - time.he)))
$rootScope.settings = response.data;
else
$rootScope.settings.activateTime = response.data.activateTime;
}); });
} }
@ -210,12 +214,15 @@ angular.module("FICApp", ["ngRoute", "ngSanitize"])
actMenu(); actMenu();
} }
$rootScope.refresh = function(justMy) { $rootScope.refresh = function(justMy, justSettings) {
if (!justMy) { if (!justMy) {
refreshSettings(); refreshSettings();
refreshThemes(); refreshThemes();
$rootScope.refreshTeams(); $rootScope.refreshTeams();
} }
else if (justSettings) {
refreshSettings();
}
refreshMy(); refreshMy();
} }
$rootScope.refresh(); $rootScope.refresh();

View File

@ -144,15 +144,16 @@ angular.module("FICApp")
"he": (new Date()).getTime(), "he": (new Date()).getTime(),
}; };
sessionStorage.userService = angular.toJson(time); sessionStorage.userService = angular.toJson(time);
return time;
} }
function updTime() { function updTime() {
if (time && $rootScope.settings) { if (time && $rootScope.settings) {
var srv_cur = new Date(Date.now() + (time.cu - time.he)); var srv_cur = new Date(Date.now() + (time.cu - time.he));
// Refresh on start time reached // Refresh on start/activate time reached
if (Math.floor($rootScope.settings.start / 1000) == Math.floor(srv_cur / 1000)) if (Math.floor($rootScope.settings.start / 1000) == Math.floor(srv_cur / 1000) ||Math.floor($rootScope.settings.activateTime / 1000) == Math.floor(srv_cur / 1000))
$rootScope.refresh(true); $rootScope.refresh(true, true);
var remain = 0; var remain = 0;
if ($rootScope.settings.start == 0) { if ($rootScope.settings.start == 0) {

View File

@ -35,6 +35,8 @@ type FICSettings struct {
End time.Time `json:"end"` End time.Time `json:"end"`
// Generation is a value used to regenerate static files. // Generation is a value used to regenerate static files.
Generation time.Time `json:"generation"` Generation time.Time `json:"generation"`
// ActivateTime is the time when the current file should be proceed.
ActivateTime time.Time `json:"activateTime"`
// FirstBlood is the coefficient applied to each first team who solve a challenge. // FirstBlood is the coefficient applied to each first team who solve a challenge.
FirstBlood float64 `json:"firstBlood"` FirstBlood float64 `json:"firstBlood"`
@ -129,11 +131,7 @@ func LoadAndWatchSettings(settingsPath string, reload func (FICSettings)) {
go func(){ go func(){
for range c { for range c {
log.Println("SIGHUP received, reloading settings...") log.Println("SIGHUP received, reloading settings...")
if config, err := ReadSettings(settingsPath); err != nil { go tryReload(settingsPath, reload)
log.Println("ERROR: Unable to read challenge settings:", err)
} else {
reload(config)
}
} }
}() }()
@ -152,11 +150,7 @@ func LoadAndWatchSettings(settingsPath string, reload func (FICSettings)) {
case ev := <-watcher.Events: case ev := <-watcher.Events:
if path.Base(ev.Name) == SettingsFile && ev.Op & fsnotify.Write == fsnotify.Write { if path.Base(ev.Name) == SettingsFile && ev.Op & fsnotify.Write == fsnotify.Write {
log.Println("Settings file changes, reloading it!") log.Println("Settings file changes, reloading it!")
if config, err := ReadSettings(settingsPath); err != nil { go tryReload(settingsPath, reload)
log.Println("ERROR: Unable to read challenge settings:", err)
} else {
reload(config)
}
} }
case err := <-watcher.Errors: case err := <-watcher.Errors:
log.Println("watcher error:", err) log.Println("watcher error:", err)
@ -165,3 +159,16 @@ func LoadAndWatchSettings(settingsPath string, reload func (FICSettings)) {
}() }()
} }
} }
func tryReload(settingsPath string, reload func (FICSettings)) {
if config, err := ReadSettings(settingsPath); err != nil {
log.Println("ERROR: Unable to read challenge settings:", err)
} else if time.Until(config.ActivateTime) > 0 {
log.Println("Configuration reloading postponed, activating at:", config.ActivateTime)
time.Sleep(time.Until(config.ActivateTime))
log.Println("Time to activate configuration...")
tryReload(settingsPath, reload)
} else {
reload(config)
}
}