diff --git a/app/Builders/ImMessageList.php b/app/Builders/ImMessageList.php index f71b7fc1..486feb25 100644 --- a/app/Builders/ImMessageList.php +++ b/app/Builders/ImMessageList.php @@ -7,20 +7,20 @@ use App\Repos\User as UserRepo; class ImMessageList extends Builder { - public function handleUsers(array $messages) + public function handleSenders(array $messages) { - $users = $this->getUsers($messages); + $users = $this->getSenders($messages); foreach ($messages as $key => $message) { - $messages[$key]['user'] = $users[$message['user_id']] ?? new \stdClass(); + $messages[$key]['sender'] = $users[$message['sender_id']] ?? new \stdClass(); } return $messages; } - public function getUsers(array $messages) + public function getSenders(array $messages) { - $ids = kg_array_column($messages, 'user_id'); + $ids = kg_array_column($messages, 'sender_id'); $userRepo = new UserRepo(); diff --git a/app/Http/Web/Controllers/MessengerController.php b/app/Http/Web/Controllers/MessengerController.php index d58e8e5e..116e7e49 100644 --- a/app/Http/Web/Controllers/MessengerController.php +++ b/app/Http/Web/Controllers/MessengerController.php @@ -38,12 +38,56 @@ class MessengerController extends LayerController return $this->jsonSuccess(['data' => ['list' => $list]]); } + /** + * @Get("/msg/unread/count", name="web.im.unread_msg_count") + */ + public function unreadMessagesCountAction() + { + $service = new MessengerService(); + + $count = $service->getUnreadSystemMessagesCount(); + + return $this->jsonSuccess(['count' => $count]); + } + + /** + * @Post("/msg/read", name="web.im.read_msg") + */ + public function markMessagesAsReadAction() + { + $service = new MessengerService(); + + $service->markSystemMessagesAsRead(); + + return $this->jsonSuccess(); + } + /** * @Get("/msg/box", name="web.im.msg_box") */ public function messageBoxAction() { + $service = new MessengerService(); + $pager = $service->getSystemMessages(); + + $this->view->pick('messenger/msg_box'); + $this->view->setVar('pager', $pager); + } + + /** + * @Get("/msg/sys", name="web.im.sys_msg") + */ + public function systemMessagesAction() + { + $service = new MessengerService(); + + $pager = $service->getSystemMessages(); + + $pager->items = kg_array_object($pager->items); + + $this->view->pick('messenger/sys_messages'); + $this->view->setVar('pager', $pager); } /** @@ -53,7 +97,7 @@ class MessengerController extends LayerController { $service = new MessengerService(); - $pager = $service->getChatLog(); + $pager = $service->getChatMessages(); $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); $this->view->pick('messenger/chat_log'); @@ -67,7 +111,7 @@ class MessengerController extends LayerController { $service = new MessengerService(); - $pager = $service->getChatLog(); + $pager = $service->getChatMessages(); return $this->jsonPaginate($pager); } diff --git a/app/Http/Web/Services/Messenger.php b/app/Http/Web/Services/Messenger.php index 195fc5af..4a8d8d67 100644 --- a/app/Http/Web/Services/Messenger.php +++ b/app/Http/Web/Services/Messenger.php @@ -8,12 +8,14 @@ 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\ImGroupMessage as ImGroupMessageModel; 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\ImSystemMessage as ImSystemMessageRepo; use App\Repos\User as UserRepo; use App\Validators\ImChatGroup as ImChatGroupValidator; use App\Validators\ImFriendUser as ImFriendUserValidator; @@ -148,7 +150,35 @@ class Messenger extends Service return $result; } - public function getChatLog() + public function getUnreadSystemMessagesCount() + { + $user = $this->getLoginUser(); + + $userRepo = new UserRepo(); + + return $userRepo->countUnreadImSystemMessages($user->id); + } + + public function getSystemMessages() + { + $user = $this->getLoginUser(); + + $pagerQuery = new PagerQuery(); + + $params = $pagerQuery->getParams(); + + $params['receiver_id'] = $user->id; + + $sort = $pagerQuery->getSort(); + $page = $pagerQuery->getPage(); + $limit = $pagerQuery->getLimit(); + + $messageRepo = new ImSystemMessageRepo(); + + return $messageRepo->paginate($params, $sort, $page, $limit); + } + + public function getChatMessages() { $user = $this->getLoginUser(); @@ -172,7 +202,7 @@ class Messenger extends Service $pager = $messageRepo->paginate($params, $sort, $page, $limit); - return $this->handleChatLogPager($pager); + return $this->handleChatMessagePager($pager); } elseif ($params['type'] == 'group') { @@ -182,7 +212,7 @@ class Messenger extends Service $pager = $messageRepo->paginate($params, $sort, $page, $limit); - return $this->handleChatLogPager($pager); + return $this->handleChatMessagePager($pager); } } @@ -222,7 +252,13 @@ class Messenger extends Service $from = $this->request->getPost('from'); $to = $this->request->getPost('to'); - $content = [ + $validator = new ImMessageValidator(); + + $validator->checkReceiver($to['id'], $to['type']); + + $from['content'] = $validator->checkContent($from['content']); + + $message = [ 'username' => $from['username'], 'avatar' => $from['avatar'], 'content' => $from['content'], @@ -237,9 +273,9 @@ class Messenger extends Service $content['id'] = $to['id']; } - $message = json_encode([ + $content = json_encode([ 'type' => 'show_chat_msg', - 'content' => $content, + 'message' => $message, ]); Gateway::$registerAddress = '127.0.0.1:1238'; @@ -250,11 +286,33 @@ class Messenger extends Service * 不推送自己给自己发送的消息 */ if ($user->id != $to['id']) { - Gateway::sendToUid($to['id'], $message); + + $online = Gateway::isUidOnline($to['id']); + + $messageModel = new ImFriendMessageModel(); + + $messageModel->sender_id = $from['id']; + $messageModel->receiver_id = $to['id']; + $messageModel->content = $from['content']; + $messageModel->viewed = $online ? 1 : 0; + + $messageModel->create(); + + if ($online) { + Gateway::sendToUid($to['id'], $content); + } } } elseif ($to['type'] == 'group') { + $messageModel = new ImGroupMessageModel(); + + $messageModel->sender_id = $from['id']; + $messageModel->group_id = $to['id']; + $messageModel->content = $from['content']; + + $messageModel->create(); + $excludeClientId = null; /** @@ -266,7 +324,23 @@ class Messenger extends Service $groupName = $this->getGroupName($to['id']); - Gateway::sendToGroup($groupName, $message, $excludeClientId); + Gateway::sendToGroup($groupName, $content, $excludeClientId); + } + } + + public function markSystemMessagesAsRead() + { + $user = $this->getLoginUser(); + + $userRepo = new UserRepo(); + + $messages = $userRepo->findUnreadImSystemMessages($user->id); + + if ($messages->count() > 0) { + foreach ($messages as $message) { + $message->viewed = 1; + $message->update(); + } } } @@ -458,7 +532,7 @@ class Messenger extends Service return $result; } - protected function handleChatLogPager($pager) + protected function handleChatMessagePager($pager) { if ($pager->total_items == 0) { return $pager; @@ -468,20 +542,17 @@ class Messenger extends Service $builder = new ImMessageListBuilder(); - $users = $builder->getUsers($messages); + $senders = $builder->getSenders($messages); $items = []; foreach ($messages as $message) { - - $user = $user = $users[$message['user_id']] ?? new \stdClass(); - + $sender = $senders[$message['sender_id']] ?? new \stdClass(); $items[] = [ 'id' => $message['id'], 'content' => $message['content'], - 'create_time' => $message['create_time'], 'timestamp' => $message['create_time'] * 1000, - 'user' => $user, + 'user' => $sender, ]; } @@ -550,36 +621,56 @@ class Messenger extends Service return $pager; } - protected function handleApplyFriendNotice(UserModel $user, UserModel $friend, $remark) + protected function handleApplyFriendNotice(UserModel $sender, UserModel $receiver, $remark) { + $userRepo = new UserRepo(); + + $itemType = ImSystemMessageModel::TYPE_FRIEND_REQUEST; + + $message = $userRepo->findImSystemMessage($receiver->id, $itemType); + + if ($message) { + + /** + * 请求未过期 + */ + if (time() - $message->create_time < 3 * 86400) { + return; + } + + if ($message->item_type['accepted'] == 1) { + return; + } + } + + $senderInfo = [ + 'id' => $sender->id, + 'name' => $sender->name, + 'avatar' => $sender->avatar, + ]; + $sysMsgModel = new ImSystemMessageModel(); - $sysMsgModel->user_id = $friend->id; - $sysMsgModel->item_id = $user->id; - $sysMsgModel->item_type = ImSystemMessageModel::TYPE_APPLY_FRIEND; + $sysMsgModel->sender_id = $sender->id; + $sysMsgModel->receiver_id = $receiver->id; + $sysMsgModel->item_type = ImSystemMessageModel::TYPE_FRIEND_REQUEST; $sysMsgModel->item_info = [ - 'user' => ['id' => $user->id, 'name' => $user->name, 'avatar' => $user->avatar], + 'sender' => $senderInfo, 'remark' => $remark, + 'accepted' => 0, ]; $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); } } diff --git a/app/Http/Web/Views/messenger/chat_log.volt b/app/Http/Web/Views/messenger/chat_log.volt index 151c5bf7..a664cca5 100644 --- a/app/Http/Web/Views/messenger/chat_log.volt +++ b/app/Http/Web/Views/messenger/chat_log.volt @@ -9,7 +9,6 @@ body .layim-chat-main { height: auto; } - #LAY_page { margin-bottom: 20px; text-align: center; @@ -22,7 +21,7 @@