From: qydysky Date: Wed, 24 Jul 2024 22:17:35 +0000 (+0800) Subject: Improve 保持牌子点亮策略调整 X-Git-Tag: v0.14.12~7 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=70f7cfddd3e7f375178cb81811bc6ab0e053ce6b;p=bili_danmu%2F.git Improve 保持牌子点亮策略调整 --- diff --git a/F/api.go b/F/api.go index ecdf1c1..687816e 100644 --- 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 diff --git a/Reply/F.go b/Reply/F.go index 73a13e4..55c2032 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -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 index 0000000..1ea89a0 --- /dev/null +++ b/Reply/F/keepMedalLight/keepMedalLight.go @@ -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 +} diff --git a/Send/Send.go b/Send/Send.go index eb50f5f..85904c1 100644 --- a/Send/Send.go +++ b/Send/Send.go @@ -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 } diff --git a/bili_danmu.go b/bili_danmu.go index 46fb29a..727ae28 100644 --- a/bili_danmu.go +++ b/bili_danmu.go @@ -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 - }, }) {