]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
使用带tag的消息队列在功能间传递消息
authorqydysky <qydysky@foxmail.com>
Tue, 22 Dec 2020 13:05:25 +0000 (21:05 +0800)
committerqydysky <qydysky@foxmail.com>
Tue, 22 Dec 2020 13:05:25 +0000 (21:05 +0800)
F/api.go
Reply/Reply.go
Reply/gtk.go
Reply/tts.go
bili_danmu.go
demo/go.mod
demo/go.sum

index e186ab6755cdbd568b30e7689e4887d8a5e1d773..e88b66fa2c8f18a9c5c5f7b6e3bcec8497e888fd 100644 (file)
--- a/F/api.go
+++ b/F/api.go
@@ -463,10 +463,8 @@ func (i *api) Get_OnlineGoldRank() {
                                        score += v.(float64)/10
                                }
                        }
-                       c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//传入消息队列
-                               Class:`c.Rev_add`,
-                               Data:score,
-                       })
+                       //传入消息队列
+                       c.Danmu_Main_mq.Push_tag(`c.Rev_add`,score)
 
                        if rank_list := p.Json().GetArrayFrom(p.Json().GetValFromS(res, "data.OnlineRankItem"), "userRank");rank_list == nil {
                                apilog.Base(1, "获取 rank_list").E("rank_list", len(rank_list))
@@ -594,7 +592,7 @@ func (i *api) Get_Version() {
        }
 }
 
-func (i *api) Get_cookie() {
+func Get_cookie() {
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
 
        var img_url string
index 44e00002f376cc22e1d933f7c0086e9cdb1295c2..b520a8dfdf7d819ba9ae18c88f5ebe6fc10b309e 100644 (file)
@@ -67,12 +67,9 @@ func (replyF) interact_word(s string){
        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.Sprint(v + `关注了直播间`),
-                               },
+                       c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{
+                               uid:`0follow`,
+                               msg:fmt.Sprint(v + `关注了直播间`),
                        })
                }
                Gui_show(v + `关注了直播间`,`0follow`)
@@ -170,25 +167,17 @@ func (replyF) user_toast_msg(s string){
        }
        if price != nil {
                sh_log = append(sh, "¥", int(price.(float64)) / 1000)//不在界面显示价格
-               c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//传入消息队列
-                       Class:`c.Rev_add`,
-                       Data:price.(float64) / 1000,
-               })
+               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,price.(float64) / 1000)
        }
        {//语言tts
-               c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{
-                       Class:`tts`,
-                       Data:Danmu_mq_t{
-                               uid:`0buyguide`,
-                               msg:fmt.Sprint(sh...),
-                       },
+               c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                       uid:`0buyguide`,
+                       msg:fmt.Sprint(sh...),
                })
        }
        {//额外 ass
                Assf(fmt.Sprintln(sh...))
-               c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//使用连续付费的新舰长无法区分,刷新舰长数
-                       Class:`guard_update`,
-               })
+               c.Danmu_Main_mq.Push_tag(`guard_update`,nil)//使用连续付费的新舰长无法区分,刷新舰长数
        }
        fmt.Println("\n====")
        fmt.Println(sh...)
@@ -203,10 +192,7 @@ func (replyF) user_toast_msg(s string){
 
 //HeartBeat-心跳用来传递人气值
 func (replyF) heartbeat(s int){
-       c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{
-               Class:`c.Renqi`,
-               Data:s,
-       })
+       c.Danmu_Main_mq.Push_tag(`c.Renqi`,s)//使用连续付费的新舰长无法区分,刷新舰长数
        if s == 1 {return}//人气为1,不输出
        heartlog.I("当前人气", s)
 }
@@ -321,12 +307,9 @@ func (replyF) welcome_guard(s string){
                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...),
-                       },
+               c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                       uid:img,
+                       msg:fmt.Sprintln(sh...),
                })
        }
        fmt.Print(">>> ")
@@ -366,10 +349,7 @@ func (replyF) send_gift(s string){
        if total_coin != nil {
                allprice = total_coin.(float64) / 1000
                sh_log = append(sh, fmt.Sprintf("¥%.1f",allprice))//不在界面显示价格
-               c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//传入消息队列
-                       Class:`c.Rev_add`,
-                       Data:allprice,
-               })
+               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,allprice)
        }
 
        if len(sh) == 0 {return}
@@ -378,12 +358,9 @@ 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...),
-                       },
+               c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                       uid:`0gift`,
+                       msg:fmt.Sprintln(sh...),
                })
        }
        {//额外
@@ -491,10 +468,7 @@ func (replyF) super_chat_message(s string){
        if price != nil {
                sh = append(sh, "\n")//界面不显示价格
                logg = append(logg, "¥", price)
-               c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//传入消息队列
-                       Class:`c.Rev_add`,
-                       Data:price.(float64),
-               })
+               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,price.(float64))
        }
        fmt.Println("====")
        fmt.Println(sh...)
@@ -506,12 +480,9 @@ func (replyF) super_chat_message(s string){
                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...),
