mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-18 20:50:12 +08:00
104 lines
2.9 KiB
Go
104 lines
2.9 KiB
Go
package steam
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
fcext "github.com/FloatTech/floatbox/ctxext"
|
|
sql "github.com/FloatTech/sqlite"
|
|
ctrl "github.com/FloatTech/zbpctrl"
|
|
zero "github.com/wdvxdr1123/ZeroBot"
|
|
"github.com/wdvxdr1123/ZeroBot/message"
|
|
)
|
|
|
|
var (
|
|
database streamDB
|
|
// 开启并检查数据库链接
|
|
getDB = fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
|
|
database.db = sql.New(engine.DataFolder() + "steam.db")
|
|
err := database.db.Open(time.Hour)
|
|
if err != nil {
|
|
ctx.SendChain(message.Text("[steam] ERROR: ", err))
|
|
return false
|
|
}
|
|
if err = database.db.Create(tableListenPlayer, &player{}); err != nil {
|
|
ctx.SendChain(message.Text("[steam] ERROR: ", err))
|
|
return false
|
|
}
|
|
// 校验密钥是否初始化
|
|
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
|
|
apiKeyMu.Lock()
|
|
defer apiKeyMu.Unlock()
|
|
_ = m.GetExtra(&apiKey)
|
|
if apiKey == "" {
|
|
ctx.SendChain(message.Text("ERROR: 未设置steam apikey"))
|
|
return false
|
|
}
|
|
return true
|
|
})
|
|
)
|
|
|
|
// streamDB 继承方法的存储结构
|
|
type streamDB struct {
|
|
sync.RWMutex
|
|
db sql.Sqlite
|
|
}
|
|
|
|
const (
|
|
// tableListenPlayer 存储查询用户信息
|
|
tableListenPlayer = "listen_player"
|
|
)
|
|
|
|
// player 用户状态存储结构体
|
|
type player struct {
|
|
SteamID int64 `json:"steam_id"` // 绑定用户标识ID
|
|
PersonaName string `json:"persona_name"` // 用户昵称
|
|
Target string `json:"target"` // 信息推送群组
|
|
GameID int64 `json:"game_id"` // 游戏ID
|
|
GameExtraInfo string `json:"game_extra_info"` // 游戏信息
|
|
LastUpdate int64 `json:"last_update"` // 更新时间
|
|
}
|
|
|
|
// update 如果主键不存在则插入一条新的数据,如果主键存在直接复写
|
|
func (sdb *streamDB) update(dbInfo *player) error {
|
|
sdb.Lock()
|
|
defer sdb.Unlock()
|
|
return sdb.db.Insert(tableListenPlayer, dbInfo)
|
|
}
|
|
|
|
// find 根据主键查信息
|
|
func (sdb *streamDB) find(steamID int64) (dbInfo player, err error) {
|
|
sdb.Lock()
|
|
defer sdb.Unlock()
|
|
err = sdb.db.Find(tableListenPlayer, &dbInfo, "WHERE steam_id = ?", steamID)
|
|
if err == sql.ErrNullResult { // 规避没有该用户数据的报错
|
|
err = nil
|
|
}
|
|
return
|
|
}
|
|
|
|
// findWithGroupID 根据用户steamID和groupID查询信息
|
|
func (sdb *streamDB) findWithGroupID(steamID int64, groupID string) (dbInfo player, err error) {
|
|
sdb.Lock()
|
|
defer sdb.Unlock()
|
|
err = sdb.db.Find(tableListenPlayer, &dbInfo, "WHERE steam_id = ? AND target LIKE ?", steamID, "%"+groupID+"%")
|
|
if err == sql.ErrNullResult { // 规避没有该用户数据的报错
|
|
err = nil
|
|
}
|
|
return
|
|
}
|
|
|
|
// findAll 查询所有库信息
|
|
func (sdb *streamDB) findAll() (dbInfos []*player, err error) {
|
|
sdb.Lock()
|
|
defer sdb.Unlock()
|
|
return sql.FindAll[player](&sdb.db, tableListenPlayer, "")
|
|
}
|
|
|
|
// del 删除指定数据
|
|
func (sdb *streamDB) del(steamID int64) error {
|
|
sdb.Lock()
|
|
defer sdb.Unlock()
|
|
return sdb.db.Del(tableListenPlayer, "WHERE steam_id = ?", steamID)
|
|
}
|