Skip to content

Commit f443e80

Browse files
authored
Merge pull request #883 from exodus4d/develop
v1.5.5
2 parents aef6d4e + 1d4a964 commit f443e80

File tree

181 files changed

+5030
-2152
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

181 files changed

+5030
-2152
lines changed

.jshintrc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
// Define globals exposed by Node.js.
1414
"node": true,
1515

16-
// Allow ES6.
17-
"esversion": 7,
16+
// Allow ES8.
17+
"esversion": 9,
1818

1919
/*
2020
* ENFORCING OPTIONS

app/cron.ini

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
[CRON]
2-
log = TRUE
3-
cli = TRUE
4-
web = FALSE
2+
log = TRUE
3+
cli = TRUE
4+
web = FALSE
5+
silent = TRUE
56

67
[CRON.presets]
78
; run every minute
@@ -51,13 +52,13 @@ deleteMapData = Cron\MapUpdate->deleteMapData, @downtime
5152
deleteAuthenticationData = Cron\CharacterUpdate->deleteAuthenticationData, @downtime
5253

5354
; delete expired cache files
54-
deleteExpiredCacheData = Cron\Cache->deleteExpiredData, @downtime
55+
deleteExpiredCacheData = Cron\Cache->deleteExpiredCacheData, @downtime
5556

5657
; delete old statistics (activity log) data
5758
deleteStatisticsData = Cron\StatisticsUpdate->deleteStatisticsData, @weekly
5859

5960
; truncate map history log files
60-
truncateMapHistoryLogFiles = Cron\MapHistory->truncateFiles, @halfHour
61+
truncateMapHistoryLogFiles = Cron\MapHistory->truncateMapHistoryLogFiles, @halfHour
6162

6263
; sync "sovereignty" and "faction warfare" data from CCP´s ESI API
6364
updateSovereigntyData = Cron\Universe->updateSovereigntyData, @halfPastHour

app/main/controller/api/setup.php

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,93 @@
1010

1111
use Controller;
1212
use lib\Config;
13+
use lib\Cron;
1314
use Model;
1415

1516
class Setup extends Controller\Controller {
1617

18+
/**
19+
* get HTML table <tr>´s for all cronjobs
20+
* @param \Base $f3
21+
*/
22+
public function cronTable(\Base $f3){
23+
$return = (object) [];
24+
$return->error = [];
25+
$return->jobsData = Cron::instance()->getJobsConfig();
26+
$return->html = $this->getCronHtml($return->jobsData);
27+
echo json_encode($return);
28+
}
29+
30+
/**
31+
* toggle "isPaused" for a cronjob by its name
32+
* @param \Base $f3
33+
*/
34+
public function cronPause(\Base $f3){
35+
$postData = (array)$f3->get('POST');
36+
$return = (object) [];
37+
$return->error = [];
38+
39+
if($jobName = (string)$postData['job']){
40+
$cron = Cron::instance();
41+
if($job = $cron->getJob($jobName)){
42+
if($job->valid()){
43+
$job->isPaused = !$job->isPaused;
44+
$job->save();
45+
46+
$return->jobsData = $cron->getJobsConfig([$jobName]);
47+
$return->html = $this->getCronHtml($return->jobsData);
48+
}
49+
}
50+
}
51+
52+
echo json_encode($return);
53+
}
54+
55+
/**
56+
* execute a cronjob by its name
57+
* -> runs sync
58+
* -> max execution time might be lower than CLI calls!
59+
* @param \Base $f3
60+
*/
61+
public function cronExecute(\Base $f3){
62+
$postData = (array)$f3->get('POST');
63+
$return = (object) [];
64+
$return->error = [];
65+
66+
if($jobName = (string)$postData['job']){
67+
$cron = Cron::instance();
68+
if($job = $cron->getJob($jobName)){
69+
if($job->valid()){
70+
$cron->execute($jobName, false);
71+
72+
$return->jobsData = $cron->getJobsConfig([$jobName]);
73+
$return->html = $this->getCronHtml($return->jobsData);
74+
}
75+
}
76+
}
77+
78+
echo json_encode($return);
79+
}
80+
81+
/**
82+
* get HTML for cronJobs
83+
* @param array $jobsData
84+
* @return string
85+
*/
86+
protected function getCronHtml(array $jobsData) : string {
87+
$tplData = [
88+
'cronConfig' => [
89+
'jobs' => $jobsData,
90+
'settings' => $this->getF3()->constants(Cron::instance(), 'DEFAULT_')
91+
],
92+
'tplCounter' => $this->counter(),
93+
'tplConvertBytes' => function(){
94+
return call_user_func_array([\lib\format\Number::instance(), 'bytesToString'], func_get_args());
95+
}
96+
];
97+
return \Template::instance()->render('templates/ui/cron_table_row.html', null, $tplData, 0);
98+
}
99+
17100
/**
18101
* build search index from existing data (e.g. Systems)
19102
* OR import data from ESI (e.g. Structures)

app/main/controller/api/system.php

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace Controller\Api;
1010

1111
use Controller;
12+
use lib\Config;
1213
use Model\Pathfinder;
1314

1415
class System extends Controller\AccessController {
@@ -39,7 +40,7 @@ public function graphData(\Base $f3){
3940
$cacheResponse = false;
4041

4142
// number of log entries in each table per system (24 = 24h)
42-
$logEntryCount = 24;
43+
$logEntryCount = Pathfinder\AbstractSystemApiBasicModel::DATA_COLUMN_COUNT;
4344

4445
$ttl = 60 * 10;
4546

@@ -51,47 +52,47 @@ public function graphData(\Base $f3){
5152
'factionKills' => 'SystemFactionKillModel'
5253
];
5354

55+
$exists = false;
56+
5457
foreach($systemIds as $systemId){
5558
$cacheKey = $this->getSystemGraphCacheKey($systemId);
56-
if( !$f3->exists($cacheKey, $graphData )){
59+
if(!$exists = $f3->exists($cacheKey, $graphData)){
5760
$graphData = [];
5861
$cacheSystem = false;
5962

60-
foreach($logTables as $label => $ModelClass){
61-
$systemLogModel = Pathfinder\AbstractPathfinderModel::getNew($ModelClass);
63+
foreach($logTables as $label => $className){
64+
$systemLogModel = Pathfinder\AbstractSystemApiBasicModel::getNew($className);
6265
$systemLogExists = false;
6366

6467
// 10min cache (could be up to 1h cache time)
6568
$systemLogModel->getByForeignKey('systemId', $systemId);
66-
if( !$systemLogModel->dry() ){
69+
if($systemLogModel->valid()){
6770
$systemLogExists = true;
6871
$cacheSystem = true;
6972
$cacheResponse = true;
7073
}
7174

75+
$systemLogData = $systemLogModel->getData();
76+
7277
// podKills share graph with shipKills -> skip
7378
if($label != 'podKills'){
7479
$graphData[$label]['logExists'] = $systemLogExists;
80+
$graphData[$label]['updated'] = $systemLogData->updated;
7581
}
7682

77-
$counter = 0;
78-
for( $i = $logEntryCount; $i >= 1; $i--){
79-
$column = 'value' . $i;
80-
$value = $systemLogExists ? $systemLogModel->$column : 0;
81-
82-
// ship and pod kills should be merged into one table
83+
$logValueCount = range(0, $logEntryCount - 1);
84+
foreach($logValueCount as $i){
8385
if($label == 'podKills'){
84-
$graphData['shipKills']['data'][$counter]['z'] = $value;
86+
$graphData['shipKills']['data'][$i]['z'] = $systemLogData->values[$i];
8587
}else{
86-
$dataSet = [
87-
'x' => ($i - 1) . 'h',
88-
'y' => $value
88+
$graphData[$label]['data'][] = [
89+
'x' => ($logEntryCount - $i - 1) . 'h',
90+
'y' => $systemLogData->values[$i]
8991
];
90-
$graphData[$label]['data'][] = $dataSet;
9192
}
92-
$counter++;
9393
}
9494
}
95+
9596
if($cacheSystem){
9697
$f3->set($cacheKey, $graphData, $ttl);
9798
}
@@ -104,7 +105,7 @@ public function graphData(\Base $f3){
104105

105106
if($cacheResponse){
106107
// send client cache header
107-
$f3->expire($ttl);
108+
$f3->expire(Config::ttlLeft($exists, $ttl));
108109
}
109110

110111
echo json_encode($graphsData);

app/main/controller/api/user.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
use Controller;
13+
use lib\Config;
1314
use Model\Pathfinder;
1415
use Exception;
1516

@@ -119,6 +120,7 @@ public function getCookieCharacter(\Base $f3){
119120
$cookieName = (string)$data['cookie'];
120121

121122
$return = (object) [];
123+
$return->ccpImageServer = Config::getPathfinderData('api.ccp_image_server');
122124
$return->error = [];
123125

124126
if( !empty($cookieData = $this->getCookieByName($cookieName) )){

app/main/controller/appcontroller.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public function afterroute(\Base $f3){
5454
parent::afterroute($f3);
5555

5656
// clear all SSO related temp data
57-
if( $f3->exists(Ccp\Sso::SESSION_KEY_SSO) ){
57+
if($f3->exists(Ccp\Sso::SESSION_KEY_SSO)){
5858
$f3->clear(Ccp\Sso::SESSION_KEY_SSO);
5959
}
6060
}

app/main/controller/ccp/sso.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ public function getCharacterData(int $characterId) : \stdClass{
468468
*/
469469
$corporation = Pathfinder\AbstractPathfinderModel::getNew('CorporationModel');
470470
$corporation->getById($corporationId, 0);
471-
if( !$corporation->dry() ){
471+
if($corporation->valid()){
472472
$characterData->corporation = $corporation;
473473
}
474474
}
@@ -479,7 +479,7 @@ public function getCharacterData(int $characterId) : \stdClass{
479479
*/
480480
$alliance = Pathfinder\AbstractPathfinderModel::getNew('AllianceModel');
481481
$alliance->getById($allianceId, 0);
482-
if( !$alliance->dry() ){
482+
if($alliance->valid()){
483483
$characterData->alliance = $alliance;
484484
}
485485
}

app/main/controller/controller.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,10 @@ function beforeroute(\Base $f3, $params) : bool {
9393
}else{
9494
$this->initResource($f3);
9595

96-
$this->setTemplate( Config::getPathfinderData('view.index') );
96+
$this->setTemplate(Config::getPathfinderData('view.index'));
97+
98+
99+
$f3->set('tplImage', \lib\format\Image::instance());
97100
}
98101

99102
return true;
@@ -165,7 +168,7 @@ protected function initResource(\Base $f3){
165168
'font' => $f3->get('BASE') . '/public/fonts',
166169
'document' => $f3->get('BASE') . '/public/templates',
167170
'image' => $f3->get('BASE') . '/public/img'
168-
]);
171+
], true);
169172

