From: qydysky Date: Sat, 6 Jan 2024 17:38:15 +0000 (+0800) Subject: Fix 直播间标题引入审核,标题修改不会触发ws消息 #98 X-Git-Tag: v0.11.17~2 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=5fdbeec414e47a52591934300aaa2d28da23e2d7;p=bili_danmu%2F.git Fix 直播间标题引入审核,标题修改不会触发ws消息 #98 --- diff --git a/F/api.go b/F/api.go index 0c569d3..eddb0a8 100644 --- a/F/api.go +++ b/F/api.go @@ -63,33 +63,40 @@ func (c *GetFunc) Get(key string) { c.GetUid, }, `UpUid`: { //主播uid + c.getRoomBaseInfo, c.getInfoByRoom, c.getRoomPlayInfo, c.Html, }, `Live_Start_Time`: { //直播开始时间 + c.getRoomBaseInfo, c.getInfoByRoom, c.getRoomPlayInfo, c.Html, }, `Liveing`: { //是否在直播 + c.getRoomBaseInfo, c.getInfoByRoom, c.getRoomPlayInfo, c.Html, }, `Title`: { //直播间标题 + c.getRoomBaseInfo, c.getInfoByRoom, c.Html, }, `Uname`: { //主播名 + c.getRoomBaseInfo, c.getInfoByRoom, c.Html, }, `ParentAreaID`: { //分区 + c.getRoomBaseInfo, c.getInfoByRoom, c.Html, }, `AreaID`: { //子分区 + c.getRoomBaseInfo, c.getInfoByRoom, c.Html, }, @@ -493,6 +500,81 @@ func (c *GetFunc) missRoomId() (missKey []string) { return } +func (c *GetFunc) getRoomBaseInfo() (missKey []string) { + fkey := `getRoomBaseInfo` + + if v, ok := c.Cache.LoadV(fkey).(cacheItem); ok && v.exceeded.After(time.Now()) { + return + } + + apilog := apilog.Base_add(`getRoomBaseInfo`) + + if c.Roomid == 0 { + missKey = append(missKey, `Roomid`) + return + } + + Roomid := strconv.Itoa(c.Roomid) + + { //使用其他api + req := c.Common.ReqPool.Get() + defer c.Common.ReqPool.Put(req) + if err := req.Reqf(reqf.Rval{ + Url: "https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomBaseInfo?req_biz=link-center&room_ids=" + Roomid, + Header: map[string]string{ + `Referer`: "https://link.bilibili.com/p/center/index", + }, + Proxy: c.Proxy, + Timeout: 10 * 1000, + }); err != nil { + apilog.L(`E: `, err) + return + } + + //Roominfores + { + var j J.GetRoomBaseInfo + + if e := json.Unmarshal(req.Respon, &j); e != nil { + apilog.L(`E: `, e) + return + } else if j.Code != 0 { + apilog.L(`E: `, j.Message) + return + } + + if data, ok := j.Data.ByRoomIds[Roomid]; ok { + //主播id + c.UpUid = data.UID + //子分区 + c.AreaID = data.AreaID + //分区 + c.ParentAreaID = data.ParentAreaID + //直播间标题 + c.Title = data.Title + //直播开始时间 + if ti, e := time.Parse(time.DateTime, data.LiveTime); e != nil && !ti.IsZero() { + c.Live_Start_Time = ti + } + //是否在直播 + c.Liveing = data.LiveStatus == 1 + //主播名 + c.Uname = data.Uname + //房间id + if data.RoomID != 0 { + c.Roomid = data.RoomID + } + } + } + } + + c.Cache.Store(fkey, cacheItem{ + data: nil, + exceeded: time.Now().Add(time.Second * 2), + }) + return +} + func (c *GetFunc) getInfoByRoom() (missKey []string) { fkey := `getInfoByRoom` diff --git a/Json/getRoomBaseInfo.go b/Json/getRoomBaseInfo.go new file mode 100644 index 0000000..4beb60e --- /dev/null +++ b/Json/getRoomBaseInfo.go @@ -0,0 +1,34 @@ +package part + +type GetRoomBaseInfo struct { + Code int `json:"code"` + Message string `json:"message"` + TTL int `json:"ttl"` + Data struct { + ByRoomIds map[string]GetRoomBaseInfoD `json:"by_room_ids"` + } `json:"data"` +} + +type GetRoomBaseInfoD struct { + RoomID int `json:"room_id"` + UID int `json:"uid"` + AreaID int `json:"area_id"` + LiveStatus int `json:"live_status"` + // LiveURL string `json:"live_url"` + ParentAreaID int `json:"parent_area_id"` + Title string `json:"title"` + // ParentAreaName string `json:"parent_area_name"` + // AreaName string `json:"area_name"` + LiveTime string `json:"live_time"` + // Description string `json:"description"` + // Tags string `json:"tags"` + Attention int `json:"attention"` + Online int `json:"online"` + ShortID int `json:"short_id"` + Uname string `json:"uname"` + Cover string `json:"cover"` + Background string `json:"background"` + JoinSlide int `json:"join_slide"` + LiveID int64 `json:"live_id"` + LiveIDStr string `json:"live_id_str"` +} diff --git a/Reply/Reply.go b/Reply/Reply.go index 1f9ad78..341a30c 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -19,6 +19,7 @@ import ( ws_msg "github.com/qydysky/bili_danmu/Reply/ws_msg" send "github.com/qydysky/bili_danmu/Send" p "github.com/qydysky/part" + funcCtrl "github.com/qydysky/part/funcCtrl" mq "github.com/qydysky/part/msgq" pstrings "github.com/qydysky/part/strings" ) @@ -535,27 +536,66 @@ func (replyF) special_gift(s string) { } +var roomChangeFC funcCtrl.FlashFunc + // Msg-房间信息改变,标题等 func (replyF) room_change(s string) { - title := p.Json().GetValFromS(s, "data.title") - area_name := p.Json().GetValFromS(s, "data.area_name") + var type_item ws_msg.ROOM_CHANGE - var sh = []interface{}{"房间改变"} + if e := json.Unmarshal([]byte(s), &type_item); e != nil { + msglog.L(`E: `, e) + } + + change := c.C.AreaID != type_item.Data.AreaID || c.C.Title != type_item.Data.Title + + if c.C.Title != type_item.Data.Title { + StreamOCut(c.C.Roomid, type_item.Data.Title) + } else if c.C.AreaID == type_item.Data.AreaID { + // 直播间标题引入审核机制,触发审核时会接收到一个roomchange但标题不变 + cancle := make(chan struct{}) + roomChangeFC.FlashWithCallback(func() { + close(cancle) + }) - if c.C.Title != title.(string) { - StreamOCut(c.C.Roomid, title.(string)) + go func(roomid int, oldTitle string) { + for tryC := 30; tryC > 0 && c.C.Roomid == roomid; tryC-- { + select { + case <-cancle: + return + case <-time.After(time.Second * 30): + F.Get(c.C).Get(`Title`) + if c.C.Roomid == roomid && c.C.Title != oldTitle { + StreamOCut(c.C.Roomid, c.C.Title) + var sh = []any{"房间改变", c.C.Title} + Gui_show(Itos(sh), "0room") + msglog.Base_add("房").L(`I: `, sh...) + return + } + } + } + }(c.C.Roomid, c.C.Title) + } + + if type_item.Data.AreaID != 0 { + c.C.AreaID = type_item.Data.AreaID + } + if type_item.Data.ParentAreaID != 0 { + c.C.ParentAreaID = type_item.Data.ParentAreaID } - if title != nil { - sh = append(sh, title) - c.C.Title = title.(string) + var sh = []interface{}{"房间改变"} + if type_item.Data.Title != "" { + sh = append(sh, type_item.Data.Title) + c.C.Title = type_item.Data.Title } - if area_name != nil { - sh = append(sh, area_name) + if type_item.Data.AreaName != "" { + sh = append(sh, type_item.Data.AreaName) } - Gui_show(Itos(sh), "0room") - msglog.Base_add("房").L(`I: `, sh...) + if change { + Gui_show(Itos(sh), "0room") + msglog.Base_add("房").L(`I: `, sh...) + } } // Msg-超管警告 diff --git a/Reply/ws_msg/ROOM_CHANGE.go b/Reply/ws_msg/ROOM_CHANGE.go new file mode 100644 index 0000000..23e142d --- /dev/null +++ b/Reply/ws_msg/ROOM_CHANGE.go @@ -0,0 +1,14 @@ +package part + +type ROOM_CHANGE struct { + Cmd string `json:"cmd"` + Data struct { + Title string `json:"title"` + AreaID int `json:"area_id"` + ParentAreaID int `json:"parent_area_id"` + AreaName string `json:"area_name"` + ParentAreaName string `json:"parent_area_name"` + LiveKey string `json:"live_key"` + SubSessionKey string `json:"sub_session_key"` + } `json:"data"` +}