"fmt"
"net/http"
"os"
+ "regexp"
"time"
comp "github.com/qydysky/part/component2"
type TargetInterface interface {
// will WriteHeader
GetRec(savePath string, r *http.Request, w http.ResponseWriter) error
- Rec(ctx context.Context, roomid int, savePath string)
- Do(roomid int)
+ Rec(ctx context.Context, roomid int, savePath string) func(map[string]any)
+ Do(roomid int, msg string, uid string)
}
func init() {
if e := comp.Register[TargetInterface]("danmuCountPerMin", &danmuCountPerMin{
- m: msgq.NewType[int](),
+ m: msgq.NewType[mi](),
}); e != nil {
panic(e)
}
var noFoundModT, _ = time.Parse(time.DateTime, "2006-01-02 15:04:05")
+type mi struct {
+ msg string
+ uid string
+}
+
type danmuCountPerMin struct {
- m *msgq.MsgType[int]
+ m *msgq.MsgType[mi]
}
func (t *danmuCountPerMin) GetRec(savePath string, r *http.Request, w http.ResponseWriter) error {
return f.CopyToIoWriter(w, part.CopyConfig{})
}
-func (t *danmuCountPerMin) Rec(ctx context.Context, rid int, savePath string) {
- go func() {
- var cpm []int
- var startT = time.Now()
+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 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 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(cfgMsg)+len(cfgUid) == 0 {
+ return
+ }
- cancel := t.m.Pull_tag_only(`do`, func(roomid int) (disable bool) {
- if rid == roomid {
+ 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) {
+ point := 0
+ for k, v := range cfgMsg {
+ if k.MatchString(i.msg) {
+ point += v
+ }
+ }
+ for k, v := range cfgUid {
+ if k == i.uid {
+ point += v
+ }
+ }
+ 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))...)
}
- cpm[cu] += 1
- }
- return false
- })
+ cpm[cu] += point
+ return false
+ })
- <-ctx.Done()
- cancel()
+ <-ctx.Done()
+ cancel()
- cu := int(time.Since(startT).Minutes())
- if len(cpm) < cu+1 {
- cpm = append(cpm, make([]int, cu+1-len(cpm))...)
- }
+ cu := int(time.Since(startT).Minutes())
+ if len(cpm) < cu+1 {
+ cpm = append(cpm, make([]int, cu+1-len(cpm))...)
+ }
- if data, e := json.MarshalIndent(cpm, "", " "); e != nil {
- fmt.Println(e)
- } else {
- f := file.New(savePath+filename, 0, true)
- defer f.Close()
- _ = f.Delete()
- if _, e = f.Write(data, false); e != nil {
+ if data, e := json.MarshalIndent(cpm, "", " "); e != nil {
fmt.Println(e)
+ } else {
+ f := file.New(savePath+filename, 0, true)
+ defer f.Close()
+ _ = f.Delete()
+ if _, e = f.Write(data, false); e != nil {
+ fmt.Println(e)
+ }
}
- }
- }()
+ }()
+ }
}
-func (t *danmuCountPerMin) Do(roomid int) {
- t.m.Push_tag(`do`, roomid)
+func (t *danmuCountPerMin) Do(roomid int, msg string, uid string) {
+ t.m.Push_tag(fmt.Sprintf("do%d", roomid), mi{msg, uid})
}
fmt.Println("搜索主播->输入' sea关键词'回车")
fmt.Println("房间信息->输入' room'回车")
fmt.Println("开始结束录制->输入' rec'回车")
- fmt.Println("å½\95æ\92å\88\87ç\89\87->输入' cut'回车")
+ fmt.Println("å½\95æ\92å\88\86段->输入' cut'回车")
fmt.Println("退出当前房间->输入' exit'回车")
fmt.Println("其他输出隔断不影响")
fmt.Print("\n")
cmdlog.L(`W: `, "不支持功能键")
} else if inputs[0] == 32 { // 开头
cmdlog.L(`T: `, "指令("+inputs+")")
- //å½\95æ\92å\88\87ç\89\87
+ //å½\95æ\92å\88\86段
if strings.Contains(inputs, ` cut`) {
if c.C.Roomid != 0 && reply.StreamOStatus(c.C.Roomid) {
reply.StreamOCut(c.C.Roomid)