diff --git a/app/Http/Web/Controllers/MessengerController.php b/app/Http/Web/Controllers/MessengerController.php index 116e7e49..e721e66b 100644 --- a/app/Http/Web/Controllers/MessengerController.php +++ b/app/Http/Web/Controllers/MessengerController.php @@ -235,6 +235,30 @@ class MessengerController extends LayerController return $this->jsonSuccess($content); } + /** + * @Post("/friend/accept", name="web.im.accept_friend") + */ + public function acceptFriendAction() + { + $service = new MessengerService(); + + $service->acceptFriend(); + + return $this->jsonSuccess(); + } + + /** + * @Post("/friend/refuse", name="web.im.refuse_friend") + */ + public function refuseFriendAction() + { + $service = new MessengerService(); + + $service->refuseFriend(); + + return $this->jsonSuccess(); + } + /** * @Post("/group/apply", name="web.im.apply_group") */ @@ -249,14 +273,6 @@ class MessengerController extends LayerController return $this->jsonSuccess($content); } - /** - * @Post("/friend/accept", name="web.im.accept_friend") - */ - public function acceptFriendAction() - { - - } - /** * @Post("/group/accept", name="web.web.im.accept_group") */ diff --git a/app/Http/Web/Services/Messenger.php b/app/Http/Web/Services/Messenger.php index 4a8d8d67..fce1750d 100644 --- a/app/Http/Web/Services/Messenger.php +++ b/app/Http/Web/Services/Messenger.php @@ -6,6 +6,7 @@ use App\Builders\ImMessageList as ImMessageListBuilder; use App\Caches\ImHotGroupList as ImHotGroupListCache; use App\Caches\ImHotUserList as ImHotUserListCache; use App\Library\Paginator\Query as PagerQuery; +use App\Models\ImFriendGroup as ImFriendGroupModel; use App\Models\ImFriendMessage as ImFriendMessageModel; use App\Models\ImFriendUser as ImFriendUserModel; use App\Models\ImGroupMessage as ImGroupMessageModel; @@ -236,13 +237,7 @@ class Messenger extends Service } } - /** - * @todo 发送未读消息 - */ - - /** - * @todo 发送盒子消息 - */ + $this->pullUnreadFriendMessages($user->id); } public function sendMessage() @@ -375,63 +370,88 @@ class Messenger extends Service $validator->checkIfJoined($user->id, $friend->id); $validator->checkIfBlocked($user->id, $friend->id); - $friendUserRepo = new ImFriendUserRepo(); - - $friendUser = $friendUserRepo->findFriendUser($user->id, $friend->id); - - if (!$friendUser) { - $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(); - } - - $this->handleApplyFriendNotice($user, $friend, $remark); + $this->handleApplyFriendNotice($user, $friend, $group, $remark); } public function acceptFriend() { - $post = $this->request->getPost(); - $user = $this->getLoginUser(); + $messageId = $this->request->getPost('message_id'); + $groupId = $this->request->getPost('group_id'); + $validator = new ImFriendUserValidator(); - $friend = $validator->checkFriend($post['friend_id']); - $group = $validator->checkGroup($post['group_id']); + $validator->checkGroup($groupId); + + $validator = new ImMessageValidator(); + + $message = $validator->checkMessage($messageId, 'system'); + + if ($message->item_type != ImSystemMessageModel::TYPE_FRIEND_REQUEST) { + return; + } + + $userRepo = new UserRepo(); + + $sender = $userRepo->findById($message->sender_id); $friendUserRepo = new ImFriendUserRepo(); - $friendUser = $friendUserRepo->findFriendUser($user->id, $friend->id); + $friendUser = $friendUserRepo->findFriendUser($user->id, $sender->id); + + $friendUserModel = new ImFriendUserModel(); if (!$friendUser) { - $model = new ImFriendUserModel(); - $model->user_id = $user->id; - $model->friend_id = $friend->id; - $model->group_id = $group->id; - $model->create(); + $friendUserModel->create([ + 'user_id' => $user->id, + 'friend_id' => $sender->id, + 'group_id' => $groupId, + ]); } - $this->handleAcceptFriendNotice(); + $friendUser = $friendUserRepo->findFriendUser($sender->id, $user->id); + + $groupId = $message->item_info['group']['id'] ?: 0; + + if (!$friendUser) { + $friendUserModel->create([ + 'user_id' => $user->id, + 'friend_id' => $sender->id, + 'group_id' => $groupId, + ]); + } + + $itemInfo = $message->item_info; + $itemInfo['status'] = ImSystemMessageModel::REQUEST_ACCEPTED; + $message->update(['item_info' => $itemInfo]); + + $this->handleAcceptFriendNotice($user, $sender); } public function refuseFriend() { - $friendId = $this->request->getPost('friend_id'); - $user = $this->getLoginUser(); - $userValidator = new UserValidator(); + $messageId = $this->request->getPost('message_id'); - $friend = $userValidator->checkUser($friendId); + $validator = new ImMessageValidator(); - /** - * @todo 向对方发拒绝添加好友的系统消息 - */ + $message = $validator->checkMessage($messageId, 'system'); + + if ($message->item_type != ImSystemMessageModel::TYPE_FRIEND_REQUEST) { + return; + } + + $itemInfo = $message->item_info; + $itemInfo['status'] = ImSystemMessageModel::REQUEST_REFUSED; + $message->update(['item_info' => $itemInfo]); + + $userRepo = new UserRepo(); + + $sender = $userRepo->findById($message->sender_id); + + $this->handleRefuseFriendNotice($user, $sender); } public function applyGroup() @@ -446,6 +466,44 @@ class Messenger extends Service { } + protected function pullUnreadFriendMessages($userId) + { + $userRepo = new UserRepo(); + + $messages = $userRepo->findUnreadImFriendMessages($userId); + + if ($messages->count() == 0) { + return; + } + + $builder = new ImMessageListBuilder(); + + $senders = $builder->getSenders($messages->toArray()); + + foreach ($messages as $message) { + + $message->update(['viewed' => 1]); + + $sender = $senders[$message->sender_id]; + + $content = kg_json_encode([ + 'type' => 'show_chat_msg', + 'message' => [ + 'username' => $sender['name'], + 'avatar' => $sender['avatar'], + 'content' => $message->content, + 'fromid' => $sender['id'], + 'id' => $sender['id'], + 'timestamp' => 1000 * $message->create_time, + 'type' => 'friend', + 'mine' => false, + ], + ]); + + Gateway::sendToUid($userId, $content); + } + } + protected function handleFriendList($userId) { $userRepo = new UserRepo(); @@ -621,7 +679,7 @@ class Messenger extends Service return $pager; } - protected function handleApplyFriendNotice(UserModel $sender, UserModel $receiver, $remark) + protected function handleApplyFriendNotice(UserModel $sender, UserModel $receiver, ImFriendGroupModel $group, $remark) { $userRepo = new UserRepo(); @@ -630,34 +688,59 @@ class Messenger extends Service $message = $userRepo->findImSystemMessage($receiver->id, $itemType); if ($message) { - - /** - * 请求未过期 - */ - if (time() - $message->create_time < 3 * 86400) { - return; - } - - if ($message->item_type['accepted'] == 1) { + $expired = time() - $message->create_time > 7 * 86400; + $pending = $message->item_type['status'] == ImSystemMessageModel::REQUEST_PENDING; + if (!$expired && $pending) { return; } } - $senderInfo = [ - 'id' => $sender->id, - 'name' => $sender->name, - 'avatar' => $sender->avatar, - ]; - $sysMsgModel = new ImSystemMessageModel(); $sysMsgModel->sender_id = $sender->id; $sysMsgModel->receiver_id = $receiver->id; $sysMsgModel->item_type = ImSystemMessageModel::TYPE_FRIEND_REQUEST; $sysMsgModel->item_info = [ - 'sender' => $senderInfo, + 'sender' => [ + 'id' => $sender->id, + 'name' => $sender->name, + 'avatar' => $sender->avatar, + ], + 'group' => [ + 'id' => $group->id, + 'name' => $group->name, + ], 'remark' => $remark, - 'accepted' => 0, + 'status' => ImSystemMessageModel::REQUEST_PENDING, + ]; + + $sysMsgModel->create(); + + Gateway::$registerAddress = '127.0.0.1:1238'; + + $online = Gateway::isUidOnline($receiver->id); + + if ($online) { + + $content = kg_json_encode(['type' => 'refresh_sys_msg']); + + Gateway::sendToUid($receiver->id, $content); + } + } + + protected function handleAcceptFriendNotice(UserModel $sender, UserModel $receiver) + { + $sysMsgModel = new ImSystemMessageModel(); + + $sysMsgModel->sender_id = $sender->id; + $sysMsgModel->receiver_id = $receiver->id; + $sysMsgModel->item_type = ImSystemMessageModel::TYPE_FRIEND_ACCEPTED; + $sysMsgModel->item_info = [ + 'sender' => [ + 'id' => $sender->id, + 'name' => $sender->name, + 'avatar' => $sender->avatar, + ] ]; $sysMsgModel->create(); @@ -674,42 +757,35 @@ class Messenger extends Service } } - protected function handleAcceptFriendNotice(UserModel $user, UserModel $friend) + protected function handleRefuseFriendNotice(UserModel $sender, UserModel $receiver) { $sysMsgModel = new ImSystemMessageModel(); - $sysMsgModel->user_id = $friend->id; - $sysMsgModel->item_id = $user->id; - $sysMsgModel->item_type = ImSystemMessageModel::TYPE_FRIEND_APPROVED; + $sysMsgModel->sender_id = $sender->id; + $sysMsgModel->receiver_id = $receiver->id; + $sysMsgModel->item_type = ImSystemMessageModel::TYPE_FRIEND_REFUSED; $sysMsgModel->item_info = [ - 'user' => ['id' => $user->id, 'name' => $user->name, 'avatar' => $user->avatar], + 'sender' => [ + 'id' => $sender->id, + 'name' => $sender->name, + 'avatar' => $sender->avatar, + ] ]; $sysMsgModel->create(); Gateway::$registerAddress = '127.0.0.1:1238'; - $online = Gateway::isUidOnline($friend->id); + $online = Gateway::isUidOnline($receiver->id); if ($online) { - $userRepo = new UserRepo(); + $content = kg_json_encode(['type' => 'show_msg_box']); - $msgCount = $userRepo->countUnreadImSystemMessages($friend->id); - - $message = kg_json_encode([ - 'type' => 'show_msg_box', - 'content' => ['msg_count' => $msgCount], - ]); - - Gateway::sendToUid($friend->id, $message); + Gateway::sendToUid($receiver->id, $content); } } - 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 e5efadd7..75fe9de4 100644 --- a/app/Http/Web/Views/messenger/find.volt +++ b/app/Http/Web/Views/messenger/find.volt @@ -3,7 +3,7 @@ {% block content %}
+ {{ sender.name }} + {{ date('Y-m-d H:i:s',item.create_time) }} +
+申请添加你为好友 {{ remark }}
++ {% if item_info.status == 'pending' %} + + + {% elseif item_info.status == 'accepted' %} + 已同意 + {% elseif item_info.status == 'refused' %} + 已拒绝 + {% endif %} +
+系统:{{ item_info.sender.name }} 接受了你的好友申请{{ date('Y-m-d H:i:s',item.create_time) }}
+系统:{{ item_info.sender.name }} 拒绝了你的好友申请{{ date('Y-m-d H:i:s',item.create_time) }}
++ {{ item_info.sender.name }} + {{ date('Y-m-d H:i:s',item.create_time) }} +
+申请加入群组 {{ remark }}
++ {% if item_info.status == 'pending' %} + + + {% elseif item_info.status == 'accepted' %} + 已同意 + {% elseif item_info.status == 'refused' %} + 已拒绝 + {% endif %} +
+系统:{{ item_info.sender.name }} 接受了你的入群申请{{ date('Y-m-d H:i:s',item.create_time) }}
+系统:{{ item_info.sender.name }} 拒绝了你的入群申请{{ date('Y-m-d H:i:s',item.create_time) }}
+