ZeroBot-Plugin/plugin/steam/store.go
2024-11-07 00:12:51 +09:00

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)
}