Files
liveroom-sdk/provider/webdm/web.go
2024-04-08 00:55:33 -07:00

96 lines
2.3 KiB
Go

package webdm
import (
"errors"
"github.com/AynaLivePlayer/blivedm-go/client"
"github.com/AynaLivePlayer/blivedm-go/message"
"github.com/go-resty/resty/v2"
"github.com/spf13/cast"
"liveroom"
"liveroom/utils"
)
const ProviderName = "biliweb"
type WebDanmuClient struct {
cfg liveroom.LiveRoomConfig
webDmClient *client.Client
onMessage func(msg *liveroom.Message)
onDisconnect func(liveroom liveroom.LiveRoom)
onStatusChange func(connected bool)
}
func NewWebDanmuClientProvider(apiServer string) liveroom.LiveRoomProvider {
return func(cfg liveroom.LiveRoomConfig) (liveroom.LiveRoom, error) {
if cfg.Provider != ProviderName {
return nil, errors.New("invalid provider name")
}
roomId, err := cast.ToIntE(cfg.Room)
if err != nil {
return nil, errors.New("invalid room id, should be integer")
}
room := &WebDanmuClient{
cfg: cfg,
webDmClient: client.NewClientWithApi(roomId, &remoteApi{client: resty.New().SetBaseURL(apiServer)}),
}
room.webDmClient.OnDanmaku(room.danmuHandler)
return room, nil
}
}
func (w *WebDanmuClient) GetName() string {
return ProviderName
}
func (w *WebDanmuClient) Config() *liveroom.LiveRoomConfig {
return &w.cfg
}
func (w *WebDanmuClient) danmuHandler(data *message.Danmaku) {
if w.onMessage == nil {
return
}
w.onMessage(&liveroom.Message{
User: liveroom.User{
Uid: cast.ToString(data.Sender.Uid),
Username: data.Sender.Uname,
Admin: data.Sender.Admin,
Privilege: data.Sender.GuardLevel,
Medal: liveroom.UserMedal{
Name: data.Sender.Medal.Name,
Level: utils.BilibiliGuardLevelToPrivilege(data.Sender.GuardLevel),
RoomID: cast.ToString(data.Sender.Medal.UpRoomId),
},
},
Message: data.Content,
})
}
func (w *WebDanmuClient) Connect() error {
err := w.webDmClient.Start()
if err == nil && w.onStatusChange != nil {
w.onStatusChange(true)
}
return err
}
func (w *WebDanmuClient) Disconnect() error {
w.webDmClient.Stop()
if w.onStatusChange != nil {
w.onStatusChange(false)
}
return nil
}
func (w *WebDanmuClient) OnDisconnect(f func(liveroom liveroom.LiveRoom)) {
w.onDisconnect = f
}
func (w *WebDanmuClient) OnStatusChange(f func(connected bool)) {
w.onStatusChange = f
}
func (w *WebDanmuClient) OnMessage(f func(msg *liveroom.Message)) {
w.onMessage = f
}