]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
Improve 指定弹幕重启录制支持自定义标题
authorqydysky <qydysky@foxmail.com>
Sat, 18 Nov 2023 14:56:40 +0000 (22:56 +0800)
committerqydysky <qydysky@foxmail.com>
Sat, 18 Nov 2023 14:56:40 +0000 (22:56 +0800)
README.md
Reply/F.go
Reply/F/danmuReLiveTriger/danmuReLiveTriger.go [new file with mode: 0644]
Reply/Reply.go
bili_danmu.go

index 40c156a80e837b3b8402fc88ed1bd3a7a1b88c74..03f32fc240864b79e837bed235a8429c43a57ad8 100644 (file)
--- a/README.md
+++ b/README.md
 ### 说明
 本项目使用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(.*)"
+      }
+  ]
+}
+```
+
 #### 指定房间录制区间
 配置文件中添加配置项`指定房间录制区间`。
 
index 66f389a71ec09c5125fb244798632cbd71229242..04c9fb049d91b0d4dfae783fef804bf865bfaf16 100644 (file)
@@ -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 (file)
index 0000000..2c4f914
--- /dev/null
@@ -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
+}
index e58d5fdf5f95ca8d66d6eac794f978a5f0a2495b..5beffdca7e4b124649030322156b3c76664bbf82 100644 (file)
@@ -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 != "" {
index a9fcc7d54baa9937053dc4f4d3cad83204d5cc61..fb7623c1e307e921437b2e2326e5d8e35ba2a7d1 100644 (file)
@@ -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的消息队列在功能间传递消息
                {