public function topValue(array $params) { $data = KillModel::find()->sort(array("totalISKValue" => -1))->limit(12); $items = array(); foreach ($data as $item) { $items[] = $item; } return $this->render("top/iskvalue.html", array("data" => $items)); }
/** * Experimental task to enable kill processing from queue. * @param array $options */ public function stomp_process_queue(array $options) { $this->cli->header("Starting Stomp Import"); $reg = Registry::getInstance(); $log = $reg->getLogger(); $stompcfg = $reg->stomp; if (is_null($stompcfg) || !is_array($stompcfg)) { $this->cli->error("stomp is not configured, see config.php for details"); $log->critical("stomp not configured, exiting"); return; } $stomp = new \Stomp($stompcfg['url'], $stompcfg['user'], $stompcfg['passwd']); // destination has the destination topic (for example /topic/kills) $destination = $reg->stomp['destination_read']; // we subscribe with additional parameters $stomp->subscribe($destination, array("id" => $reg->stomp['dsub_id'], "persistent" => "true", "ack" => "client", "prefetch-count" => 1)); while (true) { try { if (!$stomp->hasFrame()) { continue; } $frame = $stomp->readFrame(); if ($frame) { $log->debug("received frame with message-id: " . $frame->headers['message-id']); $killdata = json_decode($frame->body, true); $existing = Kill::getByKillId($killdata["killID"]); if (!is_null($existing)) { $log->debug($frame->headers['message-id'] . '::' . $killdata["killID"] . " kill by killID exists"); $stomp->ack($frame); continue; } try { $apiParser = new EveAPI(); $apiParser->parseKill($killdata); $log->debug($frame->headers['message-id'] . '::' . $killdata["killID"] . " saved"); $stomp->ack($frame); } catch (\Exception $e) { $log->error($frame->headers['message-id'] . "could not be saved, exception: " . $e->getMessage()); } } } catch (\StompException $e) { $log->error("there was some kind of error with stomp: " . $e->getMessage()); $log->info("going to sleep for 10, retrying then"); // we have a stomp exception here most likely that means that the server died. // so we are going to sleep for a bit and retry sleep(10); // replace stomp connection by new one // @todo: check if that might cause open connections not to close over time unset($stomp); $stomp = new \Stomp($stompcfg['url'], $stompcfg['user'], $stompcfg['passwd']); $stomp->subscribe($destination, array("id" => $reg->stomp['dsub_id'], "persistent" => "true", "ack" => "client", "prefetch-count" => 1)); $log->info("stomp process retrying"); } } }
public function victims(array $parameters) { $term = $_GET['term']; // at least 4 characters here or that will get quite slow if (strlen($term) < 4) { echo json_encode(array()); return; } $result = \Kingboard\Model\Kill::find(array('victim.characterName' => new \MongoRegex('/^' . $term . '.*/i')), array('victim.characterName' => 1))->limit(50); $names = array(); foreach ($result as $res) { $names[$res['victim']['characterName']] = true; } $names = array_keys($names); echo json_encode($names); }
private static function findKills(BattleSettings $battleSetting) { return \Kingboard\Model\Kill::find(array("killTime" => array('$gt' => $battleSetting->startdate, '$lt' => $battleSetting->enddate), "location.solarSystem" => $battleSetting->system, '$or' => array(array("involvedCharacters" => array('$in' => array_merge(array_keys($battleSetting->positives), array((int) $battleSetting->ownerCorporation)))), array("involvedCorporations" => array('$in' => array_merge(array_keys($battleSetting->positives), array((int) $battleSetting->ownerCorporation)))), array("involvedAlliances" => array('$in' => array_merge(array_keys($battleSetting->positives), array((int) $battleSetting->ownerCorporation)))), array("involvedFactions" => array('$in' => array_merge(array_keys($battleSetting->positives), array((int) $battleSetting->ownerCorporation)))))), array("killID" => 1, "solarSystemID" => 1, "killTime" => 1, "moonID" => 1, "victim" => 1, "location" => 1)); }
public function index(array $params) { $context = array(); if (!isset($params['date'])) { $context["date"] = date("Y-m-d"); } else { $context["date"] = $params['date']; } // get previous day $dt = new DateTime($context['date']); $context["previousDate"] = date("Y-m-d", $dt->sub(new \DateInterval("P1D"))->getTimestamp()); $dt = new DateTime($context['date']); $ts = $dt->add(new \DateInterval("P1D"))->getTimestamp(); if ($ts < time()) { $context["nextDate"] = date("Y-m-d", $ts); } else { $context["nextDate"] = date("Y-m-d"); } if (!isset($params['page']) || empty($params['page'])) { $page = 1; } else { $page = (int) $params['page']; } // reset date $dt = new DateTime($context['date']); $mdt = new MongoDate($dt->getTimestamp()); if ($this->_context['ownerID']) { $stats = KillsByDayByEntity::findOne($dt->getTimestamp(), $this->_context['ownerID']); } else { $stats = KillsByDay::findOne($mdt); } $context['stats'] = $stats['value']; $paginator = new Paginator($page, $context['stats']['total']); $context['page'] = $paginator->getNavArray(); // reset date $dt = new DateTime($context['date']); if ($this->_context['ownerID']) { switch ($this->_context['ownerType']) { case "alliance": $involvedType = "involvedAlliances"; break; case "faction": $involvedType = "involvedFactions"; break; case "corp": case "corporation": $involvedType = "involvedCorporations"; break; case "char": case "character": case "pilot": $involvedType = "involvedCharacters"; break; default: throw new \Exception("Configuration has set unknown ownerType!"); return; } $kills = KillModel::find(array('$and' => array(array("killTime" => array('$gt' => new MongoDate($dt->getTimestamp()))), array("killTime" => array('$lt' => new MongoDate($dt->add(new \DateInterval("P1D"))->getTimestamp()))), array($involvedType => $this->_context['ownerID']))))->hint(array("killTime" => 1))->sort(array("killTime" => -1))->skip($paginator->getSkip())->limit(10); } else { $kills = KillModel::find(array('$and' => array(array("killTime" => array('$gt' => new MongoDate($dt->getTimestamp()))), array("killTime" => array('$lt' => new MongoDate($dt->add(new \DateInterval("P1D"))->getTimestamp()))))))->hint(array("killTime" => 1))->sort(array("killTime" => -1))->skip($paginator->getSkip())->limit(10); } $context['kills'] = $kills; $context['action'] = "/day/" . $context['date']; $dt = new DateTime($context['date']); $criteria = array('$and' => array(array("startdate" => array('$gt' => new MongoDate($dt->getTimestamp() - 1))), array("startdate" => array('$lt' => new MongoDate($dt->add(new \DateInterval("P1D"))->getTimestamp()))))); if ($this->_context['ownerID']) { $criteria['$or'] = array(array("ownerCharacter" => $this->_context['ownerID']), array("ownerCorporation" => $this->_context['ownerID']), array("ownerAlliance" => $this->_context['ownerID']), array("ownerFaction" => $this->_context['ownerID'])); } $battles = BattleSettings::find($criteria); // resolve collection to avoid count() of doom $context["battles"] = array(); foreach ($battles as $battle) { $context["battles"][] = $battle->toArray(); } $this->render("date/daily.html", $context); }
/** * get kills for the criteria this list obeys * @param int $skip * @param int $killsPerPage * @return \King23\Mongo\MongoResult */ public function getKills($skip, $killsPerPage) { return \Kingboard\Model\Kill::find($this->criteria)->sort(array('killTime' => -1))->skip($skip)->limit($killsPerPage); }
/** * parse an kill array, add all necessary data and safe * @param array $kill * @throws \Exception * @return bool */ public function parseKill($kill) { $qtyDropped = 0; $qtyDestroyed = 0; $valueDropped = 0; $valueDestroyed = 0; // this needs to be run before exit of loop, otherwise having all kills of this run // will cause the lastID not being updated if (!isset($kill['killID']) || is_null($kill['killID']) || $kill['killID'] < 1) { throw new \Exception("no valid killID set"); } $killdata = $kill; // the kill needs some additional data // convert killID to int $killdata['killID'] = (int) $killdata['killID']; // location data $killdata['location'] = array("solarSystem" => EveSolarSystem::getBySolarSystemId($kill['solarSystemID'])->itemName, "security" => EveSolarSystem::getBySolarSystemId($kill['solarSystemID'])->security, "region" => EveSolarSystem::getBySolarSystemId($kill['solarSystemID'])->Region['itemName']); // killtime conversion to Mongo $killdata['killTime'] = new \MongoDate(strtotime($kill['killTime'])); // victim conversions / additional data $killdata['victim']['characterID'] = (int) $this->ensureEveEntityID($kill['victim']['characterID'], $kill['victim']['characterName']); $killdata['victim']['corporationID'] = (int) $this->ensureEveEntityID($kill['victim']['corporationID'], $kill['victim']['corporationName']); $killdata['victim']['allianceID'] = (int) $kill['victim']['allianceID']; $killdata['victim']['factionID'] = (int) $kill['victim']['factionID']; $killdata['victim']['shipTpyeID'] = (int) $kill['victim']['shipTypeID']; $killdata['victim']['shipType'] = EveItem::getByItemId($kill['victim']['shipTypeID'])->typeName; $killdata['victim']['iskValue'] = EveITem::getItemValue($kill['victim']['shipTypeID']); // add victim to involveds $involvedCharacters = array((int) $killdata["victim"]["characterID"]); $involvedCorporations = array((int) $killdata["victim"]["corporationID"]); if ($killdata['victim']['allianceID'] > 0) { $involvedAlliances = array((int) $killdata["victim"]["allianceID"]); } else { $involvedAlliances = array(); } if ($killdata['victim']['factionID'] > 0) { $involvedFactions = array((int) $killdata["victim"]["factionID"]); } else { $involvedFactions = array(); } // Karbos ISK Value $totalISKValue = EveItem::getItemValue($kill['victim']['shipTypeID']); foreach ($kill['attackers'] as $id => $attacker) { $killdata['attackers'][$id]['characterID'] = (int) $this->ensureEveEntityId($attacker['characterID'], $attacker['characterName']); $killdata['attackers'][$id]['corporationID'] = (int) $this->ensureEveEntityID($attacker['corporationID'], $attacker['corporationName']); $killdata['attackers'][$id]['allianceID'] = (int) $attacker['allianceID']; $killdata['attackers'][$id]['factionID'] = (int) $attacker['factionID']; $killdata['attackers'][$id]['weaponTypeID'] = (int) $attacker['weaponTypeID']; $killdata['attackers'][$id]['weaponType'] = EveItem::getByItemId($attacker['weaponTypeID'])->typeName; $killdata['attackers'][$id]['shipTypeID'] = (int) $attacker['shipTypeID']; $killdata['attackers'][$id]['shipType'] = EveItem::getByItemId($attacker['shipTypeID'])->typeName; // add involveds if (!in_array($attacker['characterID'], $involvedCharacters) && $attacker['characterID'] > 0) { $involvedCharacters[] = (int) $attacker['characterID']; } if (!in_array($attacker['corporationID'], $involvedCorporations) && $attacker['corporationID'] > 0) { $involvedCorporations[] = (int) $attacker['corporationID']; } if (!in_array($attacker['allianceID'], $involvedAlliances) && $attacker['allianceID'] > 0) { $involvedAlliances[] = (int) $attacker['allianceID']; } if (!in_array($attacker['factionID'], $involvedFactions) && $attacker['factionID'] > 0) { $involvedFactions[] = (int) $attacker['factionID']; } } if (@(!is_null($kill['items']))) { foreach ($kill['items'] as $id => $item) { $item = $this->parseItem($item); $killdata['items'][$id] = $item; $totalISKValue += $item["iskValue"]; $qtyDropped += $item["qtyDropped"]; $valueDropped += $item["iskValue"]; $qtyDestroyed += $item["qtyDestroyed"]; $valueDestroyed += $item["iskValue"]; } } $killdata["involvedCorporations"] = $involvedCorporations; $killdata["involvedAlliances"] = $involvedAlliances; $killdata["involvedCharacters"] = $involvedCharacters; $killdata["involvedFactions"] = $involvedFactions; $killdata['totalISKValue'] = $totalISKValue; $killdata['totalDropped'] = $qtyDropped; $killdata['totalDestroyed'] = $qtyDestroyed; $killdata['totalISKDropped'] = $valueDropped; $killdata['totalISKDestroyed'] = $valueDestroyed; if (is_null(Kill::getByKillId($killdata['killID']))) { $killObject = new Kill(); $killObject->injectDataFromMail($killdata); $killObject->save(); return true; } else { return false; } }
public function json($request) { $kill = \Kingboard\Model\Kill::getByKillId($request['killID']); echo json_encode($kill->toArray()); }