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

/objects/userpage.php

https://github.com/nopticon/hyd
PHP | 1247 lines | 939 code | 219 blank | 89 comment | 163 complexity | 7d32466ee740ce28a3e4f35292cf5166 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /*
  3. <Orion, a web development framework for RK.>
  4. Copyright (C) <2011> <Orion>
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. if (!defined('IN_APP')) exit;
  17. function a_thumbnails($artists, $lang_key, $block, $item_per_col = 2) {
  18. global $config, $user;
  19. _style('main.' . $block, array(
  20. 'L_TITLE' => lang($lang_key))
  21. );
  22. foreach ($artists as $ub => $data) {
  23. $image = $ub . '/thumbnails/' . $row->image . '.jpg';
  24. _style('main.' . $block . '.row', array(
  25. 'NAME' => $data->name,
  26. 'IMAGE' => $config->artists_url . $image,
  27. 'URL' => s_link('a', $data->subdomain),
  28. 'LOCATION' => ($data->local) ? 'Guatemala' : $data->location,
  29. 'GENRE' => $data->genre)
  30. );
  31. }
  32. return true;
  33. }
  34. class userpage {
  35. private $_title;
  36. private $_template;
  37. private $data;
  38. public function __construct() {
  39. return;
  40. }
  41. public function get_title($default = '') {
  42. return (!empty($this->_title)) ? $this->_title : $default;
  43. }
  44. public function get_template($default = '') {
  45. return (!empty($this->_template)) ? $this->_template : $default;
  46. }
  47. public function run() {
  48. global $user;
  49. if (!$user->is('member')) {
  50. do_login();
  51. }
  52. $userpage = request_var('member', '');
  53. $page = request_var('page', '');
  54. switch ($page) {
  55. case 'dc':
  56. return $this->conversations();
  57. }
  58. if (empty($userpage)) {
  59. return $this->profile();
  60. }
  61. $sql = 'SELECT *
  62. FROM _members
  63. WHERE username_base = ?
  64. AND user_type NOT IN (??)
  65. AND user_id NOT IN (
  66. SELECT user_id
  67. FROM _members_ban
  68. WHERE banned_user = ?
  69. )
  70. AND user_id NOT IN (
  71. SELECT ban_userid
  72. FROM _banlist
  73. )';
  74. if (!$this->data = sql_fieldrow(sql_filter($sql, get_username_base($userpage), USER_INACTIVE, $user->d('user_id')))) {
  75. fatal_error();
  76. }
  77. return $this->userpage();
  78. }
  79. private function conversations() {
  80. if (_button('cancel')) {
  81. redirect(s_link('my dc'));
  82. }
  83. global $config, $user, $cache, $comments;
  84. // TODO: New conversation system
  85. // /my/dc/(page)/(selected)/(username)/
  86. $this->conversations_delete();
  87. $submit = _button('post');
  88. $msg_id = request_var('p', 0);
  89. $mode = request_var('mode', '');
  90. $error = w();
  91. if ($submit || $mode == 'start' || $mode == 'reply') {
  92. $member = '';
  93. $dc_subject = '';
  94. $dc_message = '';
  95. if ($submit) {
  96. if ($mode == 'reply') {
  97. $parent_id = request_var('parent', 0);
  98. $sql = 'SELECT *
  99. FROM _dc
  100. WHERE msg_id = ?
  101. AND (privmsgs_to_userid = ? OR privmsgs_from_userid = ?)';
  102. if (!$to_userdata = sql_fieldrow(sql_filter($sql, $parent_id, $user->d('user_id'), $user->d('user_id')))) {
  103. fatal_error();
  104. }
  105. $privmsgs_to_userid = ($user->d('user_id') == $to_userdata->privmsgs_to_userid) ? 'privmsgs_from_userid' : 'privmsgs_to_userid';
  106. $to_userdata->user_id = $to_userdata->$privmsgs_to_userid;
  107. } else {
  108. $member = request_var('member', '');
  109. if (!empty($member)) {
  110. $member = get_username_base($member, true);
  111. if ($member !== false) {
  112. $sql = 'SELECT user_id, username, username_base, user_email
  113. FROM _members
  114. WHERE username_base = ?
  115. AND user_type <> ?';
  116. if (!$to_userdata = sql_fieldrow(sql_filter($sql, $member, USER_INACTIVE))) {
  117. $error[] = 'NO_SUCH_USER';
  118. }
  119. if (!count($error) && $to_userdata->user_id == $user->d('user_id')) {
  120. $error[] = 'NO_AUTO_DC';
  121. }
  122. } else {
  123. $error[] = 'NO_SUCH_USER';
  124. $member = '';
  125. }
  126. } else {
  127. $error[] = 'EMPTY_USER';
  128. }
  129. }
  130. if (isset($to_userdata) && isset($to_userdata->user_id)) {
  131. // Check blocked member
  132. $sql = 'SELECT ban_id
  133. FROM _members_ban
  134. WHERE user_id = ?
  135. AND banned_user = ?';
  136. if ($ban_profile = sql_fieldrow(sql_filter($sql, $to_userdata->user_id, $user->d('user_id')))) {
  137. $error[] = 'BLOCKED_MEMBER';
  138. }
  139. }
  140. $dc_message = request_var('message', '');
  141. if (empty($dc_message)) {
  142. $error[] = 'EMPTY_MESSAGE';
  143. }
  144. if (!count($error)) {
  145. $insert = array(
  146. 'privmsgs_type' => PRIVMSGS_NEW_MAIL,
  147. 'privmsgs_from_userid' => $user->d('user_id'),
  148. 'privmsgs_to_userid' => $to_userdata->user_id,
  149. 'privmsgs_date' => time(),
  150. 'msg_ip' => $user->ip,
  151. 'privmsgs_text' => $comments->prepare($dc_message),
  152. 'msg_can_reply' => 1
  153. );
  154. if ($mode == 'reply') {
  155. $insert['parent_id'] = $to_userdata->parent_id;
  156. } else {
  157. $insert['privmsgs_subject'] = $dc_subject;
  158. }
  159. $dc_id = sql_insert('dc', $insert);
  160. if ($mode == 'reply') {
  161. $sql = 'UPDATE _dc SET root_conv = root_conv + 1, last_msg_id = ?
  162. WHERE msg_id = ?';
  163. sql_query(sql_filter($sql, $dc_id, $to_userdata->msg_id));
  164. $sql = 'UPDATE _dc SET msg_deleted = 0
  165. WHERE parent_id = ?';
  166. sql_query(sql_filter($sql, $to_userdata->parent_id));
  167. // TODO: Today save
  168. // $user->delete_unread(UH_NOTE, $to_userdata->parent_id);
  169. } else {
  170. $sql = 'UPDATE _dc SET parent_id = ?, last_msg_id = ?
  171. WHERE msg_id = ?';
  172. sql_query(sql_filter($sql, $dc_id, $dc_id, $dc_id));
  173. }
  174. // TODO: Today save
  175. // $user->save_unread(UH_NOTE, (($mode == 'reply') ? $to_userdata->parent_id : $dc_id), 0, $to_userdata->user_id);
  176. //
  177. // Notify via email if user requires it
  178. //
  179. if ($mode == 'start' && /*$can_email && */$user->d('user_email_dc')) {
  180. $emailer = new emailer();
  181. $emailer->from('info');
  182. $emailer->set_subject($config->sitename . ': Mensaje nuevo de ' . $user->d('username'));
  183. $emailer->use_template('dc_email');
  184. $emailer->email_address($to_userdata->user_email);
  185. $dc_url = s_link('my dc read', $dc_id);
  186. $emailer->assign_vars(array(
  187. 'USERNAME' => $to_userdata->username,
  188. 'SENT_BY' => $user->d('username'),
  189. 'DC_URL' => $dc_url)
  190. );
  191. $emailer->send();
  192. $emailer->reset();
  193. }
  194. redirect(s_link('my dc read', $dc_id) . '#' . $dc_id);
  195. }
  196. }
  197. }
  198. //
  199. // Start error handling
  200. //
  201. if (count($error)) {
  202. _style('error', array(
  203. 'MESSAGE' => parse_error($error))
  204. );
  205. if ($mode == 'reply') {
  206. $mode = 'read';
  207. }
  208. }
  209. $s_hidden_fields = w();
  210. switch ($mode) {
  211. case 'start':
  212. //
  213. // Start new conversation
  214. //
  215. if (!$submit) {
  216. $member = request_var('member', '');
  217. if ($member != '') {
  218. $member = get_username_base($member);
  219. $sql = 'SELECT user_id, username, username_base
  220. FROM _members
  221. WHERE username_base = ?
  222. AND user_type <> ?';
  223. $row = sql_fieldrow(sql_filter($sql, $member, USER_INACTIVE));
  224. }
  225. }
  226. _style('dc_start', array(
  227. 'MEMBER' => $member,
  228. 'SUBJECT' => $dc_subject,
  229. 'MESSAGE' => $dc_message)
  230. );
  231. $s_hidden_fields = array('mode' => 'start');
  232. break;
  233. case 'read':
  234. //
  235. // Show selected conversation
  236. //
  237. if (!$msg_id) {
  238. fatal_error();
  239. }
  240. $sql = 'SELECT *
  241. FROM _dc
  242. WHERE msg_id = ?
  243. AND (privmsgs_to_userid = ? OR privmsgs_from_userid = ?)
  244. AND msg_deleted <> ?';
  245. if (!$msg_data = sql_fieldrow(sql_filter($sql, $msg_id, $user->d('user_id'), $user->d('user_id'), $user->d('user_id')))) {
  246. fatal_error();
  247. }
  248. //
  249. // Get all messages for this conversation
  250. //
  251. $sql = 'SELECT c.*, m.user_id, m.username, m.username_base, m.user_avatar, m.user_sig, m.user_rank, m.user_gender, m.user_posts
  252. FROM _dc c, _members m
  253. WHERE c.parent_id = ?
  254. AND c.privmsgs_from_userid = m.user_id
  255. ORDER BY c.privmsgs_date';
  256. if (!$result = sql_rowset(sql_filter($sql, $msg_data->parent_id))) {
  257. fatal_error();
  258. }
  259. $with_user = $msg_data->privmsgs_to_userid;
  260. if ($with_user == $user->d('user_id')) {
  261. $with_user = $msg_data->privmsgs_from_userid;
  262. }
  263. $sql = 'SELECT username
  264. FROM _members
  265. WHERE user_id = ?';
  266. $with_username = sql_field(sql_filter($sql, $with_user), 'username', '');
  267. _style('conv', array(
  268. 'URL' => s_link('my dc'),
  269. 'SUBJECT' => $with_username,
  270. 'CAN_REPLY' => $result[0]->msg_can_reply,)
  271. );
  272. foreach ($result as $row) {
  273. $user_profile = $comments->user_profile($row);
  274. _style('conv.row', array(
  275. 'USERNAME' => $user_profile->username,
  276. 'AVATAR' => $user_profile->user_avatar,
  277. 'SIGNATURE' => ($row->user_sig != '') ? $comments->parse_message($row->user_sig) : '',
  278. 'PROFILE' => $user_profile->profile,
  279. 'MESSAGE' => $comments->parse_message($row->privmsgs_text),
  280. 'POST_ID' => $row->msg_id,
  281. 'POST_DATE' => $user->format_date($row->privmsgs_date))
  282. );
  283. }
  284. $s_hidden_fields = array('mark[]' => $msg_data->parent_id, 'p' => $msg_id, 'parent' => $msg_data->parent_id, 'mode' => 'reply');
  285. break;
  286. default:
  287. //
  288. // Get all conversations for this member
  289. //
  290. $offset = request_var('offset', 0);
  291. $sql = 'SELECT COUNT(c.msg_id) AS total
  292. FROM _dc c, _dc c2, _members m, _members m2
  293. WHERE (c.privmsgs_to_userid = ? OR c.privmsgs_from_userid = ?)
  294. AND c.msg_id = c.parent_id
  295. AND c.msg_deleted <> ?
  296. AND c.privmsgs_from_userid = m.user_id
  297. AND c.privmsgs_to_userid = m2.user_id
  298. AND (IF(c.last_msg_id,c.last_msg_id,c.msg_id) = c2.msg_id)';
  299. $total_conv = sql_field(sql_filter($sql, $user->d('user_id'), $user->d('user_id'), $user->d('user_id')), 'total', 0);
  300. $sql = 'SELECT c.msg_id, c.parent_id, c.last_msg_id, c.root_conv, c.privmsgs_date, c.privmsgs_subject, c2.privmsgs_date as last_privmsgs_date, m.user_id, m.username, m.username_base, m2.user_id as user_id2, m2.username as username2, m2.username_base as username_base2
  301. FROM _dc c, _dc c2, _members m, _members m2
  302. WHERE (c.privmsgs_to_userid = ? OR c.privmsgs_from_userid = ?)
  303. AND c.msg_id = c.parent_id
  304. AND c.msg_deleted <> ?
  305. AND c.privmsgs_from_userid = m.user_id
  306. AND c.privmsgs_to_userid = m2.user_id
  307. AND (IF(c.last_msg_id,c.last_msg_id,c.msg_id) = c2.msg_id)
  308. ORDER BY c2.privmsgs_date DESC
  309. LIMIT ??, ??';
  310. if ($result = sql_rowset(sql_filter($sql, $user->d('user_id'), $user->d('user_id'), $user->d('user_id'), $offset, $config->posts_per_page))) {
  311. _style('messages');
  312. foreach ($result as $row) {
  313. $dc_with = ($user->d('user_id') == $row->user_id) ? '2' : '';
  314. if (!$row->last_msg_id) {
  315. $row->last_msg_id = $row->msg_id;
  316. $row->last_privmsgs_date = $row->privmsgs_date;
  317. }
  318. $dc_subject = 'Conversaci&oacute;n con ' . $row->{'username' . $dc_with};
  319. _style('messages.item', array(
  320. 'S_MARK_ID' => $row->parent_id,
  321. 'SUBJECT' => $dc_subject,
  322. 'U_READ' => s_link('my dc read', $row->last_msg_id) . '#' . $row->last_msg_id,
  323. 'POST_DATE' => $user->format_date($row->last_privmsgs_date, 'j F Y \a \l\a\s H:i') . ' horas.',
  324. 'ROOT_CONV' => $row->root_conv,
  325. 'DC_USERNAME' => $row->{'username' . $dc_with},
  326. 'DC_PROFILE' => s_link('m', $row->{'username_base' . $dc_with}))
  327. );
  328. }
  329. build_num_pagination(s_link('my dc s%d'), $total_conv, $config->posts_per_page, $offset);
  330. } else if ($total_conv) {
  331. redirect(s_link('my dc'));
  332. } else {
  333. _style('no_messages');
  334. }
  335. _style('dc_total', array(
  336. 'TOTAL' => $total_conv)
  337. );
  338. break;
  339. }
  340. //
  341. // Get friends for this member
  342. //
  343. $sql = 'SELECT DISTINCT m.user_id, m.username, m.username_base
  344. FROM _members_friends f, _members m
  345. WHERE (f.user_id = ? AND f.buddy_id = m.user_id)
  346. OR (f.buddy_id = ? AND f.user_id = m.user_id)
  347. ORDER BY m.username';
  348. if ($result = sql_rowset(sql_filter($sql, $user->d('user_id'), $user->d('user_id')))) {
  349. _style('sdc_friends', array(
  350. 'DC_START' => s_link('my dc start'))
  351. );
  352. foreach ($result as $row) {
  353. _style('sdc_friends.item', array(
  354. 'USERNAME' => $row->username,
  355. 'URL' => s_link('my dc start', $row->username_base))
  356. );
  357. }
  358. }
  359. //
  360. // Output template
  361. //
  362. $page_title = ($mode == 'read') ? lang('dconv_read') : lang('dconvs');
  363. $layout_vars = array(
  364. 'L_CONV' => $page_title,
  365. 'S_ACTION' => s_link('my dc'),
  366. 'S_HIDDEN_FIELDS' => s_hidden($s_hidden_fields)
  367. );
  368. page_layout($page_title, 'conversations', $layout_vars);
  369. }
  370. private function conversations_delete() {
  371. global $user;
  372. $mark = request_var('mark', array(0));
  373. if (_button('delete') && count($mark)) {
  374. if (_button('confirm')) {
  375. $sql = '((privmsgs_to_userid = ?) OR (privmsgs_from_userid = ?))';
  376. $sql_member = sql_filter($sql, $user->d('user_id'), $user->d('user_id'));
  377. $sql = 'SELECT *
  378. FROM _dc
  379. WHERE parent_id IN (??)
  380. AND ' . $sql_member;
  381. if (!$result = sql_rowset(sql_filter($sql, implode(',', array_map('intval', $mark))))) {
  382. return false;
  383. }
  384. $update_a = $delete_a = w();
  385. foreach ($result as $row) {
  386. $var = ($row->msg_deleted && ($row->msg_deleted != $user->d('user_id'))) ? 'delete_a' : 'update_a';
  387. if (!isset(${$var}[$row->parent_id])) {
  388. ${$var}[$row->parent_id] = true;
  389. }
  390. }
  391. //
  392. if (count($update_a)) {
  393. $sql = 'UPDATE _dc
  394. SET msg_deleted = ?
  395. WHERE parent_id IN (??)
  396. AND ' . $sql_member;
  397. sql_query(sql_filter($sql, $user->d('user_id'), implode(',', array_map('intval', array_keys($update_a)))));
  398. // TODO: Today save
  399. // $user->delete_unread(UH_NOTE, array_keys($update_a));
  400. }
  401. if (count($delete_a)) {
  402. $sql = 'DELETE FROM _dc
  403. WHERE parent_id IN (??)
  404. AND ' . $sql_member;
  405. sql_query(sql_filter($sql, implode(',', array_map('intval', array_keys($delete_a)))));
  406. // TODO: Today save
  407. // $user->delete_unread(UH_NOTE, array_keys($delete_a));
  408. }
  409. } else {
  410. $s_hidden = array('delete' => true);
  411. $i = 0;
  412. foreach ($mark as $item) {
  413. $s_hidden += array('mark[' . $i++ . ']' => $item);
  414. }
  415. // Output to template
  416. //
  417. $layout_vars = array(
  418. 'MESSAGE_TEXT' => (count($mark) == 1) ? lang('confirm_delete_pm') : lang('confirm_delete_pms'),
  419. 'S_CONFIRM_ACTION' => s_link('my dc'),
  420. 'S_HIDDEN_FIELDS' => s_hidden($s_hidden)
  421. );
  422. page_layout('CONVERSATIONS', 'confirm', $layout_vars);
  423. }
  424. redirect(s_link('my dc'));
  425. }
  426. return;
  427. }
  428. private function profile() {
  429. global $user, $config, $comments, $cache, $upload;
  430. $error = w();
  431. $fields = w('public_email timezone dateformat location sig msnm yim lastfm website occ interests os fav_genres fav_artists rank color');
  432. $length_ary = w('location sig msnm yim website occ interests os fav_genres fav_artists');
  433. $_fields = new stdClass;
  434. foreach ($fields as $field) {
  435. $_fields->$field = $user->d('user_' . $field);
  436. }
  437. $_fields->avatar = $user->d('user_avatar');
  438. $_fields->gender = $user->d('user_gender');
  439. $_fields->hideuser = $user->d('user_hideuser');
  440. $_fields->email_dc = $user->d('user_email_dc');
  441. $_fields->birthday_day = (int) substr($user->d('user_birthday'), 6, 2);
  442. $_fields->birthday_month = (int) substr($user->d('user_birthday'), 4, 2);
  443. $_fields->birthday_year = (int) substr($user->d('user_birthday'), 0, 4);
  444. if (_button()) {
  445. foreach ($_fields as $field => $value) {
  446. $_fields->$field = request_var($field, $value);
  447. }
  448. $_fields->password1 = request_var('password1', '');
  449. $_fields->password2 = request_var('password2', '');
  450. $_fields->hideuser = _button('hideuser');
  451. $_fields->email_dc = _button('email_dc');
  452. if (!empty($_fields->password1)) {
  453. if (empty($_fields->password2)) {
  454. $error[] = 'EMPTY_PASSWORD2';
  455. }
  456. if (!count($error)) {
  457. if ($_fields->password1 != $_fields->password2) {
  458. $error[] = 'PASSWORD_MISMATCH';
  459. } else if (strlen($_fields->password1) > 30) {
  460. $error[] = 'PASSWORD_LONG';
  461. }
  462. }
  463. }
  464. unset($_fields->password1, $_fields->password2);
  465. foreach ($length_ary as $field) {
  466. if (strlen($_fields->$field) < 2) {
  467. $_fields->$field = '';
  468. }
  469. }
  470. if (!empty($_fields->website)) {
  471. if (!preg_match('#^http[s]?:\/\/#i', $_fields->website)) {
  472. $_fields->website = 'http://' . $_fields->website;
  473. }
  474. if (!preg_match('#^http[s]?\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $_fields->website)) {
  475. $_fields->website = '';
  476. }
  477. }
  478. if (!empty($_fields->rank)) {
  479. $rank_word = explode(' ', $_fields->rank);
  480. if (count($rank_word) > 10) {
  481. $error[] = 'RANK_TOO_LONG';
  482. }
  483. if (!count($error)) {
  484. $rank_limit = 15;
  485. foreach ($rank_word as $each) {
  486. if (preg_match_all('#\&.*?\;#is', $each, $each_preg)) {
  487. foreach ($each_preg[0] as $each_preg_each) {
  488. $rank_limit += (strlen($each_preg_each) - 1);
  489. }
  490. }
  491. if (strlen($each) > $rank_limit) {
  492. $error[] = 'RANK_TOO_LONG';
  493. break;
  494. }
  495. }
  496. }
  497. }
  498. // Rank
  499. if (!empty($_fields->rank) && !count($error)) {
  500. $sql = 'SELECT rank_id
  501. FROM _ranks
  502. WHERE rank_title = ?';
  503. if (!$rank_id = sql_field(sql_filter($sql, $_fields->rank), 'rank_id', 0)) {
  504. $insert = array(
  505. 'rank_title' => $_fields->rank,
  506. 'rank_min' => -1,
  507. 'rank_max' => -1,
  508. 'rank_special' => 1
  509. );
  510. $rank_id = sql_insert('ranks', $insert);
  511. }
  512. if ($user->d('user_rank')) {
  513. $sql = 'SELECT user_id
  514. FROM _members
  515. WHERE user_rank = ?';
  516. $size_rank = sql_rowset(sql_filter($sql, $user->d('user_rank')), false, 'user_id');
  517. if (count($size_rank) == 1) {
  518. $sql = 'DELETE FROM _ranks
  519. WHERE rank_id = ?';
  520. sql_query(sql_filter($sql, $user->d('user_rank')));
  521. }
  522. }
  523. $_fields->rank = $rank_id;
  524. $cache->delete('ranks');
  525. }
  526. if (!$_fields->birthday_month || !$_fields->birthday_day || !$_fields->birthday_year) {
  527. $error[] = 'EMPTY_BIRTH_MONTH';
  528. }
  529. // Update user avatar
  530. if (!count($error)) {
  531. $upload->avatar_process($user->d('username_base'), $_fields, $error);
  532. }
  533. if (!count($error)) {
  534. if (!empty($_fields->sig)) {
  535. $_fields->sig = $comments->prepare($_fields->sig);
  536. }
  537. $_fields->birthday = (string) (leading_zero($_fields->birthday_year) . leading_zero($_fields->birthday_month) . leading_zero($_fields->birthday_day));
  538. unset($_fields->birthday_day, $_fields->birthday_month, $_fields->birthday_year);
  539. $_fields->dateformat = 'd M Y H:i';
  540. $_fields->hideuser = $user->d('user_hideuser');
  541. $_fields->email_dc = $user->d('user_email_dc');
  542. $member_data = w();
  543. foreach ($_fields as $field => $value) {
  544. if ($value != $user->d($field)) {
  545. $member_data['user_' . $field] = $_fields->$field;
  546. }
  547. }
  548. if (count($member_data)) {
  549. $sql = 'UPDATE _members SET ' . sql_build('UPDATE', $member_data) . sql_filter('
  550. WHERE user_id = ?', $user->d('user_id'));
  551. $sql = 'UPDATE _members SET ??
  552. WHERE user_id = ?';
  553. sql_query(sql_filter($sql, sql_build('UPDATE', $member_data), $user->d('user_id')));
  554. }
  555. redirect(s_link('m', $user->d('username_base')));
  556. }
  557. }
  558. if (count($error)) {
  559. _style('error', array(
  560. 'MESSAGE' => parse_error($error))
  561. );
  562. }
  563. if ($user->d('user_avatar')) {
  564. _style('current_avatar', array(
  565. 'IMAGE' => $config->avatar_url . $user->d('user_avatar'))
  566. );
  567. }
  568. $s_genders_select = '';
  569. foreach (array(1 => 'MALE', 2 => 'FEMALE') as $id => $value) {
  570. $s_genders_select .= '<option value="' . $id . '"' . (($_fields->gender == $id) ? ' selected="true"' : '') . '>' . lang($value) . '</option>';
  571. }
  572. _style('gender', array(
  573. 'GENDER_SELECT' => $s_genders_select)
  574. );
  575. $s_day_select = '';
  576. for ($i = 1; $i < 32; $i++) {
  577. $s_day_select .= '<option value="' . $i . '"' . (($_fields->birthday_day == $i) ? ' selected="true"' : '') . '>' . $i . '</option>';
  578. }
  579. $s_month_select = '';
  580. $months = w('January February March April May June July August September October November December');
  581. foreach ($months as $id => $value) {
  582. $s_month_select .= '<option value="' . ($id + 1) . '"' . (($_fields->birthday_month == ($id + 1)) ? ' selected="true"' : '') . '>' . $user->lang['datetime'][$value] . '</option>';
  583. }
  584. $s_year_select = '';
  585. for ($i = 2005; $i > 1899; $i--) {
  586. $s_year_select .= '<option value="' . $i . '"' . (($_fields->birthday_year == $i) ? ' selected="true"' : '') . '>' . $i . '</option>';
  587. }
  588. _style('birthday', array(
  589. 'DAY' => $s_day_select,
  590. 'MONTH' => $s_month_select,
  591. 'YEAR' => $s_year_select)
  592. );
  593. $dateformat_select = '';
  594. foreach ($dateset as $id => $value) {
  595. $dateformat_select .= '<option value="' . $id . '"' . (($value == $_fields->dateformat) ? ' selected="selected"' : '') . '>' . $user->format_date(time(), $value) . '</option>';
  596. }
  597. $timezone_select = '';
  598. foreach ($user->lang['zones'] as $id => $value) {
  599. $timezone_select .= '<option value="' . $id . '"' . (($id == $_fields->timezone) ? ' selected="selected"' : '') . '>' . $value . '</option>';
  600. }
  601. unset($_fields->timezone, $_fields->dateformat);
  602. if ($user->d('rank')) {
  603. $sql = 'SELECT rank_title
  604. FROM _ranks
  605. WHERE rank_id = ?';
  606. $_fields->rank = sql_field(sql_filter($sql, $user->d('rank')), 'rank_title', '--');
  607. }
  608. $output_vars = $_fields;
  609. $output_vars += array(
  610. 'DATEFORMAT' => $dateformat_select,
  611. 'TIMEZONE' => $timezone_select,
  612. 'HIDEUSER_SELECTED' => ($_fields->hideuser) ? ' checked="checked"' : '',
  613. 'EMAIL_DC_SELECTED' => ($_fields->email_dc) ? ' checked="checked"' : ''
  614. );
  615. v_style($output_vars);
  616. $this->_title = 'MEMBER_OPTIONS';
  617. $this->_template = 'profile';
  618. return;
  619. }
  620. private function userpage() {
  621. global $user, $comments;
  622. $mode = request_var('mode', 'main');
  623. if ($user->d('user_id') != $this->data->user_id && !in_array($mode, w('friend ban'))) {
  624. $is_blocked = false;
  625. if (!$user->is('all', $this->data->user_id)) {
  626. $sql = 'SELECT ban_id
  627. FROM _members_ban
  628. WHERE user_id = ?
  629. AND banned_user = ?';
  630. if ($banned_row = sql_fieldrow(sql_filter($sql, $user->d('user_id'), $this->data->user_id))) {
  631. $is_blocked = true;
  632. }
  633. $banned_lang = ($is_blocked) ? 'REMOVE' : 'ADD';
  634. _style('block_member', array(
  635. 'URL' => s_link('m', $this->data->username_base, 'ban'),
  636. 'LANG' => lang('blocked_member_' . $banned_lang))
  637. );
  638. }
  639. }
  640. $profile_fields = $comments->user_profile($this->data);
  641. switch ($mode) {
  642. case 'friend':
  643. $this->friend_add();
  644. break;
  645. case 'ban':
  646. $this->user_ban();
  647. break;
  648. case 'favs':
  649. break;
  650. case 'friends':
  651. $this->friend_list();
  652. break;
  653. case 'stats':
  654. $this->user_stats();
  655. break;
  656. case 'main':
  657. default:
  658. $this->user_main();
  659. break;
  660. }
  661. $panel_selection = array(
  662. 'main' => array('L' => 'MAIN', 'U' => false)
  663. );
  664. if ($user->d('user_id') != $this->data->user_id) {
  665. $panel_selection['start'] = array('L' => 'DCONV_START', 'U' => s_link('my dc start', $this->data->username_base));
  666. } else {
  667. $panel_selection['dc'] = array('L' => 'DC', 'U' => s_link('my dc'));
  668. }
  669. $panel_selection += array(
  670. 'friends' => array('L' => 'FRIENDS', 'U' => false)
  671. );
  672. foreach ($panel_selection as $link => $data) {
  673. _style('selected_panel', array(
  674. 'LANG' => lang('userpage_' . $data['L']))
  675. );
  676. if ($mode == $link) {
  677. _style('selected_panel.strong');
  678. continue;
  679. }
  680. _style('selected_panel.a', array(
  681. 'URL' => ($data['U'] !== false) ? $data['U'] : s_link('m', $this->data->username_base, (($link != 'main') ? $link : '')))
  682. );
  683. }
  684. //
  685. // Check if friends
  686. //
  687. if ($user->d('user_id') != $this->data->user_id) {
  688. $friend_add_lang = true;
  689. if ($user->is('member')) {
  690. $friend_add_lang = $this->is_friend($user->d('user_id'), $this->data->user_id);
  691. }
  692. $friend_add_lang = ($friend_add_lang) ? 'friends_add' : 'friends_del';
  693. _style('friend', array(
  694. 'U_FRIEND' => s_link('m', $this->data->username_base, 'friend'),
  695. 'L_FRIENDS_ADD' => lang($friend_add_lang))
  696. );
  697. }
  698. //
  699. // Generate page
  700. //
  701. v_style(array(
  702. 'USERNAME' => $this->data->username,
  703. 'POSTER_RANK' => $profile_fields->user_rank,
  704. 'AVATAR_IMG' => $profile_fields->user_avatar,
  705. 'USER_ONLINE' => $online,
  706. 'PM' => s_link('my dc start', $this->data->username_base),
  707. 'WEBSITE' => $this->data->user_website,
  708. 'MSN' => $this->data->user_msnm
  709. ));
  710. $layout_file = 'userpage';
  711. $use_m_template = 'custom/profile_' . $this->data->username_base;
  712. if (@file_exists(ROOT . 'template/' . $use_m_template . '.htm')) {
  713. $layout_file = $use_m_template;
  714. }
  715. $this->_title = $this->data->username;
  716. $this->_template = $layout_file;
  717. return;
  718. }
  719. public function friend_add() {
  720. global $user;
  721. if (!$user->is('member')) {
  722. do_login();
  723. }
  724. if ($user->d('user_id') == $this->data->user_id) {
  725. redirect(s_link('m', $this->data->username_base));
  726. }
  727. $sql = 'SELECT *
  728. FROM _members_friends
  729. WHERE user_id = ?
  730. AND buddy_id = ?';
  731. if ($row = sql_fieldrow(sql_filter($sql, $user->d('user_id'), $this->data->user_id))) {
  732. $sql = 'DELETE FROM _members_friends
  733. WHERE user_id = ?
  734. AND buddy_id = ?';
  735. sql_query(sql_filter($sql, $user->d('user_id'), $this->data->user_id));
  736. if ($row->friend_time) {
  737. //$user->points_remove(1);
  738. }
  739. // TODO: Today save
  740. // $user->delete_unread($this->data->user_id, $user->d('user_id'));
  741. redirect(s_link('m', $this->data->username_base));
  742. }
  743. $sql_insert = array(
  744. 'user_id' => $user->d('user_id'),
  745. 'buddy_id' => $this->data->user_id,
  746. 'friend_time' => time()
  747. );
  748. sql_insert('members_friends', $sql_insert);
  749. // TODO: Today Save
  750. // $user->save_unread(UH_FRIEND, $user->d('user_id'), 0, $this->data->user_id);
  751. redirect(s_link('m', $user->d('username_base'), 'friends'));
  752. }
  753. public function friend_list() {
  754. global $user, $comments;
  755. $sql = 'SELECT DISTINCT u.user_id AS user_id, u.username, u.username_base, u.user_avatar, u.user_rank, u.user_gender, u.user_posts
  756. FROM _members_friends b, _members u
  757. WHERE (b.user_id = ?
  758. AND b.buddy_id = u.user_id) OR
  759. (b.buddy_id = ?
  760. AND b.user_id = u.user_id)
  761. ORDER BY u.username';
  762. if ($result = sql_rowset(sql_filter($sql, $this->data->user_id, $this->data->user_id))) {
  763. _style('friends');
  764. foreach ($result as $row) {
  765. $friend_profile = $comments->user_profile($row);
  766. _style('friends.row', array(
  767. 'PROFILE' => $friend_profile->profile,
  768. 'USERNAME' => $friend_profile->username,
  769. 'AVATAR' => $friend_profile->user_avatar,
  770. 'RANK' => $friend_profile->user_rank)
  771. );
  772. }
  773. }
  774. return true;
  775. }
  776. public function is_friend($user_one, $user_two) {
  777. $sql = 'SELECT *
  778. FROM _members_friends
  779. WHERE (user_id = ?
  780. AND buddy_id = ?)
  781. OR (buddy_id = ?
  782. AND user_id = ?)';
  783. if (sql_fieldrow(sql_filter($sql, $user_one, $user_two, $user_two, $user_one))) {
  784. return true;
  785. }
  786. return false;
  787. }
  788. public function user_ban() {
  789. global $user;
  790. if (!$user->is('member')) {
  791. do_login();
  792. }
  793. if ($user->d('user_id') == $this->data->user_id) {
  794. redirect(s_link('m', $this->data->username_base));
  795. }
  796. if ($epbi) {
  797. fatal_error();
  798. }
  799. $sql = 'SELECT ban_id
  800. FROM _members_ban
  801. WHERE user_id = ?
  802. AND banned_user = ?';
  803. if ($row = sql_fieldrow(sql_filter($sql, $user->d('user_id'), $this->data->user_id))) {
  804. $sql = 'DELETE FROM _members_ban
  805. WHERE ban_id = ?';
  806. sql_query(sql_filter($sql, $row->ban_id));
  807. redirect(s_link('m', $this->data->username_base));
  808. }
  809. $sql_insert = array(
  810. 'user_id' => $user->d('user_id'),
  811. 'banned_user' => $this->data->user_id,
  812. 'ban_time' => $user->time
  813. );
  814. sql_insert('members_ban', $sql_insert);
  815. $sql = 'DELETE FROM _members_friends
  816. WHERE user_id = ?
  817. AND buddy_id = ?';
  818. sql_query(sql_filter($sql, $user->d('user_id'), $this->data->user_id));
  819. $sql = 'DELETE FROM _members_friends
  820. WHERE user_id = ?
  821. AND buddy_id = ?';
  822. sql_query(sql_filter($sql, $this->data->user_id, $user->d('user_id')));
  823. $sql = 'DELETE FROM _members_viewers
  824. WHERE user_id = ?
  825. AND viewer_id = ?';
  826. sql_query(sql_filter($sql, $this->data->user_id, $user->d('user_id')));
  827. redirect(s_link('m', $this->data->username_base));
  828. }
  829. public function user_stats() {
  830. $user_stats = array(
  831. 'VISITS_COUNT' => $this->data->user_totallogon,
  832. 'PAGEVIEWS_COUNT' => $this->data->user_totalpages,
  833. 'FORUM_POSTS' => $this->data->user_posts
  834. );
  835. $m = false;
  836. foreach ($user_stats as $key => $value) {
  837. if ($value == '') {
  838. continue;
  839. }
  840. if (!$m) {
  841. _style('main.stats');
  842. $m = true;
  843. }
  844. _style('main.stats.item', array(
  845. 'KEY' => lang($key),
  846. 'VALUE' => $value)
  847. );
  848. }
  849. return true;
  850. }
  851. public function user_main() {
  852. global $user, $comments;
  853. _style('main');
  854. //
  855. // Get artists where this member is an authorized member
  856. //
  857. $sql = 'SELECT au.user_id, a.ub, a.name, a.subdomain, a.images, a.local, a.location, a.genre, i.image
  858. FROM _artists_auth au, _artists a
  859. INNER JOIN _artists_images i ON a.ub = i.image
  860. WHERE au.user_id = ?
  861. AND au.ub = a.ub
  862. AND i.image_default = 1
  863. ORDER BY a.name';
  864. if ($artists = sql_rowset(sql_filter($sql, $this->data->user_id), 'ub')) {
  865. a_thumbnails($artists, 'USERPAGE_MOD', 'thumbnails');
  866. }
  867. //
  868. // GET MEMBER FAV ARTISTS
  869. //
  870. $sql = 'SELECT f.user_id, a.ub, a.name, a.subdomain, a.images, a.local, a.location, a.genre
  871. FROM _artists_fav f, _artists a
  872. INNER JOIN _artists_images i ON a.ub = i.ub
  873. WHERE f.user_id = ?
  874. AND f.ub = a.ub
  875. AND i.image_default = 1
  876. ORDER BY RAND()';
  877. if ($result2 = sql_rowset(sql_filter($sql, $this->data->user_id), 'ub')) {
  878. $total_a = 0;
  879. $selected_artists2 = w();
  880. foreach ($result2 as $row) {
  881. if ($total_a < 6) {
  882. $selected_artists2[$row->ub] = $row;
  883. }
  884. $total_a++;
  885. }
  886. a_thumbnails($result2, $random_images2, 'USERPAGE_AFAVS', 'thumbnails');
  887. if ($total_a > 6) {
  888. _style('main.thumbnails.all');
  889. }
  890. }
  891. // Latest board posts
  892. $sql = "SELECT DISTINCT(t.topic_title), p.post_id, p.post_time, t.topic_color
  893. FROM _forum_topics t, _forum_posts p
  894. WHERE p.poster_id = ?
  895. AND p.forum_id NOT IN (14,15,16,17,20,22,38)
  896. AND t.topic_id = p.topic_id
  897. AND t.topic_active = 1
  898. GROUP BY p.topic_id
  899. ORDER BY p.post_time DESC
  900. LIMIT 10";
  901. $result = sql_rowset(sql_filter($sql, $this->data->user_id));
  902. foreach ($result as $i => $row) {
  903. if (!$i) _style('main.lastboard');
  904. _style('main.lastboard.row', array(
  905. 'URL' => s_link('post', $row->post_id) . '#' . $row->post_id,
  906. 'TITLE' => $row->topic_title,
  907. 'TOPIC_COLOR' => $row->topic_color,
  908. 'TIME' => $user->format_date($row->post_time, 'H:i'),
  909. 'DATE' => $user->format_date($row->post_time, lang('date_format')))
  910. );
  911. }
  912. //
  913. // GET USERPAGE MESSAGES
  914. //
  915. $comments_ref = s_link('m', $this->data->username_base);
  916. if ($user->is('member')) {
  917. _style('main.post_comment_box', array(
  918. 'REF' => $comments_ref)
  919. );
  920. }
  921. //
  922. // User age & birthday
  923. //
  924. $birthday = '';
  925. $age = 0;
  926. if ($this->data->user_birthday) {
  927. $bd_month = gmmktime(0, 0, 0, substr($this->data->user_birthday, 4, 2) + 1, 0, 0);
  928. $birthday = (int) substr($this->data->user_birthday, 6, 2) . ' ' . $user->format_date($bd_month, 'F') . ' ' . substr($this->data->user_birthday, 0, 4);
  929. $age = date('Y', time()) - intval(substr($this->data->user_birthday, 0, 4));
  930. if (intval(substr($this->data->user_birthday, 4, 4)) > date('md', time())) {
  931. $age--;
  932. }
  933. $age .= ' ' . lang('years');
  934. }
  935. switch ($this->data->user_gender) {
  936. case 0:
  937. $gender = 'NO_GENDER';
  938. break;
  939. case 1:
  940. $gender = 'MALE';
  941. break;
  942. case 2:
  943. $gender = 'FEMALE';
  944. break;
  945. }
  946. $gender = lang($gender);
  947. $user_fields = array(
  948. //'JOINED' => ($this->data->user_regdate && (!$this->data->user_hideuser || $epbi2)) ? $user->format_date($this->data->user_regdate) . sprintf(lang('joined_since'), $memberdays) : '',
  949. 'LAST_LOGON' => ($this->data->user_lastvisit && (!$this->data->user_hideuser || $epbi2)) ? $user->format_date($this->data->user_lastvisit) : '',
  950. 'GENDER' => $gender,
  951. 'AGE' => $age,
  952. 'BIRTHDAY' => $birthday,
  953. 'FAV_GENRES' => $this->data->user_fav_genres,
  954. 'FAV_BANDS' => $this->data->user_fav_artists,
  955. 'LOCATION' => $this->data->user_location,
  956. 'OCCUPATION' => $this->data->user_occ,
  957. 'INTERESTS' => $this->data->user_interests,
  958. 'MEMBER_OS' => $this->data->user_os
  959. );
  960. $m = 0;
  961. foreach ($user_fields as $key => $value) {
  962. if ($value == '') continue;
  963. if (!$m) {
  964. _style('main.general');
  965. $m = 1;
  966. }
  967. _style('main.general.item', array(
  968. 'KEY' => lang($key),
  969. 'VALUE' => $value)
  970. );
  971. }
  972. //
  973. // Get Last.fm Feed
  974. //
  975. // http://ws.audioscrobbler.com/1.0/user//recenttracks.xml
  976. if (!empty($this->data->user_lastfm)) {
  977. include_once('./interfase/scrobbler.php');
  978. $scrobbler = new EasyScrobbler($this->data->user_lastfm);
  979. $list = $scrobbler->getRecentTracs();
  980. if (count($list)) {
  981. _style('main.lastfm', array(
  982. 'NAME' => $this->data->user_lastfm,
  983. 'URL' => 'http://www.last.fm/user/' . $this->data->user_lastfm . '/')
  984. );
  985. foreach ($list as $row) {
  986. _style('main.lastfm.row', array(
  987. 'ARTIST' => $row['ARTIST'],
  988. 'NAME' => $row['NAME'],
  989. 'ALBUM' => $row['ALBUM'],
  990. 'URL' => $row['URL'],
  991. 'TIME' => $user->format_date($row['DATE_UTS'], 'H:i'))
  992. );
  993. }
  994. }
  995. }
  996. //
  997. // Get public messages
  998. //
  999. $comments_ref = s_link('m', $this->data->username_base);
  1000. if ($this->data->userpage_posts) {
  1001. $comments->reset();
  1002. $comments->ref = $comments_ref;
  1003. $sql = 'SELECT p.*, u2.user_id, u2.username, u2.username_base, u2.user_avatar
  1004. FROM _members_posts p, _members u, _members u2
  1005. WHERE p.userpage_id = ?
  1006. AND p.userpage_id = u.user_id
  1007. AND p.post_active = 1
  1008. AND p.poster_id = u2.user_id
  1009. ORDER BY p.post_time DESC
  1010. LIMIT 50';
  1011. $comments->data = array(
  1012. 'USER_ID_FIELD' => 'userpage_id',
  1013. 'S_DELETE_URL' => s_link('acp', 'user_post_delete', 'msg_id:%d'),
  1014. 'SQL' => sql_filter($sql, $this->data->user_id)
  1015. );
  1016. $comments->view(0, '', $this->data->userpage_posts, $this->data->userpage_posts, 'main.posts');
  1017. }
  1018. if ($user->is('member')) {
  1019. _style('main.box', array(
  1020. 'REF' => $comments_ref)
  1021. );
  1022. }
  1023. return true;
  1024. }
  1025. }