From ef4b6018fee3da258e41fa035dfbd33dd7bb3c28 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 26 May 2023 18:02:58 +0800 Subject: [PATCH 01/25] feature/cp-new --- cron/gift_cron/remark.go | 1 + domain/model/event_m/send_gift.go | 1 + 2 files changed, 2 insertions(+) diff --git a/cron/gift_cron/remark.go b/cron/gift_cron/remark.go index 5dc8309..bc8ff85 100644 --- a/cron/gift_cron/remark.go +++ b/cron/gift_cron/remark.go @@ -30,6 +30,7 @@ func GiftRemark() { Payload: unmark.Payload, MarkHiloGroup: unmark.MarkHiloGroup, Mark: unmark.Mark, // 不能影响别的服务的mark状态 + MarkHiloUser: unmark.MarkHiloUser, }); err != nil { model.Log.Errorf("FetchUnMarkEvent add unmark fail:%v", err) continue diff --git a/domain/model/event_m/send_gift.go b/domain/model/event_m/send_gift.go index eee3a7d..0df1021 100644 --- a/domain/model/event_m/send_gift.go +++ b/domain/model/event_m/send_gift.go @@ -16,6 +16,7 @@ type EventGiftSend struct { Payload []byte Mark mysql.YesNo MarkHiloGroup mysql.YesNo + MarkHiloUser mysql.YesNo } func (EventGiftSend) TableName() string { -- 2.22.0 From 8b63b8f3173983519333b0e30be36f4bde983e12 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 9 Jun 2023 18:06:49 +0800 Subject: [PATCH 02/25] =?UTF-8?q?feat:=E8=AF=95=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/group_m/mic.go | 38 +++++++--------------- domain/model/group_m/micData.go | 7 ++++ domain/service/group_mic_s/group_mic.go | 43 +++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/domain/model/group_m/mic.go b/domain/model/group_m/mic.go index 4d40b3a..cb0e448 100644 --- a/domain/model/group_m/mic.go +++ b/domain/model/group_m/mic.go @@ -124,8 +124,10 @@ type MicUser struct { I int //麦中的人 ExternalId string - // + //用户id UserId uint64 + //用户cpId + CpUserId uint64 //静音 true:静音,false:没有静音 Forbid bool //上麦的的时间戳 @@ -189,7 +191,8 @@ const micInScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic}') i //上麦(自己), //规则:1:加锁了不能上麦 2:麦上有人,不能上麦 -func (mic *Mic) In(userId uint64, externalId string) error { +//cpUserId如果有 +func (mic *Mic) In(userId uint64, externalId string, cpUserId uint64) error { // 群是否被封禁, 呃,,,呃,,,呃,,, banned := GroupBanned{ImGroupId: mic.GroupUuid} if err := banned.Get(mic.model); err != gorm.ErrRecordNotFound { @@ -214,33 +217,13 @@ func (mic *Mic) In(userId uint64, externalId string) error { I: mic.I, ExternalId: externalId, UserId: userId, + CpUserId: cpUserId, Forbid: false, Timestamp: time.Now().Unix(), }) if err != nil { return err } - //让自己踢出去。 - /* if str, err := redisCli.GetRedis().Get(context.Background(), redis_key.GetPrefixGroupUserInMic(externalId)).Result(); err != nil { - if err != redis2.Nil { - return myerr.WrapErr(err) - } - } else { - if userInMic, err := strToUserInMic(str); err != nil { - return err - } else { - if micUser, err := GetMicUser(mic.model, userInMic.GroupUuid, userInMic.I); err != nil { - return err - } else { - if micUser != nil { - if err := micUser.LeaveByUser(userId, externalId); err != nil { - return err - } - } - } - } - }*/ - //加入到麦上可能有人的集合中。 groupMicHasIn(mic.model, mic.GroupUuid, userId) @@ -250,12 +233,15 @@ func (mic *Mic) In(userId uint64, externalId string) error { if err != nil { return err } - //r, err := redis2.NewScript(micInScript).Run(context.Background(), redisCli.GetRedis(), []string{redis.GetPrefixGroupMicUser(mic.groupUuid), strconv.Itoa(mic.i), redis.GetPrefixGroupUserMic(), externalId}, micUserStr, groupUserStr).Result() script := strings.Replace(strings.Replace( strings.Replace( strings.Replace( - strings.Replace(micInScript, "{micExpire}", strconv.Itoa(expireMinute), -1), "{prefixGroupMicUser}", redis_key.GetPrefixGroupMicUser(mic.GroupUuid, mic.I), -1), "{micUserStr}", micUserStr, -1), "{prefixGroupUserMic}", redis_key.GetPrefixGroupUserInMic(externalId), -1), "{groupUserStr}", groupUserStr, -1) - //redisCli.GetRedis().ScriptFlush(context.Background()) + strings.Replace(micInScript, + "{micExpire}", strconv.Itoa(expireMinute), -1), + "{prefixGroupMicUser}", redis_key.GetPrefixGroupMicUser(mic.GroupUuid, mic.I), -1), + "{micUserStr}", micUserStr, -1), + "{prefixGroupUserMic}", redis_key.GetPrefixGroupUserInMic(externalId), -1), + "{groupUserStr}", groupUserStr, -1) r, err := redis2.NewScript(script).Run(context.Background(), redisCli.GetRedis(), []string{}).Result() mic.model.Log.Infof("micUser In micInScript:%v, result:%v", script, r) d := r.(int64) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index c352df5..f5a39da 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -42,6 +42,13 @@ type MicContent struct { Timestamp int64 `json:"timestamp"` //用户 User *MicUserData `json:"user"` + //cp特效 + CpEffect *CpEffect `json:"cpEffect"` +} + +type CpEffect struct { + Svga string `json:"svga"` + CpAvatar string `json:"cpAvatar"` } type MicUserData struct { diff --git a/domain/service/group_mic_s/group_mic.go b/domain/service/group_mic_s/group_mic.go index 646e76a..df6c52e 100644 --- a/domain/service/group_mic_s/group_mic.go +++ b/domain/service/group_mic_s/group_mic.go @@ -6,12 +6,14 @@ import ( "git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/mycontext" "git.hilo.cn/hilo-common/resource/redisCli" + "git.hilo.cn/hilo-common/rpc" uuid "github.com/satori/go.uuid" "hilo-group/_const/enum/group_e" "hilo-group/_const/redis_key" "hilo-group/domain/event/group_ev" "hilo-group/domain/model/groupPower_m" "hilo-group/domain/model/group_m" + "hilo-group/domain/model/user_m" "hilo-group/domain/service/signal_s" "hilo-group/myerr" "hilo-group/myerr/bizerr" @@ -124,14 +126,51 @@ func redisLock(key string, sign string, expiration time.Duration, callBack func( //加入麦位,锁两秒 func (s *GroupMicService) GroupMicIn(groupUuid string, i int, userId uint64, externalId string) error { - return redisLock(redis_key.GetPrefixGroupMicUserInLock(userId), uuid.NewV4().String(), time.Second*2, func() error { + model := domain.CreateModelContext(s.svc.MyContext) + // 填充cp麦位 + var cpUserId uint64 + var cpI int + if cpRelation, _ := rpc.GetUserCpRelation(model, userId); cpRelation != nil { + micNumType, err := group_m.GetMicNumType(model, groupUuid) + if err != nil { + return err + } + _, micUsers, err := group_m.GetAllMic(groupUuid, micNumType) + if err != nil { + return err + } + for _, u := range micUsers { + if u.UserId == cpRelation.CpUserId { + cpUserId = u.UserId + cpI = u.I + break + } + } + } + err := redisLock(redis_key.GetPrefixGroupMicUserInLock(userId), uuid.NewV4().String(), time.Second*2, func() error { model := domain.CreateModel(s.svc.CtxAndDb) mic, err := group_m.GetMic(model, groupUuid, i) if err != nil { return err } - return mic.In(userId, externalId) + return mic.In(userId, externalId, cpUserId) }) + if err != nil { + return err + } + // 更新麦上cp的信息 + if cpUserId > 0 { + user, _ := user_m.GetUser(model, cpUserId) + return redisLock(redis_key.GetPrefixGroupMicUserInLock(cpUserId), uuid.NewV4().String(), time.Second*2, func() error { + model := domain.CreateModel(s.svc.CtxAndDb) + mic, err := group_m.GetMic(model, groupUuid, cpI) + if err != nil { + return err + } + return mic.In(cpUserId, user.ExternalId, userId) + }) + } + return nil } //离开麦位 -- 2.22.0 From 8f9581ecf260f6b450d6623258485c43aa52b28e Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 9 Jun 2023 18:29:43 +0800 Subject: [PATCH 03/25] (mic *Mic) Update --- domain/model/group_m/mic.go | 78 +++++++++++++++++++++++++ domain/service/group_mic_s/group_mic.go | 2 +- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/domain/model/group_m/mic.go b/domain/model/group_m/mic.go index cb0e448..e4fecae 100644 --- a/domain/model/group_m/mic.go +++ b/domain/model/group_m/mic.go @@ -186,6 +186,7 @@ func UpdateMicExpire(model *domain.Model, groupUuid string, externalId string) e //2022-07-20 升级,判断是自己是否已经在别的麦上了 //const micInScript = "local flag = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'nx') if flag ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 " const micInScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic}') if flag == 0 then local flag1 = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'nx') if flag1 ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 end return 3" +const micUpdateScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic}') if flag == 1 then local flag1 = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'nx') if flag1 ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 end return 3" // @@ -266,6 +267,83 @@ func (mic *Mic) In(userId uint64, externalId string, cpUserId uint64) error { return nil } +//上麦(自己), +//规则:1:加锁了不能上麦 2:麦上有人,不能上麦 +//cpUserId如果有 +func (mic *Mic) Update(userId uint64, externalId string, cpUserId uint64) error { + // 群是否被封禁, 呃,,,呃,,,呃,,, + banned := GroupBanned{ImGroupId: mic.GroupUuid} + if err := banned.Get(mic.model); err != gorm.ErrRecordNotFound { + return bizerr.GroupIsBanned + } + //判断群组设置上的麦 是否被关闭 + groupInfo, err := GetGroupInfo(mic.model, mic.GroupUuid) + if err != nil { + return err + } + if groupInfo.MicOn == false { + return bizerr.GroupInfoMicClosed + } + + //麦被加锁了 + if mic.Lock { + return bizerr.GroupMicLock + } + //设置值到redis + micUserStr, err := micUserToStr(MicUser{ + GroupUuid: mic.GroupUuid, + I: mic.I, + ExternalId: externalId, + UserId: userId, + CpUserId: cpUserId, + Forbid: false, + Timestamp: time.Now().Unix(), + }) + if err != nil { + return err + } + //加入到麦上可能有人的集合中。 + groupMicHasIn(mic.model, mic.GroupUuid, userId) + + //lua上麦,让麦上的人同人在麦上,保持原子性操作 + //清理脚本,不然redis占用内存越来越高,并且不会释放 + groupUserStr, err := userInMicToStr(mic.GroupUuid, mic.I, userId) + if err != nil { + return err + } + script := strings.Replace(strings.Replace( + strings.Replace( + strings.Replace( + strings.Replace(micUpdateScript, + "{micExpire}", strconv.Itoa(expireMinute), -1), + "{prefixGroupMicUser}", redis_key.GetPrefixGroupMicUser(mic.GroupUuid, mic.I), -1), + "{micUserStr}", micUserStr, -1), + "{prefixGroupUserMic}", redis_key.GetPrefixGroupUserInMic(externalId), -1), + "{groupUserStr}", groupUserStr, -1) + r, err := redis2.NewScript(script).Run(context.Background(), redisCli.GetRedis(), []string{}).Result() + mic.model.Log.Infof("micUser In micInScript:%v, result:%v", script, r) + d := r.(int64) + if err != nil { + return myerr.WrapErr(err) + } + if d == int64(2) { + return bizerr.GroupMicHasUser + } + if d == int64(3) { + return bizerr.GroupMicUserHasIn + } + + //离开动作已结束,增加到队列中 + MicChangeRPush(mic.model, mic.GroupUuid, mic.I) + + // 发信令,让前端重新拉取,接受容错, + sendSignalMsg(mic.model, mic.GroupUuid, GroupSystemMsg{ + MsgId: group_e.GroupMicInSignal, + Source: externalId, + }, false) + return nil +} + const micLeaveScript = "local flag = redis.call('DEL', '{prefixGroupMicUser}') if flag == 1 then return redis.call('Del', '{prefixGroupUserMic}') end return 2 " //离开麦(自己) diff --git a/domain/service/group_mic_s/group_mic.go b/domain/service/group_mic_s/group_mic.go index df6c52e..546d608 100644 --- a/domain/service/group_mic_s/group_mic.go +++ b/domain/service/group_mic_s/group_mic.go @@ -167,7 +167,7 @@ func (s *GroupMicService) GroupMicIn(groupUuid string, i int, userId uint64, ext if err != nil { return err } - return mic.In(cpUserId, user.ExternalId, userId) + return mic.Update(cpUserId, user.ExternalId, userId) }) } return nil -- 2.22.0 From c0aa40978c424c8535a0786723953d3c47251a8d Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 9 Jun 2023 18:50:34 +0800 Subject: [PATCH 04/25] set xx --- domain/model/group_m/mic.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/model/group_m/mic.go b/domain/model/group_m/mic.go index e4fecae..31f0268 100644 --- a/domain/model/group_m/mic.go +++ b/domain/model/group_m/mic.go @@ -186,7 +186,7 @@ func UpdateMicExpire(model *domain.Model, groupUuid string, externalId string) e //2022-07-20 升级,判断是自己是否已经在别的麦上了 //const micInScript = "local flag = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'nx') if flag ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 " const micInScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic}') if flag == 0 then local flag1 = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'nx') if flag1 ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 end return 3" -const micUpdateScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic}') if flag == 1 then local flag1 = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'nx') if flag1 ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 end return 3" +const micUpdateScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic}') if flag == 1 then local flag1 = redis.call('SET', '{prefixGroupMicUser}', '{micUserStr}', 'ex', '{micExpire}', 'xx') if flag1 ~= false then redis.call('SETEX', '{prefixGroupUserMic}', '{micExpire}', '{groupUserStr}') return 1 end return 2 end return 3" // -- 2.22.0 From 5dc1ce3a0a3a1c193bd7440f7787408c33e1547e Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 9 Jun 2023 19:41:20 +0800 Subject: [PATCH 05/25] =?UTF-8?q?check=20cp=20=E9=BA=A6=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/group_m/mic.go | 3 +- domain/service/group_mic_s/group_mic.go | 93 ++++++++++++++----------- route/group_r/group_mic.go | 2 + 3 files changed, 57 insertions(+), 41 deletions(-) diff --git a/domain/model/group_m/mic.go b/domain/model/group_m/mic.go index 31f0268..7fc0bb4 100644 --- a/domain/model/group_m/mic.go +++ b/domain/model/group_m/mic.go @@ -193,7 +193,7 @@ const micUpdateScript = "local flag = redis.call('EXISTS', '{prefixGroupUserMic} //上麦(自己), //规则:1:加锁了不能上麦 2:麦上有人,不能上麦 //cpUserId如果有 -func (mic *Mic) In(userId uint64, externalId string, cpUserId uint64) error { +func (mic *Mic) In(userId uint64, externalId string) error { // 群是否被封禁, 呃,,,呃,,,呃,,, banned := GroupBanned{ImGroupId: mic.GroupUuid} if err := banned.Get(mic.model); err != gorm.ErrRecordNotFound { @@ -218,7 +218,6 @@ func (mic *Mic) In(userId uint64, externalId string, cpUserId uint64) error { I: mic.I, ExternalId: externalId, UserId: userId, - CpUserId: cpUserId, Forbid: false, Timestamp: time.Now().Unix(), }) diff --git a/domain/service/group_mic_s/group_mic.go b/domain/service/group_mic_s/group_mic.go index 546d608..e3dc63d 100644 --- a/domain/service/group_mic_s/group_mic.go +++ b/domain/service/group_mic_s/group_mic.go @@ -126,51 +126,14 @@ func redisLock(key string, sign string, expiration time.Duration, callBack func( //加入麦位,锁两秒 func (s *GroupMicService) GroupMicIn(groupUuid string, i int, userId uint64, externalId string) error { - model := domain.CreateModelContext(s.svc.MyContext) - // 填充cp麦位 - var cpUserId uint64 - var cpI int - if cpRelation, _ := rpc.GetUserCpRelation(model, userId); cpRelation != nil { - micNumType, err := group_m.GetMicNumType(model, groupUuid) - if err != nil { - return err - } - _, micUsers, err := group_m.GetAllMic(groupUuid, micNumType) - if err != nil { - return err - } - for _, u := range micUsers { - if u.UserId == cpRelation.CpUserId { - cpUserId = u.UserId - cpI = u.I - break - } - } - } - err := redisLock(redis_key.GetPrefixGroupMicUserInLock(userId), uuid.NewV4().String(), time.Second*2, func() error { + return redisLock(redis_key.GetPrefixGroupMicUserInLock(userId), uuid.NewV4().String(), time.Second*2, func() error { model := domain.CreateModel(s.svc.CtxAndDb) mic, err := group_m.GetMic(model, groupUuid, i) if err != nil { return err } - return mic.In(userId, externalId, cpUserId) + return mic.In(userId, externalId) }) - if err != nil { - return err - } - // 更新麦上cp的信息 - if cpUserId > 0 { - user, _ := user_m.GetUser(model, cpUserId) - return redisLock(redis_key.GetPrefixGroupMicUserInLock(cpUserId), uuid.NewV4().String(), time.Second*2, func() error { - model := domain.CreateModel(s.svc.CtxAndDb) - mic, err := group_m.GetMic(model, groupUuid, cpI) - if err != nil { - return err - } - return mic.Update(cpUserId, user.ExternalId, userId) - }) - } - return nil } //离开麦位 @@ -367,3 +330,55 @@ func (s *GroupMicService) IncrGroupPowerOnMicExpAndTime(groupId string, userId u } return nil } + +func (s *GroupMicService) CheckCpOnMic(groupUuid string) { + model := domain.CreateModelContext(s.svc.MyContext) + // 填充cp麦位 + micNumType, err := group_m.GetMicNumType(model, groupUuid) + if err != nil { + return + } + _, micUsers, err := group_m.GetAllMic(groupUuid, micNumType) + if err != nil { + return + } + // userId->micIndex + var userMicIndex = make(map[uint64]int) + var userIds []uint64 + for _, u := range micUsers { + userMicIndex[u.UserId] = u.I + userIds = append(userIds, u.UserId) + } + cpPairs, err := rpc.MGetUserCpPairs(model, userIds) + // 更新麦上cp的信息 + if err != nil { + model.Log.Errorf("MGetUserCpPairs fail:%v", err) + return + } + users, err := user_m.GetUserMapByIds(model, userIds) + if err != nil { + model.Log.Errorf("GetUserMapByIds fail:%v", err) + return + } + for _, pairs := range cpPairs { + userId := pairs[0] + cpUserId := pairs[1] + redisLock(redis_key.GetPrefixGroupMicUserInLock(userId), uuid.NewV4().String(), time.Second*2, func() error { + model := domain.CreateModel(s.svc.CtxAndDb) + mic, err := group_m.GetMic(model, groupUuid, userMicIndex[userId]) + if err != nil { + return err + } + return mic.Update(userId, users[userId].ExternalId, cpUserId) + }) + redisLock(redis_key.GetPrefixGroupMicUserInLock(cpUserId), uuid.NewV4().String(), time.Second*2, func() error { + model := domain.CreateModel(s.svc.CtxAndDb) + mic, err := group_m.GetMic(model, groupUuid, userMicIndex[cpUserId]) + if err != nil { + return err + } + return mic.Update(cpUserId, users[cpUserId].ExternalId, userId) + }) + } + return +} diff --git a/route/group_r/group_mic.go b/route/group_r/group_mic.go index a1c999d..b3c02f2 100644 --- a/route/group_r/group_mic.go +++ b/route/group_r/group_mic.go @@ -600,6 +600,8 @@ func GroupMicIn(c *gin.Context) (*mycontext.MyContext, error) { } else { resp.ResponseOk(c, nil) } + // check cp 麦位置 + go group_mic_s.NewGroupPowerService(myContext).CheckCpOnMic(groupUuid) return myContext, nil } -- 2.22.0 From 2675111c96cad74ece280efe7327f2aada2bebe7 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 9 Jun 2023 19:52:42 +0800 Subject: [PATCH 06/25] =?UTF-8?q?=E6=A3=80=E6=9F=A5cp=E4=B8=8B=E9=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/service/group_mic_s/group_mic.go | 41 +++++++++++++++++++++++++ route/group_r/group_mic.go | 2 ++ 2 files changed, 43 insertions(+) diff --git a/domain/service/group_mic_s/group_mic.go b/domain/service/group_mic_s/group_mic.go index e3dc63d..fe60001 100644 --- a/domain/service/group_mic_s/group_mic.go +++ b/domain/service/group_mic_s/group_mic.go @@ -331,6 +331,7 @@ func (s *GroupMicService) IncrGroupPowerOnMicExpAndTime(groupId string, userId u return nil } +// 检查cp上麦 func (s *GroupMicService) CheckCpOnMic(groupUuid string) { model := domain.CreateModelContext(s.svc.MyContext) // 填充cp麦位 @@ -382,3 +383,43 @@ func (s *GroupMicService) CheckCpOnMic(groupUuid string) { } return } + +// 检查cp下麦 +func (s *GroupMicService) CheckCpLeaveMic(groupUuid string, leaveUid uint64) { + model := domain.CreateModelContext(s.svc.MyContext) + // 填充cp麦位 + micNumType, err := group_m.GetMicNumType(model, groupUuid) + if err != nil { + return + } + _, micUsers, err := group_m.GetAllMic(groupUuid, micNumType) + if err != nil { + return + } + // userId->micIndex + var userMicIndex = make(map[uint64]int) + var cpUserId uint64 + for _, u := range micUsers { + if u.UserId == leaveUid { + cpUserId = u.CpUserId + } + userMicIndex[u.UserId] = u.I + } + if cpUserId <= 0 { + return + } + user, err := user_m.GetUser(model, cpUserId) + if err != nil { + model.Log.Errorf("GetUser fail:%v", err) + return + } + redisLock(redis_key.GetPrefixGroupMicUserInLock(cpUserId), uuid.NewV4().String(), time.Second*2, func() error { + model := domain.CreateModel(s.svc.CtxAndDb) + mic, err := group_m.GetMic(model, groupUuid, userMicIndex[cpUserId]) + if err != nil { + return err + } + return mic.Update(cpUserId, user.ExternalId, 0) + }) + return +} diff --git a/route/group_r/group_mic.go b/route/group_r/group_mic.go index b3c02f2..2cb2a72 100644 --- a/route/group_r/group_mic.go +++ b/route/group_r/group_mic.go @@ -705,6 +705,8 @@ func GroupMicLeave(c *gin.Context) (*mycontext.MyContext, error) { if err := group_mic_s.NewGroupPowerService(myContext).GroupMicLeave(groupId, i, userId, externalId); err != nil { return myContext, err } + // check cp麦位置 + go group_mic_s.NewGroupPowerService(myContext).CheckCpLeaveMic(groupId, userId) resp.ResponseOk(c, nil) return myContext, nil } -- 2.22.0 From ad45092087d880c48b3ff3f82d7fe53de829177e Mon Sep 17 00:00:00 2001 From: hujiebin Date: Fri, 9 Jun 2023 19:55:34 +0800 Subject: [PATCH 07/25] =?UTF-8?q?=E4=B8=8B=E9=BA=A6=E5=89=8D=E5=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/group_r/group_mic.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/route/group_r/group_mic.go b/route/group_r/group_mic.go index 2cb2a72..c85a300 100644 --- a/route/group_r/group_mic.go +++ b/route/group_r/group_mic.go @@ -701,12 +701,12 @@ func GroupMicLeave(c *gin.Context) (*mycontext.MyContext, error) { return myContext, err } } + // check cp麦位置 + group_mic_s.NewGroupPowerService(myContext).CheckCpLeaveMic(groupId, userId) if err := group_mic_s.NewGroupPowerService(myContext).GroupMicLeave(groupId, i, userId, externalId); err != nil { return myContext, err } - // check cp麦位置 - go group_mic_s.NewGroupPowerService(myContext).CheckCpLeaveMic(groupId, userId) resp.ResponseOk(c, nil) return myContext, nil } -- 2.22.0 From ca28998e6bc1639b59f975af08071a0f33502c46 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 13 Jun 2023 09:54:27 +0800 Subject: [PATCH 08/25] Create test.lua --- test/test.lua | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 test/test.lua diff --git a/test/test.lua b/test/test.lua new file mode 100644 index 0000000..6e56545 --- /dev/null +++ b/test/test.lua @@ -0,0 +1,7 @@ +local flag = redis.call('EXISTS', 'group_user_in_mic_88913f81dc704b9e8e0a8b38956ee8b3') +if flag == 0 + then local flag1 = redis.call('SET', 'group_mic_user_HTGS#a91394382_1', '{"GroupUuid":"HTGS#a91394382","I":1,"ExternalId":"88913f81dc704b9e8e0a8b38956ee8b3","UserId":7642,"CpUserId":4549,"Forbid":false,"Timestamp":1686305425}', 'ex', '43200', 'nx') + if flag1 ~= false then redis.call('SETEX', 'group_user_in_mic_88913f81dc704b9e8e0a8b38956ee8b3', '43200', '{"GroupUuid":"HTGS#a91394382","I":1,"UserId":7642}') + return 1 end + return 2 end + return 3 \ No newline at end of file -- 2.22.0 From 9a6935a4741d3d71f4b2917dbf1fef43568dc3b1 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 13 Jun 2023 09:57:02 +0800 Subject: [PATCH 09/25] Update micData.go --- domain/model/group_m/micData.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index f5a39da..56bc45d 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -42,11 +42,11 @@ type MicContent struct { Timestamp int64 `json:"timestamp"` //用户 User *MicUserData `json:"user"` - //cp特效 - CpEffect *CpEffect `json:"cpEffect"` + //mic位置特效 + MicEffect *MicEffect `json:"micEffect"` } -type CpEffect struct { +type MicEffect struct { Svga string `json:"svga"` CpAvatar string `json:"cpAvatar"` } -- 2.22.0 From f4ddec6e494878fd9d165f5302d4c6e22cc73f35 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 13 Jun 2023 10:01:02 +0800 Subject: [PATCH 10/25] Update micData.go --- domain/model/group_m/micData.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index 56bc45d..a7077bf 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -42,13 +42,10 @@ type MicContent struct { Timestamp int64 `json:"timestamp"` //用户 User *MicUserData `json:"user"` - //mic位置特效 - MicEffect *MicEffect `json:"micEffect"` -} - -type MicEffect struct { - Svga string `json:"svga"` - CpAvatar string `json:"cpAvatar"` + //mic位置特效svga + MicEffect string `json:"micEffect"` + //头饰里面的小头像 + HeadwearIcon string `json:"headwearIcon"` } type MicUserData struct { -- 2.22.0 From c89e9806c2d8b8bfcad3c2aae5245a3d1fafa69a Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 13 Jun 2023 14:25:04 +0800 Subject: [PATCH 11/25] =?UTF-8?q?mic=E4=BD=8D=E7=BD=AE=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/group_m/micData.go | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index a7077bf..e3df977 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -398,16 +398,26 @@ func getMicIContent(model *domain.Model, groupId string, i int) (MicContent, err if err != nil { return MicContent{}, err } + var micEffect string + var headwearIcon string + if micUser.CpUserId > 0 { + if cpUser, _ := user_m.GetUser(model, micUser.CpUserId); cpUser != nil { + headwearIcon = cpUser.Avatar + } + micEffect = "https://image.whoisamy.shop/hilo/manager/b44eef9674524451b9aa4ba6d34540e9.svga" // todo ui + } return MicContent{ - GroupId: txGroupId, - I: mic.I, - Lock: mic.Lock, - Forbid: micUser.Forbid, - MicForbid: mic.MicForbid, - ExternalId: micUser.ExternalId, - AgoraId: uint32(micUser.UserId), - Timestamp: time.Now().UnixNano(), - User: micUserData, + GroupId: txGroupId, + I: mic.I, + Lock: mic.Lock, + Forbid: micUser.Forbid, + MicForbid: mic.MicForbid, + ExternalId: micUser.ExternalId, + AgoraId: uint32(micUser.UserId), + Timestamp: time.Now().UnixNano(), + User: micUserData, + MicEffect: micEffect, + HeadwearIcon: headwearIcon, }, nil } -- 2.22.0 From 5a2d99c51d8660ae74d76b53fff9068763fa2fcd Mon Sep 17 00:00:00 2001 From: hujiebin Date: Tue, 13 Jun 2023 14:29:58 +0800 Subject: [PATCH 12/25] Update factory.go --- domain/model/group_m/factory.go | 1 + 1 file changed, 1 insertion(+) diff --git a/domain/model/group_m/factory.go b/domain/model/group_m/factory.go index ebdd1d5..7313a09 100644 --- a/domain/model/group_m/factory.go +++ b/domain/model/group_m/factory.go @@ -455,6 +455,7 @@ func GetMicUser(model *domain.Model, groupUuid string, i int) (*MicUser, error) I: i, ExternalId: micUser.ExternalId, UserId: micUser.UserId, + CpUserId: micUser.CpUserId, Forbid: micUser.Forbid, Timestamp: micUser.Timestamp, }, nil -- 2.22.0 From bc9fd55e7d952abc88a912194a48f80ec5d0ac9e Mon Sep 17 00:00:00 2001 From: hujiebin Date: Wed, 14 Jun 2023 12:06:51 +0800 Subject: [PATCH 13/25] micEffect --- domain/model/group_m/micData.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index e3df977..350fbd1 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -404,7 +404,7 @@ func getMicIContent(model *domain.Model, groupId string, i int) (MicContent, err if cpUser, _ := user_m.GetUser(model, micUser.CpUserId); cpUser != nil { headwearIcon = cpUser.Avatar } - micEffect = "https://image.whoisamy.shop/hilo/manager/b44eef9674524451b9aa4ba6d34540e9.svga" // todo ui + micEffect = "https://image.whoisamy.shop/hilo/resource/svga/mic_effect_cp.svga" } return MicContent{ GroupId: txGroupId, -- 2.22.0 From 86bd19b109222944d69b187d64ff8f1cb505fa01 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Wed, 14 Jun 2023 16:34:05 +0800 Subject: [PATCH 14/25] =?UTF-8?q?feat:=E5=8F=8D=E8=BD=ACsvga?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/group_m/micData.go | 80 +++++++++++++++++---------------- domain/model/res_m/headwear.go | 9 ++-- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index 350fbd1..865f324 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -42,25 +42,24 @@ type MicContent struct { Timestamp int64 `json:"timestamp"` //用户 User *MicUserData `json:"user"` - //mic位置特效svga - MicEffect string `json:"micEffect"` - //头饰里面的小头像 - HeadwearIcon string `json:"headwearIcon"` } type MicUserData struct { - Id uint64 `json:"id,omitempty"` - ExternalId string `json:"externalId"` - Avatar string `json:"avatar"` - Nick string `json:"nick"` - Sex uint8 `json:"sex"` - Code string `json:"code"` - IsVip bool `json:"isVip"` - NobleLeave uint16 `json:"noble"` // 当前的贵族等级 - HeadwearPicUrl string `json:"headwearPicUrl"` - HeadwearEffectUrl string `json:"headwearEffectUrl"` - SvipLevel int `json:"svipLevel"` - Svip rpc.CvSvip `json:"svip"` + Id uint64 `json:"id,omitempty"` + ExternalId string `json:"externalId"` + Avatar string `json:"avatar"` + Nick string `json:"nick"` + Sex uint8 `json:"sex"` + Code string `json:"code"` + IsVip bool `json:"isVip"` + NobleLeave uint16 `json:"noble"` // 当前的贵族等级 + HeadwearPicUrl string `json:"headwearPicUrl"` + HeadwearEffectUrl string `json:"headwearEffectUrl"` + HeadwearReverseEffectUrl string `json:"headwearReverseEffectUrl"` // 反转svga效果 + SvipLevel int `json:"svipLevel"` + Svip rpc.CvSvip `json:"svip"` + MicEffect string `json:"micEffect"` //mic位置特效svga + HeadwearIcon string `json:"headwearIcon"` //头饰里面的小头像 } type MicNumChangeContent struct { @@ -405,19 +404,19 @@ func getMicIContent(model *domain.Model, groupId string, i int) (MicContent, err headwearIcon = cpUser.Avatar } micEffect = "https://image.whoisamy.shop/hilo/resource/svga/mic_effect_cp.svga" + micUserData.MicEffect = micEffect + micUserData.HeadwearIcon = headwearIcon } return MicContent{ - GroupId: txGroupId, - I: mic.I, - Lock: mic.Lock, - Forbid: micUser.Forbid, - MicForbid: mic.MicForbid, - ExternalId: micUser.ExternalId, - AgoraId: uint32(micUser.UserId), - Timestamp: time.Now().UnixNano(), - User: micUserData, - MicEffect: micEffect, - HeadwearIcon: headwearIcon, + GroupId: txGroupId, + I: mic.I, + Lock: mic.Lock, + Forbid: micUser.Forbid, + MicForbid: mic.MicForbid, + ExternalId: micUser.ExternalId, + AgoraId: uint32(micUser.UserId), + Timestamp: time.Now().UnixNano(), + User: micUserData, }, nil } @@ -467,23 +466,26 @@ func getMicUserDatas(model *domain.Model, userIds []uint64) (map[uint64]*MicUser } var headwearPicUrl string var headwearEffectUrl string + var reverseHeadwearEffectUrl string if headwearUser, flag := headwearMap[id]; flag { headwearPicUrl = resHeadwearMap[headwearUser.HeadwearId].PicUrl headwearEffectUrl = resHeadwearMap[headwearUser.HeadwearId].EffectUrl + reverseHeadwearEffectUrl = resHeadwearMap[headwearUser.HeadwearId].ReverseEffectUrl } micUserDataMap[id] = &MicUserData{ - Id: user.ID, - ExternalId: user.ExternalId, - Avatar: user.Avatar, - Nick: user.Nick, - Sex: user.Sex, - Code: user.Code, - IsVip: vipFlag, - NobleLeave: nobleMap[id], - HeadwearPicUrl: headwearPicUrl, - HeadwearEffectUrl: headwearEffectUrl, - SvipLevel: svips[id].SvipLevel, - Svip: rpc.CopySimpleSvip(svips[id]), + Id: user.ID, + ExternalId: user.ExternalId, + Avatar: user.Avatar, + Nick: user.Nick, + Sex: user.Sex, + Code: user.Code, + IsVip: vipFlag, + NobleLeave: nobleMap[id], + HeadwearPicUrl: headwearPicUrl, + HeadwearEffectUrl: headwearEffectUrl, + HeadwearReverseEffectUrl: reverseHeadwearEffectUrl, + SvipLevel: svips[id].SvipLevel, + Svip: rpc.CopySimpleSvip(svips[id]), } } return micUserDataMap, nil diff --git a/domain/model/res_m/headwear.go b/domain/model/res_m/headwear.go index 642b325..a14576f 100644 --- a/domain/model/res_m/headwear.go +++ b/domain/model/res_m/headwear.go @@ -10,10 +10,11 @@ import ( type ResHeadwear struct { mysql.Entity - *domain.Model `gorm:"-"` - Name mysql.Str - PicUrl mysql.Str - EffectUrl mysql.Str + *domain.Model `gorm:"-"` + Name mysql.Str + PicUrl mysql.Str + EffectUrl mysql.Str + ReverseEffectUrl mysql.Str } func GetResHeadwearById(model *domain.Model, id mysql.ID) (*ResHeadwear, error) { -- 2.22.0 From 178b1b5adfe00fdadcf97bf9a64817ece831cde3 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Wed, 14 Jun 2023 17:35:08 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E8=BF=9B=E5=9C=BA=E7=89=B9=E6=95=88?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=201:=20CP=202:=E7=A5=9E=E7=A7=98=E4=BA=BA=20?= =?UTF-8?q?3:=E8=B4=B5=E6=97=8F=204:vip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cv/group_cv/group.go | 23 ++++++++++--------- domain/service/group_s/group_op.go | 36 ++++++++++++++++++++++++++++++ route/group_r/group_info.go | 27 ++++++++++++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) diff --git a/cv/group_cv/group.go b/cv/group_cv/group.go index 832e310..22da233 100644 --- a/cv/group_cv/group.go +++ b/cv/group_cv/group.go @@ -166,17 +166,18 @@ type RoomInfo struct { ThemeId uint64 `json:"themeId"` ThemeUrl string `json:"themeUrl"` // 1:官方 2:自定义 - ThemeType uint8 `json:"themeType"` - Role group_e.GroupRoleType `json:"role"` - DiceNum uint16 `json:"diceNum"` // 骰子游戏的数量 - DiceType uint16 `json:"diceType"` // 骰子游戏类型 - RoleMembers []SimpleRoleInfo `json:"roleMembers"` - WelcomeText string `json:"welcomeText"` // 新成员入群欢迎语 - Banners []BannerElement `json:"banners"` - LuckyWheel LuckyWheelState `json:"luckyWheel"` - TotalConsume uint64 `json:"totalConsume"` - GameConfig *game_m.GameConfig `json:"gameConfig"` - Owner *user_cv.CvUserDetail `json:"owner"` + ThemeType uint8 `json:"themeType"` + Role group_e.GroupRoleType `json:"role"` + DiceNum uint16 `json:"diceNum"` // 骰子游戏的数量 + DiceType uint16 `json:"diceType"` // 骰子游戏类型 + RoleMembers []SimpleRoleInfo `json:"roleMembers"` + WelcomeText string `json:"welcomeText"` // 新成员入群欢迎语 + Banners []BannerElement `json:"banners"` + LuckyWheel LuckyWheelState `json:"luckyWheel"` + TotalConsume uint64 `json:"totalConsume"` + GameConfig *game_m.GameConfig `json:"gameConfig"` + Owner *user_cv.CvUserDetail `json:"owner"` + EntryEffectType int `json:"entryEffectType"` // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip } type SupportPageDetail struct { diff --git a/domain/service/group_s/group_op.go b/domain/service/group_s/group_op.go index 9256963..30732b8 100644 --- a/domain/service/group_s/group_op.go +++ b/domain/service/group_s/group_op.go @@ -232,6 +232,9 @@ func (s *GroupService) GroupIn(userId uint64, externalId string, groupUuid strin NobleLevel uint16 `json:"nobleLevel"` SvipLevel int `json:"svipLevel"` Svip rpc.CvSvip `json:"svip"` + CpLevel int `json:"cpLevel"` // cp等级 + CpUserAvatar string `json:"cpUserAvatar"` // cp用户头像 + EntryEffectType int `json:"entryEffectType"` // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip } up := user_m.UserProperty{} @@ -246,6 +249,20 @@ func (s *GroupService) GroupIn(userId uint64, externalId string, groupUuid strin if err != nil { return err } + var cpLevel int + var cpUserAvatar string + var cpEntryEffect bool + if cp, _ := rpc.GetUserCp(model, userId); cp != nil { + cpLevel = cp.CpLevel.Level + if cp.CpUserInfo.Avatar != nil { + cpUserAvatar = *cp.CpUserInfo.Avatar + } + for _, v := range cp.MyPrivilegeList { + if v.Type == 5 { + cpEntryEffect = true + } + } + } r := UserParam{ Nick: user.Nick, UserAvatar: user.Avatar, @@ -257,8 +274,27 @@ func (s *GroupService) GroupIn(userId uint64, externalId string, groupUuid strin RidReceiverAvatar: properties[rides[userId]].ReceiverAvatar, NobleLevel: nobleLevel, Svip: rpc.CopySimpleSvip(svip), + CpLevel: cpLevel, + CpUserAvatar: cpUserAvatar, } rideId = r.RideId + // 进场特效类型 + var entryEffectType int // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip ,顺序从小到大 + if r.IsVip { + entryEffectType = 4 + } + if r.NobleLevel > 0 { + entryEffectType = 3 + } + for _, v := range r.Svip.Privileges { + if len(v.MysteryCode) > 0 { + entryEffectType = 2 + } + } + if cpEntryEffect { + entryEffectType = 1 + } + r.EntryEffectType = entryEffectType buf, err := json.Marshal(r) if err == nil { diff --git a/route/group_r/group_info.go b/route/group_r/group_info.go index fb93e00..b335675 100644 --- a/route/group_r/group_info.go +++ b/route/group_r/group_info.go @@ -608,6 +608,33 @@ func GetRoomInfo(c *gin.Context) (*mycontext.MyContext, error) { if err != nil { model.Log.Errorf("GetRoomInfo: GetUserBase: %s", err.Error()) } + // 进场特效类型 + var entryEffectType int // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip ,顺序从小到大 + if result.Owner != nil { + var cpEntryEffect bool + if cp, _ := rpc.GetUserCp(model, userId); cp != nil { + for _, v := range cp.MyPrivilegeList { + if v.Type == 5 { + cpEntryEffect = true + } + } + } + if result.Owner.IsVip { + entryEffectType = 4 + } + if result.Owner.Noble.Level > 0 { + entryEffectType = 3 + } + for _, v := range result.Owner.Svip.Privileges { + if len(v.MysteryCode) > 0 { + entryEffectType = 2 + } + } + if cpEntryEffect { + entryEffectType = 1 + } + result.EntryEffectType = entryEffectType + } resp.ResponseOk(c, result) return myContext, nil -- 2.22.0 From 078f5b1702cb3a64127ebbc8b76cb7afe23c9589 Mon Sep 17 00:00:00 2001 From: iamhujiebin <458249864@qq.com> Date: Wed, 14 Jun 2023 20:59:37 +0800 Subject: [PATCH 16/25] =?UTF-8?q?cp=E5=AF=B9=E8=B1=A1=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cv/group_cv/group.go | 2 ++ route/group_r/group_info.go | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cv/group_cv/group.go b/cv/group_cv/group.go index 22da233..cef9133 100644 --- a/cv/group_cv/group.go +++ b/cv/group_cv/group.go @@ -178,6 +178,8 @@ type RoomInfo struct { GameConfig *game_m.GameConfig `json:"gameConfig"` Owner *user_cv.CvUserDetail `json:"owner"` EntryEffectType int `json:"entryEffectType"` // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip + CpUserAvatar string `json:"cpUserAvatar"` // cp对象头像 + CpLevel int `json:"cpLevel"` // cp等级 } type SupportPageDetail struct { diff --git a/route/group_r/group_info.go b/route/group_r/group_info.go index b335675..294264c 100644 --- a/route/group_r/group_info.go +++ b/route/group_r/group_info.go @@ -610,7 +610,13 @@ func GetRoomInfo(c *gin.Context) (*mycontext.MyContext, error) { } // 进场特效类型 var entryEffectType int // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip ,顺序从小到大 - if result.Owner != nil { + if result.Owner != nil && result.Owner.Id != nil { + if cp, _ := rpc.GetUserCp(model, *result.Owner.Id); cp != nil { + result.CpLevel = cp.CpLevel.Level + if cp.CpUserInfo != nil && cp.CpUserInfo.Avatar != nil { + result.CpUserAvatar = *cp.CpUserInfo.Avatar + } + } var cpEntryEffect bool if cp, _ := rpc.GetUserCp(model, userId); cp != nil { for _, v := range cp.MyPrivilegeList { -- 2.22.0 From 4ec2638f48123a16d2d55674b29c71407193a4a9 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 11:01:32 +0800 Subject: [PATCH 17/25] =?UTF-8?q?fix:=E8=BF=9B=E5=9C=BA=E7=89=B9=E6=95=88?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/group_r/group_info.go | 48 +++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/route/group_r/group_info.go b/route/group_r/group_info.go index 294264c..ce92b26 100644 --- a/route/group_r/group_info.go +++ b/route/group_r/group_info.go @@ -610,37 +610,33 @@ func GetRoomInfo(c *gin.Context) (*mycontext.MyContext, error) { } // 进场特效类型 var entryEffectType int // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip ,顺序从小到大 - if result.Owner != nil && result.Owner.Id != nil { - if cp, _ := rpc.GetUserCp(model, *result.Owner.Id); cp != nil { - result.CpLevel = cp.CpLevel.Level - if cp.CpUserInfo != nil && cp.CpUserInfo.Avatar != nil { - result.CpUserAvatar = *cp.CpUserInfo.Avatar + var cpEntryEffect bool + if cp, _ := rpc.GetUserCp(model, userId); cp != nil { + for _, v := range cp.MyPrivilegeList { + if v.Type == 5 { + cpEntryEffect = true } } - var cpEntryEffect bool - if cp, _ := rpc.GetUserCp(model, userId); cp != nil { - for _, v := range cp.MyPrivilegeList { - if v.Type == 5 { - cpEntryEffect = true - } - } - } - if result.Owner.IsVip { - entryEffectType = 4 - } - if result.Owner.Noble.Level > 0 { - entryEffectType = 3 - } - for _, v := range result.Owner.Svip.Privileges { - if len(v.MysteryCode) > 0 { - entryEffectType = 2 - } + result.CpLevel = cp.CpLevel.Level + if cp.CpUserInfo != nil && cp.CpUserInfo.Avatar != nil { + result.CpUserAvatar = *cp.CpUserInfo.Avatar } - if cpEntryEffect { - entryEffectType = 1 + } + if result.Owner.IsVip { + entryEffectType = 4 + } + if result.Owner.Noble.Level > 0 { + entryEffectType = 3 + } + for _, v := range result.Owner.Svip.Privileges { + if len(v.MysteryCode) > 0 { + entryEffectType = 2 } - result.EntryEffectType = entryEffectType } + if cpEntryEffect { + entryEffectType = 1 + } + result.EntryEffectType = entryEffectType resp.ResponseOk(c, result) return myContext, nil -- 2.22.0 From b4f02941b6f2d51108247b7de107f3fe40d053f7 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 11:06:17 +0800 Subject: [PATCH 18/25] =?UTF-8?q?fix:=E8=A6=81=E7=94=A8user=E7=9A=84?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/group_r/group_info.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/route/group_r/group_info.go b/route/group_r/group_info.go index ce92b26..18e3bae 100644 --- a/route/group_r/group_info.go +++ b/route/group_r/group_info.go @@ -609,6 +609,7 @@ func GetRoomInfo(c *gin.Context) (*mycontext.MyContext, error) { model.Log.Errorf("GetRoomInfo: GetUserBase: %s", err.Error()) } // 进场特效类型 + var entryEffectType int // 进场特效类型 1: CP 2:神秘人 3:贵族 4:vip ,顺序从小到大 var cpEntryEffect bool if cp, _ := rpc.GetUserCp(model, userId); cp != nil { @@ -622,15 +623,17 @@ func GetRoomInfo(c *gin.Context) (*mycontext.MyContext, error) { result.CpUserAvatar = *cp.CpUserInfo.Avatar } } - if result.Owner.IsVip { - entryEffectType = 4 - } - if result.Owner.Noble.Level > 0 { - entryEffectType = 3 - } - for _, v := range result.Owner.Svip.Privileges { - if len(v.MysteryCode) > 0 { - entryEffectType = 2 + if user, _ := user_cv.GetUserDetail(model, userId, userId); user != nil { + if user.IsVip { + entryEffectType = 4 + } + if user.Noble.Level > 0 { + entryEffectType = 3 + } + for _, v := range user.Svip.Privileges { + if len(v.MysteryCode) > 0 { + entryEffectType = 2 + } } } if cpEntryEffect { -- 2.22.0 From 0a48e06b0a089370ce3461c475a3164293b50926 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 11:23:32 +0800 Subject: [PATCH 19/25] =?UTF-8?q?fix=EF=BC=9AheadwearIcon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/group_m/micData.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index 865f324..804ca62 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -398,14 +398,9 @@ func getMicIContent(model *domain.Model, groupId string, i int) (MicContent, err return MicContent{}, err } var micEffect string - var headwearIcon string if micUser.CpUserId > 0 { - if cpUser, _ := user_m.GetUser(model, micUser.CpUserId); cpUser != nil { - headwearIcon = cpUser.Avatar - } micEffect = "https://image.whoisamy.shop/hilo/resource/svga/mic_effect_cp.svga" micUserData.MicEffect = micEffect - micUserData.HeadwearIcon = headwearIcon } return MicContent{ GroupId: txGroupId, @@ -524,6 +519,11 @@ func getMicUserData(model *domain.Model, userId uint64) (*MicUserData, error) { headwearPicUrl = resHeadwear.PicUrl headwearEffectUrl = resHeadwear.EffectUrl } + var headwearIcon string + if cpRelation, _ := rpc.GetUserCpRelation(model, userId); len(cpRelation.CpUserAvatar) > 0 { + headwearIcon = cpRelation.CpUserAvatar + } + return &MicUserData{ Id: user.ID, ExternalId: user.ExternalId, @@ -537,5 +537,6 @@ func getMicUserData(model *domain.Model, userId uint64) (*MicUserData, error) { HeadwearEffectUrl: headwearEffectUrl, SvipLevel: svip.SvipLevel, Svip: rpc.CopySimpleSvip(svip), + HeadwearIcon: headwearIcon, }, nil } -- 2.22.0 From 80cb7eb7e791c340961d5898d0100d028cb4ce94 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 14:26:38 +0800 Subject: [PATCH 20/25] =?UTF-8?q?feat:=E7=A6=BB=E5=BC=80=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E4=B9=9F=E6=A3=80=E6=9F=A5=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/service/group_s/group_op.go | 4 +++- test/cp_test.go | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 test/cp_test.go diff --git a/domain/service/group_s/group_op.go b/domain/service/group_s/group_op.go index 30732b8..45ae389 100644 --- a/domain/service/group_s/group_op.go +++ b/domain/service/group_s/group_op.go @@ -27,6 +27,7 @@ import ( "hilo-group/domain/model/noble_m" "hilo-group/domain/model/res_m" "hilo-group/domain/model/user_m" + "hilo-group/domain/service/group_mic_s" "hilo-group/domain/service/signal_s" "hilo-group/myerr" "hilo-group/myerr/bizerr" @@ -418,7 +419,8 @@ func (s *GroupService) RemoveZombie(model *domain.Model, groupId string) (string //离开房间 func (s *GroupService) GroupLeave(userId uint64, externalId string, groupId string) error { model := domain.CreateModelContext(s.svc.MyContext) - + // check cp麦位置 + group_mic_s.NewGroupPowerService(s.svc.MyContext).CheckCpLeaveMic(groupId, userId) _, err := group_m.RoomLivingLeave(model, userId, externalId, groupId) return err } diff --git a/test/cp_test.go b/test/cp_test.go new file mode 100644 index 0000000..ccf61b6 --- /dev/null +++ b/test/cp_test.go @@ -0,0 +1,12 @@ +package test + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/rpc" + "testing" +) + +func TestGetCpRelation(t *testing.T) { + cpRelation, err := rpc.GetUserCpRelation(domain.CreateModelNil(), 7642) + t.Logf("%v-%v", cpRelation, err) +} -- 2.22.0 From 26a94631770e50bbcaafd299bdbd0e90128bbeaf Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 15:09:09 +0800 Subject: [PATCH 21/25] =?UTF-8?q?feat:=E5=A4=9A=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/model/group_m/mic.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/domain/model/group_m/mic.go b/domain/model/group_m/mic.go index 7fc0bb4..792040e 100644 --- a/domain/model/group_m/mic.go +++ b/domain/model/group_m/mic.go @@ -269,7 +269,12 @@ func (mic *Mic) In(userId uint64, externalId string) error { //上麦(自己), //规则:1:加锁了不能上麦 2:麦上有人,不能上麦 //cpUserId如果有 -func (mic *Mic) Update(userId uint64, externalId string, cpUserId uint64) error { +func (mic *Mic) Update(userId uint64, externalId string, cpUserId uint64) (err error) { + defer func() { + if err != nil { + mic.model.Log.Errorf("MicUpdate fail,userId:%v,cpUserId:%v,err:%v", userId, cpUserId, err) + } + }() // 群是否被封禁, 呃,,,呃,,,呃,,, banned := GroupBanned{ImGroupId: mic.GroupUuid} if err := banned.Get(mic.model); err != gorm.ErrRecordNotFound { -- 2.22.0 From cb4e6ec3db4e6fade26810759520bbc0a161b3a5 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 15:32:16 +0800 Subject: [PATCH 22/25] =?UTF-8?q?//=20cpLevel=20<=205=20=E7=BA=A7=E5=88=AB?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E9=BA=A6=E4=BD=8D=E7=89=B9=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/service/group_mic_s/group_mic.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/domain/service/group_mic_s/group_mic.go b/domain/service/group_mic_s/group_mic.go index fe60001..cf39e8d 100644 --- a/domain/service/group_mic_s/group_mic.go +++ b/domain/service/group_mic_s/group_mic.go @@ -362,6 +362,10 @@ func (s *GroupMicService) CheckCpOnMic(groupUuid string) { return } for _, pairs := range cpPairs { + level := pairs[2] + if level < 5 { // cpLevel < 5 级别没有麦位特效 + continue + } userId := pairs[0] cpUserId := pairs[1] redisLock(redis_key.GetPrefixGroupMicUserInLock(userId), uuid.NewV4().String(), time.Second*2, func() error { -- 2.22.0 From 95a33fb5fcc87090df01ae33b2b13ddcae14d9d7 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 15:45:01 +0800 Subject: [PATCH 23/25] Update cp_test.go --- test/cp_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/cp_test.go b/test/cp_test.go index ccf61b6..dbe4ff0 100644 --- a/test/cp_test.go +++ b/test/cp_test.go @@ -10,3 +10,8 @@ func TestGetCpRelation(t *testing.T) { cpRelation, err := rpc.GetUserCpRelation(domain.CreateModelNil(), 7642) t.Logf("%v-%v", cpRelation, err) } + +func TestGetCpPairs(t *testing.T) { + cpPairs, err := rpc.MGetUserCpPairs(domain.CreateModelNil(), []uint64{7642, 4549}) + t.Logf("%v-%v", cpPairs, err) +} -- 2.22.0 From 5a5b59730c28a9b41415edb53fd7bed260ef0b1d Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 15:53:19 +0800 Subject: [PATCH 24/25] fix --- domain/model/group_m/micData.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index 804ca62..971c524 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -506,6 +506,7 @@ func getMicUserData(model *domain.Model, userId uint64) (*MicUserData, error) { var headwearPicUrl string var headwearEffectUrl string + var headwearReverseEffectUrl string headwear, err := user_m.GetUserHeadwearUsing(model, userId) if err != nil { @@ -525,18 +526,19 @@ func getMicUserData(model *domain.Model, userId uint64) (*MicUserData, error) { } return &MicUserData{ - Id: user.ID, - ExternalId: user.ExternalId, - Avatar: user.Avatar, - Nick: user.Nick, - Sex: user.Sex, - Code: user.Code, - IsVip: flag, - NobleLeave: nobleLeave, - HeadwearPicUrl: headwearPicUrl, - HeadwearEffectUrl: headwearEffectUrl, - SvipLevel: svip.SvipLevel, - Svip: rpc.CopySimpleSvip(svip), - HeadwearIcon: headwearIcon, + Id: user.ID, + ExternalId: user.ExternalId, + Avatar: user.Avatar, + Nick: user.Nick, + Sex: user.Sex, + Code: user.Code, + IsVip: flag, + NobleLeave: nobleLeave, + HeadwearPicUrl: headwearPicUrl, + HeadwearEffectUrl: headwearEffectUrl, + HeadwearReverseEffectUrl: headwearReverseEffectUrl, + SvipLevel: svip.SvipLevel, + Svip: rpc.CopySimpleSvip(svip), + HeadwearIcon: headwearIcon, }, nil } -- 2.22.0 From af80aa361e868912a7aacd34260835e406343dd1 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Thu, 15 Jun 2023 16:21:19 +0800 Subject: [PATCH 25/25] Update micData.go --- domain/model/group_m/micData.go | 1 + 1 file changed, 1 insertion(+) diff --git a/domain/model/group_m/micData.go b/domain/model/group_m/micData.go index 971c524..7d74c35 100644 --- a/domain/model/group_m/micData.go +++ b/domain/model/group_m/micData.go @@ -519,6 +519,7 @@ func getMicUserData(model *domain.Model, userId uint64) (*MicUserData, error) { } headwearPicUrl = resHeadwear.PicUrl headwearEffectUrl = resHeadwear.EffectUrl + headwearReverseEffectUrl = resHeadwear.ReverseEffectUrl } var headwearIcon string if cpRelation, _ := rpc.GetUserCpRelation(model, userId); len(cpRelation.CpUserAvatar) > 0 { -- 2.22.0