Skip to content

Commit 763e6cb

Browse files
committed
Merge branch 'develop'
2 parents 7a032c2 + 98c282d commit 763e6cb

23 files changed

Lines changed: 727 additions & 949 deletions

‎.editorconfig‎

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
1-
# This file is for unifying the coding style for different editors and IDEs
2-
# editorconfig.org
3-
4-
root = true
5-
6-
[*]
7-
end_of_line = lf
8-
charset = utf-8
9-
trim_trailing_whitespace = true
10-
insert_final_newline = true
11-
12-
# Spaces in coffee
13-
[**.coffee]
14-
indent_style = space
15-
indent_size = 2
16-
17-
[**.js]
18-
indent_style = space
19-
indent_size = 2
20-
21-
# Tabs in less
22-
[**.less]
23-
indent_style = tab
24-
indent_size = 2
25-
26-
[**.css]
27-
indent_style = tab
28-
indent_size = 2
29-
30-
[**.php]
31-
indent_style = space
32-
indent_size = 4
33-
34-
[**.html]
35-
indent_style = tab
36-
indent_size = 2
1+
# This file is for unifying the coding style for different editors and IDEs
2+
# editorconfig.org
3+
4+
root = true
5+
6+
[*]
7+
end_of_line = lf
8+
charset = utf-8
9+
trim_trailing_whitespace = true
10+
insert_final_newline = true
11+
12+
# Spaces in coffee
13+
[**.coffee]
14+
indent_style = space
15+
indent_size = 2
16+
17+
[**.js]
18+
indent_style = space
19+
indent_size = 2
20+
21+
# Tabs in less
22+
[**.less]
23+
indent_style = tab
24+
indent_size = 2
25+
26+
[**.css]
27+
indent_style = tab
28+
indent_size = 2
29+
30+
[**.php]
31+
indent_style = space
32+
indent_size = 4
33+
34+
[**.html]
35+
indent_style = tab
36+
indent_size = 2

‎.gitattributes‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Force LF line endings for all text files
2+
* text=auto eol=lf

‎GPL_FR.TXT‎

Lines changed: 141 additions & 141 deletions
Large diffs are not rendered by default.

