### 说明
本项目使用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(.*)"
+ }
+ ]
+}
+```
+
#### 指定房间录制区间
配置文件中添加配置项`指定房间录制区间`。
"strconv"
"strings"
"sync"
- "sync/atomic"
"time"
"database/sql"
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
--- /dev/null
+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
+}
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"
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 != "" {
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"
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的消息队列在功能间传递消息
{