-
Notifications
You must be signed in to change notification settings - Fork 8
/
program.go
152 lines (135 loc) · 3.43 KB
/
program.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package main
import (
"context"
"fmt"
"github.com/xbclub/BilibiliDanmuRobot-Core/config"
"github.com/xbclub/BilibiliDanmuRobot-Core/entity"
"github.com/xbclub/BilibiliDanmuRobot-Core/handler"
"github.com/xbclub/BilibiliDanmuRobot-Core/http"
"github.com/xbclub/BilibiliDanmuRobot-Core/svc"
"github.com/xbclub/BilibiliDanmuRobot-Core/utiles"
"github.com/zeromicro/go-zero/core/logx"
"os"
"time"
)
type Program struct {
running bool
svcCtx *svc.ServiceContext
workCtx context.Context
workCancel context.CancelFunc
cls handler.WsHandler
}
func NewProgram() *Program {
return &Program{}
}
func (p *Program) Start() bool {
if p.running {
return true
logx.Info("已启动跳过")
}
var c config.Config
if err := Mustload(&c); err != nil {
logx.Error(err)
return false
}
logx.MustSetup(c.Log)
logx.DisableStat()
dbdir, err := os.Stat(c.DBPath)
if os.IsNotExist(err) || !dbdir.IsDir() {
err = os.MkdirAll(c.DBPath, 0777)
if err != nil {
logx.Errorf("数据库文件夹创建失败:%s", c.DBPath)
panic(fmt.Sprintf("无法创建数据库文件夹 请手动创建:%s", err))
}
}
p.svcCtx = svc.NewServiceContext(c)
p.workCtx, p.workCancel = context.WithCancel(context.Background())
p.running = true
go p.Bili_danmaku_Start(p.workCtx)
return true
}
func (p *Program) Stop() bool {
if p.workCancel != nil {
p.workCancel()
}
return true
}
func (p *Program) Monitor() bool {
return p.running
}
func (l *Program) Bili_danmaku_Start(workctx context.Context) {
if !http.FileExists("token/bili_token.txt") || !http.FileExists("token/bili_token.json") {
return
}
var err error
http.InitHttpClient()
// 准备select中用到的变量
//sig := make(chan os.Signal)
//signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
var interval = 10 * time.Second
t := time.NewTimer(interval)
defer t.Stop()
var info *entity.RoomInitInfo
var preStatus int
logx.Info("正在检测直播间是否开播...")
// 循环监听直播间情况
for l.running {
select {
// 程序退出
case <-workctx.Done():
if l.cls != nil {
l.cls.StopWsClient()
}
l.running = false
logx.Info("弹幕姬进程停止")
// 每10秒检查一次直播间是否开播
case <-t.C:
if info, err = http.RoomInit(l.svcCtx.Config.RoomId); err != nil {
logx.Infof("RoomInit错误:%v", err)
t.Reset(interval)
continue
}
if info.Data.LiveStatus == entity.Live && preStatus == entity.NotStarted { // 由NotStarted到Live是开播
logx.Infof("开播啦!%v", l.svcCtx.Config.RoomId)
l.cls = handler.NewWsHandler()
if l.cls == nil {
t.Reset(interval)
continue
}
err := l.cls.StartWsClient()
if err != nil {
logx.Error(err)
t.Reset(interval)
continue
}
preStatus = entity.Live
// 开启弹幕姬
} else if info.Data.LiveStatus != entity.Live && preStatus == entity.Live { // 由Live到NotStarted是下播
logx.Info("下播啦!")
preStatus = entity.NotStarted
l.cls.StopWsClient()
//l.danmustop()
}
t.Reset(interval)
}
}
return
}
func (l *Program) userlogin() error {
var err error
http.InitHttpClient()
var loginUrl *entity.LoginUrl
if loginUrl, err = http.GetLoginUrl(); err != nil {
logx.Error(err)
return err
}
if err = utiles.GenerateQr(loginUrl.Data.Url); err != nil {
logx.Error(err)
return err
}
if _, err = http.GetLoginInfo(loginUrl.Data.OauthKey); err != nil {
logx.Error(err)
return err
}
return err
}