]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
TTS语音合成自由度大提升
authorqydysky <qydysky@foxmail.com>
Sun, 13 Jun 2021 20:27:34 +0000 (04:27 +0800)
committerqydysky <qydysky@foxmail.com>
Sun, 13 Jun 2021 20:27:34 +0000 (04:27 +0800)
README.md
Reply/F.go
Reply/Reply.go
Reply/tts.go
Reply/ws_msg/SEND_GIFT.go [new file with mode: 0644]
Reply/ws_msg/SUPER_CHAT_MESSAGE_JPN.go [new file with mode: 0644]
Reply/ws_msg/USER_TOAST_MSG.go [new file with mode: 0644]
demo/config/config_tts.json

index bf3e68dee534ad53fe87b18b1b2140c9e70cd943..25bfb923ba6b033ab41618034dcb30314cfd31dc 100644 (file)
--- a/README.md
+++ b/README.md
@@ -285,16 +285,17 @@ config_K_v.json
 ```
 release默认编译tts
 
-总开关,自定义响应的事件可在`demo/config/config_tts.json`中编辑
+总开关,自定义响应的事件可在`demo/config/config_tts.json`中编辑。{}为传递过来的变量,将会按设定替换。最后未使用的{}会全部删除。下例:`ABC购买 1个月舰长`。
+```
+...
+"0buyguide-help": "大航海 {username}:用户 {op_name}:购买方式 {role_name}:大航海类型 {num}:个数 {unit}:时间单位",
+"0buyguide": "{username}{op_name} {num}个{unit}{role_name}",
+...
 ```
-{D}:为tts内容
-key为demo/face下的文件名
-"onoff":{
-    "help":"空字符串将不触发,{D}会被替换",
-    "0buyguide": "感谢{D}"
-}
 
-有些无法被tts引擎阅读的符号可以在此项中替换
+特别说明的,下面结构为全局替换。
+
+```
 "replace":{
     "?":"问号",
     "?":"问号"
index fe024273bfa5a438a39a186863934bac0ef8086e..d6698c3d196410b27540b7df1d91b54e49ee63c7 100644 (file)
@@ -1625,6 +1625,13 @@ func init(){
                                        delete(autoskip.buf,k)
                                        {//超时显示
                                                if v.Num > 3 {
+                                                       c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                                                               uid:`0multi`,
+                                                               m:map[string]string{
+                                                                       `{num}`:strconv.Itoa(int(v.Num)),
+                                                                       `{msg}`:k,
+                                                               },
+                                                       })
                                                        Msg_showdanmu(Danmu_item{
                                                                msg:strconv.Itoa(int(v.Num)) + " x " + k,
                                                                uid:`0multi`,
index 628e8e714951b33d75c0cce27727177c1dee5749..e7762031716a3efc32218b6b8c3c055b600be465 100644 (file)
@@ -129,7 +129,9 @@ func (replyF) vtr_gift_lottery(s string){
        {//语言tts
                c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{
                        uid:`0room`,
-                       msg:fmt.Sprint(j.Data.InteractMsg),
+                       m:map[string]string{
+                               `{msg}`:j.Data.InteractMsg,
+                       },
                })
        }
        Gui_show(j.Data.InteractMsg,`0room`)
@@ -205,51 +207,67 @@ func (replyF) anchor_lot_award(s string){
 
 //msg-通常是大航海购买续费
 func (replyF) user_toast_msg(s string){
-       username := p.Json().GetValFromS(s, "data.username");
-       op_type := p.Json().GetValFromS(s, "data.op_type");
-       uid := p.Json().GetValFromS(s, "data.uid");
-       role_name := p.Json().GetValFromS(s, "data.role_name");
-       num := p.Json().GetValFromS(s, "data.num");
-       unit := p.Json().GetValFromS(s, "data.unit");
-       // target_guard_count := p.Json().GetValFromS(s, "data.target_guard_count");
-       price := p.Json().GetValFromS(s, "data.price");
+       msglog := msglog.Base_add("礼")
+
+       var j ws_msg.USER_TOAST_MSG
+       if e := json.Unmarshal([]byte(s), &j);e != nil{
+               msglog.L(`E: `, e)
+               return
+       }
+
+       username := j.Data.Username
+       op_type := j.Data.OpType
+       uid := j.Data.UID
+       role_name := j.Data.RoleName
+       num := j.Data.Num
+       unit := j.Data.Unit
+       // target_guard_count := j.Data.target_guard_count
+       price := j.Data.Price
 
        var sh []interface{}
        var sh_log []interface{}
 
-       if username != nil {
+       if username != "" {
                sh = append(sh, username)
        }
-       if op_type != nil {
-               switch op_type.(float64) {
-               case 1:
-                       sh = append(sh, "购买了")
-               case 2:
-                       sh = append(sh, "续费了")
-               case 3:
-                       sh = append(sh, "自动续费了")
-               default:
-                       msglog.L(`W`, s)
-                       sh = append(sh, op_type)
-               }
-       }
-       if num != nil {
+       op_name := ""
+       switch op_type {
+       case 1:
+               op_name = `购买`
+               sh = append(sh, "购买了")
+       case 2:
+               op_name = `续费`
+               sh = append(sh, "续费了")
+       case 3:
+               op_name = `自动续费`
+               sh = append(sh, "自动续费了")
+       default:
+               msglog.L(`W`, s)
+               sh = append(sh, op_type)
+       }
+       if num != 0 {
                sh = append(sh, num, "个")
        }
-       if unit != nil {
+       if unit != "" {
                sh = append(sh, unit)
        }
-       if role_name != nil {
+       if role_name != "" {
                sh = append(sh, role_name)
        }
-       if price != nil {
-               sh_log = append(sh, "¥", int(price.(float64)) / 1000)//不在界面显示价格
-               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,price.(float64) / 1000)
+       if price != 0 {
+               sh_log = append(sh, "¥", price / 1000)//不在界面显示价格
+               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,price / 1000)
        }
        {//语言tts
                c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
                        uid:`0buyguide`,
-                       msg:fmt.Sprint(sh...),
+                       m:map[string]string{
+                               `{username}`:username,
+                               `{op_name}`:op_name,
+                               `{role_name}`:role_name,
+                               `{num}`:strconv.Itoa(num),
+                               `{unit}`:unit,
+                       },
                })
        }
        {//额外 ass 私信
@@ -257,7 +275,7 @@ func (replyF) user_toast_msg(s string){
                c.Danmu_Main_mq.Push_tag(`guard_update`,nil)//使用连续付费的新舰长无法区分,刷新舰长数
                if uid != 0 {
                        c.Danmu_Main_mq.Push_tag(`pm`,send.Pm_item{
-                               Uid:int(uid.(float64)),
+                               Uid:uid,
                                Msg:c.K_v.LoadV(`上舰私信`).(string),
                        })//上舰私信
                }
@@ -276,7 +294,7 @@ func (replyF) user_toast_msg(s string){
        Gui_show(Itos(sh), "0buyguide")
        // Gui_show("====\n")
 
-       msglog.Base_add("礼").Log_show_control(false).L(`I: `,sh_log...)
+       msglog.Log_show_control(false).L(`I: `,sh_log...)
 }
 
 //HeartBeat-心跳用来传递人气值
@@ -404,74 +422,72 @@ func (replyF) room_change(s string){
        msglog.Base_add("房").L(`I: `, sh...)
 }
 
-//Msg-大航海欢迎信息
+//Msg-大航海欢迎信息 或已废弃
 func (replyF) welcome_guard(s string){
-
-       username := p.Json().GetValFromS(s, "data.username");
-       guard_level := p.Json().GetValFromS(s, "data.guard_level");
-       img := "0default"
-
-       var sh = []interface{}{"欢迎"}
-
-       if guard_level != nil {
-               switch guard_level.(float64) {
-               case 1:sh = append(sh, "总督");img="0level1"
-               case 2:sh = append(sh, "提督");img="0level2"
-               case 3:sh = append(sh, "舰长");img="0level3"
-               default:sh = append(sh, "等级", guard_level)
-               }
-       }
-       if username != nil {
-               sh = append(sh, username, "进入直播间")
-       }
-       {//语言tts
-               c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
-                       uid:img,
-                       msg:fmt.Sprintln(sh...),
-               })
-       }
-       fmt.Print(">>> ")
-       fmt.Println(sh...)
-       Gui_show(Itos(append([]interface{}{">>> "}, sh...)), img)
-
-       msglog.Base_add("房").Log_show_control(false).L(`I: `, sh...)
+       // username := p.Json().GetValFromS(s, "data.username");
+       // guard_level := p.Json().GetValFromS(s, "data.guard_level");
+       // img := "0default"
+
+       // var sh = []interface{}{"欢迎"}
+
+       // if guard_level != nil {
+       //      switch guard_level.(float64) {
+       //      case 1:sh = append(sh, "总督");img="0level1"
+       //      case 2:sh = append(sh, "提督");img="0level2"
+       //      case 3:sh = append(sh, "舰长");img="0level3"
+       //      default:sh = append(sh, "等级", guard_level)
+       //      }
+       // }
+       // if username != nil {
+       //      sh = append(sh, username, "进入直播间")
+       // }
+       // {//语言tts
+       //      c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+       //              uid:img,
+       //              msg:fmt.Sprintln(sh...),
+       //      })
+       // }
+       // fmt.Print(">>> ")
+       // fmt.Println(sh...)
+       // Gui_show(Itos(append([]interface{}{">>> "}, sh...)), img)
+
+       // msglog.Base_add("房").Log_show_control(false).L(`I: `, sh...)
 }
 
 //Msg-礼物处理
 func (replyF) send_gift(s string){
-       coin_type := p.Json().GetValFromS(s, "data.coin_type");
-       if coin_type != nil && coin_type == "silver" {return}
+       msglog := msglog.Base_add("礼").Log_show_control(false)
 
-       num := p.Json().GetValFromS(s, "data.num");
-       uname := p.Json().GetValFromS(s, "data.uname");
-       action := p.Json().GetValFromS(s, "data.action");
-       giftName := p.Json().GetValFromS(s, "data.giftName");
-       total_coin := p.Json().GetValFromS(s, "data.total_coin");
+       var j ws_msg.SEND_GIFT
+       if e := json.Unmarshal([]byte(s), &j);e != nil {
+               msglog.L(`E: `, e)
+       }
+
+       //忽略银瓜子
+       if j.Data.CoinType ==  "silver" {return}
+
+       num := j.Data.Num
+       uname := j.Data.Uname
+       action := j.Data.Action
+       giftName := j.Data.Giftname
+       total_coin := j.Data.TotalCoin
 
        var sh []interface{}
        var sh_log []interface{}
        var allprice float64
 
-       if uname != nil {
-               sh = append(sh, uname)
-       }
-       if action != nil {
-               sh = append(sh, action)
-       }
-       if num != nil {
-               sh = append(sh, num, "个")
-       }
-       if giftName != nil {
-               sh = append(sh, giftName)
-       }
-       if total_coin != nil {
-               allprice = total_coin.(float64) / 1000
+       sh = append(sh, uname)
+       sh = append(sh, action)
+       sh = append(sh, num, "个")
+       sh = append(sh, giftName)
+
+       if total_coin != 0 {
+               allprice = float64(total_coin) / 1000
                sh_log = append(sh, fmt.Sprintf("¥%.1f",allprice))//不在界面显示价格
                c.Danmu_Main_mq.Push_tag(`c.Rev_add`,allprice)
        }
 
        if len(sh) == 0 {return}
-       msglog := msglog.Base_add("礼").Log_show_control(false)
 
        //小于设定
        {
@@ -486,7 +502,12 @@ func (replyF) send_gift(s string){
        {//语言tts
                c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
                        uid:`0gift`,
-                       msg:fmt.Sprintln(sh...),
+                       m:map[string]string{
+                               `{num}`:strconv.Itoa(num),
+                               `{uname}`:uname,
+                               `{action}`:action,
+                               `{giftName}`:giftName,
+                       },
                })
        }
        {//额外
@@ -569,9 +590,16 @@ func (replyF) live(s string) {
 //Msg-超级留言处理
 var sc_buf = make(map[string]struct{})
 func (replyF) super_chat_message(s string){
-       id := p.Json().GetValFromS(s, "data.id");
-       if id != nil {
-               if _,ok := sc_buf[id.(string)];ok{return}
+       msglog := msglog.Base_add("礼")
+
+       var j ws_msg.SUPER_CHAT_MESSAGE_JPN
+       if e := json.Unmarshal([]byte(s), &j);e != nil {
+               msglog.L(`E: `, e)
+       }
+
+       id := j.Data.ID
+       if id != "" {
+               if _,ok := sc_buf[id];ok{return}
                if len(sc_buf) >= 10 {
                        for k,_ := range sc_buf {delete(sc_buf, k);break}
                        {//copy map
@@ -580,28 +608,26 @@ func (replyF) super_chat_message(s string){
                                sc_buf = tmp
                        }
                }
-               sc_buf[id.(string)] = struct{}{}
+               sc_buf[id] = struct{}{}
        }
-       uname := p.Json().GetValFromS(s, "data.user_info.uname");
-       price := p.Json().GetValFromS(s, "data.price");
-       message := p.Json().GetValFromS(s, "data.message");
-       message_jpn := p.Json().GetValFromS(s, "data.message_jpn");
+       uname := j.Data.UserInfo.Uname
+       price := j.Data.Price
+       message := j.Data.Message
+       message_jpn := j.Data.MessageJpn
 
        var sh = []interface{}{"SC: "}
 
-       if uname != nil {
-               sh = append(sh, uname)
-       }
+       sh = append(sh, uname)
        logg := sh
-       if price != nil {
+       if price != 0 {
                sh = append(sh, "\n")//界面不显示价格
                logg = append(logg, "¥", price)
-               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,price.(float64))
+               c.Danmu_Main_mq.Push_tag(`c.Rev_add`,float64(price))
        }
        fmt.Println("====")
        fmt.Println(sh...)
        // Gui_show("\n====")
-       if message != nil && message.(string) != ""{
+       if message != "" {
                fmt.Println(message)
                // Gui_show(message.(string))
                sh = append(sh, message)
@@ -610,10 +636,15 @@ func (replyF) super_chat_message(s string){
        {//语言tts
                c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
                        uid:`0superchat`,
-                       msg:fmt.Sprintln(sh...),
+                       m:map[string]string{
+                               `{uname}`:uname,
+                               `{price}`:strconv.Itoa(price),
+                               `{message}`:message,
+                               `{message_jpn}`:message_jpn,
+                       },
                })
        }
-       if message_jpn != nil && message.(string) != message_jpn.(string) && message_jpn.(string) != "" {
+       if message != message_jpn && message_jpn != "" {
                fmt.Println(message_jpn)
                // Gui_show(message_jpn.(string))
                sh = append(sh, message_jpn)
@@ -626,7 +657,7 @@ func (replyF) super_chat_message(s string){
                // Gui_show("====\n")
                Gui_show(Itos(sh), "0superchat")
        }
-       msglog.Base_add("礼").Log_show_control(false).L(`I: `, logg...)
+       msglog.Log_show_control(false).L(`I: `, logg...)
 }
 
 //Msg-分区排行 使用热门榜替代
@@ -681,7 +712,10 @@ func (replyF) hot_rank_settlement(s string){
        Gui_show(tmp, "0rank")
        c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
                uid:"0rank",
-               msg:tmp,
+               m:map[string]string{
+                       `{Area_name}`:type_item.Data.Area_name,
+                       `{Rank}`:strconv.Itoa(type_item.Data.Rank),
+               },
        })
        msglog.L(`I: `, "热门榜", tmp)
 }
@@ -742,7 +776,9 @@ func (replyF) entry_effect(s string){
        {//语言tts
                c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
                        uid:img,
-                       msg:fmt.Sprintln(copy_writing),
+                       m:map[string]string{
+                               `{msg}`:copy_writing,
+                       },
                })
        }
        fmt.Print(">>> ")
@@ -832,6 +868,15 @@ func (replyF) danmu(s string) {
                        msglog.L(`I: `, item.auth, ":", item.msg)
                        return
                }
+               //附加功能 更少弹幕
+               if !Lessdanmuf(item.msg) {
+                       msglog.L(`I: `, item.auth, ":", item.msg)
+                       return
+               }
+               if _msg := Shortdanmuf(item.msg); _msg == "" {
+                       msglog.L(`I: `, item.auth, ":", item.msg)
+                       return
+               } else {item.msg = _msg}
        }
        Msg_showdanmu(item)
 }
@@ -856,17 +901,7 @@ func Msg_senddanmu(msg string){
 func Msg_showdanmu(item Danmu_item) {
        msg := item.msg
        msglog := msglog.Log_show_control(false)
-       {//附加功能 更少弹幕
-               if !Lessdanmuf(msg) {
-                       if item.auth != nil {msglog.L(`I: `, item.auth, ":", msg)}
-                       return
-               }
-               if _msg := Shortdanmuf(msg); _msg == "" {
-                       if item.auth != nil {msglog.L(`I: `, item.auth, ":", msg)}
-                       return
-               } else {msg = _msg}
-       }
-
+       
        //room change
        if item.roomid != 0 && item.roomid != c.Roomid {return}
        
@@ -881,10 +916,15 @@ func Msg_showdanmu(item Danmu_item) {
        }
        {//语言tts 私信
                if item.uid != "" {
-                       c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
-                               uid:item.uid,
-                               msg:msg,
-                       })
+                       if item.auth != nil {
+                               c.Danmu_Main_mq.Push_tag(`tts`,Danmu_mq_t{//传入消息队列
+                                       uid:item.uid,
+                                       m:map[string]string{
+                                               `{auth}`:fmt.Sprint(item.auth),
+                                               `{msg}`:msg,
+                                       },
+                               })
+                       }
                        if i,e := strconv.Atoi(item.uid);e == nil {
                                c.Danmu_Main_mq.Push_tag(`pm`,send.Pm_item{
                                        Uid:i,
@@ -906,6 +946,7 @@ func Msg_showdanmu(item Danmu_item) {
 type Danmu_mq_t struct {
        uid string
        msg string
+       m map[string]string//tts参数替换列表
 }
 var Danmu_mq = mq.New(10)
 
index 23637381e1bd6d64a5a32a4796a6fd17f779b82f..899907edfe4cd73b8cb5cedbc0a855e697eadd29 100644 (file)
@@ -14,7 +14,7 @@ import (
 )
 
 var (
-       tts_setting_onoff = map[string]string{
+       tts_setting_string = map[string]string{
                "0buyguide":"感谢{D}",
                "0gift":"感谢{D}",
                "0superchat":"感谢{D}",
@@ -23,7 +23,7 @@ var (
                "\n":" ",
        }
 )
-var tts_List = make(chan interface{},20)
+var tts_List = make(chan string,20)
 
 var tts_limit = limit.New(1,5000,15000)//频率限制1次/5s,最大等待时间15s
 
@@ -68,7 +68,7 @@ func init(){
                buf.Load("config/config_tts.json")
                if onoff,ok := buf.Get(`onoff`);ok {
                        for k,v := range onoff.(map[string]interface{}) {
-                               tts_setting_onoff[k] = v.(string)
+                               tts_setting_string[k] = v.(string)
                        }
                }
                if replace,ok := buf.Get(`replace`);ok {
@@ -82,8 +82,11 @@ func init(){
 
        go func(){
                for{
-                       e := <- tts_List
-                       TTS(e.(Danmu_mq_t).uid, e.(Danmu_mq_t).msg)
+                       s := <- tts_List
+                       for len(tts_List) > 0 && len(s) < 100 {
+                               s += " " + <- tts_List
+                       }
+                       TTS(<- tts_List)
                }
        }()
        
@@ -91,8 +94,28 @@ func init(){
        //使用带tag的消息队列在功能间传递消息
        c.Danmu_Main_mq.Pull_tag(msgq.FuncMap{
                `tts`:func(data interface{})(bool){//tts
-                       if _,ok := tts_setting_onoff[data.(Danmu_mq_t).uid];ok {
-                               tts_List <- data
+                       d,_ := data.(Danmu_mq_t)
+                       if s,ok := tts_setting_string[d.uid];ok && len(d.m) != 0 && s != "" {
+                               
+                               for k,v := range d.m {
+                                       s = strings.ReplaceAll(s, k, v)
+                               }
+                               for k,v := range tts_setting_replace {
+                                       s = strings.ReplaceAll(s, k, v)
+                               }
+                               var (
+                                       skip bool
+                                       runel []rune
+                               )
+                               for _,v := range s {
+                                       if v == []rune("{")[0] {skip = true}
+                                       if v == []rune("}")[0] {skip = false;continue}
+                                       if skip {continue}
+                                       runel = append(runel,v)
+                               }
+
+                               tts_log.L(`I: `, d.uid, string(runel))
+                               tts_List <- string(runel)
                        }
                        return false
                },
@@ -109,20 +132,9 @@ func init(){
 }
 
 
-func TTS(uid,msg string) {
+func TTS(msg string) {
        if tts_limit.TO() {return}
 
-       v,ok := tts_setting_onoff[uid]
-       if !ok || v == ``{return}
-
-       tts_log.L(`I: `,uid, strings.ReplaceAll(msg, "\n", " "))
-
-       msg = strings.ReplaceAll(v, "{D}", msg)
-
-       for k,v := range tts_setting_replace {
-               msg = strings.ReplaceAll(msg, k, v)
-       }
-
        var (
                req = reqf.New()
                rval reqf.Rval
@@ -185,10 +197,11 @@ func youdao(msg string) reqf.Rval {
                return baidu(msg)
        }
 
+       //https://ai.youdao.com/gw.s#/
        var (
                api = map[string]string{
                        `q`:msg,
-                       `langType`:"auto",
+                       `langType`:"zh-CHS",
                        `appKey`:appId,
                        `salt`:p.Stringf().Rand(1, 8),
                }
diff --git a/Reply/ws_msg/SEND_GIFT.go b/Reply/ws_msg/SEND_GIFT.go
new file mode 100644 (file)
index 0000000..220809f
--- /dev/null
@@ -0,0 +1,105 @@
+package part
+type SEND_GIFT struct {
+       Cmd  string `json:"cmd"`
+       Data struct {
+               Action         string `json:"action"`
+               BatchComboID   string `json:"batch_combo_id"`
+               BatchComboSend struct {
+                       Action        string      `json:"action"`
+                       BatchComboID  string      `json:"batch_combo_id"`
+                       BatchComboNum int         `json:"batch_combo_num"`
+                       BlindGift     interface{} `json:"blind_gift"`
+                       GiftID        int         `json:"gift_id"`
+                       GiftName      string      `json:"gift_name"`
+                       GiftNum       int         `json:"gift_num"`
+                       SendMaster    interface{} `json:"send_master"`
+                       UID           int         `json:"uid"`
+                       Uname         string      `json:"uname"`
+               } `json:"batch_combo_send"`
+               Beatid           string      `json:"beatId"`
+               BizSource        string      `json:"biz_source"`
+               BlindGift        interface{} `json:"blind_gift"`
+               BroadcastID      int         `json:"broadcast_id"`
+               CoinType         string      `json:"coin_type"`
+               ComboResourcesID int         `json:"combo_resources_id"`
+               ComboSend        struct {
+                       Action     string      `json:"action"`
+                       ComboID    string      `json:"combo_id"`
+                       ComboNum   int         `json:"combo_num"`
+                       GiftID     int         `json:"gift_id"`
+                       GiftName   string      `json:"gift_name"`
+                       GiftNum    int         `json:"gift_num"`
+                       SendMaster interface{} `json:"send_master"`
+                       UID        int         `json:"uid"`
+                       Uname      string      `json:"uname"`
+               } `json:"combo_send"`
+               ComboStayTime  int    `json:"combo_stay_time"`
+               ComboTotalCoin int    `json:"combo_total_coin"`
+               CritProb       int    `json:"crit_prob"`
+               Demarcation    int    `json:"demarcation"`
+               Dmscore        int    `json:"dmscore"`
+               Draw           int    `json:"draw"`
+               Effect         int    `json:"effect"`
+               EffectBlock    int    `json:"effect_block"`
+               Face           string `json:"face"`
+               Giftid         int    `json:"giftId"`
+               Giftname       string `json:"giftName"`
+               Gifttype       int    `json:"giftType"`
+               Gold           int    `json:"gold"`
+               GuardLevel     int    `json:"guard_level"`
+               IsFirst        bool   `json:"is_first"`
+               IsSpecialBatch int    `json:"is_special_batch"`
+               Magnification  int    `json:"magnification"`
+               MedalInfo      struct {
+                       AnchorRoomid     int    `json:"anchor_roomid"`
+                       AnchorUname      string `json:"anchor_uname"`
+                       GuardLevel       int    `json:"guard_level"`
+                       IconID           int    `json:"icon_id"`
+                       IsLighted        int    `json:"is_lighted"`
+                       MedalColor       int    `json:"medal_color"`
+                       MedalColorBorder int    `json:"medal_color_border"`
+                       MedalColorEnd    int    `json:"medal_color_end"`
+                       MedalColorStart  int    `json:"medal_color_start"`
+                       MedalLevel       int    `json:"medal_level"`
+                       MedalName        string `json:"medal_name"`
+                       Special          string `json:"special"`
+                       TargetID         int    `json:"target_id"`
+               } `json:"medal_info"`
+               NameColor         string      `json:"name_color"`
+               Num               int         `json:"num"`
+               OriginalGiftName  string      `json:"original_gift_name"`
+               Price             int         `json:"price"`
+               Rcost             int64       `json:"rcost"`
+               Remain            int         `json:"remain"`
+               Rnd               string      `json:"rnd"`
+               SendMaster        interface{} `json:"send_master"`
+               Silver            int         `json:"silver"`
+               Super             int         `json:"super"`
+               SuperBatchGiftNum int         `json:"super_batch_gift_num"`
+               SuperGiftNum      int         `json:"super_gift_num"`
+               SvgaBlock         int         `json:"svga_block"`
+               TagImage          string      `json:"tag_image"`
+               Tid               string      `json:"tid"`
+               Timestamp         int         `json:"timestamp"`
+               TopList           interface{} `json:"top_list"`
+               TotalCoin         int         `json:"total_coin"`
+               UID               int         `json:"uid"`
+               Uname             string      `json:"uname"`
+       } `json:"data"`
+}
+
+/*
+{"cmd":"SEND_GIFT","data":{"action":"投喂","batch_combo_id":"batch:gift:combo_id:333010355:585267:20004:1623602183.2621","batch_combo_send":
+{"action":"投喂","batch_combo_id":"batch:gift:combo_id:333010355:585267:20004:1623602183.2621","batch_combo_num":1,"blind_gift":null,"gift_i
+d":20004,"gift_name":"吃瓜","gift_num":1,"send_master":null,"uid":333010355,"uname":"小尕子_"},"beatId":"","biz_source":"Live","blind_gift":
+null,"broadcast_id":0,"coin_type":"gold","combo_resources_id":1,"combo_send":{"action":"投喂","combo_id":"gift:combo_id:333010355:585267:200
+04:1623602183.2615","combo_num":1,"gift_id":20004,"gift_name":"吃瓜","gift_num":1,"send_master":null,"uid":333010355,"uname":"小尕子_"},"com
+bo_stay_time":3,"combo_total_coin":100,"crit_prob":0,"demarcation":1,"dmscore":16,"draw":0,"effect":0,"effect_block":0,"face":"http://i2.hds
+lb.com/bfs/face/dfb44e63d5ac42c28a37c295f6005561be2b089f.jpg","giftId":20004,"giftName":"吃瓜","giftType":1,"gold":0,"guard_level":0,"is_fir
+st":true,"is_special_batch":0,"magnification":1,"medal_info":{"anchor_roomid":0,"anchor_uname":"","guard_level":0,"icon_id":0,"is_lighted":0
+,"medal_color":6067854,"medal_color_border":12632256,"medal_color_end":12632256,"medal_color_start":12632256,"medal_level":1,"medal_name":"
+少废话","special":"","target_id":14110780},"name_color":"","num":1,"original_gift_name":"","price":100,"rcost":3892073142,"remain":0,"rnd":"
+1332407012","send_master":null,"silver":0,"super":0,"super_batch_gift_num":1,"super_gift_num":1,"svga_block":0,"tag_image":"","tid":"1623602
+183121500002","timestamp":1623602183,"top_list":null,"total_coin":100,"uid":333010355,"uname":"小尕子_"}}
+*/
\ No newline at end of file
diff --git a/Reply/ws_msg/SUPER_CHAT_MESSAGE_JPN.go b/Reply/ws_msg/SUPER_CHAT_MESSAGE_JPN.go
new file mode 100644 (file)
index 0000000..80898b5
--- /dev/null
@@ -0,0 +1,55 @@
+package part
+
+type SUPER_CHAT_MESSAGE_JPN struct {
+       Cmd  string `json:"cmd"`
+       Data struct {
+               ID                    string      `json:"id"`
+               UID                   string      `json:"uid"`
+               Price                 int         `json:"price"`
+               Rate                  int         `json:"rate"`
+               Message               string      `json:"message"`
+               MessageJpn            string      `json:"message_jpn"`
+               IsRanked              int         `json:"is_ranked"`
+               BackgroundImage       string      `json:"background_image"`
+               BackgroundColor       string      `json:"background_color"`
+               BackgroundIcon        string      `json:"background_icon"`
+               BackgroundPriceColor  string      `json:"background_price_color"`
+               BackgroundBottomColor string      `json:"background_bottom_color"`
+               Ts                    int         `json:"ts"`
+               Token                 string      `json:"token"`
+               MedalInfo             interface{} `json:"medal_info"`
+               UserInfo              struct {
+                       Uname      string `json:"uname"`
+                       Face       string `json:"face"`
+                       FaceFrame  string `json:"face_frame"`
+                       GuardLevel int    `json:"guard_level"`
+                       UserLevel  int    `json:"user_level"`
+                       LevelColor string `json:"level_color"`
+                       IsVip      int    `json:"is_vip"`
+                       IsSvip     int    `json:"is_svip"`
+                       IsMainVip  int    `json:"is_main_vip"`
+                       Title      string `json:"title"`
+                       Manager    int    `json:"manager"`
+               } `json:"user_info"`
+               Time      int `json:"time"`
+               StartTime int `json:"start_time"`
+               EndTime   int `json:"end_time"`
+               Gift      struct {
+                       Num      int    `json:"num"`
+                       GiftID   int    `json:"gift_id"`
+                       GiftName string `json:"gift_name"`
+               } `json:"gift"`
+       } `json:"data"`
+       Roomid string `json:"roomid"`
+}
+
+/*
+{"cmd":"SUPER_CHAT_MESSAGE_JPN","data":{"id":"1852575","uid":"696837750","price":2000,"rate":1000,"message":"\u8fd9\u80fd\u770b\u5230\u51e0\
+u70b9","message_jpn":"","is_ranked":1,"background_image":"https:\/\/i0.hdslb.com\/bfs\/live\/a712efa5c6ebc67bafbe8352d3e74b820a00c13e.png","
+background_color":"#FFD8D8","background_icon":"https:\/\/i0.hdslb.com\/bfs\/live\/0d9cbbdbad7d3371266cd5b568065415415316ae.png","background_
+price_color":"#C86A7A","background_bottom_color":"#AB1A32","ts":1623612710,"token":"5491A5EB","medal_info":null,"user_info":{"uname":"Red\u4
+e00","face":"http:\/\/i0.hdslb.com\/bfs\/face\/member\/noface.jpg","face_frame":"http:\/\/i0.hdslb.com\/bfs\/live\/ceb8e7fc5e207b8e6219c9917
+e3ef1b22f3df61a.png","guard_level":1,"user_level":43,"level_color":"#ff86b2","is_vip":0,"is_svip":0,"is_main_vip":0,"title":"0","manager":0}
+,"time":7200,"start_time":1623612710,"end_time":1623619910,"gift":{"num":1,"gift_id":12000,"gift_name":"\u9192\u76ee\u7559\u8a00"}},"roomid"
+:"47867"}
+*/
\ No newline at end of file
diff --git a/Reply/ws_msg/USER_TOAST_MSG.go b/Reply/ws_msg/USER_TOAST_MSG.go
new file mode 100644 (file)
index 0000000..daaac94
--- /dev/null
@@ -0,0 +1,31 @@
+package part
+
+type USER_TOAST_MSG struct {
+       Cmd  string `json:"cmd"`
+       Data struct {
+               AnchorShow       bool   `json:"anchor_show"`
+               Color            string `json:"color"`
+               Dmscore          int    `json:"dmscore"`
+               EndTime          int    `json:"end_time"`
+               GuardLevel       int    `json:"guard_level"`
+               IsShow           int    `json:"is_show"`
+               Num              int    `json:"num"`
+               OpType           int    `json:"op_type"`
+               PayflowID        string `json:"payflow_id"`
+               Price            int    `json:"price"`
+               RoleName         string `json:"role_name"`
+               StartTime        int    `json:"start_time"`
+               SvgaBlock        int    `json:"svga_block"`
+               TargetGuardCount int    `json:"target_guard_count"`
+               ToastMsg         string `json:"toast_msg"`
+               UID              int    `json:"uid"`
+               Unit             string `json:"unit"`
+               UserShow         bool   `json:"user_show"`
+               Username         string `json:"username"`
+       } `json:"data"`
+}
+/*
+{"cmd":"USER_TOAST_MSG","data":{"anchor_show":true,"color":"#00D1F1","dmscore":90,"end_time":1623612866,"guard_level":3,"is_show":0,"num":1,
+"op_type":3,"payflow_id":"2106140334131392145517282","price":138000,"role_name":"舰长","start_time":1623612866,"svga_block":0,"target_guard_
+count":820,"toast_msg":"\u003c%大桶麦丽素%\u003e 自动续费了舰长","uid":40144551,"unit":"月","user_show":true,"username":"大桶麦丽素"}}
+*/
\ No newline at end of file
index a167e5a18c797c6dede3d4036d54a4f70b98bf78..6a508bd8f38a149bb01bb4d51e44bb97fd8127e6 100644 (file)
@@ -1,20 +1,37 @@
 {
     "onoff":{
-        "help":"空字符串将不触发,{D}会被替换",
-        "0buyguide": "感谢{D}",
-        "0gift": "感谢{D}",
-        "0superchat": "感谢{D}",
-        "0multi": "观众:{D}",
-        "0rank":"{D}",
-        "0level1":"{D}",
+        "help":"空字符串将不触发。{}将被替换 未使用的{}将被移除",
+
+        "0default-help":"系统消息 {msg}:内容",
+        "0default":"{msg}",
+
+        "0buyguide-help": "大航海 {username}:用户 {op_name}:购买方式 {role_name}:大航海类型 {num}:个数 {unit}:时间单位",
+        "0buyguide": "{username}{op_name} {num}个{unit}{role_name}",
+
+        "0gift-help": "投喂礼物 {num}:个数 {uname}:用户 {action}:动作 {giftName}:礼物名称",
+        "0gift": "{uname}{action} {num}个{giftName}",
+
+        "0superchat-help":"超级留言 {uname}:用户 {message}:内容 {message_jpn}:日语内容",
+        "0superchat": "{uname}说 {message}",
+
+        "0room-help":"房间消息 {msg}消息",
+        "0room":"{msg}",
+
+        "0rank-help":"小时榜排行 {Area_name}:分区名 {Rank}:排位",
+        "0rank":"获得 {Area_name}第{Rank}",
+
+        "0level-help":"大航海进入 {username}:用户 {guard_name}:大航海类型",
+        "0level1":"欢迎 {guard_name}{username}进入直播间",
         "0level2":"",
-        "0level3":""
+        "0level3":"",
+
+        "user-help":"用户弹幕 111是用户uid可添加 0multi是合并弹幕功能的多用户弹幕 {num}:多用户个数 {auth}:用户 {msg}:弹幕内容",
+        "0multi": "{num}个观众说 {msg}",
+        "111":""
     },
     "replace":{
         "?":"问号",
         "?":"问号",
-        "!":"叹号",
-        "!":"叹号",
         "hso":"好色哦"
     }
 }
\ No newline at end of file