170173
$resource->register('style', 'pathfinder');
171174

@@ -178,6 +181,10 @@ protected function initResource(\Base $f3){
178181
$resource->register('font', 'fa-solid-900');
179182
$resource->register('font', 'fa-brands-400');
180183

184+
$resource->register('url', self::getEnvironmentData('CCP_SSO_URL'), 'prerender');
185+
$resource->register('url', Config::getPathfinderData('api.ccp_image_server'), 'dns-prefetch');
186+
$resource->register('url', '//i.ytimg.com', 'dns-prefetch'); // YouTube tiny embed domain
187+
181188
$f3->set('tplResource', $resource);
182189
}
183190

@@ -805,6 +812,26 @@ protected function logActivities(){
805812
Monolog::instance()->log();
806813
}
807814

815+
/**
816+
* simple counter with "static" store
817+
* -> called within tpl render
818+
* @return \Closure
819+
*/
820+
protected function counter() : \Closure {
821+
$store = [];
822+
823+
return function(string $action = 'increment', string $type = 'default', $val = 0) use (&$store){
824+
$return = null;
825+
switch($action){
826+
case 'increment': $store[$type]++; break;
827+
case 'add': $store[$type] += (int)$val; break;
828+
case 'get': $return = $store[$type] ? : null; break;
829+
case 'reset': unset($store[$type]); break;
830+
}
831+
return $return;
832+
};
833+
}
834+
808835
/**
809836
* get controller by class name
810837
* -> controller class is searched within all controller directories

0 commit comments

Comments
 (0)