]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
11
authorqydysky <qydysky@foxmail.com>
Wed, 16 Sep 2020 03:25:28 +0000 (11:25 +0800)
committerqydysky <qydysky@foxmail.com>
Wed, 16 Sep 2020 03:25:28 +0000 (11:25 +0800)
F.go
Msg.go
bili_danmu.go
send.go

diff --git a/F.go b/F.go
index 12f404844ce68a6e9d44a5b16df8c21fa2c9219f..29ceb9f5fad6a5de511e0f20f204d293e52d499c 100644 (file)
--- a/F.go
+++ b/F.go
@@ -1,18 +1,37 @@
 package bili_danmu
 
 import (
+       "fmt"
        "bytes"
+       "sync"
+       "time"
 
        p "github.com/qydysky/part"
 ) 
 
+//功能开关
+var AllF = map[string]bool{
+       "Autoban":true,//自动封禁(仅提示,未完成)
+       "Danmuji":true,//反射型弹幕机
+       "Danmuji_auto":false,//自动型弹幕机
+       "Autoskip":true,//刷屏缩减
+}
+
+func IsOn(s string) bool {
+       if v, ok := AllF[s]; ok {
+               return v
+       }
+       return false
+}
+
+//功能区
 type Autoban struct {
        buf []byte
        Inuse bool
 }
 
 var autoban = Autoban {
-       Inuse:true,
+       Inuse:IsOn("Autoban"),
 }
 
 func Autobanf(s string) float32 {
@@ -33,14 +52,78 @@ func Autobanf(s string) float32 {
        return float32(scop) / float32(len(s))
 }
 
-func Autoban_add(s string) {
-       if autoban.Inuse {return}
+type Danmuji struct {
+       buf map[string]string
+       Inuse bool
+       Inuse_auto bool
+
+       mute bool
+}
+
+var danmuji = Danmuji{
+       Inuse:IsOn("Danmuji"),
+       Inuse_auto:IsOn("Danmuji_auto"),
+       buf:map[string]string{
+               "弹幕机在么":"在",
+       },
+}
 
-       autoban.buf = append(autoban.buf, []byte(s)...)
-       p.File().FileWR(p.Filel{
-               File:"Autoban.txt",
-               Write:true,
-               Loc:-1,
-               Context:[]interface{}{s},
-       })
+func Danmujif(s,cookie string, roomid int) {
+       if !danmuji.Inuse {return}
+       if cookie == "" || roomid == 0 {return}
+       if v, ok := danmuji.buf[s]; ok {
+               Danmu_s(v, cookie, roomid)
+       }
+}
+
+func Danmuji_auto(cookie string, sleep,roomid int) {
+       if !danmuji.Inuse || !danmuji.Inuse_auto || danmuji.mute {return}
+       if cookie == "" || roomid == 0 || sleep == 0 {return}
+
+       danmuji.mute = true
+       var list = []string{
+               "当前正在直播",
+               "12345",
+       }
+       go func(){
+               for i := 0; true; i++{
+                       if i >= len(list) {i = 0}
+                       Danmu_s(list[i], cookie, roomid)
+                       p.Sys().Timeoutf(sleep)
+               }
+       }()
+}
+
+type Autoskip struct {
+       Inuse bool
+       num int
+       buf sync.Map
+       bufbreak chan bool
+}
+
+var autoskip = Autoskip{
+       Inuse:IsOn("Autoskip"),
+       bufbreak:make(chan bool, 10),
+}
+
+func Autoskipf(s string, maxNum,muteSecond int) int {
+       if !autoskip.Inuse || s == "" || maxNum <= 0 || muteSecond <= 0 {return 0}
+       if v, ok := autoskip.buf.LoadOrStore(s, 0); ok {
+               autoskip.buf.Store(s, v.(int) + 1)
+               return v.(int) + 1
+       }
+       
+       autoskip.num += 1
+       if autoskip.num > maxNum {autoskip.bufbreak <- true}
+       
+       go func(){
+               select {
+               case <- autoskip.bufbreak:
+               case <- time.After(time.Duration(muteSecond)*time.Second):
+               }
+               autoskip.num -= 1
+               i, ok := autoskip.buf.LoadAndDelete(s);
+               if ok && i.(int) > 0 {fmt.Println("", s, "+", i)}
+       }()
+       return 0
 }
\ No newline at end of file
diff --git a/Msg.go b/Msg.go
index 1f8d859cd4a4f3c8e12f92994acc710cd772565d..6e2c8bd3a8938cfbdc955caa0e5a12b548ca0512 100644 (file)
--- a/Msg.go
+++ b/Msg.go
@@ -13,6 +13,38 @@ import (
 var msglog = p.Logf().New().Base(-1, "Msg.go>").Open("danmu.log").Level(1)
 var Msg_cookie string
 var Msg_roomid int
+var Msg_map = map[string]func(replayF, string) {
+       "ANCHOR_LOT_START":nil,//天选之人开始
+       "ANCHOR_LOT_CHECKSTATUS":nil,
+       "ANCHOR_LOT_END":nil,//天选之人结束
+       "ANCHOR_LOT_AWARD":nil,//天选之人获奖
+       "COMBO_SEND":nil,
+       "INTERACT_WORD":nil,
+       "ACTIVITY_BANNER_UPDATE_V2":nil,
+       "NOTICE_MSG":nil,
+       "ROOM_BANNER":nil,
+       "ONLINERANK":nil,
+       "WELCOME":nil,
+       "HOUR_RANK_AWARDS":nil,
+       "ROOM_RANK":nil,
+       "ROOM_SHIELD":nil,
+       "USER_TOAST_MSG":nil,
+       "GUARD_BUY":nil,//大航海购买
+       "WELCOME_GUARD":nil,//replayF.welcome_guard,//大航海进入
+       "DANMU_MSG":replayF.danmu,//弹幕
+       "ROOM_CHANGE":replayF.room_change,//房间信息分区改变
+       "ROOM_SILENT_OFF":replayF.roomsilent,//禁言结束
+       "ROOM_SILENT_ON":replayF.roomsilent,//禁言开始
+       "SEND_GIFT":replayF.send_gift,//礼物
+       "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,//打赏
+       "PANEL":replayF.panel,//排行榜
+       "ENTRY_EFFECT":replayF.entry_effect,//进入特效
+       "ROOM_REAL_TIME_MESSAGE_UPDATE":replayF.roominfo,//粉丝数
+}
 
 func Msg(b []byte, compress bool) {
        if compress {
@@ -40,35 +72,12 @@ func Msg(b []byte, compress bool) {
                        msglog.E("cmd", s)
                        return
                } else {
-                       switch cmd.(string) {
-                       case "ANCHOR_LOT_START"://天选之人开始
-                       case "ANCHOR_LOT_CHECKSTATUS":
-                       case "ANCHOR_LOT_END"://天选之人结束
-                       case "ANCHOR_LOT_AWARD"://天选之人获奖
-                       case "COMBO_SEND":
-                       case "INTERACT_WORD":
-                       case "ACTIVITY_BANNER_UPDATE_V2":
-                       case "NOTICE_MSG":
-                       case "ROOM_BANNER":
-                       case "ONLINERANK":
-                       case "WELCOME":
-                       case "HOUR_RANK_AWARDS":
-                       case "ROOM_RANK":
-                       case "ROOM_SHIELD":
-                       case "USER_TOAST_MSG":
-                       case "GUARD_BUY"://大航海购买
-                       case "WELCOME_GUARD"://welcome_guard(s)//大航海进入
-                       case "ROOM_SILENT_OFF", "ROOM_SILENT_ON":roomsilent(s);//禁言
-                       case "SEND_GIFT":send_gift(s)//礼物
-                       case "ROOM_BLOCK_MSG":room_block_msg(s)//封禁
-                       case "PREPARING":preparing(s)//下播
-                       case "LIVE":live(s)//开播
-                       case "SUPER_CHAT_MESSAGE", "SUPER_CHAT_MESSAGE_JPN":super_chat_message(s)//打赏
-                       case "PANEL":panel(s)//排行榜
-                       case "ENTRY_EFFECT":entry_effect(s)//进入特效
-                       case "ROOM_REAL_TIME_MESSAGE_UPDATE":roominfo(s)//粉丝数
-                       case "DANMU_MSG":danmu(s)//弹幕
-                       default:msglog.I("Unknow cmd", s)
+                       var f replayF
+
+                       if F, ok := Msg_map[cmd.(string)]; ok {
+                               if F != nil {F(f, s)}
+                       } else {
+                               f.defaultMsg(s)
                        }
                }
        }
@@ -76,8 +85,28 @@ func Msg(b []byte, compress bool) {
        return 
 }
 
-func welcome_guard(s string){
-       msglog.Base(1, "房")
+type replayF struct {}
+
+func (replayF) defaultMsg(s string){
+       msglog.Base(1, "Unknow cmd").E(s)
+}
+
+func (replayF) room_change(s string){
+       title := p.Json().GetValFromS(s, "data.title");
+       area_name := p.Json().GetValFromS(s, "data.area_name");
+
+       var sh  = []interface{}{"房间改变"}
+
+       if title != nil {
+               sh = append(sh, title)
+       }
+       if area_name != nil {
+               sh = append(sh, area_name)
+       }
+       msglog.Base(1, "房").I(sh...)
+}
+
+func (replayF) welcome_guard(s string){
 
        username := p.Json().GetValFromS(s, "data.username");
        guard_level := p.Json().GetValFromS(s, "data.guard_level");
@@ -85,20 +114,17 @@ func welcome_guard(s string){
        var sh = []interface{}{"欢迎"}
 
        if username != nil {
-               sh = append(sh, username.(string), "进入直播间")
+               sh = append(sh, username, "进入直播间")
        }
        if guard_level != nil {
-               sh = append(sh, "等级", int64(guard_level.(float64)))
+               sh = append(sh, "等级", guard_level)
        }
-       if len(sh) == 0 {return}
 
-       msglog.I(sh...)
+       msglog.Base(1, "房").I(sh...)
 }
 
-func send_gift(s string){
-       msglog.Base(1, "礼")
-
-       coin_type := p.Json().GetValFromS(s, "data.coin_type");
+func (replayF) send_gift(s string){
+       // coin_type := p.Json().GetValFromS(s, "data.coin_type");
        num := p.Json().GetValFromS(s, "data.num");
        uname := p.Json().GetValFromS(s, "data.uname");
        action := p.Json().GetValFromS(s, "data.action");
@@ -108,31 +134,32 @@ func send_gift(s string){
        var sh []interface{}
        var allprice int64
 
-       if num != nil {
-               sh = append(sh, int64(num.(float64)), "x")
-       }
-       if price != nil {
-               allprice = int64(num.(float64) * price.(float64))
-               sh = append(sh, "(", allprice, "x 金瓜子 )")
-       }
        if uname != nil {
-               sh = append(sh, uname.(string))
+               sh = append(sh, uname)
        }
        if action != nil {
-               sh = append(sh, action.(string))
+               sh = append(sh, action)
+       }
+       if num != nil {
+               sh = append(sh, num, "x")
        }
        if giftName != nil {
-               sh = append(sh, giftName.(string))
+               sh = append(sh, giftName)
        }
-       
+       if price != nil {
+               allprice = int64(num.(float64) * price.(float64))
+               sh = append(sh, "(", allprice, "x 金瓜子 )")
+       }
+
        if len(sh) == 0 {return}
 
-       //小于1万金瓜子 银瓜子不显示
-       if allprice < 10000 || coin_type.(string) == "silver" {msglog.T(sh...);return}
+       msglog.Base(1, "礼")
+       //小于1万金瓜子
+       if allprice < 10000 {msglog.T(sh...);return}
        msglog.I(sh...)
 }
 
-func room_block_msg(s string) {
+func (replayF) room_block_msg(s string) {
        msglog.Base(1, "封")
 
        if uname := p.Json().GetValFromS(s, "uname");uname == nil {
@@ -143,31 +170,29 @@ func room_block_msg(s string) {
        }
 }
 
-func preparing(s string) {
+func (replayF) preparing(s string) {
        msglog.Base(1, "房")
 
        if roomid := p.Json().GetValFromS(s, "roomid");roomid == nil {
                msglog.E("roomid", roomid)
                return
        } else {
-               msglog.I("房间", roomid.(string), "下播了")
+               msglog.I("房间", roomid, "下播了")
        }
 }
 
-func live(s string) {
+func (replayF) live(s string) {
        msglog.Base(1, "房")
 
        if roomid := p.Json().GetValFromS(s, "roomid");roomid == nil {
                msglog.E("roomid", roomid)
                return
        } else {
-               msglog.I("房间", roomid.(string), "开播了")
+               msglog.I("房间", roomid, "开播了")
        }
 }
 
-func super_chat_message(s string){
-       msglog.Base(1, "礼")
-
+func (replayF) super_chat_message(s string){
        uname := p.Json().GetValFromS(s, "data.user_info.uname");
        price := p.Json().GetValFromS(s, "data.price");
        message := p.Json().GetValFromS(s, "data.message");
@@ -176,45 +201,45 @@ func super_chat_message(s string){
        var sh = []interface{}{"打赏: "}
 
        if uname != nil {
-               sh = append(sh, uname.(string))
+               sh = append(sh, uname)
        }
        if price != nil {
-               sh = append(sh, "¥", int64(price.(float64)))
+               sh = append(sh, "¥", price)
        }
        if message != nil {
-               sh = append(sh, message.(string))
+               sh = append(sh, message)
        }
-       if message_jpn != nil {
-               sh = append(sh, message_jpn.(string))
+       if message_jpn != nil && message != message_jpn {
+               sh = append(sh, message_jpn)
        }
 
-       if len(sh) != 0 {msglog.I(sh...)}
+       msglog.Base(1, "礼").I(sh...)
 }
 
-func panel(s string){
+func (replayF) panel(s string){
        msglog.Base(1, "房")
 
        if note := p.Json().GetValFromS(s, "data.note");note == nil {
                msglog.E("note", note)
                return
        } else {
-               msglog.I("排行", note.(string))
+               msglog.I("排行", note)
        }
 }
 
-func entry_effect(s string){
+func (replayF) entry_effect(s string){
        msglog.Base(1, "房")
 
        if copy_writing := p.Json().GetValFromS(s, "data.copy_writing");copy_writing == nil {
                msglog.E("copy_writing", copy_writing)
                return
        } else {
-               msglog.I(copy_writing.(string))
+               msglog.I(copy_writing)
        }
 
 }
 
-func roomsilent(s string){
+func (replayF) roomsilent(s string){
        msglog.Base(1, "房")
 
        if level := p.Json().GetValFromS(s, "data.level");level == nil {
@@ -222,39 +247,41 @@ func roomsilent(s string){
                return
        } else {
                if level.(float64) == 0 {msglog.I("主播关闭了禁言")}
-               msglog.I("主播开启了等级禁言:", int64(level.(float64)))
+               msglog.I("主播开启了等级禁言:", level)
        }
 }
 
-func roominfo(s string){
-       msglog.Base(1, "粉")
-
+func (replayF) roominfo(s string){
        fans := p.Json().GetValFromS(s, "data.fans");
        fans_club := p.Json().GetValFromS(s, "data.fans_club");
 
        var sh []interface{}
 
        if fans != nil {
-               sh = append(sh, "粉丝总人数:", int64(fans.(float64)))
+               sh = append(sh, "粉丝总人数:", fans)
        }
        if fans_club != nil {
-               sh = append(sh, "粉丝团人数:", int64(fans_club.(float64)))
+               sh = append(sh, "粉丝团人数:", fans_club)
        }
 
-       if len(sh) != 0 {msglog.I(sh...)}
+       if len(sh) != 0 {msglog.Base(1, "粉").I(sh...)}
 }
 
-func danmu(s string) {
+func (replayF) danmu(s string) {
        if info := p.Json().GetValFromS(s, "info");info == nil {
                msglog.E("info", info)
                return
        } else {
                infob := info.([]interface{})
                msg := infob[1].(string)
-               auth := infob[2].([]interface{})[1].(string)
+               auth := infob[2].([]interface{})[1]
 
-               if Autobanf(msg) > 0.5 {msglog.Base(1, "风险").I(msg)}
-               if Msg_roomid != 0 && Msg_cookie != "" && msg == "弹幕机在么" {Danmu_s("在", Msg_cookie, Msg_roomid)}
+               Danmujif(msg, Msg_cookie, Msg_roomid)
+               if Autobanf(msg) > 0.5 {msglog.Base(1, "风险").I(msg);return}
+               if i := Autoskipf(msg, 20, 20); i > 0 {
+                       msglog.Fileonly(true).I(auth, ":", msg).Fileonly(false)
+                       return
+               }
 
                msglog.I(auth, ":", msg)
        }
index e0ce16a64d479e46949c623740cfaa7f6510e7d4..4096b71367c3c6ee4e9e11ac8b225f6759059874 100644 (file)
@@ -68,6 +68,7 @@ func Demo() {
                                                        //传输变量至Msg,以便响应弹幕"弹幕机在么"
                                                        Msg_roomid = api.Roomid
                                                        Msg_cookie = f
+                                                       Danmuji_auto(Msg_cookie, 5, Msg_roomid)
                                                }
                                        }()
                                }
@@ -115,8 +116,6 @@ const (
 
 //返回数据分派
 func Reply(b []byte) {
-       danmulog.Base(-1, "返回分派")
-       defer danmulog.Base(0)
 
        if ist, _ := headChe(b[:16], len(b), WS_BODY_PROTOCOL_VERSION_DEFLATE, WS_OP_MESSAGE, 0, 4); ist {
                Msg(b, true);return
@@ -125,6 +124,8 @@ func Reply(b []byte) {
                Msg(b, false);return
        }
 
+       danmulog.Base(1, "返回分派")
+
        if ist, _ := headChe(b[:16], len(b), WS_HEADER_DEFAULT_VERSION, WS_OP_HEARTBEAT_REPLY, WS_HEADER_DEFAULT_SEQUENCE, 4); ist {
                danmulog.T("heartbeat replay!");
                return
@@ -149,8 +150,7 @@ func headGen(datalenght,Opeation,Sequence int) []byte {
 func headChe(head []byte, datalenght,Bodyv,Opeation,Sequence,show int) (bool,int32) {
        if len(head) != WS_PACKAGE_HEADER_TOTAL_LENGTH {return false, 0}
        
-       danmulog.Base(-1, "头部检查").Level(show)
-       defer danmulog.Base(0).Level(LogLevel)
+       danmulog.Base(1, "头部检查").Level(show)
 
        packL := Btoi32(head[:4])
        headL := Btoi16(head[4:6])
@@ -163,6 +163,7 @@ func headChe(head []byte, datalenght,Bodyv,Opeation,Sequence,show int) (bool,int
        if OpeaT != int32(Opeation) {danmulog.E("类型错误");return false, packL}
        if Seque != int32(Sequence) {danmulog.E("Seq错误");return false, packL}
        if BodyV != int16(Bodyv) {danmulog.E("压缩算法错误");return false, packL}
+       danmulog.Base(0).Level(LogLevel)
        return true, packL
 }
 
diff --git a/send.go b/send.go
index b7d7218a535b43ba0599a4d0fe5c496a2198e099..734f0fc27483db8935cd627fcd4b16a77b4c5e97 100644 (file)
--- a/send.go
+++ b/send.go
@@ -75,6 +75,4 @@ func Danmu_s(msg,Cookie string, roomid int) {
                return
        }
 
-       l.I("成功")
-
 }
\ No newline at end of file