From: qydysky Date: Sun, 20 Sep 2020 05:35:32 +0000 (+0800) Subject: 15 X-Git-Tag: v0.0.0~29 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=0bf042834f08601e350e6938cf31b15e63cab4c6;p=bili_danmu%2F.git 15 --- diff --git a/F.go b/F.go index c7a2a4c..9f2a5e0 100644 --- 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 27b473e..1977b17 100644 --- 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)} diff --git a/bili_danmu.go b/bili_danmu.go index bf273e2..7b5c357 100644 --- a/bili_danmu.go +++ b/bili_danmu.go @@ -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 734f0fc..74372af 100644 --- 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) {