]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
15
authorqydysky <qydysky@foxmail.com>
Sun, 20 Sep 2020 05:35:32 +0000 (13:35 +0800)
committerqydysky <qydysky@foxmail.com>
Sun, 20 Sep 2020 05:35:32 +0000 (13:35 +0800)
F.go
Msg.go
bili_danmu.go
send.go

diff --git a/F.go b/F.go
index c7a2a4c6147254261919d86791aa23331c1e5ef3..9f2a5e0e8f94ef5465136452f090cebf03e52e80 100644 (file)
--- a/F.go
+++ b/F.go
@@ -13,6 +13,7 @@ import (
 //功能开关
 var AllF = map[string]bool{
        "Autoban":true,//自动封禁(仅提示,未完成)
+       "Jiezou":true,//带节奏预警,提示弹幕礼仪
        "Danmuji":true,//反射型弹幕机,回应弹幕
        "Danmuji_auto":false,//自动型弹幕机,定时输出
        "Autoskip":true,//刷屏缩减,相同合并
@@ -52,7 +53,27 @@ func selfcross(a string) (float32) {
        }
        return 1 - float32(len(buf)) / float32(len([]rune(a)))
 }
-
+func selfcross2(a []string) (float32, string) {
+       buf := make(map[rune]float32)
+       for _,v := range a {
+               block := make(map[rune]bool)
+               for _,v1 := range v {
+                       if _,ok := block[v1]; ok {continue}
+                       block[v1] = true
+                       buf[v1] += 1
+               }
+       }
+       var (
+               max float32
+               maxS string
+               all float32
+       )
+       for k,v := range buf {
+               all += v
+               if v > max {max = v;maxS = string(k)}
+       }
+       return max / all, maxS
+}
 //功能区
 type Autoban struct {
        Banbuf []string
@@ -88,11 +109,11 @@ func Autobanf(s string) bool {
        var res []float32
 
        pt := float32(len([]rune(s)))
-       if pt <= 3 {return false}//字数过少去除
+       if pt <= 5 {return false}//字数过少去除
        res = append(res, pt)
 
        pt = selfcross(s);
-       if pt > 0.6 {return false}//自身重复高去除
+       if pt > 0.5 {return false}//自身重复高去除
        res = append(res, pt)
 
        pt = cross(s, autoban.buf);
@@ -124,17 +145,16 @@ var danmuji = Danmuji{
        },
 }
 
-func Danmujif(s,cookie string, roomid int) {
+func Danmujif(s string) {
        if !danmuji.Inuse {return}
-       if cookie == "" || roomid == 0 {return}
        if v, ok := danmuji.buf[s]; ok {
-               Danmu_s(v, cookie, roomid)
+               Msg_senddanmu(v)
        }
 }
 
-func Danmuji_auto(cookie string, sleep,roomid int) {
+func Danmuji_auto(sleep int) {
        if !danmuji.Inuse || !danmuji.Inuse_auto || danmuji.mute {return}
-       if cookie == "" || roomid == 0 || sleep == 0 {return}
+       if sleep == 0 {return}
 
        danmuji.mute = true
        var list = []string{
@@ -144,7 +164,7 @@ func Danmuji_auto(cookie string, sleep,roomid int) {
        go func(){
                for i := 0; true; i++{
                        if i >= len(list) {i = 0}
-                       Danmu_s(list[i], cookie, roomid)
+                       Msg_senddanmu(list[i])
                        p.Sys().Timeoutf(sleep)
                }
        }()
@@ -202,6 +222,7 @@ func Lessdanmuf(s string, bufsize int) float32 {
 
        o := cross(s, lessdanmu.buf)
        if o == 1 {return 1}//完全无用
+       Jiezouf(lessdanmu.buf)
        lessdanmu.buf = append(lessdanmu.buf[1:], s)
 
        return o
@@ -295,3 +316,46 @@ func Shortdanmuf(s string) string {
        shortdanmu.lastdanmu = []rune(s)
        return new
 }
+
+type Jiezou struct {
+       Inuse bool
+       alertdanmu string
+       skipS map[string]interface{}
+
+       avg float32
+       turn int
+       sync.Mutex
+}
+
+var jiezou = Jiezou{
+       Inuse:IsOn("Jiezou"),
+       alertdanmu:"",
+       skipS:map[string]interface{}{//常见语气词忽略
+               "了":nil,
+               "的":nil,
+               "哈":nil,
+       },
+}
+
+func Jiezouf(s []string) bool {
+       if !jiezou.Inuse {return false}
+       now,S := selfcross2(s)
+       jiezou.avg = (9 * jiezou.avg + now)/10
+       if jiezou.turn < len(s) {jiezou.turn += 1;return false}
+       
+       if _,ok := jiezou.skipS[S]; ok {return false}
+
+       jiezou.Lock()
+       if now > 1.3 * jiezou.avg {//触发
+               l := p.Logf().New().Open("danmu.log").Base(1, "jiezou")
+               l.W("节奏注意", now, jiezou.avg, S)
+               jiezou.avg = now //沉默
+               jiezou.Unlock()
+
+               //发送弹幕
+               if jiezou.alertdanmu != "" {Msg_senddanmu(jiezou.alertdanmu)}
+               return true
+       }
+       jiezou.Unlock()
+       return false
+}
\ No newline at end of file
diff --git a/Msg.go b/Msg.go
index 27b473ef9c8c3ade91557bf82ae54895a1ef178a..1977b1761a4f820cea9a8f11dff5533361b3ea91 100644 (file)
--- a/Msg.go
+++ b/Msg.go
@@ -42,8 +42,8 @@ var Msg_map = map[string]func(replayF, string) {
        "ROOM_BLOCK_MSG":replayF.room_block_msg,//封禁
        "PREPARING":replayF.preparing,//下播
        "LIVE":replayF.live,//开播
-       "SUPER_CHAT_MESSAGE":nil,//replayF.super_chat_message,//打赏
-       "SUPER_CHAT_MESSAGE_JPN":replayF.super_chat_message,//打赏
+       "SUPER_CHAT_MESSAGE":nil,//replayF.super_chat_message,//SC
+       "SUPER_CHAT_MESSAGE_JPN":replayF.super_chat_message,//SC
        "PANEL":replayF.panel,//排行榜
        "ENTRY_EFFECT":nil,//replayF.entry_effect,//进入特效
        "ROOM_REAL_TIME_MESSAGE_UPDATE":nil,//replayF.roominfo,//粉丝数
@@ -101,7 +101,7 @@ func (replayF) special_gift(s string){
 
        fmt.Println("\n====")
        fmt.Println(sh...)
-       fmt.Println("====\n")
+       fmt.Print("====\n\n")
        msglog.Base(1, "礼").I(sh...)
 
 }
@@ -128,7 +128,7 @@ func (replayF) guard_buy(s string){
 
        fmt.Println("\n====")
        fmt.Println(sh...)
-       fmt.Println("====\n")
+       fmt.Print("====\n\n")
        msglog.I(sh...)
 
 }
@@ -211,20 +211,20 @@ func (replayF) send_gift(s string){
 
        fmt.Println("\n====")
        fmt.Println(sh...)
-       fmt.Println("====\n")
+       fmt.Print("====\n\n")
        msglog.I(sh...)
 }
 
 func (replayF) room_block_msg(s string) {
-       msglog.Fileonly(true).Base(-1, "封")
-       defer msglog.Base(0).Fileonly(false)
+       msglog.Fileonly(true)
+       defer msglog.Fileonly(false)
 
        if uname := p.Json().GetValFromS(s, "uname");uname == nil {
                msglog.E("uname", uname)
                return
        } else {
-       fmt.Println("用户", uname, "已被封禁")
-       msglog.I("用户", uname, "已被封禁")
+               fmt.Println("用户", uname, "已被封禁")
+               msglog.Base(1, "封").I("用户", uname, "已被封禁")
        }
 }
 
@@ -264,7 +264,7 @@ func (replayF) super_chat_message(s string){
        message := p.Json().GetValFromS(s, "data.message");
        message_jpn := p.Json().GetValFromS(s, "data.message_jpn");
 
-       var sh = []interface{}{"打赏: "}
+       var sh = []interface{}{"SC: "}
 
        if uname != nil {
                sh = append(sh, uname)
@@ -283,7 +283,7 @@ func (replayF) super_chat_message(s string){
 
        fmt.Println("\n====")
        fmt.Println(sh...)
-       fmt.Println("====\n")
+       fmt.Print("====\n\n")
        msglog.Base(1, "礼").I(sh...)
 }
 
@@ -355,7 +355,7 @@ func (replayF) danmu(s string) {
                defer msglog.Fileonly(false)
 
                //F附加方法
-               Danmujif(msg, Msg_cookie, Msg_roomid)
+               Danmujif(msg)
                if Autobanf(msg) {
                        fmt.Println("风险", msg)
                        msglog.Base(1, "风险").I(msg)
@@ -370,6 +370,11 @@ func (replayF) danmu(s string) {
        }
 }
 
+func Msg_senddanmu(msg string){
+       if Msg_cookie == "" || Msg_roomid == 0 {return}
+       Danmu_s(msg, Msg_cookie, Msg_roomid)
+}
+
 func Msg_showdanmu(auth interface{}, msg string) {
        if Lessdanmuf(msg, 20) > 0.7 {//与前20条弹幕重复的字数占比度>0.7的屏蔽
                if auth != nil {msglog.I(auth, ":", msg)}
index bf273e25b98836348aba3387be62ed726881c5c4..7b5c357c8c78d5ea4d4e94dd4a06b58dd2d8bc3e 100644 (file)
@@ -69,7 +69,7 @@ func Demo() {
                                                        //传输变量至Msg,以便响应弹幕"弹幕机在么"
                                                        Msg_roomid = api.Roomid
                                                        Msg_cookie = f
-                                                       Danmuji_auto(Msg_cookie, 5, Msg_roomid)
+                                                       Danmuji_auto(5)
                                                }
                                        }()
                                }
@@ -98,6 +98,7 @@ func Demo() {
                }
 
                danmulog.I("结束退出")
+               os.Exit(0)
        }
 }
 
diff --git a/send.go b/send.go
index 734f0fc27483db8935cd627fcd4b16a77b4c5e97..74372af70c0b0f219939b8973b40ea0c24dd24ab 100644 (file)
--- a/send.go
+++ b/send.go
@@ -8,7 +8,7 @@ import (
 )
 
 //每秒一个令牌,最多等5秒
-var danmu_s_limit = p.Limit(1, 1000, 5000)
+var danmu_s_limit = p.Limit(1, 1500, 5000)
 
 //弹幕发送
 func Danmu_s(msg,Cookie string, roomid int) {