forked from Sarjuuk/aowow
-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathprQueue
More file actions
executable file
·142 lines (121 loc) · 5.79 KB
/
prQueue
File metadata and controls
executable file
·142 lines (121 loc) · 5.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env php
<?php
namespace Aowow;
require_once 'includes/kernel.php';
require_once 'includes/setup/cli.class.php';
/* todo (med):
* tidy this file
* make win-safe
*/
if (!CLI)
die("this script must be run from CLI\n");
if (CLI && getcwd().DIRECTORY_SEPARATOR.'prQueue' != __FILE__)
die("this script must be run from root directory\n");
if ($_ = getopt('', ['log::']))
if (!empty($_['log']))
CLI::initLogFile(trim($_['log']));
// check if we already have a queue running
if (!Profiler::queueLock(getmypid()))
exit();
CLI::write('profiler queue started', CLI::LOG_OK);
set_time_limit(0);
$tCycle = microtime(true);
$error = function (int $type, int $realmGUID, int $realmId, int $fetchResult) : void
{
$what = match ($type)
{
Type::PROFILE => 'char',
Type::GUILD => 'guild',
Type::ARENA_TEAM => 'arena team'
};
$msg = match ($fetchResult)
{
Profiler::FETCH_RESULT_ERR_NAME_EMPTY => 'Subject has an empty name and was skipped.',
Profiler::FETCH_RESULT_ERR_NOT_FOUND => 'Subject was not found. Truncating local placeholder.',
Profiler::FETCH_RESULT_ERR_NO_MEMBERS => 'Subject has no members. Truncating local placeholder.',
Profiler::FETCH_RESULT_ERR_INTERNAL => 'Internal Error - Data stub is missing.'
};
trigger_error('prQueue - [realm: '.$realmId.' '.$what.' guid: '.$realmGUID.'] '.$msg, E_USER_WARNING);
DB::Aowow()->qry('UPDATE ::profiler_sync SET `status` = %i, `errorCode` = %i WHERE `realm` = %i AND `realmGUID` = %i AND `type` = %i', PR_QUEUE_STATUS_ERROR, PR_QUEUE_ERROR_CHAR, $realmId, $realmGUID, $type);
};
while (Cfg::get('PROFILER_ENABLE', true))
{
$delay = Cfg::get('PROFILER_QUEUE_DELAY') / 1000;
if (($tDiff = (microtime(true) - $tCycle)) < $delay)
{
$wait = $delay - $tDiff;
CLI::write('sleeping '.Lang::nf($wait, 2).'s..');
usleep($wait * 1000 * 1000);
}
$row = DB::Aowow()->selectRow('SELECT * FROM ::profiler_sync WHERE `status` = %i ORDER BY `requestTime` ASC', PR_QUEUE_STATUS_WAITING);
if (!$row)
{
// nothing more to do
CLI::write('profiler queue empty - process halted!', CLI::LOG_INFO);
Profiler::queueFree();
exit();
}
// scheduled for future date
if ($row['requestTime'] > time())
continue;
if (empty(Profiler::getRealms()[$row['realm']]))
{
DB::Aowow()->qry('UPDATE ::profiler_sync SET `status` = %i, `errorCode` = %i WHERE `realm` = %i AND `type` = %i AND `typeId` = %i', PR_QUEUE_STATUS_ERROR, PR_QUEUE_ERROR_ARMORY, $row['realm'], $row['type'], $row['typeId']);
CLI::write('realm #'.$row['realm'].' for subject guid '.$row['realmGUID'].' is missing/inaccessible.', CLI::LOG_WARN);
continue;
}
else
DB::Aowow()->qry('UPDATE ::profiler_sync SET `status` = %i WHERE `realm` = %i AND `type` = %i AND `typeId` = %i', PR_QUEUE_STATUS_WORKING, $row['realm'], $row['type'], $row['typeId']);
switch ($row['type'])
{
case Type::PROFILE:
switch ($result = Profiler::getCharFromRealm($row['realm'], $row['realmGUID']))
{
case Profiler::FETCH_RESULT_OK_UNCHANGED:
CLI::write('char #'.$row['realmGUID'].' on realm #'.$row['realm'].' did not log in since last update. skipping...');
case Profiler::FETCH_RESULT_OK:
break 2;
case Profiler::FETCH_RESULT_ERR_NAME_EMPTY:
case Profiler::FETCH_RESULT_ERR_NOT_FOUND:
DB::Aowow()->qry('DELETE FROM ::profiler_profiles WHERE `realm` = %i AND `realmGUID` = %i', $row['realm'], $row['realmGUID']);
default:
$error(Type::PROFILE, $row['realmGUID'], $row['realm'], $result);
continue 3;
}
case Type::GUILD:
switch ($result = Profiler::getGuildFromRealm($row['realm'], $row['realmGUID']))
{
case Profiler::FETCH_RESULT_OK:
break 2;
case Profiler::FETCH_RESULT_ERR_NAME_EMPTY:
case Profiler::FETCH_RESULT_ERR_NOT_FOUND:
case Profiler::FETCH_RESULT_ERR_NO_MEMBERS:
DB::Aowow()->qry('DELETE FROM ::profiler_guild WHERE `realm` = %i AND `realmGUID` = %i', $row['realm'], $row['realmGUID']);
default:
$error(Type::GUILD, $row['realmGUID'], $row['realm'], $result);
continue 3;
}
case Type::ARENA_TEAM:
switch ($result = Profiler::getArenaTeamFromRealm($row['realm'], $row['realmGUID']))
{
case Profiler::FETCH_RESULT_OK:
break 2;
case Profiler::FETCH_RESULT_ERR_NAME_EMPTY:
case Profiler::FETCH_RESULT_ERR_NOT_FOUND:
case Profiler::FETCH_RESULT_ERR_NO_MEMBERS:
DB::Aowow()->qry('DELETE FROM ::profiler_arena_team WHERE `realm` = %i AND `realmGUID` = %i', $row['realm'], $row['realmGUID']);
default:
$error(Type::ARENA_TEAM, $row['realmGUID'], $row['realm'], $result);
continue 3;
}
default:
DB::Aowow()->qry('DELETE FROM ::profiler_sync WHERE realm = %i AND type = %i AND typeId = %i', $row['realm'], $row['type'], $row['typeId']);
trigger_error('prQueue - unknown type #'.$row['type'].' to sync into profiler. Removing from queue...', E_USER_ERROR);
}
$tCycle = microtime(true);
// mark as ready
DB::Aowow()->qry('UPDATE ::profiler_sync SET `status` = %i, `errorCode` = 0 WHERE `realm` = %i AND `type` = %i AND `typeId` = %i', PR_QUEUE_STATUS_READY, $row['realm'], $row['type'], $row['typeId']);
}
Profiler::queueFree();
CLI::write('profiler queue halted!', CLI::LOG_INFO);
?>