From 105a331311a054ed4b3fe560621bd6eb2f98a515 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sat, 18 Nov 2023 22:56:40 +0800 Subject: [PATCH] =?utf8?q?Improve=20=E6=8C=87=E5=AE=9A=E5=BC=B9=E5=B9=95?= =?utf8?q?=E9=87=8D=E5=90=AF=E5=BD=95=E5=88=B6=E6=94=AF=E6=8C=81=E8=87=AA?= =?utf8?q?=E5=AE=9A=E4=B9=89=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++ Reply/F.go | 39 --------- .../F/danmuReLiveTriger/danmuReLiveTriger.go | 84 +++++++++++++++++++ Reply/Reply.go | 4 +- bili_danmu.go | 8 ++ 5 files changed, 117 insertions(+), 41 deletions(-) create mode 100644 Reply/F/danmuReLiveTriger/danmuReLiveTriger.go diff --git a/README.md b/README.md index 40c156a..03f32fc 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,29 @@ ### 说明 本项目使用github action自动构建,构建过程详见[yml](https://github.com/qydysky/bili_danmu/blob/master/.github/workflows/go.yml) +#### 指定用户弹幕切片 +配置文件中添加配置项`指定弹幕重启录制`。 + +- `uid`:进入个人空间,可以在地址栏看到你的uid +- `danmu`:正则匹配表达式 +- 多个相同`uid`的规则存在时,则会覆盖,取最后一个规则,一个用户最多一条规则 +- `uid`或`danmu`为""时,将忽略这个规则 + +当有`匹配分组`时,第一个分组将作为新标题,例:`t(.*)`,接收到`t暗潮t炒`时,则会将`暗潮t炒`作为标题。 + +无`匹配分组`时,将以原标题切片,例:`t`,接收到`t暗潮t炒`时,将会切片。 + +```json +{ + "指定弹幕重启录制":[ + { + "uid":"29183321", + "danmu":"t(.*)" + } + ] +} +``` + #### 指定房间录制区间 配置文件中添加配置项`指定房间录制区间`。 diff --git a/Reply/F.go b/Reply/F.go index 66f389a..04c9fb0 100644 --- a/Reply/F.go +++ b/Reply/F.go @@ -18,7 +18,6 @@ import ( "strconv" "strings" "sync" - "sync/atomic" "time" "database/sql" @@ -1751,44 +1750,6 @@ func (t *Communicate) Store(k interface{}) { t.Buf.Store(k, nil) } -// 指定弹幕重启录制 -var danmuReLiveTriger DanmuReLiveTriger - -type DanmuReLiveTriger struct { - l map[string]struct{} - reload atomic.Bool - init sync.Once -} - -func (t *DanmuReLiveTriger) Init(c *c.Common) { - t.init.Do(func() { - t.l = make(map[string]struct{}) - if v, ok := c.K_v.LoadV(`指定弹幕重启录制`).([]any); ok && len(v) > 0 { - for i := 0; i < len(v); i++ { - var item = v[i].(map[string]any) - var uid = strings.TrimSpace(item["uid"].(string)) - var danmu = strings.TrimSpace(item["danmu"].(string)) - if uid != "" && danmu != "" { - t.l[uid+" "+danmu] = struct{}{} - } - } - } - }) -} - -func (t *DanmuReLiveTriger) Check(uid, msg string) { - if _, ok := t.l[uid+" "+msg]; ok { - if t.reload.CompareAndSwap(false, true) { - flog.Base_add("指定弹幕重启录制").L(`I: `, uid, msg, "请求重启录制") - go func() { - StreamOCut(c.C.Roomid) - time.Sleep(time.Minute) - t.reload.Store(false) - }() - } - } -} - // 保存弹幕至db var saveDanmuToDB SaveDanmuToDB diff --git a/Reply/F/danmuReLiveTriger/danmuReLiveTriger.go b/Reply/F/danmuReLiveTriger/danmuReLiveTriger.go new file mode 100644 index 0000000..2c4f914 --- /dev/null +++ b/Reply/F/danmuReLiveTriger/danmuReLiveTriger.go @@ -0,0 +1,84 @@ +package danmuReLiveTriger + +import ( + "context" + "regexp" + "strings" + "sync/atomic" + "time" + + c "github.com/qydysky/bili_danmu/CV" + comp "github.com/qydysky/part/component" + log "github.com/qydysky/part/log" +) + +// path +var ( + Init = comp.NewComp(initf) + Check = comp.NewComp(check) +) + +// 指定弹幕重启录制 +var ( + logg *log.Log_interface + common *c.Common + streamCut func(i int, title ...string) + reload atomic.Bool + l map[string]*regexp.Regexp +) + +type DanmuReLiveTriger struct { + StreamCut func(i int, title ...string) + C *c.Common +} + +func initf(ctx context.Context, ptr DanmuReLiveTriger) error { + l = make(map[string]*regexp.Regexp) + if v, ok := ptr.C.K_v.LoadV(`指定弹幕重启录制`).([]any); ok && len(v) > 0 { + logg = ptr.C.Log.Base("指定弹幕重启录制") + streamCut = ptr.StreamCut + common = ptr.C + for i := 0; i < len(v); i++ { + var item = v[i].(map[string]any) + var uid = strings.TrimSpace(item["uid"].(string)) + var danmu = strings.TrimSpace(item["danmu"].(string)) + if uid != "" && danmu != "" { + if reg, e := regexp.Compile(danmu); e != nil { + clear(l) + return e + } else { + l[uid] = reg + } + } + } + if len(l) != 0 { + logg.L(`T: `, `加载`, len(l), `条规则`) + } + } + return nil +} + +type Danmu struct { + Uid, Msg string +} + +func check(ctx context.Context, item Danmu) error { + if reg, ok := l[item.Uid]; ok { + if ss := reg.FindStringSubmatch(item.Msg); len(ss) > 0 { + if reload.CompareAndSwap(false, true) { + switch len(ss) { + case 1: + logg.L(`I: `, item.Uid, item.Msg, "请求重启录制") + streamCut(common.Roomid) + case 2: + logg.L(`I: `, item.Uid, ss[1], "请求重启录制带标题") + streamCut(common.Roomid, ss[1]) + } + time.AfterFunc(time.Minute, func() { + reload.Store(false) + }) + } + } + } + return nil +} diff --git a/Reply/Reply.go b/Reply/Reply.go index e58d5fd..5beffdc 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -13,6 +13,7 @@ import ( brotli "github.com/andybalholm/brotli" c "github.com/qydysky/bili_danmu/CV" F "github.com/qydysky/bili_danmu/F" + "github.com/qydysky/bili_danmu/Reply/F/danmuReLiveTriger" "github.com/qydysky/bili_danmu/Reply/F/liveOver" "github.com/qydysky/bili_danmu/Reply/F/recStartEnd" ws_msg "github.com/qydysky/bili_danmu/Reply/ws_msg" @@ -1138,8 +1139,7 @@ func (replyF) danmu(s string) { saveDanmuToDB.init(c.C) saveDanmuToDB.danmu(item) // 对指定弹幕重新录制 - danmuReLiveTriger.Init(c.C) - danmuReLiveTriger.Check(item.uid, item.msg) + _ = danmuReLiveTriger.Check.Run(context.Background(), danmuReLiveTriger.Danmu{Uid: item.uid, Msg: item.msg}) // 语言tts 私信 { if item.uid != "" { diff --git a/bili_danmu.go b/bili_danmu.go index a9fcc7d..fb7623c 100644 --- a/bili_danmu.go +++ b/bili_danmu.go @@ -15,6 +15,7 @@ import ( c "github.com/qydysky/bili_danmu/CV" F "github.com/qydysky/bili_danmu/F" reply "github.com/qydysky/bili_danmu/Reply" + "github.com/qydysky/bili_danmu/Reply/F/danmuReLiveTriger" "github.com/qydysky/bili_danmu/Reply/F/recStartEnd" send "github.com/qydysky/bili_danmu/Send" Cmd "github.com/qydysky/bili_danmu/cmd" @@ -100,6 +101,13 @@ func Start() { Cut: func(i int) { reply.StreamOCut(i) }, }) } + // 指定弹幕重启录制 + if err := danmuReLiveTriger.Init.Run(context.Background(), danmuReLiveTriger.DanmuReLiveTriger{ + StreamCut: reply.StreamOCut, + C: c.C, + }); err != nil { + danmulog.Base("功能", "指定弹幕重启录制").L(`E: `, err) + } //使用带tag的消息队列在功能间传递消息 { -- 2.39.2