MessageController.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller;
  4. /**
  5. * MessageController
  6. * @package App\Controller
  7. */
  8. use App\JsonRpc\UserServiceInterface;
  9. use Hyperf\Di\Annotation\Inject;
  10. use Hyperf\Context\ApplicationContext;
  11. use Swoole\WebSocket\Server as WebSocketServer;
  12. use App\Service\RedisService;
  13. use Hyperf\Server\ServerManager;
  14. use function Hyperf\Support\call;
  15. use swoole\Server;
  16. class MessageController extends AbstractController
  17. {
  18. /**
  19. * @var UserServiceInterface
  20. */
  21. #[Inject]
  22. private $userServiceClient;
  23. public function sendAdminMessage($data)
  24. {
  25. try {
  26. // 获取管理员列表
  27. $adminList = $this->userServiceClient->getTypeUserList(['type_id' => 10000]);
  28. // 获取 Swoole WebSocket Server 实例
  29. $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
  30. $redisClient = new RedisService();
  31. if ($adminList && isset($adminList['data'])) {
  32. foreach ($adminList['data'] as $admin) {
  33. $fd = $redisClient->findFd((int)$admin['id']);
  34. if ($fd && $server->isEstablished((int)$fd)) {
  35. $server->push((int)$fd, json_encode($data));
  36. }
  37. }
  38. }
  39. return true;
  40. } catch (\Throwable $e) {
  41. var_dump('发送消息错误: ' . $e->getMessage());
  42. return false;
  43. }
  44. }
  45. public function sendUserMessage($data){
  46. try {
  47. // 获取 Swoole WebSocket Server 实例
  48. $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
  49. $redisClient = new RedisService();
  50. $fd = $redisClient->findFd((int)$data['user_id']);
  51. // var_dump("用户信息:",$fd,$data['user_id'],$data);
  52. if ($fd && $server->isEstablished((int)$fd)) {
  53. $server->push((int)$fd, json_encode($data));
  54. }
  55. } catch (\Throwable $e) {
  56. var_dump('发送消息错误: ' . $e->getMessage());
  57. return false;
  58. }
  59. }
  60. public function sendOtherUserMessage($data){
  61. try {
  62. // 获取 Swoole WebSocket Server 实例
  63. $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
  64. $redisClient = new RedisService();
  65. $data['user_id'] = json_decode($data['user_id'],true);
  66. if(is_array($data['user_id'])){
  67. foreach($data['user_id'] as $user_id){
  68. $fd = $redisClient->findFd((int)$user_id);
  69. if ($fd && $server->isEstablished((int)$fd)) {
  70. $server->push((int)$fd, json_encode($data));
  71. }
  72. }
  73. }
  74. } catch (\Throwable $e) {
  75. var_dump('发送消息错误: ' . $e->getMessage());
  76. return false;
  77. }
  78. }
  79. /**
  80. * 单聊
  81. */
  82. public function sendSingleChat($data){
  83. $userInfo = $this->userServiceClient->getImContact([
  84. 'user_id' => $data['receiver_id'],
  85. 'friend_id' => $data['user_id'],
  86. ]);
  87. // var_dump("用户信息:",$userInfo);
  88. $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
  89. $redisClient = new RedisService();
  90. $message = [
  91. 'talk_type' => 1,
  92. 'title' => isset($userInfo['data']['remark']) && $userInfo['data']['remark'] != '' ? $userInfo['data']['remark'] : '好友',
  93. 'content' => $data['content'],
  94. 'messageType' => 1,
  95. 'receiver_id'=> $data['user_id'],
  96. // 'user_id' => $user['user_id'] ?? '',
  97. 'time' => microtime(),
  98. ];
  99. $fd = $redisClient->findFd((int)$data['receiver_id']);
  100. if ($fd && $server->isEstablished((int)$fd)) {
  101. $server->push((int)$fd, json_encode($message));
  102. }
  103. return true;
  104. }
  105. /**
  106. * 群聊
  107. */
  108. public function sendGroupChat($data){
  109. $userList = $this->userServiceClient->getImGroupMember(['user_id' => $data['user_id'],'group_id' => $data['receiver_id']]);
  110. // 获取 Swoole WebSocket Server 实例
  111. $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
  112. $redisClient = new RedisService();
  113. if($userList && isset($userList['data'])){
  114. foreach($userList['data'] as $user){
  115. $message = [
  116. 'talk_type' => 2,
  117. 'title' => $user['group_name'],
  118. 'content' => $data['content'],
  119. 'messageType' => 1,
  120. 'receiver_id'=> $data['receiver_id'],
  121. // 'user_id' => $user['user_id'] ?? '',
  122. 'time' => microtime(),
  123. ];
  124. $fd = $redisClient->findFd((int)$user['user_id']);
  125. if ($fd && $server->isEstablished((int)$fd)) {
  126. $server->push((int)$fd, json_encode($message));
  127. }
  128. }
  129. }
  130. }
  131. }