]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Improve 保持牌子点亮策略调整
authorqydysky <qydysky@foxmail.com>
Wed, 24 Jul 2024 22:17:35 +0000 (06:17 +0800)
committerqydysky <qydysky@foxmail.com>
Wed, 24 Jul 2024 22:17:35 +0000 (06:17 +0800)
F/api.go
Reply/F.go
Reply/F/keepMedalLight/keepMedalLight.go [new file with mode: 0644]
Send/Send.go
bili_danmu.go

index ecdf1c182c5bf098f1fe41d14b3ab792134a34fc..687816e32bff81e9a7acc286bde673c67e40f033 100644 (file)
--- a/F/api.go
+++ b/F/api.go
@@ -1085,7 +1085,7 @@ func Get_cookie_by_msg() {
 
 // 牌子字段
 // 获取牌子信息
-func Get_list_in_room(RoomID, TargetID int) (array []struct {
+func GetListInRoom(RoomID, TargetID int) (array []struct {
        TargetID  int
        IsLighted int
        MedalID   int
@@ -1176,7 +1176,7 @@ func (t *GetFunc) CheckSwitch_FansMedal() (missKey []string) {
        var medal_id int //将要使用的牌子id
        //检查是否有此直播间的牌子
        {
-               medal_list := Get_list_in_room(t.Roomid, t.UpUid)
+               medal_list := GetListInRoom(t.Roomid, t.UpUid)
                for _, v := range medal_list {
                        if v.TargetID != t.UpUid {
                                continue
index 73a13e4603ee68065316752645498b88a19fbc47..55c2032e632bd2e5867f9c9983f6a0a1ae938327 100644 (file)
@@ -31,6 +31,7 @@ import (
        F "github.com/qydysky/bili_danmu/F"
        _ "github.com/qydysky/bili_danmu/Reply/F"
        "github.com/qydysky/bili_danmu/Reply/F/danmuXml"
+       "github.com/qydysky/bili_danmu/Reply/F/keepMedalLight"
        videoInfo "github.com/qydysky/bili_danmu/Reply/F/videoInfo"
        send "github.com/qydysky/bili_danmu/Send"
 
@@ -991,86 +992,31 @@ func Entry_danmu(common *c.Common) {
        }
 }
 
-var fc_Keep_medal_light fctrl.SkipFunc
-
 // 保持所有牌子点亮
-func Keep_medal_light(common *c.Common) {
-       if fc_Keep_medal_light.NeedSkip() {
-               return
-       } else {
-               defer fc_Keep_medal_light.UnSet()
-       }
-
+func KeepMedalLight(common *c.Common) {
        if v, _ := common.K_v.LoadV(`保持牌子亮着`).(bool); !v {
                return
        }
        flog := flog.Base_add(`保持亮牌`)
 
-       array, ok := common.K_v.LoadV(`进房弹幕_内容`).([]interface{})
-       if !ok || len(array) == 0 {
-               flog.L(`I: `, `进房弹幕_内容 为 空,退出`)
-               return
-       }
+       array, _ := common.K_v.LoadV(`进房弹幕_内容`).([]any)
 
        flog.L(`T: `, `开始`)
        defer flog.L(`I: `, `完成`)
 
-       medals := F.Get_list_in_room(0, 0)
-       if len(medals) == 0 {
-               return
-       }
-       for _, v := range medals {
-               if v.IsLighted == 1 || v.RoomID == 0 {
-                       continue
-               } //点亮状态
-
-               //两天内到期,发弹幕续期
-               rand := p.Rand().MixRandom(0, int64(len(array)-1))
-               send.Danmu_s(array[rand].(string), v.RoomID)
-               time.Sleep(time.Second * 5)
-       }
-
-       //重试,使用点赞
-       medals = F.Get_list_in_room(0, 0)
-       if len(medals) == 0 {
-               return
-       }
-       for _, v := range medals {
-               if v.IsLighted == 1 || v.RoomID == 0 {
-                       continue
+       var lightedRoom []int
+       for _, v := range F.GetListInRoom(0, 0) {
+               if v.IsLighted == 1 {
+                       lightedRoom = append(lightedRoom, v.RoomID)
                }
-
-               //两天内到期,发弹幕续期
-               send.Danmu_s2(map[string]string{
-                       `msg`:     `official_147`,
-                       `dm_type`: `1`,
-                       `roomid`:  strconv.Itoa(v.RoomID),
-               })
-               time.Sleep(time.Second * 5)
-       }
-
-       //重试,使用历史弹幕
-       medals = F.Get_list_in_room(0, 0)
-       if len(medals) == 0 {
-               return
        }
-       for _, v := range medals {
-               if v.IsLighted == 1 || v.RoomID == 0 {
-                       continue
-               }
-
-               //两天内到期,发弹幕续期
-               var Str string
-               for _, Text := range F.GetHistory(v.RoomID) {
-                       Str = Text
-                       break
-               }
-               if Str == "" {
-                       rand := p.Rand().MixRandom(0, int64(len(array)-1))
-                       Str = array[rand].(string)
-               }
-               send.Danmu_s(Str, v.RoomID)
-               time.Sleep(time.Second * 5)
+       if _, e := keepMedalLight.KeepMedalLight.Run(context.Background(), keepMedalLight.Func{
+               LightedRoomID:   lightedRoom,
+               SendDanmu:       send.Danmu_s,
+               GetHistoryDanmu: F.GetHistory,
+               PreferDanmu:     array,
+       }); e != nil {
+               flog.L(`E: `, e)
        }
 }
 
diff --git a/Reply/F/keepMedalLight/keepMedalLight.go b/Reply/F/keepMedalLight/keepMedalLight.go
new file mode 100644 (file)
index 0000000..1ea89a0
--- /dev/null
@@ -0,0 +1,62 @@
+package keepMedalLight
+
+import (
+       "context"
+       "sync/atomic"
+       "time"
+
+       p "github.com/qydysky/part"
+       comp "github.com/qydysky/part/component"
+)
+
+var (
+       KeepMedalLight = comp.NewComp(keepMedalLight)
+       skip           atomic.Bool
+)
+
+type Func struct {
+       LightedRoomID   []int // 熄灭的徽章只能通过送礼物点亮
+       SendDanmu       func(danmu string, RoomID int) error
+       GetHistoryDanmu func(RoomID int) []string
+       PreferDanmu     []any
+}
+
+func keepMedalLight(ctx context.Context, ptr Func) (ret any, err error) {
+       if !skip.CompareAndSwap(false, true) {
+               return
+       }
+       defer skip.Store(false)
+
+       for i := 0; i < len(ptr.LightedRoomID); i++ {
+               time.Sleep(time.Second * 5)
+
+               if len(ptr.PreferDanmu) > 0 {
+                       rand := p.Rand().MixRandom(0, int64(len(ptr.PreferDanmu)-1))
+                       if s, ok := ptr.PreferDanmu[rand].(string); ok {
+                               if e := ptr.SendDanmu(s, ptr.LightedRoomID[i]); e == nil {
+                                       continue
+                               } else {
+                                       err = e
+                               }
+                       }
+               }
+
+               if e := ptr.SendDanmu(`点赞`, ptr.LightedRoomID[i]); e == nil {
+                       continue
+               } else {
+                       err = e
+               }
+
+               his := ptr.GetHistoryDanmu(ptr.LightedRoomID[i])
+
+               if len(his) > 0 {
+                       if e := ptr.SendDanmu(his[0], ptr.LightedRoomID[i]); e == nil {
+                               continue
+                       } else {
+                               err = e
+                       }
+               }
+       }
+
+       return
+}
index eb50f5ff9f11c23265a6a839db391e04de0fc342..85904c19942874a420017fba0782d5d75271ef28 100644 (file)
@@ -39,7 +39,7 @@ func init() {
 }
 
 // 弹幕发送
-func Danmu_s(msg string, roomid int) {
+func Danmu_s(msg string, roomid int) error {
        data := map[string]string{
                `msg`:    msg,
                `roomid`: strconv.Itoa(roomid),
@@ -52,32 +52,40 @@ func Danmu_s(msg string, roomid int) {
                }
        }
 
-       Danmu_s2(data)
+       return Danmu_s2(data)
 }
 
+var (
+       ErrLimit     = errors.New("ErrLimit")
+       ErrMsgEmpty  = errors.New("ErrMsgEmpty")
+       ErrRoomEmpty = errors.New("ErrRoomEmpty")
+       ErrNoLogin   = errors.New("ErrNoLogin")
+       ErrRes       = errors.New("ErrRes")
+)
+
 // 通用发送
-func Danmu_s2(data map[string]string) {
+func Danmu_s2(data map[string]string) error {
        //等待令牌时阻塞,超时返回true
        if danmu_s_limit.TO() {
-               return
+               return ErrLimit
        }
 
        l := c.C.Log.Base("弹幕发送")
 
        if _, ok := data[`msg`]; !ok {
                l.L(`E: `, "必须输入参数msg")
-               return
+               return ErrMsgEmpty
        }
 
        if _, ok := data[`roomid`]; !ok {
                l.L(`E: `, "必须输入参数roomid")
-               return
+               return ErrRoomEmpty
        }
 
        csrf, _ := c.C.Cookie.LoadV(`bili_jct`).(string)
        if csrf == `` {
                l.L(`E: `, "Cookie错误,无bili_jct=")
-               return
+               return ErrNoLogin
        }
 
        if _, ok := data[`bubble`]; !ok {
@@ -130,7 +138,7 @@ func Danmu_s2(data map[string]string) {
        })
        if err != nil {
                l.L(`E: `, err)
-               return
+               return err
        }
 
        var res struct {
@@ -140,9 +148,13 @@ func Danmu_s2(data map[string]string) {
 
        if e := json.Unmarshal(r.Respon, &res); e != nil {
                l.L(`E: `, e)
+               return e
        }
 
        if res.Code != 0 {
                l.L(`E: `, `产生错误:`, res.Code, res.Message)
+               return errors.Join(ErrRes, errors.New(res.Message))
        }
+
+       return nil
 }
index 46fb29a81cb3a19dc262e86ff62dfccf66cf8ac3..727ae281418e2080f4e22905b9bf3d3294210999 100644 (file)
@@ -178,6 +178,21 @@ func Start() {
                                        }
                                        return false
                                },
+                               `new day`: func(_ any) bool { //日期更换
+                                       go func() {
+                                               //每日签到
+                                               F.Dosign()
+                                               //每日兑换硬币
+                                               F.Get(c.C).Silver_2_coin()
+                                               //附加功能 每日发送弹幕
+                                               reply.Entry_danmu(c.C)
+                                               //附加功能 保持牌子点亮
+                                               reply.KeepMedalLight(c.C)
+                                               //附加功能 自动发送即将过期礼物
+                                               reply.AutoSend_silver_gift(c.C)
+                                       }()
+                                       return false
+                               },
                        })
                        defer cancelfunc()
                }
@@ -234,7 +249,7 @@ func Start() {
 
 func entryRoom(mainCtx context.Context, danmulog *part.Log_interface, common *c.Common) (exitSign bool) {
        //附加功能 保持牌子点亮
-       go reply.Keep_medal_light(common)
+       // go reply.KeepMedalLight(common)
        //附加功能 自动发送即将过期礼物
        go reply.AutoSend_silver_gift(common)
        //获取热门榜
@@ -427,21 +442,6 @@ func entryRoom(mainCtx context.Context, danmulog *part.Log_interface, common *c.
                                        go F.Get(common).Get(`getOnlineGoldRank`)
                                        return false
                                },
-                               `new day`: func(_ any) bool { //日期更换
-                                       go func() {
-                                               //每日签到
-                                               F.Dosign()
-                                               //每日兑换硬币
-                                               F.Get(common).Silver_2_coin()
-                                               //附加功能 每日发送弹幕
-                                               reply.Entry_danmu(common)
-                                               //附加功能 保持牌子点亮
-                                               reply.Keep_medal_light(common)
-                                               //附加功能 自动发送即将过期礼物
-                                               reply.AutoSend_silver_gift(common)
-                                       }()
-                                       return false
-                               },
                        })
 
                        {