// 牌子字段
// 获取牌子信息
-func Get_list_in_room(RoomID, TargetID int) (array []struct {
+func GetListInRoom(RoomID, TargetID int) (array []struct {
TargetID int
IsLighted int
MedalID int
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
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"
}
}
-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)
}
}
--- /dev/null
+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
+}
}
// 弹幕发送
-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),
}
}
- 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 {
})
if err != nil {
l.L(`E: `, err)
- return
+ return err
}
var res struct {
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
}
}
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()
}
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)
//获取热门榜
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
- },
})
{