diff --git a/app/Caches/ImHotGroupList.php b/app/Caches/ImHotGroupList.php index b17c2dcc..62b5d78d 100644 --- a/app/Caches/ImHotGroupList.php +++ b/app/Caches/ImHotGroupList.php @@ -48,6 +48,7 @@ class ImHotGroupList extends Cache 'name' => $group->name, 'avatar' => $group->avatar, 'about' => $group->about, + 'user_count' => $group->user_count, ]; } diff --git a/app/Caches/ImHotUserList.php b/app/Caches/ImHotUserList.php index 8662167c..1ae7f453 100644 --- a/app/Caches/ImHotUserList.php +++ b/app/Caches/ImHotUserList.php @@ -48,9 +48,11 @@ class ImHotUserList extends Cache 'name' => $user->name, 'avatar' => $user->avatar, 'about' => $user->about, - 'sign' => $user->sign, 'location' => $user->location, + 'gender' => $user->gender, 'vip' => $user->vip, + 'follower_count' => $user->follower_count, + 'following_count' => $user->following_count, ]; } diff --git a/app/Http/Web/Controllers/MessengerController.php b/app/Http/Web/Controllers/MessengerController.php index 0e0cc804..d58e8e5e 100644 --- a/app/Http/Web/Controllers/MessengerController.php +++ b/app/Http/Web/Controllers/MessengerController.php @@ -94,20 +94,26 @@ class MessengerController extends LayerController */ public function searchAction() { - $query = $this->request->getQuery('query', ['trim', 'string']); - $type = $this->request->getQuery('type', ['trim', 'string']); + $type = $this->request->getQuery('type'); + $query = $this->request->getQuery('query'); + $target = $this->request->getQuery('target'); + + $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); $service = new MessengerService(); if ($type == 'user') { - $pager = $service->searchUsers($query); $this->view->pick('messenger/find_users'); + $target = $target ?: 'tab-users'; + $pager = $service->searchUsers($query); } else { - $pager = $service->searchGroups($query); $this->view->pick('messenger/find_groups'); + $target = $target ?: 'tab-groups'; + $pager = $service->searchGroups($query); } $pager->items = kg_array_object($pager->items); + $pager->target = $target; $this->view->setVar('pager', $pager); } @@ -200,17 +206,17 @@ class MessengerController extends LayerController } /** - * @Post("/friend/approve", name="web.im.approve_friend") + * @Post("/friend/accept", name="web.im.accept_friend") */ - public function approveFriendAction() + public function acceptFriendAction() { } /** - * @Post("/group/approve", name="web.web.im.approve_group") + * @Post("/group/accept", name="web.web.im.accept_group") */ - public function approveGroupAction() + public function acceptGroupAction() { } diff --git a/app/Http/Web/Services/Messenger.php b/app/Http/Web/Services/Messenger.php index db74863e..195fc5af 100644 --- a/app/Http/Web/Services/Messenger.php +++ b/app/Http/Web/Services/Messenger.php @@ -8,12 +8,15 @@ use App\Caches\ImHotUserList as ImHotUserListCache; use App\Library\Paginator\Query as PagerQuery; use App\Models\ImFriendMessage as ImFriendMessageModel; use App\Models\ImFriendUser as ImFriendUserModel; +use App\Models\ImSystemMessage as ImSystemMessageModel; +use App\Models\User as UserModel; use App\Repos\ImChatGroup as ImChatGroupRepo; use App\Repos\ImFriendMessage as ImFriendMessageRepo; use App\Repos\ImFriendUser as ImFriendUserRepo; use App\Repos\ImGroupMessage as ImGroupMessageRepo; use App\Repos\User as UserRepo; use App\Validators\ImChatGroup as ImChatGroupValidator; +use App\Validators\ImFriendUser as ImFriendUserValidator; use App\Validators\ImMessage as ImMessageValidator; use App\Validators\User as UserValidator; use GatewayClient\Gateway; @@ -44,14 +47,42 @@ class Messenger extends Service ]; } - public function searchUsers($query) + public function searchUsers($name) { + $pagerQuery = new PagerQuery(); + $params = $pagerQuery->getParams(); + + $params['name'] = $name; + + $sort = $pagerQuery->getSort(); + $page = $pagerQuery->getPage(); + $limit = $pagerQuery->getLimit(); + + $userRepo = new UserRepo(); + + $pager = $userRepo->paginate($params, $sort, $page, $limit); + + return $this->handleUserPager($pager); } - public function searchGroups($query) + public function searchGroups($name) { + $pagerQuery = new PagerQuery(); + $params = $pagerQuery->getParams(); + + $params['name'] = $name; + + $sort = $pagerQuery->getSort(); + $page = $pagerQuery->getPage(); + $limit = $pagerQuery->getLimit(); + + $groupRepo = new ImChatGroupRepo(); + + $pager = $groupRepo->paginate($params, $sort, $page, $limit); + + return $this->handleGroupPager($pager); } public function getHotUsers() @@ -141,7 +172,7 @@ class Messenger extends Service $pager = $messageRepo->paginate($params, $sort, $page, $limit); - return $this->handleChatLog($pager); + return $this->handleChatLogPager($pager); } elseif ($params['type'] == 'group') { @@ -151,7 +182,7 @@ class Messenger extends Service $pager = $messageRepo->paginate($params, $sort, $page, $limit); - return $this->handleChatLog($pager); + return $this->handleChatLogPager($pager); } } @@ -207,7 +238,7 @@ class Messenger extends Service } $message = json_encode([ - 'type' => 'show_message', + 'type' => 'show_chat_msg', 'content' => $content, ]); @@ -256,13 +287,19 @@ class Messenger extends Service public function applyFriend() { - $friendId = $this->request->getPost('friend_id'); + $post = $this->request->getPost(); $user = $this->getLoginUser(); - $userValidator = new UserValidator(); + $validator = new ImFriendUserValidator(); - $friend = $userValidator->checkUser($friendId); + $friend = $validator->checkFriend($post['friend_id']); + $group = $validator->checkGroup($post['group_id']); + $remark = $validator->checkRemark($post['remark']); + + $validator->checkIfSelfApply($user->id, $friend->id); + $validator->checkIfJoined($user->id, $friend->id); + $validator->checkIfBlocked($user->id, $friend->id); $friendUserRepo = new ImFriendUserRepo(); @@ -272,23 +309,26 @@ class Messenger extends Service $model = new ImFriendUserModel(); $model->user_id = $user->id; $model->friend_id = $friend->id; + $model->group_id = $group->id; $model->create(); + } else { + $friendUser->group_id = $group->id; + $friendUser->update(); } - /** - * @todo 向对方发好友申请的系统消息 - */ + $this->handleApplyFriendNotice($user, $friend, $remark); } - public function approveFriend() + public function acceptFriend() { - $friendId = $this->request->getPost('friend_id'); + $post = $this->request->getPost(); $user = $this->getLoginUser(); - $userValidator = new UserValidator(); + $validator = new ImFriendUserValidator(); - $friend = $userValidator->checkUser($friendId); + $friend = $validator->checkFriend($post['friend_id']); + $group = $validator->checkGroup($post['group_id']); $friendUserRepo = new ImFriendUserRepo(); @@ -298,12 +338,11 @@ class Messenger extends Service $model = new ImFriendUserModel(); $model->user_id = $user->id; $model->friend_id = $friend->id; + $model->group_id = $group->id; $model->create(); } - /** - * @todo 向对方发通过好友申请的系统消息 - */ + $this->handleAcceptFriendNotice(); } public function refuseFriend() @@ -325,7 +364,7 @@ class Messenger extends Service { } - public function approveGroup() + public function acceptGroup() { } @@ -342,11 +381,20 @@ class Messenger extends Service $items = []; - $items[] = ['id' => 0, 'groupname' => '我的好友', 'list' => []]; + $items[] = [ + 'id' => 0, + 'groupname' => '我的好友', + 'list' => [], + ]; if ($friendGroups->count() > 0) { foreach ($friendGroups as $group) { - $items[] = ['id' => $group->id, 'groupname' => $group->name, 'online' => 0, 'list' => []]; + $items[] = [ + 'id' => $group->id, + 'groupname' => $group->name, + 'online' => 0, + 'list' => [], + ]; } } @@ -410,7 +458,7 @@ class Messenger extends Service return $result; } - protected function handleChatLog($pager) + protected function handleChatLogPager($pager) { if ($pager->total_items == 0) { return $pager; @@ -442,6 +490,135 @@ class Messenger extends Service return $pager; } + protected function handleUserPager($pager) + { + if ($pager->total_items == 0) { + return $pager; + } + + $users = $pager->items->toArray(); + + $baseUrl = kg_ci_base_url(); + + $items = []; + + foreach ($users as $user) { + $user['avatar'] = $baseUrl . $user['avatar']; + $items[] = [ + 'id' => $user['id'], + 'name' => $user['name'], + 'avatar' => $user['avatar'], + 'about' => $user['about'], + 'location' => $user['location'], + 'gender' => $user['gender'], + 'vip' => $user['vip'], + 'follower_count' => $user['follower_count'], + 'following_count' => $user['following_count'], + ]; + } + + $pager->items = $items; + + return $pager; + } + + protected function handleGroupPager($pager) + { + if ($pager->total_items == 0) { + return $pager; + } + + $groups = $pager->items->toArray(); + + $baseUrl = kg_ci_base_url(); + + $items = []; + + foreach ($groups as $group) { + $group['avatar'] = $baseUrl . $group['avatar']; + $items[] = [ + 'id' => $group['id'], + 'name' => $group['name'], + 'avatar' => $group['avatar'], + 'about' => $group['about'], + 'user_count' => $group['user_count'], + ]; + } + + $pager->items = $items; + + return $pager; + } + + protected function handleApplyFriendNotice(UserModel $user, UserModel $friend, $remark) + { + $sysMsgModel = new ImSystemMessageModel(); + + $sysMsgModel->user_id = $friend->id; + $sysMsgModel->item_id = $user->id; + $sysMsgModel->item_type = ImSystemMessageModel::TYPE_APPLY_FRIEND; + $sysMsgModel->item_info = [ + 'user' => ['id' => $user->id, 'name' => $user->name, 'avatar' => $user->avatar], + 'remark' => $remark, + ]; + + $sysMsgModel->create(); + + Gateway::$registerAddress = '127.0.0.1:1238'; + + $online = Gateway::isUidOnline($friend->id); + + if ($online) { + + $userRepo = new UserRepo(); + + $msgCount = $userRepo->countUnreadImSystemMessages($friend->id); + + $message = kg_json_encode([ + 'type' => 'show_msg_box', + 'content' => ['msg_count' => $msgCount], + ]); + + Gateway::sendToUid($friend->id, $message); + } + } + + protected function handleAcceptFriendNotice(UserModel $user, UserModel $friend) + { + $sysMsgModel = new ImSystemMessageModel(); + + $sysMsgModel->user_id = $friend->id; + $sysMsgModel->item_id = $user->id; + $sysMsgModel->item_type = ImSystemMessageModel::TYPE_FRIEND_APPROVED; + $sysMsgModel->item_info = [ + 'user' => ['id' => $user->id, 'name' => $user->name, 'avatar' => $user->avatar], + ]; + + $sysMsgModel->create(); + + Gateway::$registerAddress = '127.0.0.1:1238'; + + $online = Gateway::isUidOnline($friend->id); + + if ($online) { + + $userRepo = new UserRepo(); + + $msgCount = $userRepo->countUnreadImSystemMessages($friend->id); + + $message = kg_json_encode([ + 'type' => 'show_msg_box', + 'content' => ['msg_count' => $msgCount], + ]); + + Gateway::sendToUid($friend->id, $message); + } + } + + protected function handleRefuseFriendNotice() + { + } + protected function getGroupName($groupId) { return "group_{$groupId}"; diff --git a/app/Http/Web/Views/messenger/find.volt b/app/Http/Web/Views/messenger/find.volt index 91c3adee..e5efadd7 100644 --- a/app/Http/Web/Views/messenger/find.volt +++ b/app/Http/Web/Views/messenger/find.volt @@ -3,8 +3,9 @@ {% block content %}