golang-im聊天
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

friend_service.go 7.7 KiB

před 2 roky
před 1 rokem
před 1 rokem
před 2 roky
před 2 roky
před 1 rokem
před 2 roky
před 2 roky
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 2 roky
před 1 rokem
před 2 roky
před 2 roky
před 2 roky
před 1 rokem
před 2 roky
před 1 rokem
před 2 roky
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 2 roky
před 2 roky
před 1 rokem
před 2 roky
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
před 1 rokem
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package friend
  2. import (
  3. "context"
  4. svc "gim/internal/business/comm/service"
  5. "gim/internal/business/comm/utils"
  6. "gim/internal/logic/domain/message/repo"
  7. "gim/internal/logic/proxy"
  8. "gim/pkg/gerrors"
  9. "gim/pkg/grpclib"
  10. "gim/pkg/pb"
  11. "gim/pkg/rpc"
  12. "google.golang.org/protobuf/proto"
  13. "time"
  14. )
  15. type friendService struct{}
  16. var FriendService = new(friendService)
  17. // List 获取好友列表
  18. func (s *friendService) List(ctx context.Context, userId int64) ([]*pb.Friend, error) {
  19. friends, err := FriendRepo.List(userId, FriendStatusAgree)
  20. if err != nil {
  21. return nil, err
  22. }
  23. userIds := make(map[int64]int32, len(friends))
  24. for i := range friends {
  25. userIds[friends[i].FriendId] = 0
  26. }
  27. resp, err := rpc.GetBusinessIntClient().GetUsers(ctx, &pb.GetUsersReq{UserIds: userIds})
  28. if err != nil {
  29. return nil, err
  30. }
  31. var infos = make([]*pb.Friend, len(friends))
  32. for i := range friends {
  33. friend := pb.Friend{
  34. UserId: friends[i].FriendId,
  35. Remarks: friends[i].Remarks,
  36. Extra: friends[i].Extra,
  37. }
  38. user, ok := resp.Users[friends[i].FriendId]
  39. if ok {
  40. friend.Nickname = user.Nickname
  41. friend.Sex = user.Sex
  42. friend.AvatarUrl = user.AvatarUrl
  43. friend.UserExtra = user.Extra
  44. }
  45. infos[i] = &friend
  46. }
  47. return infos, nil
  48. }
  49. // DeleteFriend 删除好友
  50. func (*friendService) DeleteFriend(ctx context.Context, userId, friendId int64) error {
  51. err := FriendRepo.Delete(userId, friendId)
  52. if err != nil {
  53. return err
  54. }
  55. return nil
  56. }
  57. // AddFriend 添加好友
  58. func (*friendService) AddFriend(ctx context.Context, userId, friendId int64, remarks, description string) error {
  59. friend, err := FriendRepo.Get(userId, friendId)
  60. if err != nil {
  61. return err
  62. }
  63. if friend != nil {
  64. if friend.Status == FriendStatusApply {
  65. return nil
  66. }
  67. if friend.Status == FriendStatusAgree {
  68. return gerrors.ErrAlreadyIsFriend
  69. }
  70. }
  71. now := time.Now()
  72. err = FriendRepo.Save(&Friend{
  73. UserId: userId,
  74. FriendId: friendId,
  75. Remarks: remarks,
  76. Status: FriendStatusApply,
  77. CreateTime: now,
  78. UpdateTime: now,
  79. })
  80. if err != nil {
  81. return err
  82. }
  83. resp, err := rpc.GetBusinessIntClient().GetUser(ctx, &pb.GetUserReq{UserId: userId})
  84. if err != nil {
  85. return err
  86. }
  87. err = proxy.MessageProxy.PushToUser(ctx, friendId, pb.PushCode_PC_ADD_FRIEND, &pb.AddFriendPush{
  88. FriendId: userId,
  89. Nickname: resp.User.Nickname,
  90. AvatarUrl: resp.User.AvatarUrl,
  91. Description: description,
  92. }, true)
  93. if err != nil {
  94. return err
  95. }
  96. //TODO::判断是否需要`自动添加好友`
  97. masterId, _ := grpclib.GetCtxMasterId(ctx)
  98. isAutoAddFriends := svc.SysCfgGet(masterId, "is_auto_add_friends")
  99. //if isAutoAddFriends == "1" && resp.User.IsAutoAddedFriends == 1 {
  100. if isAutoAddFriends == "1" {
  101. respFriend, err := rpc.GetBusinessIntClient().GetUser(ctx, &pb.GetUserReq{UserId: friendId})
  102. if err != nil {
  103. return err
  104. }
  105. utils.FilePutContents("addFriend", utils.SerializeStr(map[string]interface{}{
  106. "is_auto_add_friends": isAutoAddFriends,
  107. "user": resp.User,
  108. }))
  109. if description == "社交人脉圈添加好友" {
  110. return FriendService.AgreeAddFriend(ctx, friendId, userId, description)
  111. } else if description == "客服自动添加" {
  112. return FriendService.AgreeAddFriend(ctx, friendId, userId, "客服")
  113. } else {
  114. if respFriend.User.IsAutoAddedFriends == 1 {
  115. return FriendService.AgreeAddFriend(ctx, friendId, userId, "系统自动添加")
  116. }
  117. }
  118. }
  119. return nil
  120. }
  121. // AgreeAddFriend 同意添加好友
  122. func (*friendService) AgreeAddFriend(ctx context.Context, userId, friendId int64, remarks string) error {
  123. friend, err := FriendRepo.Get(friendId, userId)
  124. if err != nil {
  125. return err
  126. }
  127. if friend == nil {
  128. utils.FilePutContents("AgreeAddFriend", utils.SerializeStr(map[string]interface{}{
  129. "userId": userId,
  130. "friendId": friendId,
  131. }))
  132. return gerrors.ErrBadRequest
  133. }
  134. if friend.Status == FriendStatusAgree {
  135. return nil
  136. }
  137. friend.Status = FriendStatusAgree
  138. err = FriendRepo.Save(friend)
  139. if err != nil {
  140. return err
  141. }
  142. newFriend, err := FriendRepo.Get(userId, friendId)
  143. if newFriend != nil && newFriend.Status != FriendStatusAgree {
  144. newFriend.Status = FriendStatusAgree
  145. err = FriendRepo.Save(newFriend)
  146. } else {
  147. now := time.Now()
  148. err = FriendRepo.Save(&Friend{
  149. UserId: userId,
  150. FriendId: friendId,
  151. Remarks: remarks,
  152. Status: FriendStatusAgree,
  153. CreateTime: now,
  154. UpdateTime: now,
  155. })
  156. }
  157. if err != nil {
  158. return err
  159. }
  160. resp, err := rpc.GetBusinessIntClient().GetUser(ctx, &pb.GetUserReq{UserId: friendId})
  161. if err != nil {
  162. return err
  163. }
  164. err = proxy.MessageProxy.PushToUser(ctx, friendId, pb.PushCode_PC_AGREE_ADD_FRIEND, &pb.AgreeAddFriendPush{
  165. FriendId: friendId,
  166. Nickname: resp.User.Nickname,
  167. AvatarUrl: resp.User.AvatarUrl,
  168. }, true)
  169. utils.FilePutContents("push_AgreeAddFriend", utils.SerializeStr(map[string]interface{}{
  170. "friend_id": friendId,
  171. "friend_nick_name": resp.User.Nickname,
  172. "friend_avatar_url": resp.User.AvatarUrl,
  173. "err": err,
  174. }))
  175. if err != nil {
  176. return err
  177. }
  178. return nil
  179. }
  180. // SendToFriend 消息发送至好友
  181. func (*friendService) SendToFriend(ctx context.Context, sender *pb.Sender, req *pb.SendMessageReq) (int64, error) {
  182. //TODO::判断是否为好友
  183. friend, err := FriendRepo.Get(sender.SenderId, req.ReceiverId)
  184. if err != nil {
  185. return 0, err
  186. }
  187. if friend == nil || friend.Status != FriendStatusAgree {
  188. return 0, gerrors.ErrNotIsFriend
  189. }
  190. //utils.FilePutContents("sendToFriend", utils.SerializeStr(map[string]interface{}{
  191. // "send": sender,
  192. // "req": req,
  193. //}))
  194. // 发给发送者
  195. seq, err := proxy.MessageProxy.SendToUser(ctx, sender, sender.SenderId, req)
  196. if err != nil {
  197. return 0, err
  198. }
  199. // 发给接收者
  200. _, err = proxy.MessageProxy.SendToUser(ctx, sender, req.ReceiverId, req)
  201. if err != nil {
  202. return 0, err
  203. }
  204. return seq, nil
  205. }
  206. // RecallMessageSendToFriend 撤回消息发送至好友
  207. func (*friendService) RecallMessageSendToFriend(ctx context.Context, sender *pb.Sender, req *pb.RecallMessageReq) (int64, error) {
  208. //TODO::判断是否为好友
  209. friend, err := FriendRepo.Get(sender.SenderId, req.ReceiverId)
  210. if err != nil {
  211. return 0, err
  212. }
  213. if friend == nil || friend.Status != FriendStatusAgree {
  214. return 0, gerrors.ErrNotIsFriend
  215. }
  216. utils.FilePutContents("RecallMessageSendToFriend", utils.SerializeStr(map[string]interface{}{
  217. "send": sender,
  218. "req": req,
  219. }))
  220. //查询到对应seq的消息
  221. msg := &pb.RECALL{}
  222. err = proto.Unmarshal(req.MessageContent, msg)
  223. if err != nil {
  224. return 0, err
  225. }
  226. message, err := repo.MessageRepo.GetMessage(sender.SenderId, msg.RecallSeq)
  227. if err != nil {
  228. return 0, err
  229. }
  230. // 发给发送者
  231. seq, err := proxy.MessageProxy.RecallMessageSendToUser(ctx, sender, sender.SenderId, req, message.SendTime)
  232. if err != nil {
  233. return 0, err
  234. }
  235. // 发给接收者
  236. _, err = proxy.MessageProxy.RecallMessageSendToUser(ctx, sender, req.ReceiverId, req, message.SendTime)
  237. if err != nil {
  238. return 0, err
  239. }
  240. return seq, nil
  241. }
  242. // RedPackageMessageSendToFriend 红包发送至好友
  243. func (*friendService) RedPackageMessageSendToFriend(ctx context.Context, sender *pb.Sender, req *pb.SendRedPacketReq) (int64, error) {
  244. //TODO::判断是否为好友
  245. friend, err := FriendRepo.Get(sender.SenderId, req.ReceiverId)
  246. if err != nil {
  247. return 0, err
  248. }
  249. if friend == nil || friend.Status != FriendStatusAgree {
  250. return 0, gerrors.ErrNotIsFriend
  251. }
  252. utils.FilePutContents("RedPackageMessageSendToFriend", utils.SerializeStr(map[string]interface{}{
  253. "send": sender,
  254. "req": req,
  255. }))
  256. // 发给发送者
  257. seq, err := proxy.MessageProxy.SendRedPackageToUser(ctx, sender, sender.SenderId, req)
  258. if err != nil {
  259. return 0, err
  260. }
  261. // 发给接收者
  262. _, err = proxy.MessageProxy.SendRedPackageToUser(ctx, sender, req.ReceiverId, req)
  263. if err != nil {
  264. return 0, err
  265. }
  266. return seq, nil
  267. }