Completed
Push — work-fleets ( 006942...3604bd )
by SuperNova.WS
06:54
created

UBEReport::sn_ube_report_save()   C

Complexity

Conditions 8
Paths 19

Size

Total Lines 161
Code Lines 111

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 72

Importance

Changes 4
Bugs 0 Features 0
Metric Value
cc 8
eloc 111
c 4
b 0
f 0
nc 19
nop 1
dl 0
loc 161
rs 5.2676
ccs 0
cts 131
cp 0
crap 72

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
class UBEReport {
4
5
  // ------------------------------------------------------------------------------------------------
6
  // Записывает боевой отчет в БД
7
  /**
8
   * @param UBE $ube
9
   *
10
   * @return bool|string
11
   *
12
   * @version 2016-02-25 23:42:45 41a4.68
13
   */
14
  public function sn_ube_report_save($ube) {
15
    // Если уже есть ИД репорта - значит репорт был взят из таблицы. С таким мы не работаем
16
    if($ube->get_cypher()) {
17
      return false;
18
    }
19
20
    // Генерируем уникальный секретный ключ и проверяем наличие в базе
21
    do {
22
      $ube->report_cypher = sys_random_string(32);
23
    } while(classSupernova::$db->doSelectFetchArray("SELECT ube_report_cypher FROM {{ube_report}} WHERE ube_report_cypher = '{$ube->report_cypher}' LIMIT 1 FOR UPDATE"));
0 ignored issues
show
Deprecated Code introduced by
The method db_mysql::doSelectFetchArray() has been deprecated with message: TODO - УДАЛИТЬ
Метод временно находится здесь - слишком много переписывать, что бы его отсюда вынести

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
24
25
    // Инициализация таблицы для пакетной вставки информации
26
    $sql_perform = array(
27
      'ube_report_player' => array(
28
        array(
29
          '`ube_report_id`',
30
          '`ube_report_player_player_id`',
31
          '`ube_report_player_name`',
32
          '`ube_report_player_attacker`',
33
          '`ube_report_player_bonus_attack`',
34
          '`ube_report_player_bonus_shield`',
35
          '`ube_report_player_bonus_armor`',
36
        ),
37
      ),
38
39
      'ube_report_fleet' => array(
40
        array(
41
          '`ube_report_id`',
42
          '`ube_report_fleet_player_id`',
43
          '`ube_report_fleet_fleet_id`',
44
          '`ube_report_fleet_planet_id`',
45
          '`ube_report_fleet_planet_name`',
46
          '`ube_report_fleet_planet_galaxy`',
47
          '`ube_report_fleet_planet_system`',
48
          '`ube_report_fleet_planet_planet`',
49
          '`ube_report_fleet_planet_planet_type`',
50
          '`ube_report_fleet_resource_metal`',
51
          '`ube_report_fleet_resource_crystal`',
52
          '`ube_report_fleet_resource_deuterium`',
53
          '`ube_report_fleet_bonus_attack`',
54
          '`ube_report_fleet_bonus_shield`',
55
          '`ube_report_fleet_bonus_armor`',
56
        ),
57
      ),
58
59
      'ube_report_outcome_fleet' => array(
60
        array(
61
          '`ube_report_id`',
62
          '`ube_report_outcome_fleet_fleet_id`',
63
          '`ube_report_outcome_fleet_resource_lost_metal`',
64
          '`ube_report_outcome_fleet_resource_lost_crystal`',
65
          '`ube_report_outcome_fleet_resource_lost_deuterium`',
66
          '`ube_report_outcome_fleet_resource_dropped_metal`',
67
          '`ube_report_outcome_fleet_resource_dropped_crystal`',
68
          '`ube_report_outcome_fleet_resource_dropped_deuterium`',
69
          '`ube_report_outcome_fleet_resource_loot_metal`',
70
          '`ube_report_outcome_fleet_resource_loot_crystal`',
71
          '`ube_report_outcome_fleet_resource_loot_deuterium`',
72
          '`ube_report_outcome_fleet_resource_lost_in_metal`',
73
        ),
74
      ),
75
76
      'ube_report_outcome_unit' => array(
77
        array(
78
          '`ube_report_id`',
79
          '`ube_report_outcome_unit_fleet_id`',
80
          '`ube_report_outcome_unit_unit_id`',
81
          '`ube_report_outcome_unit_restored`',
82
          '`ube_report_outcome_unit_lost`',
83
          '`ube_report_outcome_unit_sort_order`',
84
        ),
85
      ),
86
87
      'ube_report_unit' => array(
88
        array(
89
          '`ube_report_id`',
90
          '`ube_report_unit_round`',
91
          '`ube_report_unit_player_id`',
92
          '`ube_report_unit_fleet_id`',
93
          '`ube_report_unit_unit_id`',
94
          '`ube_report_unit_count`',
95
          '`ube_report_unit_boom`',
96
          '`ube_report_unit_attack`',
97
          '`ube_report_unit_shield`',
98
          '`ube_report_unit_armor`',
99
          '`ube_report_unit_attack_base`',
100
          '`ube_report_unit_shield_base`',
101
          '`ube_report_unit_armor_base`',
102
          '`ube_report_unit_sort_order`',
103
        ),
104
      ),
105
    );
106
107
    // Сохраняем общую информацию о бое
108
    classSupernova::$db->doInsertSet(TABLE_UBE_REPORT, array(
109
        'ube_report_cypher'             => (string)$ube->report_cypher,
110
        'ube_report_time_combat'        => (string)date(FMT_DATE_TIME_SQL, $ube->combat_timestamp),
111
        'ube_report_time_spent'         => (float)$ube->time_spent,
112
        'ube_report_combat_admin'       => (int)$ube->is_admin_in_combat,
113
        'ube_report_mission_type'       => (int)$ube->mission_type_id,
114
        'ube_report_combat_result'      => (int)$ube->combat_result,
115
        'ube_report_combat_sfr'         => (int)$ube->is_small_fleet_recce,
116
        'ube_report_planet_id'          => (int)$ube->ube_planet_info[PLANET_ID],
117
        'ube_report_planet_name'        => (string)$ube->ube_planet_info[PLANET_NAME],
118
        'ube_report_planet_size'        => (int)$ube->ube_planet_info[PLANET_SIZE],
119
        'ube_report_planet_galaxy'      => (int)$ube->ube_planet_info[PLANET_GALAXY],
120
        'ube_report_planet_system'      => (int)$ube->ube_planet_info[PLANET_SYSTEM],
121
        'ube_report_planet_planet'      => (int)$ube->ube_planet_info[PLANET_PLANET],
122
        'ube_report_planet_planet_type' => (int)$ube->ube_planet_info[PLANET_TYPE],
123
        'ube_report_capture_result'     => (int)$ube->capture_result,
124
      )
125
      + $ube->debris->report_generate_array()
126
      + $ube->moon_calculator->report_generate_array()
127
    );
128
    $ube_report_id = classSupernova::$db->db_insert_id();
129
130
    // Сохраняем общую информацию по игрокам
131
    $player_sides = $ube->players->get_player_sides();
132
    foreach($player_sides as $player_id => $player_side) {
133
      $sql_perform['ube_report_player'][] = array(
134
        $ube_report_id,
135
        $player_id,
136
137
        "'" . db_escape($ube->players[$player_id]->name) . "'",
138
        $ube->players[$player_id]->getSide() == UBE_PLAYER_IS_ATTACKER ? 1 : 0,
139
140
        (float)$ube->players[$player_id]->player_bonus->calcBonus(P_ATTACK),
141
        (float)$ube->players[$player_id]->player_bonus->calcBonus(P_SHIELD),
142
        (float)$ube->players[$player_id]->player_bonus->calcBonus(P_ARMOR),
143
      );
144
    }
145
146
    // Всякая информация по флотам
147
    foreach($ube->fleet_list->_container as $fleet_id => $UBEFleet) {
148
      // Сохраняем общую информацию по флотам
149
      $sql_perform['ube_report_fleet'][] = $UBEFleet->sql_generate_array($ube_report_id);
150
151
      // Сохраняем итоговую информацию по ресурсам флота - потеряно, выброшено, увезено
152
      $sql_perform['ube_report_outcome_fleet'][] = $UBEFleet->sql_generate_outcome_fleet_array($ube_report_id);
153
154
      // Сохраняем результаты по юнитам - потеряно и восстановлено
155
      $UBEFleet->sql_generate_outcome_unit_array($sql_perform['ube_report_outcome_unit'], $ube_report_id);
156
    }
157
158
    // Сохраняем информацию о раундах
159
    $ube->rounds->sql_generate_unit_array($sql_perform['ube_report_unit'], $ube_report_id, $ube->fleet_list);
160
161
    // Пакетная вставка данных
162
    // First row is a list of field names
163
    foreach($sql_perform as $table_name => &$table_data) {
164
      // If only field names in this table - doing nothing
165
      if(count($table_data) < 2) {
166
        continue;
167
      }
168
      // Picking up field names
169
      $fields = array_shift($table_data);
170
      classSupernova::$db->doInsertBatch($table_name, $table_data, $fields, DB_INSERT_PLAIN);
0 ignored issues
show
Bug introduced by
It seems like $fields defined by array_shift($table_data) on line 169 can also be of type null; however, db_mysql::doInsertBatch() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
171
    }
172
173
    return $ube->report_cypher;
174
  }
175
176
177
  // ------------------------------------------------------------------------------------------------
178
  // Читает боевой отчет из БД
179
  /**
180
   * @param $report_cypher
181
   *
182
   * @return string|UBE
183
   */
184
  public function sn_ube_report_load($report_cypher) {
185
    $report_cypher = db_escape($report_cypher);
186
187
    $report_row = classSupernova::$db->doSelectFetchArray("SELECT * FROM {{ube_report}} WHERE ube_report_cypher = '{$report_cypher}' LIMIT 1");
0 ignored issues
show
Deprecated Code introduced by
The method db_mysql::doSelectFetchArray() has been deprecated with message: TODO - УДАЛИТЬ
Метод временно находится здесь - слишком много переписывать, что бы его отсюда вынести

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
188
    if(!$report_row) {
189
      return UBE_REPORT_NOT_FOUND;
190
    }
191
192
    $ube = new UBE();
193
    $ube->load_from_report_row($report_row, $report_cypher);
194
195
    return $ube;
196
  }
197
198
199
  /**
200
   * @param UBE $ube
201
   * @param     $template_result
202
   */
203
  public function sn_ube_report_generate(UBE $ube, &$template_result) {
204
    if(!is_object($ube)) {
205
      return;
206
    }
207
208
    // Обсчитываем результаты боя из начальных данных
209
    // Генерируем отчет по флотам
210
    $ube->rounds->report_render_rounds($template_result, $ube); // OK3
211
212
    // Боевые потери флотов
213
    $template_result['.']['loss'] = $ube->fleet_list->ube_report_render_fleets_outcome($ube);
214
215
// TODO: $combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] - если админский бой не генерировать осколки и не делать луну. Сделать серверную опцию
216
217
    // Координаты, тип и название планеты - если есть
218
//R  $planet_owner_id = $combat_data[UBE_FLEETS][0][UBE_OWNER];
219
    if(isset($ube->ube_planet_info)) {
220
      $template_result += $ube->ube_planet_info;
221
      $template_result[PLANET_NAME] = str_replace(' ', '&nbsp;', htmlentities($template_result[PLANET_NAME], ENT_COMPAT, 'UTF-8'));
222
    }
223
224
    // Обломки
225
    $debris = array();
226
    foreach(array(RES_METAL, RES_CRYSTAL) as $resource_id) {
227
      if($resource_amount = $ube->debris->debris_get_resource($resource_id)) {
228
        $debris[] = array(
229
          'NAME'   => classLocale::$lang['tech'][$resource_id],
230
          'AMOUNT' => pretty_number($resource_amount),
231
        );
232
      }
233
    }
234
    $template_result['.']['debris'] = $debris;
235
236
    $template_result += $ube->moon_calculator->report_render_moon();
237
238
    $template_result += array(
239
      'MICROTIME'         => $ube->get_time_spent(),
240
      'COMBAT_TIME'       => $ube->combat_timestamp ? $ube->combat_timestamp + SN_CLIENT_TIME_DIFF : 0,
241
      'COMBAT_TIME_TEXT'  => date(FMT_DATE_TIME, $ube->combat_timestamp + SN_CLIENT_TIME_DIFF),
242
      'COMBAT_ROUNDS'     => $ube->rounds->count() - 1,
243
      'UBE_MISSION_TYPE'  => $ube->mission_type_id,
244
      'UBE_REPORT_CYPHER' => $ube->get_cypher(),
245
246
      'PLANET_TYPE_TEXT' => classLocale::$lang['sys_planet_type_sh'][$template_result['PLANET_TYPE']],
247
248
      'UBE_CAPTURE_RESULT'      => $ube->capture_result,
249
      'UBE_CAPTURE_RESULT_TEXT' => classLocale::$lang['ube_report_capture_result'][$ube->capture_result],
250
251
      'UBE_SFR'           => $ube->is_small_fleet_recce,
252
      'UBE_COMBAT_RESULT' => $ube->combat_result,
253
254
      'MT_DESTROY'             => MT_DESTROY,
255
      'UBE_COMBAT_RESULT_WIN'  => UBE_COMBAT_RESULT_WIN,
256
      'UBE_COMBAT_RESULT_LOSS' => UBE_COMBAT_RESULT_LOSS,
257
    );
258
259
  }
260
261
}
262