You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
933 lines
22 KiB
933 lines
22 KiB
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 |
|
}
|
|
|