PageRenderTime 56ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 1ms

/app/code/Bengine/Game/Controller/MSG.php

https://github.com/Basti-sama/Bengine
PHP | 386 lines | 297 code | 12 blank | 77 comment | 38 complexity | 231050fcdc4e454f54382c0ec7f4eb06 MD5 | raw file
  1. <?php
  2. /**
  3. * Shows messages.
  4. *
  5. * @package Bengine
  6. * @copyright Copyright protected by / Urheberrechtlich geschützt durch "Sebastian Noll" <snoll@4ym.org>
  7. * @version $Id: MSG.php 19 2011-05-27 10:30:33Z secretchampion $
  8. */
  9. class Bengine_Game_Controller_MSG extends Bengine_Game_Controller_Abstract
  10. {
  11. /**
  12. * Constructor: Displays message folders.
  13. *
  14. * @return Bengine_Game_Controller_MSG
  15. */
  16. protected function init()
  17. {
  18. Core::getLanguage()->load(array("Message"));
  19. return parent::init();
  20. }
  21. /**
  22. * Index action.
  23. *
  24. * @return Bengine_Game_Controller_MSG
  25. */
  26. protected function indexAction()
  27. {
  28. $select = array("f.folder_id", "f.label", "f.is_standard", "COUNT(m.msgid) AS messages", "SUM(m.read) AS `read`", "SUM(LENGTH(m.message)) AS `storage`");
  29. $joins = "LEFT JOIN ".PREFIX."message m ON (m.mode = f.folder_id AND m.receiver = '".Core::getUser()->get("userid")."')";
  30. $where = Core::getDB()->quoteInto("f.userid = ? OR f.is_standard = '1'", Core::getUser()->get("userid"));
  31. $result = Core::getQuery()->select("folder f", $select, $joins, $where, "", "", "f.folder_id");
  32. $folders = array();
  33. foreach($result->fetchAll() as $row)
  34. {
  35. $unreadMessages = $row["messages"] - (int) $row["read"];
  36. if($unreadMessages > 1)
  37. {
  38. $read = "UNREAD";
  39. $newMessages = sprintf(Core::getLanguage()->getItem("F_NEW_MESSAGES"), fNumber($unreadMessages));
  40. }
  41. else if($unreadMessages > 0)
  42. {
  43. $read = "UNREAD";
  44. $newMessages = Core::getLanguage()->getItem("F_NEW_MESSAGE");
  45. }
  46. else
  47. {
  48. $read = "READ";
  49. $newMessages = "";
  50. }
  51. $label = ($row["is_standard"]) ? Core::getLang()->get($row["label"]) : $row["label"];
  52. $link = "game/".SID."/MSG/ReadFolder/".$row["folder_id"];
  53. $folders[] = array(
  54. "image" => Link::get("game/".SID."/MSG/markasread/".$row["folder_id"], Image::getImage(strtolower($read).".gif", Core::getLang()->get($read))),
  55. "label" => Link::get($link, $label, Core::getLang()->get($read)),
  56. "messages" => fNumber($row["messages"]),
  57. "newMessages" => $newMessages,
  58. "size" => File::bytesToString($row["storage"]),
  59. );
  60. }
  61. $result->closeCursor();
  62. Core::getTPL()->addLoop("folders", $folders);
  63. return $this;
  64. }
  65. /**
  66. * Deletes all messages of the user.
  67. *
  68. * return Bengine_Game_Controller_MSG
  69. */
  70. protected function deleteAllAction()
  71. {
  72. Core::getQuery()->delete("message", "receiver = ?", null, null, array(Core::getUser()->get("userid")));
  73. return $this->redirect("game/".SID."/MSG");
  74. }
  75. /**
  76. * Form to send a new message.
  77. *
  78. * @param string $receiver Receiver
  79. * @param string $reply Reply subject
  80. *
  81. * @return Bengine_Game_Controller_MSG
  82. */
  83. protected function writeAction($receiver, $reply)
  84. {
  85. if($this->isPost())
  86. {
  87. $this->sendMessage($this->getParam("receiver"), $this->getParam("subject"), $this->getParam("message"));
  88. }
  89. Core::getLanguage()->load("Message");
  90. Core::getTPL()->assign("receiver", $receiver);
  91. Core::getTPL()->assign("subject", ($reply != "") ? Link::urlDecode($reply) : Core::getLanguage()->getItem("NO_SUBJECT"));
  92. Core::getTPL()->assign("maxpmlength", fNumber(Core::getOptions()->get("MAX_PM_LENGTH")));
  93. $sendAction = BASE_URL."game/".SID."/MSG/Write/".rawurlencode($receiver);
  94. if($reply != "")
  95. {
  96. $sendAction .= "/".Link::urlEncode($reply);
  97. }
  98. Core::getTPL()->assign("sendAction", $sendAction);
  99. Core::getLang()->assign("receiver", empty($receiver) ? "[".Core::getLang()->get("RECEIVER")."]" : $receiver);
  100. Core::getTPL()->assign("defaultMessageTemplate", Core::getLang()->get("WRITE_MESSAGE_TEMPLATE"));
  101. return $this;
  102. }
  103. /**
  104. * Sends a message.
  105. *
  106. * @param string $receiver Receiver name
  107. * @param string $subject Subject
  108. * @param string $message Message
  109. *
  110. * @return Bengine_Game_Controller_MSG
  111. */
  112. protected function sendMessage($receiver, $subject, $message)
  113. {
  114. $this->checkForSpam();
  115. $receiver = trim($receiver);
  116. $subject = trim($subject);
  117. $message = richText($message);
  118. $messageLength = Str::length(strip_tags($message));
  119. if($messageLength >= 3 && $messageLength <= Core::getOptions()->get("MAX_PM_LENGTH") && Str::length($subject) > 0 && Str::length($subject) < 101)
  120. {
  121. $result = Core::getQuery()->select("user", "userid", "", Core::getDB()->quoteInto("username = ?", $receiver));
  122. if($row = $result->fetchRow())
  123. {
  124. $result->closeCursor();
  125. if($row["userid"] != Core::getUser()->get("userid"))
  126. {
  127. $subject = preg_replace("#((RE|FW):\s)+#is", "\\1", $subject); // Remove excessive reply or forward notes
  128. Hook::event("SendPrivateMessage", array(&$row, $receiver, &$subject, &$message));
  129. Core::getQuery()->insert("message", array("mode" => 1, "time" => TIME, "sender" => Core::getUser()->get("userid"), "receiver" => $row["userid"], "subject" => Str::validateXHTML($subject), "message" => $message, "read" => 0));
  130. Core::getQuery()->insert("message", array("mode" => 2, "time" => TIME, "sender" => $row["userid"], "receiver" => Core::getUser()->get("userid"), "subject" => Str::validateXHTML($subject), "message" => $message, "read" => 1));
  131. $msgid = Core::getDB()->lastInsertId();
  132. if($msgid > 10000000)
  133. {
  134. $TableCleaner = new Recipe_Maintenance_TableCleaner("message", "msgid");
  135. $TableCleaner->clean();
  136. }
  137. Logger::addMessage("SENT_SUCCESSFUL", "success");
  138. }
  139. else
  140. {
  141. Core::getTPL()->assign("userError", Logger::getMessageField("SELF_MESSAGE"));
  142. }
  143. }
  144. else
  145. {
  146. $result->closeCursor();
  147. Core::getTPL()->assign("userError", Logger::getMessageField("USER_NOT_FOUND"));
  148. }
  149. }
  150. else
  151. {
  152. if($messageLength < 3) { Core::getTPL()->assign("messageError", Logger::getMessageField("MESSAGE_TOO_SHORT")); }
  153. if($messageLength > Core::getOptions()->get("MAX_PM_LENGTH")) { Core::getTPL()->assign("messageError", Logger::getMessageField("MESSAGE_TOO_LONG")); }
  154. if(Str::length($subject) == 0 || Str::length($subject) > 50) { Core::getTPL()->assign("subjectError", Logger::getMessageField("SUBJECT_TOO_SHORT")); }
  155. }
  156. return $this;
  157. }
  158. /**
  159. * Deletes messages.
  160. *
  161. * @param integer $folder Folder id
  162. * @param integer $option Mode to delete content
  163. * @param array $msgs Messages
  164. *
  165. * @return Bengine_Game_Controller_MSG
  166. */
  167. protected function deleteMessages($folder, $option, array $msgs)
  168. {
  169. $pagination = $this->getPagination($folder);
  170. $deltime = 604800;
  171. if(is_numeric(Core::getOptions()->get("DEL_MESSAGE_DAYS")) && Core::getOptions()->get("DEL_MESSAGE_DAYS") > 0)
  172. {
  173. $deltime = ((int) Core::getOptions()->get("DEL_MESSAGE_DAYS")) * 86400;
  174. }
  175. $deltime = TIME - $deltime;
  176. Core::getQuery()->delete("message", "time <= ?", null, null, array($deltime));
  177. switch($option)
  178. {
  179. case 1:
  180. foreach($msgs as $msgid)
  181. {
  182. Core::getQuery()->delete("message", "msgid = ? AND receiver = ?", null, null, array($msgid, Core::getUser()->get("userid")));
  183. }
  184. break;
  185. case 2:
  186. $where = Core::getDB()->quoteInto("receiver = ? AND mode = ?", array(Core::getUser()->get("userid"), $folder));
  187. $result = Core::getQuery()->select("message", "msgid", "", $where, "time DESC", $pagination->getStart().", ".Core::getOptions()->get("MAX_PMS"));
  188. foreach($result->fetchAll() as $row)
  189. {
  190. if(!in_array($row["msgid"], $msgs))
  191. {
  192. Core::getQuery()->delete("message", "msgid = ?", null, null, array($row["msgid"]));
  193. }
  194. }
  195. $result->closeCursor();
  196. break;
  197. case 3:
  198. $where = Core::getDB()->quoteInto("receiver = ? AND mode = ?", array(Core::getUser()->get("userid"), $folder));
  199. $result = Core::getQuery()->select("message", array("msgid"), "", $where, "time DESC", $pagination->getStart().", ".Core::getOptions()->get("MAX_PMS"));
  200. foreach($result->fetchAll() as $row)
  201. {
  202. Core::getQuery()->delete("message", "msgid = ?", null, null, array($row["msgid"]));
  203. }
  204. break;
  205. case 4:
  206. Core::getQuery()->delete("message", "receiver = ? AND mode = ?", null, null, array(Core::getUser()->get("userid"), $folder));
  207. break;
  208. case 5:
  209. $reports = array();
  210. $modId = Game::getRandomModerator();
  211. foreach($msgs as $msgid)
  212. {
  213. $where = Core::getDB()->quoteInto("m.msgid = ? AND m.receiver = ?", array(
  214. $msgid, Core::getUser()->get("userid")
  215. ));
  216. $result = Core::getQuery()->select("message m", array("m.sender", "m.mode", "m.message", "m.time", "u.username"), "LEFT JOIN ".PREFIX."user u ON (u.userid = m.sender)", $where);
  217. if($row = $result->fetchRow())
  218. {
  219. if(($row["sender"] > 0 || $row["mode"] == 5) && $row["sender"] != $modId)
  220. {
  221. $reports[] = $row;
  222. }
  223. }
  224. }
  225. if(count($reports) > 0)
  226. {
  227. Core::getLang()->assign("reportSender", Core::getUser()->get("username"));
  228. foreach($reports as $report)
  229. {
  230. Core::getLang()->assign("reportMessage", $report["message"]);
  231. Core::getLang()->assign("reportUser", $report["username"]);
  232. Core::getLang()->assign("reportSendTime", Date::timeToString(1, $report["time"], "", false));
  233. if($report["mode"] == 5)
  234. {
  235. $assault = Game::getModel("game/assault")->load((int) $report["message"]);
  236. $url = BASE_URL.Core::getLang()->getOpt("langcode")."/combat/report/".$assault->get("assaultid")."/".$assault->get("key");
  237. $gentime = $assault->get("gentime") / 1000;
  238. $label = Core::getLanguage()->getItem("ASSAULT_REPORT")." (A: ".fNumber($assault->get("lostunits_attacker")).", D: ".fNumber($assault->get("lostunits_defender")).") ".$gentime."s";
  239. Core::getLang()->assign("reportLink", "<span class=\"assault-report\" onclick=\"window.open('".$url."')\">".$label."</span>");
  240. $message = Core::getDB()->escape(Core::getLang()->get("MODERATOR_REPORT_COMBAT"));
  241. }
  242. else
  243. {
  244. richText($message = Core::getLang()->get("MODERATOR_REPORT_MESSAGE"));
  245. }
  246. $subject = Core::getLang()->get("MODERATOR_REPORT_SUBJECT");
  247. $spec = array(
  248. "sender" => null,
  249. "mode" => 1,
  250. "subject" => $subject,
  251. "message" => $message,
  252. "receiver" => $modId,
  253. "time" => TIME,
  254. "read" => 0,
  255. );
  256. Core::getQuery()->insert("message", $spec);
  257. }
  258. Logger::addMessage("MESSAGES_REPORTED", "success");
  259. }
  260. break;
  261. }
  262. return $this;
  263. }
  264. /**
  265. * Creates a new pagination object for the given folder.
  266. *
  267. * @param integer $id Folder id
  268. *
  269. * @return Pagination
  270. */
  271. protected function getPagination($id)
  272. {
  273. /* @var Bengine_Game_Model_Collection_Message $messages */
  274. $messages = Game::getCollection("game/message");
  275. $messages->addReceiverFilter(Core::getUser()->get("userid"))
  276. ->addFolderFilter($id);
  277. $pagination = new Pagination(Core::getOptions()->get("MAX_PMS"), $messages->getCalculatedSize(false));
  278. $pagination->setMaxPagesToShow(Core::getConfig()->get("MAX_MESSAGE_PAGES"));
  279. return $pagination;
  280. }
  281. /**
  282. * Shows content of a message folder.
  283. *
  284. * @param integer $id Folder id
  285. *
  286. * @return Bengine_Game_Controller_MSG
  287. */
  288. protected function readFolderAction($id)
  289. {
  290. if($this->isPost())
  291. {
  292. $this->deleteMessages($id, $this->getParam("deleteOption"), $this->getParam("msgid", array()));
  293. }
  294. $pagination = $this->getPagination($id);
  295. $pagination->render();
  296. $readMessages = array();
  297. /* @var Bengine_Game_Model_Collection_Message $messages */
  298. $messages = Game::getCollection("game/message");
  299. $messages->addTimeOrder()
  300. ->addFolderJoin()
  301. ->addReceiverFilter(Core::getUser()->get("userid"))
  302. ->addFolderFilter($id)
  303. ->setPagination($pagination);
  304. $folderObjCache = array();
  305. /* @var Bengine_Game_Model_Message $message */
  306. foreach($messages as $message)
  307. {
  308. Hook::event("ReadMessageFirst", array($message));
  309. $folderCode = $message->get("folder_class");
  310. if(!isset($folderObjCache[$folderCode]))
  311. {
  312. $folderClass = explode("/", $folderCode);
  313. $folderClass = $folderClass[0]."/messageFolder_".$folderClass[1];
  314. $folderObj = Application::factory($folderClass);
  315. $folderObjCache[$folderCode] = $folderObj;
  316. }
  317. else
  318. {
  319. $folderObj = $folderObjCache[$folderCode];
  320. }
  321. $folderObj->formatMessage($message);
  322. if(!$message->get("read"))
  323. {
  324. $readMessages[] = (int) $message->get("msgid");
  325. }
  326. Hook::event("ReadMessageLast", array($message));
  327. }
  328. if(count($readMessages) > 0)
  329. {
  330. Core::getQuery()->update("message", array("read" => 1), "msgid = ".implode(" OR msgid = ", $readMessages));
  331. }
  332. Core::getTPL()->addLoop("messages", $messages);
  333. Core::getTPL()->assign("mode", $id);
  334. Core::getTPL()->assign("pagination", $pagination);
  335. return $this;
  336. }
  337. /**
  338. * Mark a folder as read.
  339. *
  340. * @param integer $folderId Folder id to mark
  341. *
  342. * @return Bengine_Game_Controller_MSG
  343. */
  344. protected function markAsReadAction($folderId)
  345. {
  346. Hook::event("MarkFolderAsRead", array($folderId));
  347. Core::getQuery()->update("message", array("read" => 1), "mode = ? AND receiver = ?", array($folderId, Core::getUser()->get("userid")));
  348. $this->redirect("game/".SID."/MSG");
  349. return $this;
  350. }
  351. /**
  352. * Checks if the user send to many message (spam protection).
  353. *
  354. * @return Bengine_Game_Controller_MSG
  355. */
  356. protected function checkForSpam()
  357. {
  358. if($max = Core::getConfig()->get("MESSAGE_FLOOD_MAX"))
  359. {
  360. $bind = array(
  361. Core::getUser()->get("userid"),
  362. TIME - Core::getConfig()->get("MESSAGE_FLOOD_SPAN"),
  363. Bengine_Game_Model_Message::USER_FOLDER_ID
  364. );
  365. $result = Core::getQuery()->select("message", array("COUNT(msgid)"), "", "sender = ? AND time >= ? AND mode = ?", "", 1, "", "", $bind);
  366. if($result->fetchColumn() >= $max)
  367. {
  368. Logger::dieMessage("MESSAGE_FLOOD_INFO", "warning");
  369. }
  370. }
  371. return $this;
  372. }
  373. }
  374. ?>