-                       },
+               c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                       uid:`0superchat`,
+                       msg:fmt.Sprintln(sh...),
                })
        }
        if message_jpn != nil && message.(string) != message_jpn.(string) && message_jpn.(string) != "" {
@@ -654,12 +625,9 @@ func Msg_showdanmu(auth interface{}, m ...string) {
        }
        {//语言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,
-                               },
+                       c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                               uid:m[1],
+                               msg:msg,
                        })
                }
        }
@@ -678,7 +646,7 @@ func Gui_show(m ...string){
        uid := ""
        if len(m) > 1 {uid = m[1]}
 
-       Danmu_mq.Push(Danmu_mq_t{
+       Danmu_mq.Push_tag(`danmu`,Danmu_mq_t{
                uid:uid,
                msg:m[0],
        })
index b98100ce8cf7634d4c10dcd891bc0f0997986742..1287efc0d90cf428ce6a468993331e7a8225bca6 100644 (file)
@@ -66,18 +66,15 @@ var (
 
 func init(){
        if!IsOn("Gtk") {return}
-       go func(){
-               go Gtk_danmu()
-               var (
-                       sig = Danmu_mq.Sig()
-                       data interface{}
-               )
-               for {
-                       data,sig = Danmu_mq.Pull(sig)
-                       Gtk_danmuChan_uid <- data.(Danmu_mq_t).uid 
+       go Gtk_danmu()
+       //使用带tag的消息队列在功能间传递消息
+       Danmu_mq.Pull_tag(map[string]func(interface{})(bool){
+               `danmu`:func(data interface{})(bool){//弹幕
+                       Gtk_danmuChan_uid <- data.(Danmu_mq_t).uid
                        Gtk_danmuChan <- data.(Danmu_mq_t).msg
-               }
-       }()
+                       return false
+               },
+       })
 }
 
 func Gtk_danmu() {
@@ -245,9 +242,7 @@ func Gtk_danmu() {
                                                        y(`输入错误`,load_face("0room"))
                                                } else {
                                                        c.Roomid =  i
-                                                       c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{
-                                                               Class:`change_room`,
-                                                       })
+                                                       c.Danmu_Main_mq.Push_tag(`change_room`,nil)
                                                }
                                        } else {
                                                y(`房间号输入为空`,load_face("0room"))
index a7c305250278079d04007ed08560c191a06c8dd8..5fb59265c514b3651312f6c87353daa509444889 100644 (file)
@@ -29,32 +29,22 @@ func init(){
                }
        }
        go func(){
-               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 = 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:
-                               }
-                       }
+               for{
+                       e := <- tts_List
+                       TTS(e.(Danmu_mq_t).uid, e.(Danmu_mq_t).msg)
                }
        }()
+       
+       //消息队列接收tts类消息,并传送到TTS朗读
+       //使用带tag的消息队列在功能间传递消息
+       c.Danmu_Main_mq.Pull_tag(map[string]func(interface{})(bool){
+               `tts`:func(data interface{})(bool){//tts
+                       if _,ok := tts_setting[data.(Danmu_mq_t).uid];ok {
+                               tts_List <- data
+                       }
+                       return false
+               },
+       })
 }
 
 
index cecabd54ae0637c3dd736c8a61b05fbb8c5301e9..f5ca8d4b377c53ab8bf2000a1d530de0ac34b168 100644 (file)
@@ -59,38 +59,31 @@ func Demo(roomid ...int) {
                                change_room_chan <- true
                        }
                }()
