1: <?php
2:
3: namespace Budabot\Core;
4:
5: use stdClass;
6:
7: 8: 9: 10: 11: 12:
13: class PlayerManager {
14:
15: public $db;
16:
17:
18: public $util;
19:
20:
21: public $chatBot;
22:
23:
24: public $http;
25:
26: public function getByName($name, $rk_num = 0, $forceUpdate = false) {
27: if ($rk_num == 0) {
28: $rk_num = $this->chatBot->vars['dimension'];
29: }
30:
31: $name = ucfirst(strtolower($name));
32:
33: $charid = '';
34: if ($rk_num == $this->chatBot->vars['dimension']) {
35: $charid = $this->chatBot->get_uid($name);
36: if ($charid == null) {
37: return null;
38: }
39: }
40:
41: $player = $this->findInDb($name, $rk_num);
42:
43: if ($player === null || $forceUpdate) {
44: $player = $this->lookup($name, $rk_num);
45: if ($player !== null) {
46: $player->charid = $charid;
47: $this->update($player);
48: }
49: } else if ($player->last_update < (time() - 86400)) {
50: $player2 = $this->lookup($name, $rk_num);
51: if ($player2 !== null) {
52: $player = $player2;
53: $player->charid = $charid;
54: $this->update($player);
55: } else {
56: $player->source .= ' (old-cache)';
57: }
58: } else {
59: $player->source .= ' (current-cache)';
60: }
61:
62: return $player;
63: }
64:
65: public function findInDb($name, $rk_num) {
66: $sql = "SELECT * FROM players WHERE name LIKE ? AND dimension = ? LIMIT 1";
67: return $this->db->queryRow($sql, $name, $rk_num);
68: }
69:
70: public function lookup($name, $rk_num) {
71: $obj = $this->lookupUrl("http://people.anarchy-online.com/character/bio/d/$rk_num/name/$name/bio.xml?data_type=json");
72: if ($obj->name == $name) {
73: $obj->source = 'people.anarchy-online.com';
74: $obj->dimension = $rk_num;
75: return $obj;
76: }
77:
78: return null;
79: }
80:
81: private function lookupUrl($url) {
82: $response = $this->http->get($url)->waitAndReturnResponse();
83: list($char, $org, $lastUpdated) = json_decode($response->body);
84:
85: $obj = new stdClass;
86:
87:
88: $obj->firstname = trim($char->FIRSTNAME);
89: $obj->name = $char->NAME;
90: $obj->lastname = trim($char->LASTNAME);
91: $obj->level = $char->LEVELX;
92: $obj->breed = $char->BREED;
93: $obj->gender = $char->SEX;
94: $obj->faction = $char->SIDE;
95: $obj->profession = $char->PROF;
96: $obj->prof_title = $char->PROFNAME;
97: $obj->ai_rank = $char->RANK_name;
98: $obj->ai_level = $char->ALIENLEVEL;
99: $obj->guild_id = $org->ORG_INSTANCE;
100: $obj->guild = $org->NAME;
101: $obj->guild_rank = $org->RANK_TITLE;
102: $obj->guild_rank_id = $org->RANK;
103:
104: $obj->head_id = $char->HEADID;
105: $obj->pvp_rating = $char->PVPRATING;
106: $obj->pvp_title = $char->PVPTITLE;
107:
108:
109: $obj->dimension = $char->CHAR_DIMENSION;
110:
111: forEach ($obj as $key => $value) {
112: if (is_null($value)) {
113: $obj->$key = "";
114: }
115: }
116:
117: return $obj;
118: }
119:
120: public function update($char) {
121: $sql = "DELETE FROM players WHERE `name` = ? AND `dimension` = ?";
122: $this->db->exec($sql, $char->name, $char->dimension);
123:
124: if (empty($char->guild_id)) {
125: $char->guild_id = 0;
126: }
127:
128: if ($char->guild_rank_id === '') {
129: $char->guild_rank_id = -1;
130: }
131:
132: $sql = "
133: INSERT INTO players (
134: `charid`,
135: `firstname`,
136: `name`,
137: `lastname`,
138: `level`,
139: `breed`,
140: `gender`,
141: `faction`,
142: `profession`,
143: `prof_title`,
144: `ai_rank`,
145: `ai_level`,
146: `guild_id`,
147: `guild`,
148: `guild_rank`,
149: `guild_rank_id`,
150: `dimension`,
151: `head_id`,
152: `pvp_rating`,
153: `pvp_title`,
154: `source`,
155: `last_update`
156: ) VALUES (
157: ?,
158: ?,
159: ?,
160: ?,
161: ?,
162: ?,
163: ?,
164: ?,
165: ?,
166: ?,
167: ?,
168: ?,
169: ?,
170: ?,
171: ?,
172: ?,
173: ?,
174: ?,
175: ?,
176: ?,
177: ?,
178: ?
179: )";
180:
181: $this->db->exec($sql, $char->charid, $char->firstname, $char->name, $char->lastname, $char->level, $char->breed, $char->gender, $char->faction,
182: $char->profession, $char->prof_title, $char->ai_rank, $char->ai_level, $char->guild_id, $char->guild, $char->guild_rank, $char->guild_rank_id,
183: $char->dimension, $char->head_id, $char->pvp_rating, $char->pvp_title, $char->source, time());
184: }
185:
186: public function getInfo($whois, $showFirstAndLastName = true) {
187: $msg = '';
188:
189: if ($showFirstAndLastName && $whois->firstname) {
190: $msg = $whois->firstname . " ";
191: }
192:
193: $msg .= "<highlight>\"{$whois->name}\"<end> ";
194:
195: if ($showFirstAndLastName && $whois->lastname) {
196: $msg .= $whois->lastname . " ";
197: }
198:
199: $msg .= "(<highlight>{$whois->level}<end>/<green>{$whois->ai_level}<end>";
200: $msg .= ", {$whois->gender} {$whois->breed} <highlight>{$whois->profession}<end>";
201: $msg .= ", <" . strtolower($whois->faction) . ">$whois->faction<end>";
202:
203: if ($whois->guild) {
204: $msg .= ", {$whois->guild_rank} of <highlight>{$whois->guild}<end>)";
205: } else {
206: $msg .= ", Not in a guild)";
207: }
208:
209: return $msg;
210: }
211:
212: public function searchForPlayers($search, $rkNum = null) {
213: $searchTerms = explode(' ', $search);
214: list($query, $params) = $this->util->generateQueryFromParams($searchTerms, 'name');
215:
216: if ($rkNum == null) {
217: $sql = "SELECT * FROM players WHERE $query ORDER BY name ASC LIMIT 100";
218: return $this->db->query($sql, $params);
219: } else {
220: $sql = "SELECT * FROM players WHERE $query AND dimension = ? ORDER BY name ASC LIMIT 100";
221: $params []= $rkNum;
222:
223: return $this->db->query($sql, $params);
224: }
225: }
226: }
227: