/** * Behandle siden */ protected function handle() { // oppdatere ranklista? if (isset($_GET['update']) && access::has("crewet")) { ranklist::flush(); ess::$b->page->add_message("Ranklisten skal nå være oppdatert."); } // vise komplett liste? if (isset($_GET['alle'])) { $this->all(); } else { $this->top(); } }
/** * Endre rankpoengene for en bestemt spiller * @param integer $points_change * @param player $up (evt. integer) * @param boolean $use_login skal vi oppdatere sesjonsinfo hvis dette er den innloggede spilleren? * @param boolean $silent ikke annonser svaret på f.eks. IRC * @param integer $points_change_rel * @param string $oppdrag_name navn for oppdragtrigger å identifisere funksjonen som gav poeng * @return integer rank pos change/boolean false 404 */ public static function increase_rank_static($points_change, $up, $use_login = false, $silent = null, $points_change_rel = null, $oppdrag_name = null) { // ikke behandle hvis antall poeng ikke endres if (!$points_change) { return; } // hent ut spillerid if (!is_numeric($up) && (!is_object($up) || !$up instanceof player)) { throw new HSException("Ukjent spiller."); } if (is_numeric($up)) { $up_id = $up; $up = player::get($up_id); } else { $up_id = $up->id; } // tilhører spilleren brukeren som er logget inn? $is_login = $use_login && login::$logged_in && $up_id == login::$user->player->id; // hent helt fersk spillerinfo $result = \Kofradia\DB::get()->query("\n\t\t\tSELECT up_name, up_access_level, up_points, upr_rank_pos\n\t\t\tFROM users_players\n\t\t\t\tLEFT JOIN users_players_rank ON upr_up_id = up_id\n\t\t\tWHERE up_id = {$up_id}"); $row = $result->fetch(); // sett opp info $points_change_rel = $points_change_rel === null ? $points_change : (int) $points_change_rel; $access_level = $row['up_access_level']; $points = $row['up_points']; $points_after = $points + $points_change; $points_after_rel = $points + $points_change_rel; $rank_pos = $row['upr_rank_pos']; $name = $row['up_name']; $pos_change = 0; $extra = ""; // må ranklista oppdateres? if ($rank_pos === null) { ranklist::flush(); // hent oppdatert plassering $result = \Kofradia\DB::get()->query("SELECT upr_rank_pos FROM users_players_rank WHERE upr_up_id = {$up_id}"); $row = $result->fetch(); // har fortsatt ikke plassering? if (!$row) { throw new HSException("Klarer ikke å finne korrekt rankplassering."); } } // ranken vi har nå $rank = game::rank_info($points); $rank_num_now = $rank['number']; // ranken vi kommer til å være på etter endring $rank_after = game::rank_info($points_after); $rank_num_after = $rank_after['number']; $invisible = $access_level >= ess::$g['access_noplay'] || $access_level == 0; // positiv forandring if ($points_change > 0) { // hent ny rankplassering $result = \Kofradia\DB::get()->query("\n\t\t\t\tSELECT MIN(upr_rank_pos)\n\t\t\t\tFROM users_players_rank\n\t\t\t\tWHERE upr_up_points > {$points} AND upr_up_points <= {$points_after} AND upr_up_access_level != 0 AND upr_up_access_level < " . ess::$g['access_noplay']); // endre rankplassering? $pos = $result->fetchColumn(0); if ($pos !== NULL) { #$extra = ", up_rank_pos = $pos"; $pos_change = $rank_pos - $pos; if ($up) { $up->data['upr_rank_pos'] -= $pos_change; } } // oppdater brukeren \Kofradia\DB::get()->exec("UPDATE users_players SET up_points = up_points + {$points_change}, up_points_rel = up_points_rel + {$points_change_rel}{$extra} WHERE up_id = {$up_id}"); // oppdater ranklisten \Kofradia\DB::get()->exec("UPDATE users_players_rank SET upr_up_points = upr_up_points + {$points_change} WHERE upr_up_id = {$up_id}"); // oppdater rankplasseringen til de vi går forbi #if (!$invisible) \Kofradia\DB::get()->exec("UPDATE users_players SET up_rank_pos = up_rank_pos + 1 WHERE up_points >= $points AND up_points < $points_after"); ranklist::update(); } elseif ($points_change < 0) { // hent ny rankplassering $result = \Kofradia\DB::get()->query("\n\t\t\t\tSELECT MAX(upr_rank_pos)\n\t\t\t\tFROM users_players_rank\n\t\t\t\tWHERE upr_up_points < {$points} AND upr_up_points > {$points_after} AND upr_up_access_level != 0 AND upr_up_access_level < " . ess::$g['access_noplay']); // endre rankplassering? $pos = $result->fetchColumn(0); if ($pos !== NULL) { $pos++; #$extra = ", up_rank_pos = $pos"; $pos_change = $rank_pos - $pos; if ($up) { $up->data['upr_rank_pos'] -= $pos_change; } } // oppdater brukeren \Kofradia\DB::get()->exec("UPDATE users_players SET up_points = up_points + {$points_change}, up_points_rel = up_points_rel + {$points_change_rel}{$extra} WHERE up_id = {$up_id}"); // oppdater ranklisten \Kofradia\DB::get()->exec("UPDATE users_players_rank SET upr_up_points = upr_up_points + {$points_change} WHERE upr_up_id = {$up_id}"); // oppdater rankplasseringen til de vi går forbi #if (!$invisible) \Kofradia\DB::get()->exec("UPDATE users_players SET up_rank_pos = GREATEST(1, up_rank_pos - 1) WHERE up_points < $points AND up_points >= $points_after"); ranklist::update(); } // oppdater info knyttet til users_hits og sessions if ($is_login) { \Kofradia\DB::get()->exec("UPDATE users_hits SET uhi_points = uhi_points + {$points_change} WHERE uhi_up_id = {$up_id} AND uhi_secs_hour = " . login::$info['secs_hour']); \Kofradia\DB::get()->exec("UPDATE sessions SET ses_points = ses_points + {$points_change} WHERE ses_id = " . login::$info['ses_id']); } // logg putlog("SPAMLOG", "%c6%bRANKPOENG:%b%c %u{$name}%u skaffet %b%u{$points_change}%u%b rankpoeng ({$_SERVER['REQUEST_URI']}) ({$_SERVER['REQUEST_METHOD']})"); // økning? if ($rank_num_after > $rank_num_now) { for ($i = $rank_num_now + 1; $i <= $rank_num_after && $i <= count(game::$ranks['items']); $i++) { $rank_name = game::$ranks['items_number'][$i]['name']; // forfremmet self::add_log_static("forfremmelse", $rank_name, 0, $up_id); // mirc msg if (!$silent) { // live-feed if ($i >= 6) { livefeed::add_row('<user id="' . $up_id . '" /> ble forfremmet til ' . htmlspecialchars($rank_name) . '.'); } $type = $i >= 6 ? "INFO" : "SPAM"; putlog($type, "%bFORFREMMELSE:%b %u{$name}%u ble forfremmet til %b{$rank_name}%b!"); } } } elseif ($rank_num_after < $rank_num_now) { for ($i = $rank_num_now - 1; $i >= $rank_num_after && $i > 0; $i--) { $rank_name = game::$ranks['items_number'][$i]['name']; // nedgradert self::add_log_static("nedgradering", $rank_name, 0, $up_id); // mirc msg if (!$silent) { // live-feed if ($i >= 6) { livefeed::add_row('<user id="' . $up_id . '" /> ble nedgradert til ' . htmlspecialchars($rank_name) . '.'); } putlog("INFO", "%bNEDGRADERING:%b %u{$name}%u ble nedgradert til %b{$rank_name}%b!"); } } } // sett ny helse og energi if ($rank_num_after != $rank_num_now) { \Kofradia\DB::get()->exec("\n\t\t\t\tUPDATE users_players\n\t\t\t\tSET\n\t\t\t\t\tup_health = ROUND(up_health * ({$rank_after['rank_max_health']} / up_health_max)), up_health_max = {$rank_after['rank_max_health']},\n\t\t\t\t\tup_energy = ROUND(up_energy * ({$rank_after['rank_max_energy']} / up_energy_max)), up_energy_max = {$rank_after['rank_max_energy']}\n\t\t\t\tWHERE up_id = {$up_id}"); } // sjekke oppdrag? // kontroller spiller if ($up) { // nullstill rankobjekt unset($up->rank); // sett ny helse og energi if ($rank_num_after != $rank_num_now) { $up->data['up_health'] = round($up->data['up_health'] * ($rank_after['rank_max_health'] / $up->data['up_health_max'])); $up->data['up_health_max'] = $rank_after['rank_max_health']; $up->data['up_energy'] = round($up->data['up_energy'] * ($rank_after['rank_max_energy'] / $up->data['up_energy_max'])); $up->data['up_energy_max'] = $rank_after['rank_max_energy']; } // oppdater rankpoeng $up->data['up_points'] += $points_change; $up->data['up_points_rel'] += $points_change_rel; // fyr av trigger $up->trigger("rank_points", array("source" => $oppdrag_name, "points" => $points_change, "points_rel" => $points_change_rel, "points_after" => $points_after, "points_after_rel" => $points_after_rel, "rank" => $rank_num_after - $rank_num_now, "pos" => $pos_change)); } // har vi endret plass når vi er i top 100 lista? if (($rank_pos <= 10 || $pos <= 10) && $pos_change != 0 && !$silent) { if ($pos_change < 0) { putlog("INFO", "%bRANKNUMMER:%b %u{$name}%u falt tilbake %b" . abs($pos_change) . "%b plass" . ($pos_change != -1 ? 'er' : '') . " til %b{$pos}.%b plass.."); // live-feed livefeed::add_row('<user id="' . $up_id . '" /> falt tilbake <b>' . abs($pos_change) . '</b> plass' . ($pos_change != -1 ? 'er' : '') . ' til <b>' . $pos . '</b> plass.'); } else { putlog("INFO", "%bRANKNUMMER:%b %u{$name}%u avanserte %b" . $pos_change . "%b plass" . ($pos_change != 1 ? 'er' : '') . " til %b{$pos}.%b plass!"); // live-feed livefeed::add_row('<user id="' . $up_id . '" /> avanserte <b>' . abs($pos_change) . '</b> plass' . ($pos_change != 1 ? 'er' : '') . ' til <b>' . $pos . '</b>. plass.'); } } return $pos_change; }