From 6dc279eeaf2db33b538ceedfc553b633028ce7f7 Mon Sep 17 00:00:00 2001 From: qydysky Date: Wed, 16 Sep 2020 11:25:28 +0800 Subject: [PATCH] 11 --- F.go | 103 ++++++++++++++++++++++++--- Msg.go | 191 ++++++++++++++++++++++++++++---------------------- bili_danmu.go | 9 +-- send.go | 2 - 4 files changed, 207 insertions(+), 98 deletions(-) diff --git a/F.go b/F.go index 12f4048..29ceb9f 100644 --- 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 1f8d859..6e2c8bd 100644 --- 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) } diff --git a/bili_danmu.go b/bili_danmu.go index e0ce16a..4096b71 100644 --- a/bili_danmu.go +++ b/bili_danmu.go @@ -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 b7d7218..734f0fc 100644 --- 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 -- 2.39.2