PageRenderTime 41ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/library/Server.php

https://github.com/liquidhot/md-master-server
PHP | 485 lines | 374 code | 89 blank | 22 comment | 28 complexity | 763b9b39c7420dfb4c048b8d5d514e52 MD5 | raw file
  1. <?php
  2. require_once "Utility.php";
  3. class Server {
  4. //Static Functions
  5. public static function updateServer(Server $server) {
  6. if(Server::getServerByPrivateKey($server->getPrivateKey()) === null) {
  7. return Server::createServer($server);
  8. }
  9. //Grab connection object
  10. $mysqli = Utility::getSQLConnection();
  11. $sql = "UPDATE servers SET ";
  12. $sql .= "address = ?, port = ?, version = ?, name = ?, key_hash = ?, max_clients = ?, ";
  13. $sql .= "public = ?, password_protected = ?, allow_guests = ?, user_count = ?, ";
  14. $sql .= "user_list = ?, motd = ?, game_mode = ?, last_heartbeat_date = NOW() ";
  15. $sql .= "WHERE private_key = ?";
  16. $stmt = $mysqli->prepare($sql);
  17. if ($mysqli->errno) {
  18. trigger_error($mysqli->error,E_USER_ERROR);
  19. }
  20. //Bind parameters
  21. $stmt->bind_param("sissssississss",
  22. $server->getAddress(),
  23. $server->getPort(),
  24. $server->getVersion(),
  25. $server->getName(),
  26. $server->getPublicKey(),
  27. $server->getMaxClients(),
  28. $server->getPublic(),
  29. $server->getPasswordProtected(),
  30. $server->getAllowGuests(),
  31. $server->getUserCount(),
  32. $server->getUserList(),
  33. $server->getMotd(),
  34. $server->getGameMode(),
  35. $server->getPrivateKey());
  36. //Execute statement
  37. $stmt->execute();
  38. if ($mysqli->errno) {
  39. trigger_error($mysqli->error,E_USER_ERROR);
  40. }
  41. $stmt->close();
  42. unset($stmt);
  43. return "Server updated succesfully.\nserver=" . $server->getPublicKey();
  44. }
  45. //Note: this is private.
  46. private static function createServer(Server $server) {
  47. //Grab connection object
  48. $mysqli = Utility::getSQLConnection();
  49. $sql = "INSERT INTO servers(";
  50. $sql .= "address, port, version, name, private_key, key_hash, max_clients, public, password_protected, ";
  51. $sql .= "allow_guests, user_count, user_list, motd, game_mode, last_heartbeat_date";
  52. $sql .= ") VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())";
  53. $stmt = $mysqli->prepare($sql);
  54. if ($mysqli->errno) {
  55. trigger_error($mysqli->error,E_USER_ERROR);
  56. }
  57. //Bind parameters
  58. $stmt->bind_param("sissssisssisss",
  59. $server->getAddress(),
  60. $server->getPort(),
  61. $server->getVersion(),
  62. $server->getName(),
  63. $server->getPrivateKey(),
  64. $server->getPublicKey(),
  65. $server->getMaxClients(),
  66. $server->getPublic(),
  67. $server->getPasswordProtected(),
  68. $server->getAllowGuests(),
  69. $server->getUserCount(),
  70. $server->getUserList(),
  71. $server->getMotd(),
  72. $server->getGameMode());
  73. //Execute statement
  74. $stmt->execute();
  75. if ($mysqli->errno) {
  76. trigger_error($mysqli->error,E_USER_ERROR);
  77. }
  78. $stmt->close();
  79. unset($stmt);
  80. return "Server added successfully.\nserver=" . $server->getPublicKey();
  81. }
  82. public static function getServerByPublicKey($keyHash) {
  83. $server = new Server();
  84. //Grab connection object
  85. $mysqli = Utility::getSQLConnection();
  86. $sql = "SELECT server_id, address, port, version, name, private_key, key_hash, ";
  87. $sql .= "max_clients, public, password_protected, allow_guests, user_count, ";
  88. $sql .= "user_list, motd, game_mode, last_heartbeat_date, created_date ";
  89. $sql .= "FROM servers WHERE key_hash = ?";
  90. //Prepare query to find server
  91. $stmt = $mysqli->prepare($sql);
  92. if ($mysqli->errno) {
  93. trigger_error($mysqli->error,E_USER_ERROR);
  94. }
  95. $stmt->bind_param("s", $keyHash);
  96. //Run query
  97. $stmt->execute();
  98. if ($mysqli->errno) {
  99. $stmt->close();
  100. unset($stmt);
  101. trigger_error($mysqli->error,E_USER_ERROR);
  102. }
  103. $stmt->bind_result($serverId, $address, $port, $version, $name, $privateKey, $keyHash,
  104. $maxClients, $public, $passwordProtected, $allowGuests, $userCount,
  105. $userList, $motd, $gameMode, $lastHeartbeatDate, $createdDate);
  106. $result = $stmt->fetch();
  107. $stmt->close();
  108. unset($stmt);
  109. if(!$result) { //Not found or error.
  110. return null;
  111. }
  112. //Fill server object
  113. $server->setServerId($serverId);
  114. $server->setAddress($address);
  115. $server->setPort($port);
  116. $server->setVersion($version);
  117. $server->setName($name);
  118. $server->setPrivateKey($privateKey);
  119. $server->setPublicKey($keyHash);
  120. $server->setMaxClients($maxClients);
  121. $server->setPublic($public);
  122. $server->setPasswordProtected($passwordProtected);
  123. $server->setAllowGuests($allowGuests);
  124. $server->setUserCount($userCount);
  125. $server->setUserList($userList);
  126. $server->setMotd($motd);
  127. $server->setGameMode($gameMode);
  128. $server->setLastHeartbeatDate($lastHeartbeatDate);
  129. $server->setCreatedDate($createdDate);
  130. return $server;
  131. }
  132. public static function getServerByPrivateKey($privateKey) {
  133. $server = new Server();
  134. //Grab connection object
  135. $mysqli = Utility::getSQLConnection();
  136. $sql = "SELECT server_id, address, port, version, name, private_key, key_hash, ";
  137. $sql .= "max_clients, public, password_protected, allow_guests, user_count, ";
  138. $sql .= "user_list, motd, game_mode, last_heartbeat_date, created_date ";
  139. $sql .= "FROM servers WHERE private_key = ?";
  140. //Prepare query to find server
  141. $stmt = $mysqli->prepare($sql);
  142. if ($mysqli->errno) {
  143. trigger_error($mysqli->error,E_USER_ERROR);
  144. }
  145. $stmt->bind_param("s", $privateKey);
  146. //Run query
  147. $stmt->execute();
  148. if ($mysqli->errno) {
  149. $stmt->close();
  150. unset($stmt);
  151. trigger_error($mysqli->error,E_USER_ERROR);
  152. }
  153. $stmt->bind_result($serverId, $address, $port, $version, $name, $privateKey, $keyHash,
  154. $maxClients, $public, $passwordProtected, $allowGuests, $userCount,
  155. $userList, $motd, $gameMode, $lastHeartbeatDate, $createdDate);
  156. $result = $stmt->fetch();
  157. $stmt->close();
  158. unset($stmt);
  159. if(!$result) { //Not found or error.
  160. return null;
  161. }
  162. //Fill server object
  163. $server->setServerId($serverId);
  164. $server->setAddress($address);
  165. $server->setPort($port);
  166. $server->setVersion($version);
  167. $server->setName($name);
  168. $server->setPrivateKey($privateKey);
  169. $server->setPublicKey($keyHash);
  170. $server->setMaxClients($maxClients);
  171. $server->setPublic($public);
  172. $server->setPasswordProtected($passwordProtected);
  173. $server->setAllowGuests($allowGuests);
  174. $server->setUserCount($userCount);
  175. $server->setUserList($userList);
  176. $server->setMotd($motd);
  177. $server->setGameMode($gameMode);
  178. $server->setLastHeartbeatDate($lastHeartbeatDate);
  179. $server->setCreatedDate($createdDate);
  180. return $server;
  181. }
  182. public static function getServerList() {
  183. //Grab connection object
  184. $mysqli = Utility::getSQLConnection();
  185. $sql = "SELECT server_id, address, port, version, name, private_key, key_hash, ";
  186. $sql .= "max_clients, public, password_protected, allow_guests, user_count, ";
  187. $sql .= "user_list, motd, game_mode, last_heartbeat_date, created_date ";
  188. $sql .= "FROM servers ";
  189. $sql .= "WHERE last_heartbeat_date > (NOW() - INTERVAL 8 HOUR) ";
  190. $sql .= "ORDER BY last_heartbeat_date DESC";
  191. //Prepare query to find server
  192. $stmt = $mysqli->prepare($sql);
  193. if ($mysqli->errno) {
  194. trigger_error($mysqli->error,E_USER_ERROR);
  195. }
  196. //Run query
  197. $stmt->execute();
  198. if ($mysqli->errno) {
  199. $stmt->close();
  200. unset($stmt);
  201. trigger_error($mysqli->error,E_USER_ERROR);
  202. }
  203. $stmt->bind_result($serverId, $address, $port, $version, $name, $privateKey, $keyHash,
  204. $maxClients, $public, $passwordProtected, $allowGuests, $userCount,
  205. $userList, $motd, $gameMode, $lastHeartbeatDate, $createdDate);
  206. $serverList = array();
  207. while($stmt->fetch()) {
  208. $server = new Server();
  209. //Fill server object
  210. $server->setServerId($serverId);
  211. $server->setAddress($address);
  212. $server->setPort($port);
  213. $server->setVersion($version);
  214. $server->setName($name);
  215. $server->setPrivateKey($privateKey);
  216. $server->setPublicKey($keyHash);
  217. $server->setMaxClients($maxClients);
  218. $server->setPublic($public);
  219. $server->setPasswordProtected($passwordProtected);
  220. $server->setAllowGuests($allowGuests);
  221. $server->setUserCount($userCount);
  222. $server->setUserList($userList);
  223. $server->setMotd($motd);
  224. $server->setGameMode($gameMode);
  225. $server->setLastHeartbeatDate($lastHeartbeatDate);
  226. $server->setCreatedDate($createdDate);
  227. $serverList[] = $server;
  228. }
  229. $stmt->close();
  230. unset($stmt);
  231. return $serverList;
  232. }
  233. //Internal Data
  234. private $serverId;
  235. private $address;
  236. private $port;
  237. private $version;
  238. private $name;
  239. private $privateKey;
  240. private $keyHash;
  241. private $maxClients;
  242. private $public;
  243. private $passwordProtected;
  244. private $allowGuests;
  245. private $userCount;
  246. private $userList;
  247. private $motd;
  248. private $gameMode;
  249. private $createdDate;
  250. private $lastHeartbeatDate;
  251. //Getters/Setters
  252. public function getServerId(){
  253. return $this->serverId;
  254. }
  255. public function setServerId($serverId){
  256. $this->serverId = $serverId;
  257. }
  258. public function getAddress(){
  259. return $this->address;
  260. }
  261. public function setAddress($address){
  262. if(strlen($address) > 1024) {
  263. throw new Exception("Error: Server address length exceeded. (Max 1024)");
  264. }
  265. $this->address = $address;
  266. }
  267. public function getPort(){
  268. return $this->port;
  269. }
  270. public function setPort($port){
  271. $port = intval($port);
  272. if($port > 65535 || $port < 0) {
  273. throw new Exception("Error: Port number out of range.");
  274. }
  275. $this->port = $port;
  276. }
  277. public function getVersion(){
  278. return $this->version;
  279. }
  280. public function setVersion($version){
  281. if(strlen($version) > 32) {
  282. throw new Exception("Error: Version length exceeded. (Max 32)");
  283. }
  284. $this->version = $version;
  285. }
  286. public function getName(){
  287. return $this->name;
  288. }
  289. public function setName($name){
  290. if(strlen($name) > 1024) {
  291. $name = substr($name, 0, 1024);
  292. }
  293. $this->name = $name;
  294. }
  295. public function getPrivateKey(){
  296. return $this->privateKey;
  297. }
  298. public function setPrivateKey($privateKey){
  299. if(strlen($privateKey) > 32) {
  300. throw new Exception("Error: Private key length exceeded. (Max 32)");
  301. }
  302. $this->keyHash = md5($privateKey . Config::webServerHash);
  303. $this->privateKey = $privateKey;
  304. }
  305. public function getPublicKey(){
  306. return $this->keyHash;
  307. }
  308. public function setPublicKey($keyHash){
  309. if(strlen($keyHash) > 32) {
  310. throw new Exception("Error: Public key length exceeded. (Max 32)");
  311. }
  312. $this->keyHash = $keyHash;
  313. }
  314. public function getMaxClients(){
  315. return $this->maxClients;
  316. }
  317. public function setMaxClients($maxClients){
  318. $this->maxClients = intval($maxClients);
  319. }
  320. public function getPublic(){
  321. return $this->public;
  322. }
  323. public function setPublic($public){
  324. if(strlen($public) > 5) {
  325. throw new Exception("Error: Public value length exceeded. (Max 5)");
  326. }
  327. $this->public = $public;
  328. }
  329. public function getPasswordProtected(){
  330. if(strtoupper($this->passwordProtected) === "TRUE") {
  331. return "True";
  332. } else {
  333. return "False";
  334. }
  335. }
  336. public function setPasswordProtected($passwordProtected){
  337. if(strlen($passwordProtected) > 5) {
  338. throw new Exception("Error: Password protected value length exceeded. (Max 5)");
  339. }
  340. $this->passwordProtected = $passwordProtected;
  341. }
  342. public function getAllowGuests(){
  343. return $this->allowGuests;
  344. }
  345. public function setAllowGuests($allowGuests){
  346. if(strlen($allowGuests) > 5) {
  347. throw new Exception("Error: Allow guests value length exceeded. (Max 5)");
  348. }
  349. $this->allowGuests = $allowGuests;
  350. }
  351. public function getUserCount(){
  352. return $this->userCount;
  353. }
  354. public function setUserCount($userCount){
  355. $this->userCount = intval($userCount);
  356. }
  357. public function getUserList(){
  358. return $this->userList;
  359. }
  360. public function setUserList($userList){
  361. if(strlen($userList) > 1024) {
  362. $userList = substr($userList, 0, 1024);
  363. }
  364. $this->userList = $userList;
  365. }
  366. public function getMotd(){
  367. return $this->motd;
  368. }
  369. public function setMotd($motd){
  370. if(strlen($motd) > 1024) {
  371. $motd = substr($motd, 0, 1024);
  372. }
  373. $this->motd = $motd;
  374. }
  375. public function getGameMode(){
  376. return $this->gameMode;
  377. }
  378. public function setGameMode($gameMode){
  379. if(strlen($gameMode) > 32) {
  380. $gameMode = substr($gameMode, 0, 32);
  381. }
  382. $this->gameMode = $gameMode;
  383. }
  384. public function getCreatedDate(){
  385. return $this->createdDate;
  386. }
  387. public function setCreatedDate($createdDate){
  388. $this->createdDate = $createdDate;
  389. }
  390. public function getLastHeartbeatDate(){
  391. return $this->lastHeartbeatDate;
  392. }
  393. public function setLastHeartbeatDate($lastHeartbeatDate){
  394. $this->lastHeartbeatDate = $lastHeartbeatDate;
  395. }
  396. }