-
-               go func(){
-                       var (
-                               sig = c.Danmu_Main_mq.Sig()
-                               data interface{}
-                       )
-                       for {
-                               data,sig = c.Danmu_Main_mq.Pull(sig)
-                               if d,ok := data.(c.Danmu_Main_mq_item);!ok {
-                                       continue
-                               } else {
-                                       switch d.Class {
-                                       case `change_room`:
-                                               c.Rev = 0.0 //营收
-                                               c.Renqi = 1//人气置1
-                                               c.GuardNum = 0//舰长数
-                                               c.Note = ``//分区排行
-                                               c.Uname = ``//主播id
-                                               c.Title = ``
-                                               reply.Saveflv_wait()//停止保存直播流
-                                               change_room_chan <- true
-                                       case `c.Rev_add`:
-                                               c.Rev += d.Data.(float64)
-                                       case `c.Renqi`:
-                                               if tmp,ok := d.Data.(int);ok{
-                                                       c.Renqi = tmp
-                                               }
-                                       default:
-                                       }
+               
+               //使用带tag的消息队列在功能间传递消息
+               c.Danmu_Main_mq.Pull_tag(map[string]func(interface{})(bool){
+                       `change_room`:func(data interface{})(bool){//房间改变
+                               c.Rev = 0.0 //营收
+                               c.Renqi = 1//人气置1
+                               c.GuardNum = 0//舰长数
+                               c.Note = ``//分区排行
+                               c.Uname = ``//主播id
+                               c.Title = ``
+                               reply.Saveflv_wait()//停止保存直播流
+                               change_room_chan <- true
+                               return false
+                       },
+                       `c.Rev_add`:func(data interface{})(bool){//收入
+                               c.Rev += data.(float64)
+                               return false
+                       },
+                       `c.Renqi`:func(data interface{})(bool){//人气更新
+                               if tmp,ok := data.(int);ok{
+                                       c.Renqi = tmp
                                }
-                       }
-               }()
+                               return false
+                       },
+               })
 
                <-change_room_chan
 
@@ -112,12 +105,11 @@ func Demo(roomid ...int) {
                                } else {
                                        danmulog.I("未检测到cookie.txt,如果需要登录请在本机打开以下网址扫码登录,不需要请忽略")
                                        go func(){//获取cookie
-                                               F.New_api(c.Roomid).Get_cookie()
+                                               F.Get_cookie()
                                                if c.Cookie != `` {
                                                        danmulog.I("你已登录,刷新房间!")
-                                                       c.Danmu_Main_mq.Push(c.Danmu_Main_mq_item{//刷新
-                                                               Class:`change_room`,
-                                                       })
+                                                       //刷新
+                                                       c.Danmu_Main_mq.Push_tag(`change_room`,nil)
                                                }
                                        }()
                                        p.Sys().Timeoutf(3)
@@ -191,27 +183,18 @@ func Demo(roomid ...int) {
                                                //获取过往营收 舰长数量
                                                // go api.Get_OnlineGoldRank()//高能榜显示的是在线观众的打赏
 
-                                               go func(){//订阅消息,以便刷新舰长数
-                                                       api.Get_guardNum()
-                                                       var (
-                                                               sig = c.Danmu_Main_mq.Sig()
-                                                               data interface{}
-                                                       )
-                                                       for {
-                                                               data,sig = c.Danmu_Main_mq.Pull(sig)
-                                                               if d,ok := data.(c.Danmu_Main_mq_item);!ok {
-                                                                       continue
-                                                               } else {
-                                                                       switch d.Class {
-                                                                       case `guard_update`:
-                                                                               go api.Get_guardNum()
-                                                                       case `change_room`:
-                                                                               return//换房时退出当前房间
-                                                                       default:
-                                                                       }
-                                                               }
-                                                       }
-                                               }()
+                                               //订阅消息,以便刷新舰长数
+                                               api.Get_guardNum()
+                                               //使用带tag的消息队列在功能间传递消息
+                                               c.Danmu_Main_mq.Pull_tag(map[string]func(interface{})(bool){
+                                                       `guard_update`:func(data interface{})(bool){//舰长更新
+                                                               go api.Get_guardNum()
+                                                               return false
+                                                       },
+                                                       `change_room`:func(data interface{})(bool){//换房时退出当前房间
+                                                               return true
+                                                       },
+                                               })
 
                                                if c.Cookie != `` {//附加功能 弹幕机 无cookie无法发送弹幕
                                                        reply.Danmuji_auto(1)
index cdfab1e7ad8f954af4c000f91782b2173d78ec9d..b26931289f3718c6c6e96c1d7db70bf4dac61df1 100644 (file)
@@ -10,7 +10,7 @@ require (
        github.com/miekg/dns v1.1.35 // indirect
        github.com/mitchellh/mapstructure v1.4.0 // indirect
        github.com/qydysky/bili_danmu v0.5.4
-       github.com/qydysky/part v0.3.5-0.20201222075205-70243aca6682 // indirect
+       github.com/qydysky/part v0.3.5-0.20201222123333-27d31033ffec // indirect
        github.com/shirou/gopsutil v3.20.11+incompatible // indirect
        github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
        golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 // indirect
index 177144ca4baeb16a43c9ed2ec382728183a0f8f1..87ce0a7eb12be138f1fee2f89c39f3eaea2c977c 100644 (file)
@@ -78,6 +78,8 @@ github.com/qydysky/part v0.3.5-0.20201222061900-d0c0ca9fc246 h1:MDhL/WQ4fGNjLWnc
 github.com/qydysky/part v0.3.5-0.20201222061900-d0c0ca9fc246/go.mod h1:SxxNav0Z7DbsDLoG5uxo0wW5EKU/JBu2CAkZzZeLnX0=
 github.com/qydysky/part v0.3.5-0.20201222075205-70243aca6682 h1:k7YM2PUXxW96cIAludM1zJ4c9Ru6/W5jxJ67HrUht3w=
 github.com/qydysky/part v0.3.5-0.20201222075205-70243aca6682/go.mod h1:SxxNav0Z7DbsDLoG5uxo0wW5EKU/JBu2CAkZzZeLnX0=
+github.com/qydysky/part v0.3.5-0.20201222123333-27d31033ffec h1:Mwrebha+zOcwYRxroUJhWBMgopVoqIyfOEYOeq6idtA=
+github.com/qydysky/part v0.3.5-0.20201222123333-27d31033ffec/go.mod h1:SxxNav0Z7DbsDLoG5uxo0wW5EKU/JBu2CAkZzZeLnX0=
 github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad h1:Jtzf509lQrkUMGTV0Sc6IDCAiR1VrBcHrIban7hpye4=
 github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg=
 github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8=