]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
直播间关注
authorqydysky <qydysky@foxmail.com>
Fri, 18 Dec 2020 22:17:34 +0000 (06:17 +0800)
committerqydysky <qydysky@foxmail.com>
Fri, 18 Dec 2020 22:17:48 +0000 (06:17 +0800)
README.md
Reply/Msg.go
Reply/Reply.go
Reply/tts.go
demo/config/config_disable_msg.json
demo/config/config_gtk_keep_key.json
demo/config/config_tts.json
demo/face/0follow [new file with mode: 0644]

index 393c100fe5d62f6d29dc7ff7ee5d80785b035150..a20ae0502ae9513f83ff07c032e89191b8374490 100644 (file)
--- 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/)
 ```
 编译命令
index e3d06b6c5c1bd21ca144bbc702d0935d2e2c4023..52b24d3a722a55c266c77d84c7cb6c895aafbb99 100644 (file)
@@ -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
+                               }
+                       }
                }
        }
 }
index c59a5bfb7d6b33742c61c69afe6efd202ff100f9..b0557058c1838df03c9bfcbaef5484196090f2b3 100644 (file)
@@ -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)}
 }
index 8f2b34c578140687c014dcd7382f88fb2d4c5faa..f9cf8fcf6f4003842e6be5747adcd05197b73d7e 100644 (file)
@@ -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:
+                               }
+                       }
                }
        }()
 }
index ece8479c3881f136d5f284d98518d01706ba3f89..bab0479e3086c0fff3793cb24ca64d933d30b7f0 100644 (file)
@@ -1,5 +1,4 @@
 {
     "help":"禁用指定消息类型",
-    "PK_BATTLE_PRE":false,
-    "DANMU_MSG":true
+    "PK_BATTLE_PRE":false
 }
\ No newline at end of file
index 50b98601e9d885bde5acf5b8b3fb9735699e68a4..8f75f53a3dbe413c4d00b83ab434b945f6635166 100644 (file)
@@ -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
index 52b02c8e8eb8277c898a3e9b4884802fbf8aa415..67e82351828472ff6a78f375aec88f21a5b865b8 100644 (file)
@@ -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 (file)
index 0000000..0c3ab2e
Binary files /dev/null and b/demo/face/0follow differ