From: qydysky Date: Fri, 18 Dec 2020 22:17:34 +0000 (+0800) Subject: 直播间关注 X-Git-Tag: v0.5.5~1^2~16 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=06464647b86d0574edf5ac075e03dc377769f213;p=bili_danmu%2F.git 直播间关注 --- diff --git a/README.md b/README.md index 393c100..a20ae05 100644 --- a/README.md +++ b/README.md @@ -13,104 +13,57 @@ golang go version go1.15.5 linux/amd64 --- ### 当前支持显示/功能 + +#### 当前支持显示 以下内容可能过时,点击查看[当前支持显示](https://github.com/qydysky/bili_danmu/blob/master/Reply/Msg.go#L13) -``` -显示 -case 后有函数调用的为支持,为nil的为待完善,注释掉的调用为未启用 - -//Msg类型数据处理方法map -var Msg_map = map[string]func(replyF, string) { - "PK_BATTLE_PRE":nil,//人气pk - "PK_BATTLE_START":nil,//人气pk - "PK_BATTLE_PROCESS":nil,//人气pk - "PK_BATTLE_END":nil,//人气pk - "PK_BATTLE_RANK_CHANGE":nil,//人气pk - "PK_BATTLE_SETTLE_USER":nil,//人气pk - "PK_BATTLE_SETTLE_V2":nil,//人气pk - "PK_BATTLE_SETTLE":nil,//人气pk - "SYS_MSG":nil,//系统消息 - "ROOM_SKIN_MSG":nil, - "GUARD_ACHIEVEMENT_ROOM":nil, - "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":replyF.user_toast_msg,//大航海购买信息 - "WIN_ACTIVITY":replyF.win_activity,//活动 - "SPECIAL_GIFT":replyF.special_gift,//节奏风暴 - "GUARD_BUY":nil,//replyF.guard_buy,//大航海购买 - "WELCOME_GUARD":replyF.welcome_guard,//大航海进入 - "DANMU_MSG":replyF.danmu,//弹幕 - "ROOM_CHANGE":replyF.room_change,//房间信息分区改变 - "ROOM_SILENT_OFF":replyF.roomsilent,//禁言结束 - "ROOM_SILENT_ON":replyF.roomsilent,//禁言开始 - "SEND_GIFT":replyF.send_gift,//礼物 - "ROOM_BLOCK_MSG":replyF.room_block_msg,//封禁 - "PREPARING":replyF.preparing,//下播 - "LIVE":replyF.live,//开播 - "SUPER_CHAT_MESSAGE":nil,//replyF.super_chat_message,//SC - "SUPER_CHAT_MESSAGE_JPN":replyF.super_chat_message,//SC - "PANEL":replyF.panel,//排行榜 - "ENTRY_EFFECT":nil,//replyF.entry_effect,//进入特效 - "ROOM_REAL_TIME_MESSAGE_UPDATE":nil,//replyF.roominfo,//粉丝数 -} -``` +- [x] 人气 +- [x] 天选之人开始 +- [x] 天选之人获奖 +- [x] 直播间关注提示 +- [x] 大航海购买 +- [x] 节奏风暴 +- [x] 大航海进入 +- [x] 弹幕 +- [x] 房间信息分区改变 +- [x] 禁言 +- [x] 礼物 +- [x] 封禁 +- [x] 下播 +- [x] 开播 +- [x] SC +- [x] 排行榜 + +#### 当前支持功能 以下内容可能过时,点击查看[当前支持功能](https://github.com/qydysky/bili_danmu/blob/master/Reply/F.go#L16) -``` -其他功能 -自动化功能、挑选有价值的弹幕,可在demo/config_F.json覆盖默认控制 -//功能开关 -var AllF = map[string]bool{ - "Saveflv":true,//保存直播流(仅高清) - /* - Saveflv需要外部组件 - ffmpeg http://ffmpeg.org/download.html - */ - "Obs":false,//obs组件(仅录播) - /* - Obs需要外部组件: - obs https://obsproject.com/download - obs-websocket https://github.com/Palakis/obs-websocket/releases - */ - "Ass":true,//Ass弹幕生成,由于时间对应关系,仅开启流保存时生效 - "Autoban":true,//自动封禁(仅提示,未完成) - "Jiezou":true,//带节奏预警,提示弹幕礼仪 - "Danmuji":true,//反射型弹幕机,回应弹幕 - "Danmuji_auto":false,//自动型弹幕机,定时输出 - "Autoskip":true,//刷屏缩减,相同合并 - "Lessdanmu":true,//弹幕缩减,屏蔽与前n条弹幕重复的字数占比度高于阈值的弹幕 - "Moredanmu":false,//弹幕增量 - "Shortdanmu":true,//上下文相同文字缩减 -} -``` -以下内容可能过时,其他小功能 - -弹幕自动重连 - -直播流开播自动下载 - -直播流下载重连 - -gtk弹幕窗自定义人/事件消息停留/房间切换/弹幕格式化发送 - -营收/舰长/时长统计 - -自定义语音提醒 +- [x] 自定义语音提醒 +- [x] GTK弹幕窗 +- [x] GTK信息窗 +- [x] 营收统计 +- [x] 舰长数统计 +- [x] 直播流保存 +- [x] ASS字幕生成 +- [x] OBS调用 +- [x] 节奏提示 +- [x] 反射型弹幕机 +- [x] 自动型弹幕机 +- [x] 相同弹幕合并 +- [x] 重复度高弹幕屏蔽 +- [x] 弹幕开头字符相同缩减 + + +#### 其他特性 + +- [x] 弹幕自动重连(30s) +- [x] 直播流开播自动下载 +- [x] 直播流断流再保存 +- [x] GTK信息窗支持房间切换、弹幕格式化发送、时长统计 +- [x] GTK弹幕窗支持自定义人/事件消息停留 ### 构建 本项目使用github action自动构建,构建过程详见[yml](https://github.com/qydysky/bili_danmu/blob/master/.github/workflows/go.yml) -构建tts需要ffplay,先行安装[ffmpeg](http://ffmpeg.org/download.html) +#### 语音 +调用tts需要ffplay,先行安装[ffmpeg](http://ffmpeg.org/download.html) ``` 编译命令 @@ -118,6 +71,7 @@ cd demo go build -v -tags `tts` -o demo.exe -i main.go ``` +#### 弹幕窗 构建gtk需要gtk3,先行安装[gtk](https://www.gtk.org/) ``` 编译命令 diff --git a/Reply/Msg.go b/Reply/Msg.go index e3d06b6..52b24d3 100644 --- a/Reply/Msg.go +++ b/Reply/Msg.go @@ -41,7 +41,7 @@ var Msg_map = map[string]func(replyF, string) { "ANCHOR_LOT_END":nil,//天选之人结束 "ANCHOR_LOT_AWARD":replyF.anchor_lot_award,//天选之人获奖 "COMBO_SEND":nil, - "INTERACT_WORD":nil, + "INTERACT_WORD":replyF.interact_word,//进入信息,包含直播间关注提示 "ACTIVITY_BANNER_UPDATE_V2":nil, "NOTICE_MSG":nil, "ROOM_BANNER":nil, @@ -78,7 +78,13 @@ func init(){ buf := s.New() buf.Load("config/config_disable_msg.json") for k,v := range buf.B { - if able,ok := v.(bool);ok && !able {Msg_map[k] = nil} + if able,ok := v.(bool);ok {//设置为true时,使用默认显示 + if able { + Msg_map[k] = replyF.defaultMsg + } else { + Msg_map[k] = nil + } + } } } } diff --git a/Reply/Reply.go b/Reply/Reply.go index c59a5bf..b055705 100644 --- a/Reply/Reply.go +++ b/Reply/Reply.go @@ -60,6 +60,26 @@ func (replyF) defaultMsg(s string){ msglog.Base(1, "Unknow").E(s) } +//msg-直播间进入信息,此处用来提示关注 +func (replyF) interact_word(s string){ + msg_type := p.Json().GetValFromS(s, "data.msg_type"); + if v,ok := msg_type.(float64);!ok || v < 2 {return}//关注时为2,进入时为1 + uname := p.Json().GetValFromS(s, "data.uname"); + if v,ok := uname.(string);ok { + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0follow`, + msg:fmt.Sprintln(v + `关注了直播间`), + }, + }) + } + Gui_show(v + `关注了直播间`,`0follow`) + msglog.Base(1, "房").Fileonly(true).I(v + `关注了直播间`).Fileonly(false) + } +} + //Msg-天选之人开始 func (replyF) anchor_lot_start(s string){ award_name := p.Json().GetValFromS(s, "data.award_name"); @@ -92,7 +112,11 @@ func (replyF) anchor_lot_award(s string){ uname := p.Json().GetValFrom(v, "uname"); uid := p.Json().GetValFrom(v, "uid"); if uname != nil && uid != nil { - sh = append(sh, uname, "(", uid, ")") + if v,ok := uid.(float64);ok {//uid可能为float型 + sh = append(sh, uname, "(", strconv.Itoa(int(v)), ")") + } else { + sh = append(sh, uname, "(", uid, ")") + } } } } @@ -151,6 +175,15 @@ func (replyF) user_toast_msg(s string){ Data:price.(float64) / 1000, }) } + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0guard_update`, + msg:fmt.Sprintln(sh...), + }, + }) + } {//额外 ass Assf(fmt.Sprintln(sh...)) c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//使用连续付费的新舰长无法区分,刷新舰长数 @@ -174,7 +207,7 @@ func (replyF) heartbeat(s int){ Class:`c.Renqi`, Data:s, }) - // if s == "1" {return}//人气为1,不输出 + if s == 1 {return}//人气为1,不输出 heartlog.I("当前人气", s) } @@ -287,7 +320,15 @@ func (replyF) welcome_guard(s string){ if username != nil { sh = append(sh, username, "进入直播间") } - + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:img, + msg:fmt.Sprintln(sh...), + }, + }) + } fmt.Print(">>> ") fmt.Println(sh...) Gui_show(Itos(append([]interface{}{">>> "}, sh...)), img) @@ -336,6 +377,15 @@ func (replyF) send_gift(s string){ //小于3万金瓜子 if allprice < 30 {msglog.T(sh...);return} + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0gift`, + msg:fmt.Sprintln(sh...), + }, + }) + } {//额外 Assf(fmt.Sprintln(sh...)) } @@ -455,6 +505,15 @@ func (replyF) super_chat_message(s string){ sh = append(sh, message) logg = append(logg, message) } + {//语言tts + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:`0superchat`, + msg:fmt.Sprintln(sh...), + }, + }) + } if message_jpn != nil && message.(string) != message_jpn.(string) && message_jpn.(string) != "" { fmt.Println(message_jpn) // Gui_show(message_jpn.(string)) @@ -592,7 +651,17 @@ func Msg_showdanmu(auth interface{}, m ...string) { Gui_show(m...) } } - + {//语言tts + if len(m) > 1 { + c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{ + Class:`tts`, + Data:Danmu_mq_t{ + uid:m[1], + msg:msg, + }, + }) + } + } fmt.Println(msg) if auth != nil {msglog.I(auth, ":", msg)} } diff --git a/Reply/tts.go b/Reply/tts.go index 8f2b34c..f9cf8fc 100644 --- a/Reply/tts.go +++ b/Reply/tts.go @@ -7,6 +7,7 @@ import ( "net/url" "strings" p "github.com/qydysky/part" + c "github.com/qydysky/bili_danmu/CV" s "github.com/qydysky/part/buf" ) @@ -28,21 +29,30 @@ func init(){ } } go func(){ - var ( - sig = Danmu_mq.Sig() - data interface{} - ) go func(){ for{ e := <- tts_List TTS(e.(Danmu_mq_t).uid, e.(Danmu_mq_t).msg) } }() - + + //消息队列接收tts类消息,并传送到TTS朗读 + var ( + sig = c.Danmu_Main_mq.Sig() + data interface{} + ) for { - data,sig = Danmu_mq.Pull(sig) - if _,ok := tts_setting[data.(Danmu_mq_t).uid];!ok {continue} - tts_List <- data + data,sig = c.Danmu_Main_mq.Pull(sig) + if d,ok := data.(c.Danmu_Main_mq_item);!ok { + continue + } else { + switch d.Class { + case `tts`: + if _,ok := tts_setting[d.Data.(Danmu_mq_t).uid];!ok {continue} + tts_List <- d.Data + default: + } + } } }() } diff --git a/demo/config/config_disable_msg.json b/demo/config/config_disable_msg.json index ece8479..bab0479 100644 --- a/demo/config/config_disable_msg.json +++ b/demo/config/config_disable_msg.json @@ -1,5 +1,4 @@ { "help":"禁用指定消息类型", - "PK_BATTLE_PRE":false, - "DANMU_MSG":true + "PK_BATTLE_PRE":false } \ No newline at end of file diff --git a/demo/config/config_gtk_keep_key.json b/demo/config/config_gtk_keep_key.json index 50b9860..8f75f53 100644 --- a/demo/config/config_gtk_keep_key.json +++ b/demo/config/config_gtk_keep_key.json @@ -9,5 +9,6 @@ "face/0level3":1, "face/0superchat":13, "face/0tianxuan":5, - "face/0multi":1 + "face/0multi":1, + "face/0follow":1 } \ No newline at end of file diff --git a/demo/config/config_tts.json b/demo/config/config_tts.json index 52b02c8..67e8235 100644 --- a/demo/config/config_tts.json +++ b/demo/config/config_tts.json @@ -2,5 +2,6 @@ "0buyguide":"感谢{D}", "0gift":"感谢{D}", "0superchat":"感谢{D}", - "0multi":"观众:{D}" + "0multi":"观众:{D}", + "0follow":"感谢{D}" } \ No newline at end of file diff --git a/demo/face/0follow b/demo/face/0follow new file mode 100644 index 0000000..0c3ab2e Binary files /dev/null and b/demo/face/0follow differ