PageRenderTime 50ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/php/auxiliary.php

https://bitbucket.org/obsidian/selador
PHP | 508 lines | 342 code | 102 blank | 64 comment | 56 complexity | c306c1f3517af2c53431eadc8150b9cd MD5 | raw file
Possible License(s): AGPL-3.0, LGPL-2.1
  1. <?php
  2. /* auxiliary.php - Auxiliary back-end functions that aren't used often
  3. *
  4. * Copyright (C) 2006, 2007, 2008 Kevin Read, Simone Schaefer
  5. *
  6. * This file is part of Selador, a browser-based fantasy strategy game
  7. *
  8. * This program is distributed under the terms of the GNU Affero General Public License.
  9. *
  10. *
  11. * Selador is free software: you can redistribute it and/or modify
  12. * it under the terms of the GNU Affero General Public License as published by
  13. * the Free Software Foundation, either version 3 of the License, or
  14. * any later version.
  15. *
  16. * Selador is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU Affero General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU Affero General Public License
  22. * along with Selador. If not, see <http://www.gnu.org/licenses/>.
  23. **/
  24. // Seems to work ok.
  25. function AllocResTiles ($playerid, $villageid, $x, $y)
  26. {
  27. global $world;
  28. $x -= 1; // center them
  29. $y -= 1;
  30. foreach ($world->citytilesy as $index => $cty)
  31. {
  32. $my = ($y + $cty);
  33. $mx = ($x + $world->citytilesx[$index]);
  34. /* if ($mx < 0)
  35. $mx += $world->sizex;
  36. if ($my < 0)
  37. $my += $world->sizey; */
  38. $query = "insert into tileres (villageid, x, y, uid, level, staff, time_exhaust) values (".$villageid.", ".$mx.", ".$my.", ".$playerid.", 0, 0, \"2038-01-01 00:00:00\")";
  39. // echo $query."\n";
  40. mysql_query ($query);
  41. // echo $index.", looking at ".$ctx.", ".$world->citytilesy[$index]." (".$debugmap[$ctx][$world->citytilesy[$index]].": ".((int)($map[$ctx][$world->citytilesy[$index]] / 100))."\n";
  42. }
  43. }
  44. function CleanOutUser ($uid)
  45. {
  46. global $gamedb, $authdb, $_ghost_uids, $world;
  47. $query = "insert into deleted_users_villages select uid, villageid from village where uid=".$uid;
  48. if (!($res = $gamedb->query ($query)))
  49. {
  50. log_err ("Cannot log delete attempt user villages. Query: ".$query.", ".$gamedb->error ());
  51. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  52. $gamedb->query ("rollback");
  53. return (false);
  54. }
  55. $query = "insert into deleted_users select uid, created, now() from user where uid=".$uid;
  56. if (!($res = $gamedb->query ($query)))
  57. {
  58. log_err ("Cannot log delete attempt. Query: ".$query.", ".$gamedb->error ());
  59. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  60. $gamedb->query ("rollback");
  61. return (false);
  62. }
  63. $query = "select race from user where uid=".$uid;
  64. if (!($res = $gamedb->query ($query)))
  65. {
  66. log_err ("Cannot look up race for user that should be deleted. Query: ".$query.", ".$gamedb->error ());
  67. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  68. $gamedb->query ("rollback");
  69. return (false);
  70. }
  71. else
  72. {
  73. if (!($row = mysql_fetch_array ($res)))
  74. {
  75. log_err ("User ".$uid." doesn't have an entry when deleting. Query: ".$query.", ".mysql_error ());
  76. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  77. $gamedb->query ("rollback");
  78. return (false);
  79. }
  80. else
  81. {
  82. // Now we know the race, we can select the correct ghost uid.
  83. $race = $row['race'];
  84. $ghost_uid = $_ghost_uids[$race];
  85. // Flush the cache for this guys villages
  86. $query = "select x,y,villageid from village where uid=".$uid;
  87. if (!($res = $gamedb->query ($query)))
  88. {
  89. log_err ("Cannot find coordinates for user ".$uid." when deleting him. Query: ".$query.", ".mysql_error ());
  90. $gamedb->query ("rollback");
  91. return (false);
  92. }
  93. else
  94. {
  95. if (!mysql_num_rows ($res))
  96. {
  97. log_err ("User ".$uid." has no villages when we delete him! Query: ".$query);
  98. $gamedb->query ("rollback");
  99. return (false);
  100. }
  101. else
  102. {
  103. while ($vrow = mysql_fetch_array ($res))
  104. {
  105. $world->ClearMapCache ($vrow['x'], $vrow['y']);
  106. $world->ClearLandCache ($vrow['x'], $vrow['y']);
  107. // Ok, to delete heroes we set the uid for all villages of the player to the
  108. // uid of the global "deleted" user, as well as redirect all events targeted
  109. // at this player.
  110. $query = "update village set name=\"Geisterstadt (".$vrow['x']."|".$vrow['y'].")\",uid=".$ghost_uid." where villageid=".$vrow['villageid'];
  111. if (!$gamedb->query ($query))
  112. {
  113. $delerr = "Leider ist ein Datenbank-Fehler (16) aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  114. log_err ("Cannot pass on villages while deleting user ".$query.", ".$authdb->error ());
  115. }
  116. }
  117. }
  118. // Now clear out the armies. First we delete all hero units, then
  119. // we move them over to the ghost account
  120. $query = "update troops set amount=0 where unitid=1000 and troopid in (select troopid from armies where uid=".$uid.")";
  121. if (!$gamedb->query ($query))
  122. {
  123. $delerr = "Leider ist ein Datenbank-Fehler (17) aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  124. log_err ("Cannot delete hero units while deleting user ".$gamedb->error ());
  125. $gamedb->query ("rollback");
  126. }
  127. else
  128. {
  129. // Delete all outside armies (this will also squash the empty hero army if there is one)
  130. $query = "select A.troopid from armies A where A.uid=".$uid." and A.villageid!=A.location and (A.flag=0 or A.flag=6);";
  131. if (!($res = $gamedb->query ($query)))
  132. {
  133. $delerr = "Leider ist ein Datenbank-Fehler (18) aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  134. log_err ("Cannot find outside armies while deleting user ".$gamedb->error ());
  135. $gamedb->query ("rollback");
  136. return (false);
  137. }
  138. $deltroopids = array ();
  139. // And now delete every row - ugly but I don't care just now
  140. while ($row = mysql_fetch_array ($res))
  141. {
  142. $deltroopids[] = $row['troopid'];
  143. }
  144. if (count ($deltroopids) > 0)
  145. {
  146. $query = "delete from armies where troopid in (".implode (",", $deltroopids).")";
  147. if (!$gamedb->query ($query))
  148. {
  149. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  150. log_err ("Cannot delete outside armies while deleting user ".$gamedb->error ());
  151. $gamedb->query ("rollback");
  152. return (false);
  153. }
  154. $query = "delete from troops where troopid in (".implode (",", $deltroopids).")";
  155. if (!$gamedb->query ($query))
  156. {
  157. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  158. log_err ("Cannot delete outside troops while deleting user ".$gamedb->error ());
  159. $gamedb->query ("rollback");
  160. return (false);
  161. }
  162. }
  163. $query = "update armies set uid=".$ghost_uid." where uid=".$uid;
  164. if (!$gamedb->query ($query))
  165. {
  166. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  167. log_err ("Cannot pass on armies while deleting user ".$gamedb->error ());
  168. $gamedb->query ("rollback");
  169. return (false);
  170. }
  171. else
  172. {
  173. $query = "delete from event where uid1=".$uid." and type=".RESEARCH;
  174. if (!$gamedb->query ($query))
  175. {
  176. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  177. log_err ("Cannot delete research events while deleting user ".$gamedb->error ());
  178. $gamedb->query ("rollback");
  179. }
  180. else
  181. {
  182. $query = "update event set uid1=".$ghost_uid." where uid1=".$uid;
  183. if (!$gamedb->query ($query))
  184. {
  185. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  186. log_err ("Cannot pass on own events while deleting user ".$gamedb->error ());
  187. $gamedb->query ("rollback");
  188. }
  189. else
  190. {
  191. $query = "update event set uid2=".$ghost_uid." where uid2=".$uid;
  192. if (!$gamedb->query ($query))
  193. {
  194. $delerr = "Leider ist ein Datenbank-Fehler aufgetreten. Bitte versuche es sp&auml;ter noch einmal.";
  195. log_err ("Cannot pass on foreign events while deleting user ".$gamedb->error ());
  196. $gamedb->query ("rollback");
  197. }
  198. else
  199. {
  200. $query = "delete from worlds_players where uid=".$uid." and worldname=\"".WORLDNAME."\"";
  201. if (!$authdb->query ($query))
  202. log_err ("Cannot delete player from world in deleting user. Query: ".$query.", ".$authdb->error ());
  203. $query = "delete from offers where uid=".$uid;
  204. if (!$gamedb->query ($query))
  205. log_err ("Cannot delete offers in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  206. $query = "delete from ally_blog_comments where entryId in (select entryid from ally_blog where userid=".$uid.")";
  207. if (!$gamedb->query ($query))
  208. log_err ("Cannot delete blog comment responses in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  209. $query = "delete from ally_blog where userid=".$uid."";
  210. if (!$gamedb->query ($query))
  211. log_err ("Cannot delete blog posts in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  212. $query = "delete from ally_invite where uid=".$uid."";
  213. if (!$gamedb->query ($query))
  214. log_err ("Cannot delete ally invites in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  215. $query = "update allyactions set stamp=stamp,uid1=NULL where uid1=".$uid."";
  216. if (!$gamedb->query ($query))
  217. log_err ("Cannot remove allyactions1 in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  218. $query = "update allyactions set stamp=stamp,uid2=NULL where uid2=".$uid."";
  219. if (!$gamedb->query ($query))
  220. log_err ("Cannot remove allyactions2 in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  221. $query = "delete from allymembers where uid=".$uid."";
  222. if (!$gamedb->query ($query))
  223. log_err ("Cannot delete allymembers in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  224. $query = "delete from allyperms where uid=".$uid."";
  225. if (!$gamedb->query ($query))
  226. log_err ("Cannot delete allyperms in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  227. $query = "update bat_armies set uid=".$ghost_uid." where uid=".$uid."";
  228. if (!$gamedb->query ($query))
  229. log_err ("Cannot update bat_armies in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  230. $query = "update rep_loot set value=".$ghost_uid." where value=".$uid." and coin in (4,5,6,7,8,9,10,11,60,0,1,2,3,30)";
  231. if (!$gamedb->query ($query))
  232. log_err ("Cannot update rep_loot in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  233. $query = "update reports set stamp=stamp,uid1=".$ghost_uid." where uid1=".$uid."";
  234. if (!$gamedb->query ($query))
  235. log_err ("Cannot remove battles1 in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  236. $query = "update reports set stamp=stamp,uid2=".$ghost_uid." where uid2=".$uid."";
  237. if (!$gamedb->query ($query))
  238. log_err ("Cannot remove battles2 in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  239. $query = "delete from profile where userid=".$uid."";
  240. if (!$gamedb->query ($query))
  241. log_err ("Cannot delete profile in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  242. $query = "delete from hero where uid=".$uid."";
  243. if (!$gamedb->query ($query))
  244. log_err ("Cannot delete hero in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  245. $query = "delete from user where uid=".$uid."";
  246. if (!$gamedb->query ($query))
  247. log_err ("Cannot delete user in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  248. $query = "delete from hero where uid=".$uid."";
  249. if (!$gamedb->query ($query))
  250. log_err ("Cannot delete hero in cleanoutusers. Query: ".$query.", ".$gamedb->error ());
  251. }
  252. }
  253. }
  254. }
  255. }
  256. }
  257. }
  258. }
  259. }
  260. function calculate_ranking ($db)
  261. {
  262. global $_ghost_uids;
  263. $oneweek = 24*3600*7;
  264. $twoweeks = $oneweek * 2;
  265. $query = 'update user set userstate=null,inactivity=0 where userstate<now()';
  266. $db->query ($query);
  267. $query = 'update user set score=0 where user="Geist"';
  268. $db->query ($query);
  269. $query = "select uid, score, unix_timestamp(now())-unix_timestamp(changed),inactivity from user where uid not in (".implode (",", $_ghost_uids)." ) order by score desc";
  270. if (!($res = mysql_query ($query)))
  271. echo "Cannot calculate ranking: ".$query.", ".$db->error ();
  272. $number_rows = mysql_num_rows ($res);
  273. $query = "replace into ranking values ";
  274. $prefix = "";
  275. for ($temp = 1; $temp <= $number_rows; $temp++)
  276. {
  277. $row = mysql_fetch_row($res);
  278. // echo $temp.": ".$row[0].": ".$row[1]."\n";
  279. $query .= $prefix."(".$row[0].", ".$temp.")";
  280. $prefix = ",";
  281. // Do not change the state of blocked players
  282. if ($row[3] == 3)
  283. continue;
  284. // Reactivate players that started playing again
  285. if (($row[2] < $oneweek) && ($row[3] > 0))
  286. {
  287. $re_act[] = $row[0];
  288. }
  289. else
  290. {
  291. // Mark semi-active players as semi-active
  292. if (($row[2] >= $oneweek) && ($row[3] == 0))
  293. $de_act[] = $row[0];
  294. /* else
  295. {
  296. if (($row[2] > $twoweeks) && ($row[3] < 2))
  297. $kill[] = $row[0];
  298. }*/
  299. }
  300. }
  301. if (isset ($re_act))
  302. {
  303. // echo "Wieder aktivierte:\n";
  304. $digits = log (count ($re_act), 10) + 10;
  305. /* foreach ($re_act as $idx=>$uid)
  306. echo $idx.": ".$uid."\n"; */
  307. // echo "\n";
  308. $aquery = "update user set changed=changed,inactivity=0 where uid in (".implode (",", $re_act).")";
  309. if (!mysql_query ($aquery))
  310. echo "Konnte diese Spieler nicht reaktivieren! Fehler: ".mysql_error ();
  311. // echo $query;
  312. }
  313. if (isset ($de_act))
  314. {
  315. // echo "Jetzt semi-aktive:\n";
  316. /* foreach ($de_act as $idx=>$uid)
  317. echo $idx.": ".$uid."\n"; */
  318. // echo "\n";
  319. $aquery = "update user set changed=changed,inactivity=1 where uid in (".implode (",", $de_act).")";
  320. if (!mysql_query ($aquery))
  321. echo "Konnte diese Spieler nicht semi-aktivieren! Fehler: ".mysql_error ();
  322. }
  323. if (isset ($kill))
  324. {
  325. // echo "Jetzt deaktive:\n";
  326. /* foreach ($kill as $idx=>$uid)
  327. echo $idx.": ".$uid."\n"; */
  328. // echo "\n";
  329. $aquery = "update user set changed=changed,inactivity=2 where uid in (".implode (",", $kill).")";
  330. /* if (!mysql_query ($query))
  331. echo "Konnte diese Spieler nicht deaktivieren! Fehler: ".mysql_error (); */
  332. }
  333. // echo $query;
  334. mysql_query ($query);
  335. $query = "select uid, xp from user where uid not in (".implode (",", $_ghost_uids)." ) order by xp desc";
  336. $res = mysql_query ($query);
  337. $number_rows = mysql_num_rows ($res);
  338. $query = "replace into hero_ranking values ";
  339. $prefix = "";
  340. for ($temp = 1; $temp <= $number_rows; $temp++)
  341. {
  342. $row = mysql_fetch_row($res);
  343. // echo $temp.": ".$row[0].": ".$row[1]."\n";
  344. $query .= $prefix."(".$row[0].", ".$temp.")";
  345. $prefix = ",";
  346. }
  347. mysql_query ($query);
  348. $query = "select A.aid, sum(round((B.score)/1000)) as score, count(A.uid) as players from allymembers A, user B where A.uid=B.uid group by A.aid order by score desc";
  349. $res = mysql_query ($query);
  350. $number_rows = mysql_num_rows ($res);
  351. $query = "replace into ally_ranking (aid, aranking, ascore, players) values ";
  352. $prefix = "";
  353. for ($temp = 1; $temp <= $number_rows; $temp++)
  354. {
  355. $row = mysql_fetch_row($res);
  356. $query .= $prefix."(".$row[0].", ".$temp.", ".$row[1].", ".$row[2].")";
  357. $prefix = ",";
  358. }
  359. mysql_query ($query);
  360. /**jetzt die kriegsstatistik*/
  361. // $query = "select A.aid, sum(round((B.score)/1000)) as score, count(A.uid) as players from allymembers A, user B where A.uid=B.uid group by A.aid order by score desc";
  362. $query = "select A.aid, A.score, A.lost, A.won, (A.score / (A.lost + A.won)) as average from war_stats A order by A.score desc,A.won desc, A.lost desc";//;, A.won, A.lost desc";
  363. //echo "Query ist: ".$query."\n";
  364. $res = mysql_query ($query);
  365. $number_rows = mysql_num_rows ($res);
  366. $query = "replace into war_ranking (aid, ranking, score, lost, won, average) values ";
  367. $prefix = "";
  368. for ($temp = 1; $temp <= $number_rows; $temp++)
  369. {
  370. $row = mysql_fetch_row($res);
  371. if ($row[4] == NULL)
  372. $row[4] = 0;
  373. $query .= $prefix."(".$row[0].", ".$temp.", ".$row[1].", ".$row[2].", ".$row[3].", ".$row[4].")";
  374. $prefix = ",";
  375. }
  376. //echo $query."\n";
  377. mysql_query ($query);
  378. }
  379. function CheckPasswordStrength($password)
  380. {
  381. $strength = 0;
  382. $patterns = array('#[a-z]#','#[A-Z]#','#[0-9]#','/[!"$%^&*()`{}\[\]:@~;\'#<>?,.\/\\-=_+\|]/');
  383. foreach($patterns as $pattern)
  384. {
  385. if(preg_match($pattern,$password,$matches))
  386. {
  387. $strength++;
  388. }
  389. }
  390. return $strength;
  391. // 1 - weak
  392. // 2 - not weak
  393. // 3 - acceptable
  394. // 4 - strong
  395. }
  396. ?>