‎README.md‎

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
## Module OGSpy Attaques
2-
3-
Ce module permet de suivre la rentabilité des attaques et des recyclages et de les exporter en BBCode.
4-
5-
### Pré Requis ###
6-
7-
* Nécessite OGSpy 3.3.6 [Dépot OGSpy](https://github.com/ogsteam/ogspy)
8-
* Modules OGspy requis : Xtense
9-
10-
### Configuration ###
11-
12-
Posibilité de modifier les couleurs d'export ainsi que de gérer les archives.
13-
14-
### Pour nous contacter ###
15-
16-
* [Forum OGSteam](https://forum.ogsteam.eu) : Vous y trouverez notre équipe de support ainsi que l'invitation vers notre salon Discord
17-
* Discord : https://discord.gg/Azcb67b
18-
19-
### Index Codacy ###
20-
21-
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/7691d96373ce441fb3b898a8b0c10ba5)](https://www.codacy.com/manual/OGSteam/mod-attaques?utm_source=github.com&utm_medium=referral&utm_content=OGSteam/mod-attaques&utm_campaign=Badge_Grade)
22-
1+
## Module OGSpy Attaques
2+
3+
Ce module permet de suivre la rentabilité des attaques et des recyclages et de les exporter en BBCode.
4+
5+
### Pré Requis ###
6+
7+
* Nécessite OGSpy 3.3.6 [Dépot OGSpy](https://github.com/ogsteam/ogspy)
8+
* Modules OGspy requis : Xtense
9+
10+
### Configuration ###
11+
12+
Posibilité de modifier les couleurs d'export ainsi que de gérer les archives.
13+
14+
### Pour nous contacter ###
15+
16+
* [Forum OGSteam](https://forum.ogsteam.eu) : Vous y trouverez notre équipe de support ainsi que l'invitation vers notre salon Discord
17+
* Discord : https://discord.gg/Azcb67b
18+
19+
### Index Codacy ###
20+
21+
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/7691d96373ce441fb3b898a8b0c10ba5)](https://www.codacy.com/manual/OGSteam/mod-attaques?utm_source=github.com&utm_medium=referral&utm_content=OGSteam/mod-attaques&utm_campaign=Badge_Grade)
22+

‎_xtense.php‎

Lines changed: 112 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*
66
* @package Attaques
77
* @author ericc
8-
* @link http://www.ogsteam.eu
8+
* @link https://www.ogsteam.eu
99
* @version : 0.8e
1010
* created : 17/02/2008
1111
* modified :
@@ -61,49 +61,115 @@ public function getCallbacks()
6161
*/
6262
function attack_rc($rapport)
6363
{
64-
global $db, $table_prefix, $attack_config, $user_data;
64+
global $db, $table_prefix, $attack_config, $user_data, $xtense_user_data, $log;
6565
define("TABLE_ATTAQUES_ATTAQUES", $table_prefix . "attaques_attaques");
6666
read_config();
6767

68-
if (!isset($rapport['json']))
68+
$log->debug('Attaques::attack_rc called', ['rapport_keys' => array_keys($rapport)]);
69+
70+
if (!isset($rapport['json'])) {
71+
$log->warning('Attaques::attack_rc: rapport[json] missing');
6972
return false;
73+
}
7074

71-
//On regarde dans les coordonnées de l'espace personnel du joueur qui insère les données via le plugin si il fait partie des attaquants et/ou des défenseurs
75+
// $rapport['json'] is the full outer xtense wrapper JSON string.
76+
// The actual RC payload is in the 'data' field (itself a JSON string).
77+
$outer = json_decode($rapport['json'], true);
78+
$log->debug('Attaques::attack_rc: outer decode', [
79+
'json_error' => json_last_error_msg(),
80+
'outer_keys' => is_array($outer) ? array_keys($outer) : 'NOT_ARRAY',
81+
]);
82+
if (!isset($outer['data'])) {
83+
$log->warning('Attaques::attack_rc: outer[data] missing');
84+
return false;
85+
}
7286

73-
$query = "SELECT `coordinates` FROM " . TABLE_USER_BUILDING . " WHERE `user_id` ='" . $user_data['user_id'] . "'";
74-
//log_('debug', $query);
75-
$result = $db->sql_query($query);
76-
$coordinates = array();
77-
while ($coordinate = $db->sql_fetch_row($result)) {
78-
$coordinates[] = $coordinate[0];
87+
$rc = json_decode($outer['data'], true);
88+
$log->debug('Attaques::attack_rc: inner decode', [
89+
'json_error' => json_last_error_msg(),
90+
'rc_keys' => is_array($rc) ? array_keys($rc) : 'NOT_ARRAY',
91+
]);
92+
if (!is_array($rc)) {
93+
$log->warning('Attaques::attack_rc: inner data is not an array');
94+
return false;
7995
}
80-
$rc = json_decode($rapport['json']);
8196

82-
//Coordonnées où a eu lieu l'attaque
83-
$coord_attaque = "{$rc->coordinates->galaxy}:{$rc->coordinates->system}:{$rc->coordinates->position}";
84-
//log_('debug', $coord_attaque);
97+
// Coordonnées où a eu lieu l'attaque — stored as "g:s:p" in the new format
98+
$coord_attaque = $rc['coordinates'] ?? null;
99+
$log->debug('Attaques::attack_rc: coordinates', ['coord_attaque' => $coord_attaque]);
100+
if ($coord_attaque === null) {
101+
$log->warning('Attaques::attack_rc: rc[coordinates] missing');
102+
return false;
103+
}
85104

86-
if ($rc->result != 'attacker') //Si l'attaquant ne gagne pas alors il ne prend pas de ressources !
87-
{
88-
$winmetal = 0;
105+
// Winner / loot
106+
$winner = $rc['result']['winner'] ?? '';
107+
$log->debug('Attaques::attack_rc: winner', ['winner' => $winner]);
108+
if ($winner !== 'attacker') {
109+
$winmetal = 0;
89110
$wincristal = 0;
90-
$windeut = 0;
111+
$windeut = 0;
91112
} else {
92-
$winmetal = $rc->loot->metal;
93-
$wincristal = $rc->loot->crystal;
94-
$windeut = $rc->loot->deuterium;
113+
$winmetal = 0;
114+
$wincristal = 0;
115+
$windeut = 0;
116+
foreach ($rc['result']['loot']['resources'] ?? [] as $resource) {
117+
switch ($resource['resource']) {
118+
case 'metal': $winmetal = (int)$resource['amount']; break;
119+
case 'crystal': $wincristal = (int)$resource['amount']; break;
120+
case 'deuterium': $windeut = (int)$resource['amount']; break;
121+
}
122+
}
95123
}
124+
$log->debug('Attaques::attack_rc: loot', ['metal' => $winmetal, 'crystal' => $wincristal, 'deut' => $windeut]);
96125

97-
$pertes = $rc->statistic->lostUnitsAttacker;
98-
$timestamp = $rc->event_timestamp;
126+
// Unit losses
127+
$pertes_attacker = 0;
128+
$pertes_defender = 0;
129+
foreach ($rc['result']['totalValueOfUnitsLost'] ?? [] as $loss) {
130+
if ($loss['side'] === 'attacker') $pertes_attacker = (int)$loss['value'];
131+
if ($loss['side'] === 'defender') $pertes_defender = (int)$loss['value'];
132+
}
133+
$pertes = $pertes_attacker;
134+
$log->debug('Attaques::attack_rc: losses', ['attacker' => $pertes_attacker, 'defender' => $pertes_defender]);
99135

100-
//Récupération des coordonnées des attaquants
136+
$timestamp = $rc['timestamp'] ?? null;
137+
$log->debug('Attaques::attack_rc: timestamp', ['timestamp' => $timestamp]);
138+
if ($timestamp === null) {
139+
$log->warning('Attaques::attack_rc: rc[timestamp] missing');
140+
return false;
141+
}
142+
143+
// Récupération des coordonnées des attaquants et défenseurs
101144
$coords_attaquants = array();
102145
$coords_defenseurs = array();
103-
foreach ($rc->attacker as $attacker)
104-
$coords_attaquants[] = $attacker->ownerCoordinates;
105-
foreach ($rc->defender as $defender)
106-
$coords_defenseurs[] = $defender->ownerCoordinates;
146+
foreach ($rc['fleets'] ?? [] as $fleet) {
147+
$c = $fleet['spaceObject']['coordinates'] ?? null;
148+
if ($c === null) {
149+
$log->warning('Attaques::attack_rc: fleet missing spaceObject.coordinates', ['fleet_side' => $fleet['side'] ?? 'unknown']);
150+
continue;
151+
}
152+
$coord = "{$c['galaxy']}:{$c['system']}:{$c['position']}";
153+
if ($fleet['side'] === 'attacker') {
154+
$coords_attaquants[] = $coord;
155+
} else {
156+
$coords_defenseurs[] = $coord;
157+
}
158+
}
159+
$log->debug('Attaques::attack_rc: fleet coords', [
160+
'attackers' => $coords_attaquants,
161+
'defenders' => $coords_defenseurs,
162+
]);
163+
164+
//On regarde dans les coordonnées de l'espace personnel du joueur qui insère les données via le plugin si il fait partie des attaquants et/ou des défenseurs
165+
$log->debug('Attaques::attack_rc: user_id', ['id' => $xtense_user_data['id'] ?? 'NULL']);
166+
$query = "SELECT CONCAT(`galaxy`, ':', `system`, ':', `row`) FROM " . TABLE_USER_BUILDING . " WHERE `last_update_user_id` = '" . (int)$xtense_user_data['id'] . "'";
167+
$result = $db->sql_query($query);
168+
$coordinates = array();
169+
while ($coordinate = $db->sql_fetch_row($result)) {
170+
$coordinates[] = $coordinate[0];
171+
}
172+
$log->debug('Attaques::attack_rc: user coordinates', ['count' => count($coordinates), 'coords' => $coordinates]);
107173

108174
$attaquant = 0;
109175
$defenseur = 0;
@@ -114,43 +180,42 @@ function attack_rc($rapport)
114180
if (count(array_intersect($coords_defenseurs, $coordinates)) > 0) {
115181
$defenseur = 1;
116182
}
183+
$log->debug('Attaques::attack_rc: role', ['attaquant' => $attaquant, 'defenseur' => $defenseur, 'config_defenseur' => $attack_config['defenseur'] ?? 0]);
117184

118-
// le rapport ne concerne pas l'utilisateur, ou que l'on ne tiens pas compte des attaques subies
119-
// On ne va pas plus loin
120-
//log_('debug', "Attack Config: " . $attack_config['defenseur']);
121-
//log_('debug', "I am the Attacker: " . $attaquant);
122-
//log_('debug', "I am the Defender: " . $defenseur);
123185
/*Cas 1 : Attaquant = 0 Def = 0 Config = 0|1 -> RC Refusé
124186
Cas 2 : Attaquant = 0 Def = 1 Config = 0 -> RC Refusé
125187
Cas 3 : Attaquant = 0 Def = 1 Config = 1 -> RC Accepté
126188
Cas 4 : Attaquant = 1 Def = 0 Config = 0 -> RC Accepté
127189
Cas 5 : Attaquant = 1 Def = 0 Config = 1 -> RC Accepté
128190
Cas 6 : Impossible Att toujours différent de Def
129191
*/
130-
if ($attaquant !== 1 && ($defenseur !== 1 || $attack_config['defenseur'] !== 1)) { // vrai & faux | vrai
131-
//log_('debug', "Erreur : RC non pris en compte");
192+
if ($attaquant !== 1 && ($defenseur !== 1 || ($attack_config['defenseur'] ?? 0) !== 1)) {
193+
$log->debug('Attaques::attack_rc: RC refusé (utilisateur non impliqué)');
132194
return false;
133195
} else {
134-
if ($defenseur === 1 && $attack_config['defenseur'] === 1) {
196+
if ($defenseur === 1 && ($attack_config['defenseur'] ?? 0) === 1) {
135197
//Récupération des pertes défenseurs
136-
$pertes = $rc->statistic->lostUnitsDefender;
198+
$pertes = $pertes_defender;
137199
//On soustrait les ressources volées
138200
$winmetal = -$winmetal;
139201
$wincristal = -$wincristal;
140202
$windeut = -$windeut;
141203
}
142204

143205
//On vérifie que cette attaque n'a pas déja été enregistrée
144-
$query = "SELECT `attack_id` FROM " . TABLE_ATTAQUES_ATTAQUES . " WHERE `attack_user_id` ='" . $user_data['user_id'] . "' AND `attack_date`='$timestamp' AND `attack_coord`='$coord_attaque' ";
206+
$query = "SELECT `attack_id` FROM " . TABLE_ATTAQUES_ATTAQUES . " WHERE `attack_user_id` ='" . $xtense_user_data['id'] . "' AND `attack_date`='$timestamp' AND `attack_coord`='$coord_attaque' ";
145207
$result = $db->sql_query($query);
146208
$nb = $db->sql_numrows($result);
147209

148210
if ($nb == 0) {
149211
//On insere ces données dans la base de données
150212
$query = "INSERT INTO " . TABLE_ATTAQUES_ATTAQUES . " ( `attack_id` , `attack_user_id` , `attack_coord` , `attack_date` , `attack_metal` , `attack_cristal` , `attack_deut` , `attack_pertes` )
151213
VALUES (
152-
NULL , '" . $user_data['user_id'] . "', '" . $coord_attaque . "', '" . $timestamp . "', '" . $winmetal . "', '" . $wincristal . "', '" . $windeut . "', '" . $pertes . "')";
214+
NULL , '" . $xtense_user_data['id'] . "', '" . $coord_attaque . "', '" . $timestamp . "', '" . $winmetal . "', '" . $wincristal . "', '" . $windeut . "', '" . $pertes . "')";
153215
$db->sql_query($query);
216+
$log->info('Attaques::attack_rc: RC enregistré', ['coord' => $coord_attaque, 'timestamp' => $timestamp]);
217+
} else {
218+
$log->debug('Attaques::attack_rc: RC déjà enregistré (doublon ignoré)', ['coord' => $coord_attaque, 'timestamp' => $timestamp]);
154219
}
155220
}
156221

@@ -163,7 +228,7 @@ function attack_rc($rapport)
163228
*/
164229
function attack_rr($rapport)
165230
{
166-
global $db, $table_prefix, $user_data;
231+
global $db, $table_prefix, $user_data, $xtense_user_data;
167232

168233
define("TABLE_ATTAQUES_RECYCLAGES", $table_prefix . "attaques_recyclages");
169234

@@ -173,15 +238,15 @@ function attack_rr($rapport)
173238
$timestamp = $rapport['time'];
174239
$coordonne = $rapport['coords'][0] . ":" . $rapport['coords'][1] . ":" . $rapport['coords'][2];
175240
//On vérifie que ce recyclage n'a pas déja été enregistrée
176-
$query = "SELECT `recy_id` FROM " . TABLE_ATTAQUES_RECYCLAGES . " WHERE `recy_user_id` ='" . $user_data['user_id'] . "' AND `recy_date` ='$timestamp' AND `recy_coord` ='$coordonne' ";
241+
$query = "SELECT `recy_id` FROM " . TABLE_ATTAQUES_RECYCLAGES . " WHERE `recy_user_id` ='" . $xtense_user_data['id'] . "' AND `recy_date` ='$timestamp' AND `recy_coord` ='$coordonne' ";
177242
$result = $db->sql_query($query);
178243
$nb = $db->sql_numrows($result);
179244
// Si on ne trouve rien
180245
if ($nb == 0) {
181246
//On insere ces données dans la base de données
182247
$query = "INSERT INTO " . TABLE_ATTAQUES_RECYCLAGES . " ( `recy_id` , `recy_user_id` , `recy_coord` , `recy_date` , `recy_metal` , `recy_cristal` )
183248
VALUES (
184-
NULL , '" . $user_data['user_id'] . "', '" . $coordonne . "', '" . $timestamp . "', '" . $rapport['M_reco'] . "', '" . $rapport['C_reco'] . "')";
249+
NULL , '" . $xtense_user_data['id'] . "', '" . $coordonne . "', '" . $timestamp . "', '" . $rapport['M_reco'] . "', '" . $rapport['C_reco'] . "')";
185250
$db->sql_query($query);
186251
}
187252
return true;
@@ -196,5 +261,9 @@ function read_config()
196261
$request = "SELECT `value` FROM `" . TABLE_MOD_CFG . "` WHERE `mod` = 'Attaques' AND `config` = 'config'";
197262
$queryResult = $db->sql_query($request);
198263
$configs = $db->sql_fetch_row($queryResult);
199-
$attack_config = json_decode($configs[0], true);
264+
$attack_config = isset($configs[0]) ? json_decode($configs[0], true) : [];
265+
if (!is_array($attack_config)) {
266+
$attack_config = [];
267+
}
200268
}
269+

0 commit comments

Comments
 (0)