diff --git a/_const/redis_key/group_k/enter_room.go b/_const/redis_key/group_k/enter_room.go new file mode 100644 index 0000000000000000000000000000000000000000..3e01264b2d6977596ea4eb863faefa0041172d1d --- /dev/null +++ b/_const/redis_key/group_k/enter_room.go @@ -0,0 +1,21 @@ +package group_k + +import ( + "fmt" + "hilo-group/_const/redis_key" +) + +// 用户进房的key +const ( + UserEnterRoomPrefix = "uer:" + UserEnterRoomUserKey = UserEnterRoomPrefix + "u:${user_id}" + UserEnterRoomGroupKey = UserEnterRoomPrefix + "g:${user_id}" +) + +func GetUserEnterRoomUserKey(userId uint64) string { + return redis_key.ReplaceKey(UserEnterRoomUserKey, fmt.Sprintf("%d", userId)) +} + +func GetUserEnterRoomGroupKey(groupId string) string { + return redis_key.ReplaceKey(UserEnterRoomGroupKey, groupId) +} diff --git a/domain/cache/group_c/enter_room.go b/domain/cache/group_c/enter_room.go new file mode 100644 index 0000000000000000000000000000000000000000..814ce8b0c0062473a5b3bae6240714edf3da68d3 --- /dev/null +++ b/domain/cache/group_c/enter_room.go @@ -0,0 +1,71 @@ +package group_c + +import ( + "fmt" + "git.hilo.cn/hilo-common/domain" + "github.com/go-redis/redis/v8" + "hilo-group/_const/redis_key/group_k" + "strconv" + "time" +) + +// 用户进房 +func ZAddUserEnterRoom(model *domain.Model, userId uint64, imGroupId string) { + userKey := group_k.GetUserEnterRoomUserKey(userId) + groupKey := group_k.GetUserEnterRoomGroupKey(imGroupId) + if err := model.Redis.ZAdd(model, userKey, &redis.Z{ + Score: float64(time.Now().Unix()), + Member: imGroupId, + }).Err(); err != nil { + model.Log.Errorf("ZAddUserEnterRoom user fail:%v", err) + } + if err := model.Redis.ZAdd(model, groupKey, &redis.Z{ + Score: float64(time.Now().Unix()), + Member: userId, + }).Err(); err != nil { + model.Log.Errorf("ZAddUserEnterRoom room fail:%v", err) + } +} + +// 获取最近房间访客 +func GetLastRoomVisitors(model *domain.Model, imGroupId string) (userIds []uint64) { + groupKey := group_k.GetUserEnterRoomGroupKey(imGroupId) + res, err := model.Redis.ZRangeByScore(model, groupKey, &redis.ZRangeBy{ + Min: fmt.Sprintf("%d", time.Now().AddDate(0, 0, -15).Unix()), + Max: "+inf", + }).Result() + if err != nil { + return + } + for _, u := range res { + uid, _ := strconv.ParseUint(u, 10, 64) + if uid > 0 { + userIds = append(userIds, uid) + } + } + return +} + +// 获取最近进入的房间 +func GetUserRecentRooms(model *domain.Model, userId uint64) (imGroupIds []string) { + userKey := group_k.GetUserEnterRoomUserKey(userId) + var err error + imGroupIds, err = model.Redis.ZRangeByScore(model, userKey, &redis.ZRangeBy{ + Min: fmt.Sprintf("%d", time.Now().AddDate(0, 0, -15).Unix()), + Max: "+inf", + }).Result() + if err != nil { + return + } + return +} + +// 清理房间访客 +// 15天前访问的 +func RemoveRoomVisitors(model *domain.Model, imGroupId string) { + groupKey := group_k.GetUserEnterRoomGroupKey(imGroupId) + err := model.Redis.ZRemRangeByScore(model, groupKey, "-inf", fmt.Sprintf("%d", time.Now().AddDate(0, 0, -15).Unix())).Err() + if err != nil { + model.Log.Errorf("RemoveRoomVisitors fail:%v", err) + } +} diff --git a/domain/service/event_s/event_init.go b/domain/service/event_s/event_init.go index dfb64068e9eb1d2f935d528fb049f688c499680d..80447d9334dea82c7141d048b4dab4380ac2e8de 100644 --- a/domain/service/event_s/event_init.go +++ b/domain/service/event_s/event_init.go @@ -10,6 +10,7 @@ import ( "hilo-group/_const/enum/group_e" "hilo-group/_const/enum/msg_e" "hilo-group/_const/enum/task_e" + "hilo-group/domain/cache/group_c" "hilo-group/domain/event/gift_ev" "hilo-group/domain/event/group_ev" "hilo-group/domain/event/group_power_ev" @@ -246,6 +247,7 @@ func GroupEvents() { } err := uer.Save(model.Db) model.Log.Infof("AddGroupInAsync, UserEnterRoom err: %v", err) + group_c.ZAddUserEnterRoom(model, event.UserId, event.GroupId) // redis存储 return err }) diff --git a/release.ini b/release.ini index ba72927d76fe8c142e8d1a79a34eb4378874b68d..64eee6d6ada4cb0fcbd7b7dfa58cf001eee1552d 100644 --- a/release.ini +++ b/release.ini @@ -1,6 +1,6 @@ [DATABASE] MYSQL_HOST=ua4papc3hmgqf351pbej-rw4rm.rwlb.dubai.rds.aliyuncs.com -MYSQL_USERNAME=nextvideo +MYSQL_USERNAME=hilo_group MYSQL_PASSWORD=ihlUwI4nhi9W88MI MYSQL_DB=hilo [DATABASECODE] diff --git a/route/group_r/group_op.go b/route/group_r/group_op.go index e18b6ac60e22b9f18948cefcd43234dadb4d14d1..120bc8f9f96993204edb329816f85e54b91ed042 100644 --- a/route/group_r/group_op.go +++ b/route/group_r/group_op.go @@ -448,7 +448,7 @@ func GetGroupDetail(c *gin.Context) (*mycontext.MyContext, error) { result.Role = group_e.GROUP_MEMBER } - groupUser := group_m.GroupUser{Model: model, UserId: userId} + groupUser := group_m.GroupUser{Model: model, UserId: userId, GroupId: groupId} msgStatus, err := groupUser.Get() if err != nil { return myContext, err