//功能开关
var AllF = map[string]bool{
"Autoban":true,//自动封禁(仅提示,未完成)
+ "Jiezou":true,//带节奏预警,提示弹幕礼仪
"Danmuji":true,//反射型弹幕机,回应弹幕
"Danmuji_auto":false,//自动型弹幕机,定时输出
"Autoskip":true,//刷屏缩减,相同合并
}
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
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);
},
}
-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{
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)
}
}()
o := cross(s, lessdanmu.buf)
if o == 1 {return 1}//完全无用
+ Jiezouf(lessdanmu.buf)
lessdanmu.buf = append(lessdanmu.buf[1:], s)
return o
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
"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,//粉丝数
fmt.Println("\n====")
fmt.Println(sh...)
- fmt.Println("====\n")
+ fmt.Print("====\n\n")
msglog.Base(1, "礼").I(sh...)
}
fmt.Println("\n====")
fmt.Println(sh...)
- fmt.Println("====\n")
+ fmt.Print("====\n\n")
msglog.I(sh...)
}
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, "已被封禁")
}
}
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)
fmt.Println("\n====")
fmt.Println(sh...)
- fmt.Println("====\n")
+ fmt.Print("====\n\n")
msglog.Base(1, "礼").I(sh...)
}
defer msglog.Fileonly(false)
//F附加方法
- Danmujif(msg, Msg_cookie, Msg_roomid)
+ Danmujif(msg)
if Autobanf(msg) {
fmt.Println("风险", msg)
msglog.Base(1, "风险").I(msg)
}
}
+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)}