From: qydysky Date: Mon, 10 Feb 2025 18:16:51 +0000 (+0800) Subject: Improve 弹幕分值默认统计弹幕数 (#164) X-Git-Tag: v0.15.7~2 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=412ef88ebc0e6f8eed30a45f22fc80bb1935953a;p=bili_danmu%2F.git Improve 弹幕分值默认统计弹幕数 (#164) --- diff --git a/Reply/F/comp.go b/Reply/F/comp.go index 7003159..d25466e 100644 --- a/Reply/F/comp.go +++ b/Reply/F/comp.go @@ -19,7 +19,7 @@ import ( var DanmuCountPerMin = comp.Get[interface { // will WriteHeader GetRec(savePath string, r *http.Request, w http.ResponseWriter) error - Rec(ctx context.Context, roomid int, savePath string) func(map[string]any) + Rec(ctx context.Context, roomid int, savePath string) func(any) Do(roomid int, msg string, uid string) }](`danmuCountPerMin`) diff --git a/Reply/F/danmuCountPerMin/danmuCountPerMin.go b/Reply/F/danmuCountPerMin/danmuCountPerMin.go index 2b7cfc5..eda6dc0 100644 --- a/Reply/F/danmuCountPerMin/danmuCountPerMin.go +++ b/Reply/F/danmuCountPerMin/danmuCountPerMin.go @@ -19,7 +19,7 @@ import ( type TargetInterface interface { // will WriteHeader GetRec(savePath string, r *http.Request, w http.ResponseWriter) error - Rec(ctx context.Context, roomid int, savePath string) func(map[string]any) + Rec(ctx context.Context, roomid int, savePath string) func(any) Do(roomid int, msg string, uid string) } @@ -36,8 +36,9 @@ const filename = "danmuCountPerMin.json" var noFoundModT, _ = time.Parse(time.DateTime, "2006-01-02 15:04:05") type mi struct { - msg string - uid string + roomid int + msg string + uid string } type danmuCountPerMin struct { @@ -67,60 +68,85 @@ func (t *danmuCountPerMin) GetRec(savePath string, r *http.Request, w http.Respo return f.CopyToIoWriter(w, part.CopyConfig{}) } -func (t *danmuCountPerMin) Rec(ctx context.Context, rid int, savePath string) func(map[string]any) { - return func(cfg map[string]any) { - cfgMsg := make(map[*regexp.Regexp]int) - cfgUid := make(map[string]int) - - if cfg == nil { // 默认统计弹幕数 - cfg = map[string]any{ - `danmu`: map[string]any{ - `.`: 1.0, - }, - } +func (t *danmuCountPerMin) Rec(ctx context.Context, rid int, savePath string) func(any) { + return func(cfg any) { + cfgM := make(map[int][]func(mi) int) + // 默认统计弹幕数 + cfgM[-1] = []func(mi) int{ + func(m mi) int { + return 1 + }, } - if m, ok := cfg["danmu"].(map[string]any); ok { - for k, v := range m { - if point, ok := v.(float64); ok && point != 0 { - if reg, err := regexp.Compile(k); err == nil { - cfgMsg[reg] = int(point) + if cfgs, ok := cfg.([]any); ok { + // 配置特定房间 + for i := 0; i < len(cfgs); i++ { + cfg, ok := cfgs[i].(map[string]any) + if !ok { + continue + } + + roomid := 0 + if m, ok := cfg["roomid"].(float64); !ok || roomid == 0 { + continue + } else { + roomid = int(m) + } + + var funcs []func(mi) int + + if m, ok := cfg["danmu"].(map[string]any); ok { + for k, v := range m { + if point, ok := v.(float64); ok && point != 0 { + if reg, err := regexp.Compile(k); err == nil { + funcs = append(funcs, func(m mi) int { + if reg.MatchString(m.msg) { + return int(point) + } + return 0 + }) + } + } + } + } + + if m, ok := cfg["uid"].(map[string]any); ok { + for k, v := range m { + if point, ok := v.(float64); ok && point != 0 { + funcs = append(funcs, func(m mi) int { + if k == m.uid { + return int(point) + } + return 0 + }) + } } } - } - } - if m, ok := cfg["uid"].(map[string]any); ok { - for k, v := range m { - if point, ok := v.(float64); ok && point != 0 { - cfgUid[k] = int(point) + if len(funcs) == 0 { + continue } - } - } - if len(cfgMsg)+len(cfgUid) == 0 { - return - } + cfgM[roomid] = funcs + fmt.Println(roomid, len(funcs)) + } + } go func() { var cpm []int var startT = time.Now() - cancel := t.m.Pull_tag_only(fmt.Sprintf("do%d", rid), func(i mi) (disable bool) { + cancel := t.m.Pull_tag_only(`do`, func(m mi) (disable bool) { point := 0 - for k, v := range cfgMsg { - if k.MatchString(i.msg) { - point += v + if fs, ok := cfgM[m.roomid]; ok { + for i := 0; i < len(fs); i++ { + point += fs[i](m) } - } - for k, v := range cfgUid { - if k == i.uid { - point += v + } else if fs, ok := cfgM[-1]; ok { + for i := 0; i < len(fs); i++ { + point += fs[i](m) } } - if point == 0 { - return false - } cu := int(time.Since(startT).Minutes()) if len(cpm) < cu+1 { cpm = append(cpm, make([]int, cu+1-len(cpm))...) @@ -152,5 +178,5 @@ func (t *danmuCountPerMin) Rec(ctx context.Context, rid int, savePath string) fu } func (t *danmuCountPerMin) Do(roomid int, msg string, uid string) { - t.m.Push_tag(fmt.Sprintf("do%d", roomid), mi{msg, uid}) + t.m.Push_tag(`do`, mi{roomid, msg, uid}) } diff --git a/Reply/stream.go b/Reply/stream.go index e5bbe29..cc14009 100644 --- a/Reply/stream.go +++ b/Reply/stream.go @@ -1406,13 +1406,7 @@ func (t *M4SStream) Start() bool { startf := func(_ *M4SStream) error { l.L(`T: `, `开始`) //弹幕分值统计 - { - var m map[string]any - if tmp, ok := ms.common.K_v.LoadV("弹幕分值").(map[string]any); ok { - m = tmp - } - replyFunc.DanmuCountPerMin.Rec(contextC, ms.common.Roomid, ms.GetSavePath())(m) - } + replyFunc.DanmuCountPerMin.Rec(contextC, ms.common.Roomid, ms.GetSavePath())(ms.common.K_v.LoadV("弹幕分值")) return nil } stopf := func(_ *M4SStream) error { diff --git a/demo/config/config_K_v.json b/demo/config/config_K_v.json index 04ea298..1bc55d8 100644 --- a/demo/config/config_K_v.json +++ b/demo/config/config_K_v.json @@ -234,15 +234,19 @@ "env": "" } ], - "弹幕分值-help":"对每条弹幕进行评分,每分钟输出分值到danmuCountPerMin.json,无有效规则时默认统计弹幕数,用于后续评估", - "弹幕分值":{ - "danmu-help":"key为正则表达式,匹配成功时分值加value,value为0时忽略", - "danmu": { - ".":1 - }, - "uid-help":"key为uid,相等时分值加value,value为0时忽略", - "uid": { - "":0 + "弹幕分值-help":"对每条弹幕进行评分,每分钟输出分值到danmuCountPerMin.json,无有效规则时默认配置统计弹幕数,用于后续评估", + "弹幕分值":[ + { + "roomid-help":"为0时忽略,为-1时可覆盖默认配置,>0时为指定房间号", + "roomid": -1, + "danmu-help":"key为正则表达式,匹配成功时分值加value,value为0时忽略", + "danmu": { + ".":1 + }, + "uid-help":"key为uid,相等时分值加value,value为0时忽略", + "uid": { + "":0 + } } - } + ] }