123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933 |
- package roomAdmin
- import (
- "bytes"
- "context"
- "encoding/json"
- "fmt"
- "github.com/jinzhu/gorm"
- banned "go-common/app/service/live/banned_service/api/liverpc/v1"
- v12 "go-common/app/service/live/fans_medal/api/liverpc/v2"
- "go-common/app/service/live/room/api/liverpc/v1"
- "go-common/app/service/live/room/api/liverpc/v2"
- v1pb "go-common/app/service/live/xuser/api/grpc/v1"
- "go-common/app/service/live/xuser/conf"
- "go-common/app/service/live/xuser/dao"
- "go-common/app/service/live/xuser/model"
- account "go-common/app/service/main/account/model"
- accrpc "go-common/app/service/main/account/rpc/client"
- "go-common/library/cache/memcache"
- "go-common/library/cache/redis"
- "go-common/library/database/orm"
- xsql "go-common/library/database/sql"
- "go-common/library/ecode"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "io/ioutil"
- "math"
- "net/http"
- "sort"
- "strconv"
- "time"
- )
- // Dao dao
- type Dao struct {
- c *conf.Config
- mc *memcache.Pool
- redis *redis.Pool
- db *xsql.DB
- orm *gorm.DB
- RoomAdminExpire int32
- // acc rpc
- acc *accrpc.Service3
- client *bm.Client
- }
- const (
- userPrefix = "up_v1_%d"
- roomPrefix = "rp_v1_%d"
- mcExpire = 3600
- maxAdminsNum = 100
- )
- // KeyUser return the mc key by user mid.
- func KeyUser(uid int64) string {
- return fmt.Sprintf(userPrefix, uid)
- }
- // KeyRoom return the mc key by anchor mid.
- func KeyRoom(uid int64) string {
- return fmt.Sprintf(roomPrefix, uid)
- }
- //go:generate $GOPATH/src/go-common/app/tool/cache/mc
- type _mc interface {
- // 获取主播的房管列表
- // mc: -key=KeyRoom
- CacheRoomAdminRoom(c context.Context, anchor int64) ([]*model.RoomAdmin, error)
- // 获取用户的房管列表
- // mc: -key=KeyUser
- CacheRoomAdminUser(c context.Context, user int64) ([]*model.RoomAdmin, error)
- // mc: -key=KeyRoom -expire=d.RoomAdminExpire -encode=json|gzip
- AddCacheKeyAnchorRoom(c context.Context, anchor int64, value []*model.RoomAdmin) error
- // mc: -key=KeyUser -expire=d.RoomAdminExpire -encode=gob
- AddCacheRoomAdminUser(c context.Context, user int64, value []*model.RoomAdmin) error
- // mc: -key=KeyRoom
- DelCacheKeyAnchorRoom(c context.Context, anchor int64) error
- // mc: -key=KeyUser
- DelCacheRoomAdminUser(c context.Context, user int64) error
- }
- // New init mysql db
- func New(c *conf.Config) (dao *Dao) {
- dao = &Dao{
- c: c,
- mc: memcache.NewPool(c.Memcache),
- redis: redis.NewPool(c.Redis),
- db: xsql.NewMySQL(c.LiveAppMySQL),
- orm: orm.NewMySQL(c.LiveAppORM),
- RoomAdminExpire: mcExpire,
- acc: accrpc.New3(c.AccountRPC),
- client: bm.NewClient(c.BMClient),
- }
- return
- }
- // Close close the resource.
- func (d *Dao) Close() {
- d.mc.Close()
- d.redis.Close()
- d.orm.Close()
- d.db.Close()
- }
- // Ping dao ping
- func (d *Dao) Ping(c context.Context) error {
- // TODO: if you need use mc,redis, please add
- return d.db.Ping(c)
- }
- // HasAnyAdmin whether he has any admin in any room.
- func (d *Dao) HasAnyAdmin(c context.Context, uid int64) (int64, error) {
- noAdmin := int64(0)
- hasAdmin := int64(1)
- rst, err := d.GetAllByUid(c, uid)
- if nil == rst {
- return noAdmin, err
- }
- return hasAdmin, err
- }
- // GetByUidPage get admins by uid and page.
- func (d *Dao) GetByUidPage(c context.Context, uid int64, page int64, pageSize int64) (resp *v1pb.RoomAdminGetByUidResp, err error) {
- resp = &v1pb.RoomAdminGetByUidResp{}
- resp.Page = &v1pb.RoomAdminGetByUidResp_Page{
- Page: page,
- PageSize: pageSize,
- TotalPage: 1,
- TotalCount: 0,
- }
- rst, err := d.GetAllByUid(c, uid)
- //spew.Dump("GetAllByUid", rst, err)
- if err != nil {
- return
- }
- if rst == nil {
- return
- }
- sort.Sort(sort.Reverse(model.RoomAdmins(rst)))
- //spew.Dump(rst)
- resp.Page.TotalCount = int64(len(rst))
- resp.Page.PageSize = pageSize
- resp.Page.TotalPage = int64(math.Ceil(float64(len(rst)) / float64(resp.Page.PageSize)))
- begin := (page - 1) * pageSize
- end := page * pageSize
- if page*pageSize > int64(len(rst)) {
- end = int64(len(rst))
- }
- roomUid, mids, err := d.getAnchorUidsFromAdmins(c, rst)
- // 没获取到房间信息
- if err != nil {
- return resp, err
- }
- // 可能从room获取主播信息不全
- if int64(len(mids)) < end {
- end = int64(len(mids))
- }
- if begin > end {
- begin = end
- }
- if err != nil {
- return resp, err
- }
- args := &account.ArgMids{Mids: mids[begin:end]}
- accData, err := d.acc.Infos3(c, args)
- //spew.Dump("d.acc.Infos3", accData, err)
- if err != nil {
- log.Error("call account.Infos3(%v) error(%v)", args, err)
- return resp, err
- }
- for _, v := range rst[begin:end] {
- item := &v1pb.RoomAdminGetByUidResp_Data{
- Uid: v.Uid,
- Roomid: v.Roomid,
- Ctime: v.Ctime.Time().Format("2006-01-02 15:04:05"),
- }
- if _, ok := roomUid[v.Roomid]; ok {
- item.AnchorId = roomUid[v.Roomid]
- if _, ok := accData[item.AnchorId]; ok {
- item.AnchorCover = accData[item.AnchorId].Face
- item.Uname = accData[item.AnchorId].Name
- } else {
- log.Error("没有这个人的用户信息 uid(%v) data(%v)", item.AnchorId, accData)
- }
- } else {
- log.Error("没有这个人的房间信息 room (%v) data(%v)", v.Roomid, roomUid)
- }
- resp.Data = append(resp.Data, item)
- }
- //spew.Dump("resp.Data", resp.Data)
- return
- }
- // GetAllByUid get by uid.
- func (d *Dao) GetAllByUid(c context.Context, uid int64) ([]*model.RoomAdmin, error) {
- rstMc, err := d.CacheRoomAdminUser(c, uid)
- //spew.Dump("HasAnyAdmin1", rstMc, err)
- //spew.Dump("lenMc", len(rstMc))
- if err != nil {
- return nil, err
- }
- // 空缓存标识
- if rstMc != nil {
- if rstMc[0].Id == -1 {
- return nil, err
- }
- return rstMc, err
- }
- rstDb, err := d.GetByUserMysql(c, uid)
- if err != nil {
- return nil, err
- }
- if len(rstDb) == 0 {
- d.AddCacheNoneUser(c, uid)
- return nil, err
- }
- d.AddCacheRoomAdminUser(c, uid, rstDb)
- return rstDb, err
- }
- // getAnchorUidsFromAdmins .
- // 根据批量房管获取对应主播的房间号和UID
- func (d *Dao) getAnchorUidsFromAdmins(c context.Context, admins []*model.RoomAdmin) (roomUid map[int64]int64, uids []int64, err error) {
- var roomIds []int64
- roomUid = make(map[int64]int64)
- for _, a := range admins {
- roomIds = append(roomIds, a.Roomid)
- }
- if len(roomIds) == 0 {
- return
- }
- reply, err := dao.RoomAPI.V2Room.GetByIds(c, &v2.RoomGetByIdsReq{Ids: roomIds})
- if err != nil {
- log.Error("dao.RoomAPI.V2Room.GetByIds (%v) error(%v)", roomIds, err)
- return roomUid, uids, err
- }
- if reply.GetCode() != 0 {
- err = ecode.Int(int(reply.GetCode()))
- log.Error("dao.RoomAPI.V2Room.GetByIds (%v) error code(%v)", roomIds, err)
- return roomUid, uids, err
- }
- for aRoomId, r := range reply.Data {
- roomUid[aRoomId] = r.Uid
- uids = append(uids, r.Uid)
- }
- return
- }
- // Del delete a roomadmin
- func (d *Dao) Del(c context.Context, uid int64, roomId int64) (err error) {
- if err = d.DelAllCache(c, uid, roomId); err != nil {
- log.Error("DelAllCache(%v) uid (%v) roomid (%v) error(%v)", uid, roomId, err)
- return
- }
- admin, err := d.GetByRoomIdUidMysql(c, uid, roomId)
- if len(admin) == 0 {
- log.Error("GetByRoomIdUidMysql empty uid(%v) roomId (%v)error(%v)", uid, roomId, err)
- return
- }
- //spew.Dump("GetByRoomIdUidMysql", admin)
- if err = d.DelDbAdminMysql(c, admin[0].Id); err != nil {
- log.Error("DelCacheRoomAdminUser uid(%v) roomId (%v) error(%v)", uid, roomId, err)
- return err
- }
- return
- }
- func (d *Dao) getInfoByName(c context.Context, name string) (userInfo *account.Info, err error) {
- userInfo = &account.Info{}
- infosByName, err := d.acc.InfosByName3(c, &account.ArgNames{
- Names: []string{name},
- })
- if err != nil {
- log.Error("d.acc.InfosByName3(%v) error(%v)", name, err)
- return userInfo, err
- }
- log.Info("d.acc.InfosByName3(%v) return (%v)", name, infosByName)
- if len(infosByName) != 0 {
- for _, info := range infosByName {
- return info, err
- }
- }
- return
- }
- // SearchForAdmin search user list by keyword.
- func (d *Dao) SearchForAdmin(c context.Context, keyword string, anchorId int64) (resp []*v1pb.RoomAdminSearchForAdminResp_Data, err error) {
- isUid := 0
- matchUid, _ := strconv.ParseInt(keyword, 10, 64)
- if matchUid != 0 && keyword != "0" {
- isUid = 1
- }
- // get by name
- infoMatchName, err := d.getInfoByName(c, keyword)
- if err != nil {
- return resp, err
- }
- if nil != infoMatchName && infoMatchName.Mid != 0 {
- log.Info("SearchForAdmin infoMatchName keyword (%v) ret (%v)", keyword, infoMatchName)
- isAdminName, _ := d.isAdminByUid(c, infoMatchName.Mid, anchorId)
- medalData, errMedal := d.getMedalInfoByUids(c, []int64{infoMatchName.Mid})
- if errMedal != nil {
- return resp, errMedal
- }
- itemName := &v1pb.RoomAdminSearchForAdminResp_Data{
- Uid: infoMatchName.Mid,
- IsAdmin: isAdminName,
- Uname: infoMatchName.Name,
- Face: infoMatchName.Face,
- }
- if _, ok := medalData[infoMatchName.Mid]; ok {
- itemName.MedalName = medalData[infoMatchName.Mid].MedalName
- itemName.Level = medalData[infoMatchName.Mid].Level
- } else {
- log.Info("没有这个人的勋章信息 uid(%v) data(%v)", infoMatchName.Mid, medalData)
- }
- resp = append(resp, itemName)
- }
- //spew.Dump("searchForadmin2", resp)
- // just name
- if 0 == isUid {
- return resp, nil
- }
- // get by uid
- infoMatchUid, err := d.getInfoByUid(c, matchUid)
- if err != nil {
- return resp, err
- }
- if infoMatchUid == nil {
- return resp, nil
- }
- isAdminUid, _ := d.isAdminByUid(c, matchUid, anchorId)
- medalDataUid, err := d.getMedalInfoByUids(c, []int64{infoMatchUid.Mid})
- if err != nil {
- return resp, err
- }
- itemUid := &v1pb.RoomAdminSearchForAdminResp_Data{
- Uid: infoMatchUid.Mid,
- IsAdmin: isAdminUid,
- Uname: infoMatchUid.Name,
- Face: infoMatchUid.Face,
- }
- if _, ok := medalDataUid[infoMatchUid.Mid]; ok {
- itemUid.MedalName = medalDataUid[infoMatchUid.Mid].MedalName
- itemUid.Level = medalDataUid[infoMatchUid.Mid].Level
- }
- resp = append(resp, itemUid)
- //spew.Dump("searchForadmin2", resp)
- return
- }
- func (d *Dao) isAdminByUid(c context.Context, uid int64, anchorId int64) (rst int64, err error) {
- roomId, err := d.getRoomIdByUid(c, anchorId)
- if err != nil {
- return rst, err
- }
- if 0 == roomId {
- return rst, nil
- }
- return d.IsAdminByRoomId(c, uid, roomId)
- }
- func (d *Dao) getInfoByUid(c context.Context, uid int64) (info *account.Info, err error) {
- info, err = d.acc.Info3(c, &account.ArgMid{
- Mid: uid,
- })
- if err != nil {
- log.Error("d.acc.Info3(%v) error(%v)", uid, err)
- return info, err
- }
- log.Info("d.acc.Info3(%v) return (%v)", uid, info)
- return
- }
- func (d *Dao) getRoomInfoByUid(c context.Context, uid int64) (roomInfo *v1.RoomGetStatusInfoByUidsResp_RoomInfo, err error) {
- roomInfo = &v1.RoomGetStatusInfoByUidsResp_RoomInfo{}
- reply, err := dao.RoomAPI.V1Room.GetStatusInfoByUids(c, &v1.RoomGetStatusInfoByUidsReq{
- Uids: []int64{uid},
- ShowHidden: 1,
- })
- if err != nil {
- log.Error("dao.RoomAPI.V1Room.GetStatusInfoByUids (%v) error(%v)", uid, err)
- return roomInfo, err
- }
- if reply.GetCode() != 0 {
- err = ecode.Int(int(reply.GetCode()))
- log.Error("dao.RoomAPI.V2Room.GetByIds (%v) error code(%v)", uid, err)
- return roomInfo, err
- }
- if len(reply.Data) == 0 {
- return
- }
- for aUid, aInfo := range reply.Data {
- if aUid == uid {
- return aInfo, nil
- }
- }
- return
- }
- func (d *Dao) getMedalInfoByUids(c context.Context, uids []int64) (medalInfo map[int64]*v12.AnchorQueryLiveWearingResp_Medal, err error) {
- medalInfo = make(map[int64]*v12.AnchorQueryLiveWearingResp_Medal)
- reply, err := dao.FansMedalAPI.V2Anchor.QueryLiveWearing(c, &v12.AnchorQueryLiveWearingReq{
- UidList: uids,
- })
- log.Info("call dao.FansMedalAPI.V2Anchor.QueryLiveWearing (%v) rst (%v)", uids, reply)
- if err != nil {
- log.Error("dao.FansMedalAPI.V2Anchor.QueryLiveWearing (%v) error(%v)", uids, err)
- return medalInfo, err
- }
- if reply.GetCode() != 0 {
- err = ecode.Int(int(reply.GetCode()))
- log.Error("dao.RoomAPI.V2Room.GetByIds (%v) error code(%v)", uids, err)
- return medalInfo, err
- }
- if len(reply.Data) == 0 {
- return
- }
- return reply.Data, err
- }
- // IsAdminByRoomId ...
- func (d *Dao) IsAdminByRoomId(c context.Context, uid int64, roomId int64) (rst int64, err error) {
- rst = 0
- admins, err := d.GetAllByRoomId(c, roomId)
- if err != nil {
- log.Error("GetAllByRoomId(%v) error(%v)", roomId, err)
- return rst, err
- }
- if len(admins) == 0 {
- return rst, nil
- }
- for _, v := range admins {
- if v.Uid == uid {
- rst = 1
- return rst, nil
- }
- }
- return
- }
- // GetByAnchorIdPage get by anchor id and page .
- func (d *Dao) GetByAnchorIdPage(c context.Context, anchorId int64, page int64, pageSize int64) (resp *v1pb.RoomAdminGetByAnchorResp, err error) {
- resp = &v1pb.RoomAdminGetByAnchorResp{}
- resp.Page = &v1pb.RoomAdminGetByAnchorResp_Page{
- Page: page,
- PageSize: pageSize,
- TotalPage: 1,
- TotalCount: 0,
- }
- roomId, err := d.getRoomIdByUid(c, anchorId)
- if err != nil {
- return resp, err
- }
- if 0 == roomId {
- return resp, nil
- }
- allAdmins, err := d.GetAllByRoomId(c, roomId)
- //spew.Dump("GetAllByUid", allAdmins, err)
- if err != nil {
- return resp, err
- }
- if allAdmins == nil {
- return resp, nil
- }
- sort.Sort(sort.Reverse(model.RoomAdmins(allAdmins)))
- //spew.Dump(allAdmins)
- resp.Page.TotalCount = int64(len(allAdmins))
- resp.Page.PageSize = pageSize
- resp.Page.TotalPage = int64(math.Ceil(float64(len(allAdmins)) / float64(resp.Page.PageSize)))
- begin := (page - 1) * pageSize
- end := page * pageSize
- if page*pageSize > int64(len(allAdmins)) {
- end = int64(len(allAdmins))
- }
- uids, _ := d.getUidsFromAdmins(c, allAdmins)
- if int64(len(uids)) < end {
- end = int64(len(uids))
- }
- if begin > end {
- begin = end
- }
- //spew.Dump("getAnchorUidsFromAdmins", uids, err)
- accArgs := &account.ArgMids{Mids: uids[begin:end]}
- accData, err := d.acc.Infos3(c, accArgs)
- if err != nil {
- log.Error("d.acc.Infos3(%v) error(%v)", accArgs, err)
- }
- medalData, err := d.getMedalInfoByUids(c, uids)
- if err != nil {
- log.Error("d.getMedalInfoByUids(%v) error(%v)", uids, err)
- return resp, err
- }
- if err != nil {
- log.Error("call account.Infos3(%v) error(%v)", accArgs, err)
- return resp, err
- }
- for _, v := range allAdmins[begin:end] {
- item := &v1pb.RoomAdminGetByAnchorResp_Data{
- Uid: v.Uid,
- Ctime: v.Ctime.Time().Format("2006-01-02 15:04:05"),
- Roomid: v.Roomid,
- }
- if _, ok := accData[v.Uid]; ok {
- item.Uname = accData[v.Uid].Name
- item.Face = accData[v.Uid].Face
- } else {
- log.Error("没有这个人的用户信息 uid(%v) data(%v)", v.Uid, accData)
- }
- if _, ok := medalData[v.Uid]; ok {
- item.Level = medalData[v.Uid].Level
- item.MedalName = medalData[v.Uid].MedalName
- } else {
- log.Info("没有这个人的勋章信息 uid(%v) data(%v)", v.Uid, medalData)
- }
- resp.Data = append(resp.Data, item)
- }
- //spew.Dump("resp.Data", resp.Data)
- return
- }
- // GetAllByRoomId get by uid.
- func (d *Dao) GetAllByRoomId(c context.Context, roomId int64) ([]*model.RoomAdmin, error) {
- rstMc, err := d.CacheRoomAdminRoom(c, roomId)
- //spew.Dump("HasAnyAdmin1", rstMc, err)
- //spew.Dump("lenMc", len(rstMc))
- if err != nil {
- return nil, err
- }
- // 空缓存标识
- if rstMc != nil {
- if rstMc[0].Id == -1 {
- return nil, err
- }
- return rstMc, err
- }
- rstDb, err := d.GetByRoomIdMysql(c, roomId)
- if err != nil {
- return nil, err
- }
- if len(rstDb) == 0 {
- d.AddCacheNoneRoom(c, roomId)
- return nil, err
- }
- d.AddCacheKeyAnchorRoom(c, roomId, rstDb)
- return rstDb, err
- }
- // getUidsFromAdmins .
- // 返回房管列表中的uid
- func (d *Dao) getUidsFromAdmins(c context.Context, admins []*model.RoomAdmin) (uids []int64, err error) {
- for _, a := range admins {
- uids = append(uids, a.Uid)
- }
- return
- }
- // DismissAnchor del a admin
- func (d *Dao) DismissAnchor(c context.Context, uid int64, anchorId int64) (resp *v1pb.RoomAdminDismissAdminResp, err error) {
- resp = &v1pb.RoomAdminDismissAdminResp{}
- roomId, err := d.getRoomIdByUid(c, anchorId)
- if err != nil {
- return resp, err
- }
- if 0 == roomId {
- return resp, nil
- }
- isAdmin, err := d.IsAdminByRoomId(c, uid, roomId)
- if err != nil {
- log.Error("IsAdminByRoomId uid(%v) roomid (%v) error(%v)", uid, roomId, err)
- return resp, err
- }
- if 0 == isAdmin {
- err = ecode.Error(ecode.XUserAddRoomAdminNotAdminError, "该用户已经不是房管啦")
- return
- }
- err = d.Del(c, uid, roomId)
- if err != nil {
- log.Error("getRoomInfoByUid uid (%v) roomid (%v) error(%v)", uid, roomId, err)
- return
- }
- return
- }
- // DelAllCache delete cache .
- func (d *Dao) DelAllCache(c context.Context, uid int64, roomId int64) (err error) {
- if err = d.DelCacheKeyAnchorRoom(c, roomId); err != nil {
- log.Error("DelCacheKeyAnchorRoom(%v) error(%v)", roomId, err)
- return err
- }
- if err = d.DelCacheRoomAdminUser(c, uid); err != nil {
- log.Error("DelCacheRoomAdminUser(%v) error(%v)", uid, err)
- return err
- }
- return
- }
- // Add add a admin
- func (d *Dao) Add(c context.Context, uid int64, anchorId int64) (resp *v1pb.RoomAdminAddResp, err error) {
- resp = &v1pb.RoomAdminAddResp{}
- roomId, err := d.getRoomIdByUid(c, anchorId)
- if err != nil {
- return resp, err
- }
- if 0 == roomId {
- return resp, nil
- }
- allRoomAdmin, err := d.GetAllByRoomId(c, roomId)
- //spew.Dump("Add", roomId, allRoomAdmin)
- if err != nil {
- return resp, err
- }
- if len(allRoomAdmin) >= maxAdminsNum {
- err = ecode.Error(ecode.XUserAddRoomAdminOverLimitError, "最多设置100个房间管理员")
- //err = &pb.Error{
- // ErrCode: 2,
- // ErrMessage: "最多设置100个房间管理员",
- //}
- return
- }
- isAdmin, err := d.IsAdminByRoomId(c, uid, roomId)
- if err != nil {
- log.Error("IsAdminByRoomId uid(%v) roomid (%v) error(%v)", uid, roomId, err)
- return resp, err
- }
- if 1 == isAdmin {
- err = ecode.Error(ecode.XUserAddRoomAdminIsAdminError, "该用户已经是你的房管啦")
- //err = &pb.Error{
- // ErrCode: 1,
- // ErrMessage: "他已经是房管",
- //}
- return
- }
- banArg := &banned.SilentMngIsBlockUserReq{
- Uid: uid,
- Roomid: roomId,
- Type: 1,
- }
- retBan, err := dao.BannedAPI.V1SilentMng.IsBlockUser(c, banArg)
- if err != nil {
- log.Error("call dao.BannedAPI.V1SilentMng.IsBlockUser(%v) error(%v)", banArg, err)
- return
- }
- if retBan.Code != 0 || nil == retBan.Data {
- log.Error("call dao.BannedAPI.V1SilentMng.IsBlockUser(%v) error return (%v)", banArg, retBan)
- }
- if retBan.Data.GetIsBlockUser() {
- err = ecode.Error(ecode.XUserAddRoomAdminIsSilentError, "他已经被禁言,无法添加房管")
- //err = &pb.Error{
- // ErrCode: 3,
- // ErrMessage: "他已经被禁言,无法添加房管",
- //}
- return
- }
- if err = d.DelAllCache(c, uid, roomId); err != nil {
- log.Error("DelCacheKeyAnchorRoom(%v) error(%v)", roomId, err)
- return resp, err
- }
- if err = d.AddAdminMysql(c, uid, roomId); err != nil {
- log.Error("DelCacheKeyAnchorRoom(%v) error(%v)", roomId, err)
- return
- }
- resp.Uid = uid
- resp.Roomid = roomId
- resp.Userinfo = &v1pb.RoomAdminAddResp_UI{}
- resp.Userinfo.Uid = uid
- info, _ := d.getInfoByUid(c, uid)
- if info != nil {
- resp.Userinfo.Uname = info.Name
- }
- d.adminChange(c, uid, roomId)
- return
- }
- func (d *Dao) getRoomIdByUid(c context.Context, anchorId int64) (roomId int64, err error) {
- roomInfo, err := d.getRoomInfoByUid(c, anchorId)
- if err != nil {
- log.Error("getRoomInfoByUid (%v) error(%v)", anchorId, err)
- return roomId, err
- }
- if roomInfo == nil {
- return roomId, nil
- }
- return roomInfo.RoomId, nil
- }
- // adminChange send broadcast
- func (d *Dao) adminChange(c context.Context, uid int64, roomId int64) (err error) {
- roomInfo, err := dao.RoomAPI.V2Room.GetByIds(c, &v2.RoomGetByIdsReq{
- Ids: []int64{roomId},
- NeedUinfo: 1,
- })
- if err != nil {
- log.Error("dao.RoomAPI.V2Room.GetByIds(%v) error(%v)", roomId, err)
- return
- }
- if roomInfo.Code != 0 || 0 == len(roomInfo.Data) {
- log.Error("dao.RoomAPI.V1Room.GetInfoById(%v) error code (%v) data (%v)", roomId, roomInfo.Code, roomInfo.Data)
- return
- }
- postJson := make(map[string]interface{})
- postJson["cmd"] = "room_admin_entrance"
- postJson["uid"] = uid
- postJson["msg"] = "系统提示:你已被主播设为房管"
- if err = d.sendBroadcastRoom(roomId, postJson); err != nil {
- return err
- }
- admins, err := d.GetAllByRoomId(c, roomId)
- if err != nil {
- return err
- }
- var adminUids []int64
- // adminUids := make([]int64, 100)
- for _, v := range admins {
- adminUids = append(adminUids, v.Uid)
- }
- postJson2 := make(map[string]interface{})
- postJson2["cmd"] = "ROOM_ADMINS"
- postJson2["uids"] = adminUids
- if err = d.sendBroadcastRoom(roomId, postJson2); err != nil {
- return err
- }
- return
- }
- // sendBroadcastRoom .
- func (d *Dao) sendBroadcastRoom(roomid int64, postJson map[string]interface{}) (err error) {
- log.Info("send reward broadcast begin:%d", roomid)
- var endPoint = fmt.Sprintf("http://live-dm.bilibili.co/dm/1/push?cid=%d&ensure=1", roomid)
- bytesData, err := json.Marshal(postJson)
- if err != nil {
- log.Error("json.Marshal(%v) error(%v)", postJson, err)
- return
- }
- req, err := http.NewRequest("POST", endPoint, bytes.NewReader(bytesData))
- req.Header.Add("Content-Type", "application/json")
- if err != nil {
- log.Error("http.NewRequest(%v) url(%v) error(%v)", postJson, endPoint, err)
- return
- }
- client := http.Client{
- Timeout: time.Second,
- }
- // use httpClient to send request
- response, err := client.Do(req)
- if err != nil {
- log.Error("sending request to API endpoint(%v) error(%v)", req, err)
- return
- }
- body, err := ioutil.ReadAll(response.Body)
- if err != nil {
- log.Error("parse resp body(%v) error(%v)", body, err)
- }
- log.Info("send reward broadcast end:%d", roomid)
- return
- }
- // IsAdmin return whether a user is admin.
- func (d *Dao) IsAdmin(c context.Context, uid int64, anchorId int64, roomId int64) (resp *v1pb.RoomAdminIsAdminResp, err error) {
- resp = &v1pb.RoomAdminIsAdminResp{}
- isAdmin, err := d.IsAdminByRoomId(c, uid, roomId)
- if err != nil {
- log.Error("IsAdminByRoomId uid(%v) roomid (%v) error(%v)", uid, roomId, err)
- return resp, err
- }
- if 0 == isAdmin {
- if uid != anchorId {
- err = ecode.Error(120014, "Ta不是该主播的房管")
- //err = ecode.Error{
- // ErrCode: 120014, // 接口迁移, code 为老业务error code
- // ErrMessage: "Ta不是该主播的房管",
- //}
- return
- }
- }
- userInfo, err := d.getInfoByUid(c, uid)
- if err != nil {
- return resp, err
- }
- if userInfo != nil {
- resp.Userinfo = &v1pb.RoomAdminIsAdminResp_UI{}
- resp.Roomid = roomId
- resp.Uid = uid
- resp.Userinfo.Uid = uid
- resp.Userinfo.Uname = userInfo.Name
- return
- }
- return
- }
|