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 })