/** * View user profile * * @param Request $request * @param $matches * @return mixed|string */ public function profile(Request $request, $matches) { try { /** @var \User $user */ $user = \User::find($matches['id']); } catch (\Exception $e) { return $this->error404($request); } // User access log filter $access_filter = ['conditions' => ['user_id = ?', $user->id]]; // Paginator access log /** @var Listing $paginator */ $paginator = NCService::load('Paginator.Listing', [$request->page, \Visit::count($access_filter)]); $access_filter['order'] = 'id DESC'; $access_filter = array_merge($access_filter, $paginator->limit()); // Unban user if ($request->get('unban')) { $user->ban_time = null; $user->ban_user_id = null; $user->ban_reason = null; $user->save(); static::redirect_response($this->map->reverse('users.profile', ['id' => $user->id])); } if ($request->isMethod('post')) { $changed = false; // Edit rating $rating = intval($request->get('rating', 0)); if ($user->rating != $rating) { $user->rating = $rating; $changed = true; } // Change ban user $ban_time = $request->get('ban_time', false); $ban_reason = $request->get('ban_reason', false); if ($ban_time) { if ($ban_time == '-1' || strtolower(trim($ban_time)) == 'forever') { $ban_time = -1; } else { $ban_time = strtotime($ban_time, time()); } $user->ban($this->user, $ban_time, $ban_reason); $changed = true; } // Edit username $new_login = $request->get('username'); if ($new_login && $new_login != $user->username) { $exists = \User::find_by_username($new_login); if ($exists && $exists->id) { return static::json_response(['status' => $this->lang->translate('user.edit.exists', $new_login), 'class' => 'error']); } else { $changed = true; $user->username = $new_login; } } // Edit email $new_email = $request->get('email'); if ($new_email && $new_email != $user->email) { $exists = \User::find_by_email($new_email); if ($exists && $exists->id) { return static::json_response(['status' => $this->lang->translate('user.edit.exists_email', $new_email), 'class' => 'error']); } else { $changed = true; $user->email = $new_email; } } // Edit group $new_group = intval($request->get('group', $user->group_id)); if (!\Group::find($new_group)) { return static::json_response(['status' => $this->lang->translate('user.edit.wrong_group'), 'class' => 'error']); } else { $changed = true; $user->group_id = $new_group; } // Change password $new_password = $request->get('new_password'); if ($new_password) { $user->password = $new_password; if (strlen($new_password) > 5 && $user->save()) { return static::json_response(['status' => $this->lang->translate('form.saved'), 'class' => 'success']); } else { return static::json_response(['status' => $this->lang->translate('form.failed'), 'class' => 'error']); } } if ($changed && $user->save()) { return static::json_response(['status' => $this->lang->translate('form.saved'), 'class' => 'success']); } else { return static::json_response(['status' => $this->lang->translate('form.failed'), 'class' => 'error']); } } return $this->view->render('users/profile.twig', ['title' => $this->lang->translate('user.profile.name', $user->username), 'profile' => $user->to_array(), 'groups' => array_map(function ($i) { return $i->to_array(); }, \Group::all()), 'visits_list' => \Visit::as_array(\Visit::find('all', $access_filter)), 'user_ips' => array_map(function ($ip) { $data = ['addr' => long2ip($ip->ip)]; $data['banned'] = !Env::$kernel->ipwall->allowed(long2ip($ip->ip)); return $data; }, \Visit::ips_by_user($user)), 'listing' => $paginator->pages(), 'page' => $paginator->cur_page]); }