PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/library/PirateProfile/Model/Pirate.php

https://github.com/xobxxi/Pirates-Forums
PHP | 575 lines | 483 code | 92 blank | 0 comment | 41 complexity | e30a97b6b316b8853651b0d5e9d9153d MD5 | raw file
  1. <?php
  2. class PirateProfile_Model_Pirate extends XenForo_Model
  3. {
  4. const FETCH_PIRATE_USER = 0x01;
  5. const FETCH_COMMENT_USER = 0x01;
  6. public function preparePirateConditions(array $conditions, array &$fetchOptions)
  7. {
  8. $db = $this->_getDb();
  9. $sqlConditions = array();
  10. if (!empty($conditions['name']))
  11. {
  12. if (is_array($conditions['name']))
  13. {
  14. $sqlConditions[] = 'pirate.name LIKE ' . XenForo_Db::quoteLike($conditions['name'][0], $conditions['name'][1], $db);
  15. }
  16. else
  17. {
  18. $sqlConditions[] = 'user.username LIKE ' . XenForo_Db::quoteLike($conditions['name'], 'lr', $db);
  19. }
  20. }
  21. return $this->getConditionsForClause($sqlConditions);
  22. }
  23. public function preparePirateOrderOptions(array &$fetchOptions, $defaultOrderSql = '')
  24. {
  25. $choices = array(
  26. 'id' => 'pirate.pirate_id',
  27. 'user_id' => 'pirate.user_id',
  28. 'name' => 'pirate.name',
  29. 'modified_date' => 'pirate.modified_date',
  30. 'level' => 'pirate.level',
  31. 'guild' => 'pirate.guild',
  32. 'last_comment_date' => 'pirate.last_comment_date'
  33. );
  34. $orderSql = null;
  35. if (!empty($fetchOptions['order']) && isset($choices[$fetchOptions['order']]))
  36. {
  37. $orderSql = $choices[$fetchOptions['order']];
  38. if (!empty($fetchOptions['direction']))
  39. {
  40. $orderSql .= (strtolower($fetchOptions['direction']) == 'desc' ? ' DESC' : ' ASC');
  41. }
  42. $orderSql .= ',' . $choices['name'] . ' ASC';
  43. }
  44. if (!$orderSql)
  45. {
  46. $orderSql = $defaultOrderSql;
  47. }
  48. return ($orderSql ? 'ORDER BY ' . $orderSql : '');
  49. }
  50. public function preparePirateFetchOptions(array $fetchOptions)
  51. {
  52. $selectFields = '';
  53. $joinTables = '';
  54. $db = $this->_getDb();
  55. if (isset($fetchOptions['likeUserId']))
  56. {
  57. if (empty($fetchOptions['likeUserId']))
  58. {
  59. $selectFields .= ',
  60. 0 AS like_date';
  61. }
  62. else
  63. {
  64. $selectFields .= ',
  65. liked_content.like_date';
  66. $joinTables .= '
  67. LEFT JOIN xf_liked_content AS liked_content
  68. ON (liked_content.content_type = \'pirate\'
  69. AND liked_content.content_id = pirate.pirate_id
  70. AND liked_content.like_user_id = ' .$db->quote($fetchOptions['likeUserId']) . ')';
  71. }
  72. }
  73. if (!empty($fetchOptions['join']))
  74. {
  75. if ($fetchOptions['join'] & self::FETCH_PIRATE_USER)
  76. {
  77. $selectFields .= ',
  78. user.*,
  79. IF(user.username IS NULL, pirate.user_id, user.user_id) AS user_id';
  80. $joinTables .= '
  81. LEFT JOIN xf_user AS user ON
  82. (user.user_id = pirate.user_id)';
  83. }
  84. }
  85. return array(
  86. 'selectFields' => $selectFields,
  87. 'joinTables' => $joinTables,
  88. );
  89. }
  90. public function countPirates(array $conditions)
  91. {
  92. $fetchOptions = array();
  93. $whereClause = $this->preparePirateConditions($conditions, $fetchOptions);
  94. $joinOptions = $this->preparePirateFetchOptions($fetchOptions);
  95. return $this->_getDb()->fetchOne('
  96. SELECT COUNT(*)
  97. FROM pirate
  98. ' . $joinOptions['joinTables'] . '
  99. WHERE ' . $whereClause
  100. );
  101. }
  102. public function getPirates(array $conditions, array $fetchOptions = array())
  103. {
  104. $whereClause = $this->preparePirateConditions($conditions, $fetchOptions);
  105. $limitOptions = $this->prepareLimitFetchOptions($fetchOptions);
  106. $orderClause = $this->preparePirateOrderOptions($fetchOptions, 'pirate.name');
  107. return $this->fetchAllKeyed($this->limitQueryResults('
  108. SELECT pirate_id, user_id, name, modified_date, likes, level, guild, last_comment_date, latest_comment_ids
  109. FROM pirate
  110. WHERE ' . $whereClause . '
  111. ' . $orderClause . '
  112. ', $limitOptions['limit'], $limitOptions['offset']
  113. ), 'pirate_id');
  114. }
  115. public function getLatestPirates(array $criteria, array $fetchOptions = array())
  116. {
  117. $fetchOptions['order'] = 'modified_date';
  118. $fetchOptions['direction'] = 'desc';
  119. return $this->getPirates($criteria, $fetchOptions);
  120. }
  121. public function getNewestPirates(array $criteria, array $fetchOptions = array())
  122. {
  123. $fetchOptions['order'] = 'id';
  124. $fetchOptions['direction'] = 'desc';
  125. return $this->getPirates($criteria, $fetchOptions);
  126. }
  127. public function getUserPirates($user_id, $fetchOptions = array())
  128. {
  129. $sqlClauses = $this->preparePirateFetchOptions($fetchOptions);
  130. return $this->_getDb()->fetchAll('
  131. SELECT pirate_id, user_id, name
  132. ' . $sqlClauses['selectFields'] . '
  133. FROM pirate
  134. ' . $sqlClauses['joinTables'] . '
  135. WHERE user_id = ?
  136. ', $user_id);
  137. }
  138. public function getPirateById($id, array $fetchOptions = array())
  139. {
  140. $sqlClauses = $this->preparePirateFetchOptions($fetchOptions);
  141. $pirate = $this->_getDb()->fetchRow('
  142. SELECT *
  143. ' . $sqlClauses['selectFields'] . '
  144. FROM pirate
  145. ' . $sqlClauses['joinTables'] . '
  146. WHERE pirate_id = ?
  147. ', $id);
  148. if (!isset($pirate)) return false;
  149. $pirate = preg_replace("/^0$/is", null, $pirate);
  150. return $pirate;
  151. }
  152. public function getPiratesByIds($ids, array $fetchOptions = array())
  153. {
  154. $sqlClauses = $this->preparePirateFetchOptions($fetchOptions);
  155. return $this->fetchAllKeyed('
  156. SELECT *
  157. ' . $sqlClauses['selectFields'] . '
  158. FROM pirate
  159. ' . $sqlClauses['joinTables'] . '
  160. WHERE pirate.pirate_id IN (' . $this->_getDb()->quote($ids) . ')
  161. ', 'pirate_id');
  162. }
  163. public function getPirateByName($name, array $fetchOptions = array())
  164. {
  165. $sqlClauses = $this->preparePirateFetchOptions($fetchOptions);
  166. return $this->_getDb()->fetchRow('
  167. SELECT *
  168. ' . $sqlClauses['selectFields'] . '
  169. FROM pirate
  170. ' . $sqlClauses['joinTables'] . '
  171. WHERE pirate.name LIKE ?
  172. ORDER BY pirate.name ASC
  173. ', $name);
  174. }
  175. public function getPiratesByName($name, array $fetchOptions = array())
  176. {
  177. $sqlClauses = $this->preparePirateFetchOptions($fetchOptions);
  178. return $this->fetchAllKeyed('
  179. SELECT *
  180. ' . $sqlClauses['selectFields'] . '
  181. FROM pirate
  182. ' . $sqlClauses['joinTables'] . '
  183. WHERE pirate.name LIKE ?
  184. ', 'pirate_id', $name);
  185. }
  186. public function preparePirate($pirate)
  187. {
  188. $options = XenForo_Application::get('options');
  189. $pirate += array(
  190. 'likeUsers' => unserialize($pirate['like_users']),
  191. 'skills_set' => true,
  192. 'max' => array(
  193. 'weapon' => $options->pirateProfile_maxLevelWeapon,
  194. 'skill' => $options->pirateProfile_maxLevelSkill
  195. ),
  196. 'weapons' => array(),
  197. 'skills' => array()
  198. );
  199. foreach ($pirate as $name => $level)
  200. {
  201. switch ($name)
  202. {
  203. case 'cannon':
  204. case 'sailing':
  205. case 'sword':
  206. case 'shooting':
  207. case 'doll':
  208. case 'dagger':
  209. case 'grenade':
  210. case 'staff':
  211. $phrase = new XenForo_Phrase('pirateProfile_pirate_' . $name);
  212. $phrase = $phrase->__toString();
  213. $pirate['weapons'][$name] = array(
  214. 'name' => $phrase,
  215. 'level' => $level
  216. );
  217. unset($pirate[$name]);
  218. break;
  219. case 'potions':
  220. case 'fishing':
  221. $phrase = new XenForo_Phrase('pirateProfile_pirate_' . $name);
  222. $phrase = $phrase->__toString();
  223. $pirate['skills'][$name] = array(
  224. 'name' => $phrase,
  225. 'level' => $level
  226. );
  227. unset($pirate[$name]);
  228. break;
  229. }
  230. }
  231. $skillsSet = false;
  232. foreach ($pirate['weapons'] as $weapon)
  233. {
  234. if (!empty($weapon['level'])) $skillsSet = true;
  235. }
  236. foreach ($pirate['skills'] as $skill)
  237. {
  238. if (!empty($skill['level'])) $skillsSet = true;
  239. }
  240. if (!$skillsSet)
  241. {
  242. $pirate['skills_set'] = false;
  243. }
  244. $pictures = $this->getPicturesById($pirate['pirate_id']);
  245. $pirate['picture'] = $this->_preparePicture($pictures[0], $pirate['make_fit']);
  246. return $pirate;
  247. }
  248. public function getPicturesById($id)
  249. {
  250. $attachmentModel = $this->_getAttachmentModel();
  251. $attachments = $attachmentModel->getAttachmentsByContentId('pirate', $id);
  252. if (empty($attachments)) return false;
  253. foreach ($attachments as $attachment)
  254. {
  255. $return[] = $attachmentModel->prepareAttachment($attachment);
  256. }
  257. return $return;
  258. }
  259. protected function _preparePicture($picture, $fit = false)
  260. {
  261. if (empty($picture)) return false;
  262. $width = 250;
  263. $height = 280;
  264. if ($fit)
  265. {
  266. $picture['width'] = $width;
  267. $picture['height'] = $height;
  268. return $picture;
  269. }
  270. switch ($picture['width'] >= $picture['height'])
  271. {
  272. default:
  273. case true:
  274. $ratio = ($picture['height'] / $height);
  275. $picture['width'] = intval(round($picture['width'] / $ratio));
  276. $picture['height'] = $height;
  277. $picture['margin'] = intval(round(-(($picture['width'] - $width) / 2)));
  278. break;
  279. case false:
  280. $ratio = ($picture['width'] / $width);
  281. $picture['width'] = $width;
  282. $picture['height'] = intval(round($picture['height'] / $ratio));
  283. break;
  284. }
  285. return $picture;
  286. }
  287. public function getAttachmentParams(array $contentData)
  288. {
  289. if ($this->canUploadAndManageAttachment())
  290. {
  291. return array(
  292. 'hash' => md5(uniqid('', true)),
  293. 'content_type' => 'pirate',
  294. 'content_data' => $contentData
  295. );
  296. }
  297. else
  298. {
  299. return false;
  300. }
  301. }
  302. public function canUploadAndManageAttachment()
  303. {
  304. $perms = $this->getPermissions();
  305. if (!$perms['canAttach']) return false;
  306. return true;
  307. }
  308. public function preparePirateCommentFetchOptions(array $fetchOptions)
  309. {
  310. $selectFields = '';
  311. $joinTables = '';
  312. if (!empty($fetchOptions['join']))
  313. {
  314. if ($fetchOptions['join'] & self::FETCH_COMMENT_USER)
  315. {
  316. $selectFields .= ',
  317. user.*,
  318. IF(user.username IS NULL, pirate_comment.username, user.username) AS username';
  319. $joinTables .= '
  320. LEFT JOIN xf_user AS user ON
  321. (user.user_id = pirate_comment.user_id)';
  322. }
  323. }
  324. return array(
  325. 'selectFields' => $selectFields,
  326. 'joinTables' => $joinTables
  327. );
  328. }
  329. public function getPirateCommentById($pirateCommentId, $fetchOptions = array())
  330. {
  331. $sqlClauses = $this->preparePirateCommentFetchOptions($fetchOptions);
  332. return $this->_getDb()->fetchRow('
  333. SELECT pirate_comment.*
  334. ' . $sqlClauses['selectFields'] . '
  335. FROM pirate_comment
  336. ' . $sqlClauses['joinTables'] . '
  337. WHERE pirate_comment.pirate_comment_id = ?
  338. ', $pirateCommentId);
  339. }
  340. public function getPirateCommentsByIds(array $ids, $fetchOptions = array())
  341. {
  342. if (!$ids)
  343. {
  344. return array();
  345. }
  346. $sqlClauses = $this->preparePirateCommentFetchOptions($fetchOptions);
  347. return $this->fetchAllKeyed('
  348. SELECT pirate_comment.*
  349. ' . $sqlClauses['selectFields'] . '
  350. FROM pirate_comment
  351. ' . $sqlClauses['joinTables'] . '
  352. WHERE pirate_comment.pirate_comment_id IN (' . $this->_getDb()->quote($ids) . ')
  353. ', 'pirate_comment_id');
  354. }
  355. public function getPirateCommentUserIds($pirateId)
  356. {
  357. return $this->_getDb()->fetchCol('
  358. SELECT DISTINCT user_id
  359. FROM pirate_comment
  360. WHERE pirate_id = ?
  361. ', $pirateId);
  362. }
  363. public function getPirateCommentsByPirate($pirateId, $beforeDate = 0, array $fetchOptions = array())
  364. {
  365. $sqlClauses = $this->preparePirateCommentFetchOptions($fetchOptions);
  366. $limitOptions = $this->prepareLimitFetchOptions($fetchOptions);
  367. if ($beforeDate)
  368. {
  369. $beforeCondition = 'AND pirate_comment.comment_date < ' . $this->_getDb()->quote($beforeDate);
  370. }
  371. else
  372. {
  373. $beforeCondition = '';
  374. }
  375. $results = $this->fetchAllKeyed($this->limitQueryResults(
  376. '
  377. SELECT pirate_comment.*
  378. ' . $sqlClauses['selectFields'] . '
  379. FROM pirate_comment
  380. ' . $sqlClauses['joinTables'] . '
  381. WHERE pirate_comment.pirate_id = ?
  382. ' . $beforeCondition . '
  383. ORDER BY pirate_comment.comment_date DESC
  384. ', $limitOptions['limit'], $limitOptions['offset']
  385. ), 'pirate_comment_id', $pirateId);
  386. return array_reverse($results, true);
  387. }
  388. public function addPirateCommentsToPirate(array $pirate, array $fetchOptions = array())
  389. {
  390. if ($pirate['latest_comment_ids'])
  391. {
  392. foreach (explode(',', $pirate['latest_comment_ids']) AS $commentId)
  393. {
  394. $commentIdMap[intval($commentId)] = $pirate['pirate_id'];
  395. }
  396. $pirate['comments'] = array();
  397. }
  398. if (isset($commentIdMap))
  399. {
  400. $comments = $this->getPirateCommentsByIds(array_keys($commentIdMap), $fetchOptions);
  401. foreach ($commentIdMap AS $commentId => $profilePostId)
  402. {
  403. if (isset($comments[$commentId]))
  404. {
  405. if (!isset($pirate['first_shown_comment_date']))
  406. {
  407. $pirate['first_shown_comment_date'] = $comments[$commentId]['comment_date'];
  408. }
  409. $pirate['comments'][$commentId] = $comments[$commentId];
  410. }
  411. }
  412. }
  413. return $pirate;
  414. }
  415. public function preparePirateComment(array $comment, array $profilePost, array $user, array $viewingUser = null)
  416. {
  417. $comment['canDelete'] = $this->canDeletePirateComment($comment, $profilePost, $user, $null, $viewingUser);
  418. return $comment;
  419. }
  420. public function canDeletePirateComment(array $comment, array $pirate, array $user, &$errorPhraseKey = '', array $viewingUser = null)
  421. {
  422. $this->standardizeViewingUserReference($viewingUser);
  423. if (!$viewingUser['user_id'])
  424. {
  425. return false;
  426. }
  427. $perms = $this->getPermissions($viewingUser);
  428. if ($perms['canManage'])
  429. {
  430. return true;
  431. }
  432. if ($viewingUser['user_id'] == $comment['user_id'])
  433. {
  434. return true;
  435. }
  436. else if ($viewingUser['user_id'] == $pirate['user_id'])
  437. {
  438. return true;
  439. }
  440. else
  441. {
  442. return false;
  443. }
  444. }
  445. public function getPermissions(array $viewingUser = null)
  446. {
  447. $this->standardizeViewingUserReference($viewingUser);
  448. $permissions = $viewingUser['permissions'];
  449. $perms = array(
  450. 'canView' => $this->_hasPermission($permissions, 'pirateProfile', 'canView'),
  451. 'canAdd' => $this->_hasPermission($permissions, 'pirateProfile', 'canAdd'),
  452. 'canAttach' => $this->_hasPermission($permissions, 'pirateProfile', 'canAttach'),
  453. 'canEdit' => $this->_hasPermission($permissions, 'pirateProfile', 'canEdit'),
  454. 'canDelete' => $this->_hasPermission($permissions, 'pirateProfile', 'canDelete'),
  455. 'canManage' => $this->_hasPermission($permissions, 'pirateProfile', 'canManage')
  456. );
  457. return $perms;
  458. }
  459. public function canLikePirate(array $pirate, array $user, &$errorPhraseKey = '', array $viewingUser = null)
  460. {
  461. $this->standardizeViewingUserReference($viewingUser);
  462. if (!$viewingUser['user_id'])
  463. {
  464. return false;
  465. }
  466. if ($pirate['user_id'] == $viewingUser['user_id'])
  467. {
  468. $errorPhraseKey = 'liking_own_content_cheating';
  469. return false;
  470. }
  471. $perms = $this->getPermissions($viewingUser);
  472. if (!$perms['canView']) return false;
  473. return true;
  474. }
  475. protected function _hasPermission($permissions, $group, $permission)
  476. {
  477. return XenForo_Permission::hasPermission($permissions, $group, $permission);
  478. }
  479. protected function _getAttachmentModel()
  480. {
  481. return $this->getModelFromCache('XenForo_Model_Attachment');
  482. }
  483. }