F "github.com/qydysky/bili_danmu/F"
"github.com/christopher-dG/go-obs-websocket"
p "github.com/qydysky/part"
+ s "github.com/qydysky/part/setting"
)
/*
//功能开关
var AllF = map[string]bool{
- "Qtd":true,//Qt弹幕窗口
+ "Qtd":false,//Qt弹幕窗口
"Saveflv":true,//保存直播流(默认高清,有cookie默认蓝光)
"Ass":true,//Ass弹幕生成,由于时间对应关系,仅开启流保存时生效
"Obs":false,//obs组件(仅录播)
"Shortdanmu":true,//上下文相同文字缩减
}
+//从config.json初始化
+func init(){
+ buf := s.New()
+ buf.Load("config.json")
+ for k,v := range buf.B {
+ AllF[k] = v.(bool)
+ }
+}
+
//功能开关选取函数
func IsOn(s string) bool {
if v, ok := AllF[s]; ok && v {
//Qtd 弹幕Qt窗口
type Qtd struct {
- Inuse bool
Qt_MaxMun int
Qt_LineHeight float64
Qt_BlockMargin float64
}
var qtd = Qtd {
- Inuse:IsOn("Qtd"),
Qt_MaxMun:30,//danmu max limit
Qt_LineHeight:90,//percent
Qt_BlockMargin:7,
}
func Qtdf(){
- if !qtd.Inuse {return}
+ if !IsOn("Qtd") {return}
go Qtdanmu()
}
//Ass 弹幕转字幕
type Ass struct {
- Inuse bool
file string//弹幕ass文件名
startT time.Time//开始记录的基准时间
)
var ass = Ass {
- Inuse:IsOn("Ass"),
header:`[Script Info]
Title: Default Ass file
ScriptType: v4.00+
//传入要显示的单条字幕
func Assf(s string){
- if !ass.Inuse {return}
+ if !IsOn("Ass") {return}
if ass.file == "" {return}
if s == "" {return}
//直播流保存
type Saveflv struct {
- Inuse bool
path string
wait p.Signal
cancel p.Signal
}
var saveflv = Saveflv {
- Inuse:IsOn("Saveflv"),
}
//已go func形式调用,将会获取直播流
func Saveflvf(){
- if !saveflv.Inuse {return}
+ if !IsOn("Saveflv") {return}
if saveflv.cancel.Islive() {return}
l := p.Logf().New().Open("danmu.log").Base(-1, "saveflv")
//已func形式调用,将会停止保存直播流
func Saveflv_wait(){
- if !saveflv.Inuse {return}
+ if !IsOn("Saveflv") {return}
saveflv.cancel.Done()
p.Logf().New().Open("danmu.log").Base(-1, "saveflv").I("等待").Block()
saveflv.wait.Wait()
}
type Obs struct {
- Inuse bool
c obsws.Client
Prog string//程序路径
}
var obs = Obs {
- Inuse:IsOn("Obs"),
c:obsws.Client{Host: "127.0.0.1", Port: 4444},
Prog:"obs",
}
func Obsf(on bool){
- if !obs.Inuse {return}
+ if !IsOn("Obs") {return}
l := p.Logf().New().Open("danmu.log").Base(1, "obs")
defer l.BC()
}
func Obs_R(on bool){
- if !obs.Inuse {return}
+ if !IsOn("Obs") {return}
l := p.Logf().New().Open("danmu.log").Base(1, "obs_R")
defer l.BC()
type Autoban struct {
Banbuf []string
buf []string
- Inuse bool
}
var autoban = Autoban {
- Inuse:IsOn("Autoban"),
}
func Autobanf(s string) bool {
- if !autoban.Inuse {return false}
+ if !IsOn("Autoban") {return false}
if len(autoban.Banbuf) == 0 {
f := p.File().FileWR(p.Filel{
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{
"弹幕机在么":"在",
}
func Danmujif(s string) {
- if !danmuji.Inuse {return}
+ if !IsOn("Danmuji") {return}
if v, ok := danmuji.buf[s]; ok {
Msg_senddanmu(v)
}
}
func Danmuji_auto(sleep int) {
- if !danmuji.Inuse || !danmuji.Inuse_auto || danmuji.mute {return}
+ if !IsOn("Danmuji") || !IsOn("Danmuji_auto") || danmuji.mute {return}
if sleep == 0 {return}
danmuji.mute = true
}
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 !IsOn("Autoskip") || 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
}
type Lessdanmu struct {
- Inuse bool
buf []string
}
var lessdanmu = Lessdanmu{
- Inuse:IsOn("Lessdanmu"),
}
func Lessdanmuf(s string, bufsize int) float32 {
- if !lessdanmu.Inuse {return 0}
+ if !IsOn("Lessdanmu") {return 0}
if len(lessdanmu.buf) < bufsize {
lessdanmu.buf = append(lessdanmu.buf, s)
return 0
原理:留存弹幕,称为buf。将当前若干弹幕在buf中的位置找出,根据位置聚集情况及该位置出现语句的频率,选择发送的弹幕
*/
// type Moredanmu struct {
-// Inuse bool
// buf []string
// }
// var moredanmu = Moredanmu{
-// Inuse:IsOn("Moredanmu"),
// }
// func moredanmuf(s string) {
// if !moredanmu.Inuse {return}
// }
type Shortdanmu struct {
- Inuse bool
lastdanmu []rune
}
var shortdanmu = Shortdanmu{
- Inuse:IsOn("Shortdanmu"),
}
func Shortdanmuf(s string) string {
- if !shortdanmu.Inuse {return s}
+ if !IsOn("Shortdanmu") {return s}
if len(shortdanmu.lastdanmu) == 0 {shortdanmu.lastdanmu = []rune(s);return s}
var new string
}
type Jiezou struct {
- Inuse bool
alertdanmu string
skipS map[string]interface{}
}
var jiezou = Jiezou{
- Inuse:IsOn("Jiezou"),
alertdanmu:"",
skipS:map[string]interface{}{//常见语气词忽略
"了":nil,
}
func Jiezouf(s []string) bool {
- if !jiezou.Inuse {return false}
+ if !IsOn("Jiezou") {return false}
now,S := selfcross2(s)
jiezou.avg = (8 * jiezou.avg + 2 * now)/10
if jiezou.turn < len(s) {jiezou.turn += 1;return false}