ZeroBot-Plugin/plugin/steam/store.go
2023-03-18 00:30:22 +08:00

118 lines
3.4 KiB
Go

package steam
import (
"strconv"
"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.DBPath = engine.DataFolder() + "steam.db"
err := database.db.Open(time.Hour * 24)
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])
_ = m.Manager.Response(steamapikeygid)
_ = m.Manager.GetExtra(steamapikeygid, &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 (sql *streamDB) update(dbInfo *player) error {
sql.Lock()
defer sql.Unlock()
return sql.db.Insert(TableListenPlayer, dbInfo)
}
// find 根据主键查信息
func (sql *streamDB) find(steamID int64) (dbInfo player, err error) {
sql.Lock()
defer sql.Unlock()
condition := "where steam_id = " + strconv.FormatInt(steamID, 10)
if !sql.db.CanFind(TableListenPlayer, condition) {
return player{}, nil // 规避没有该用户数据的报错
}
err = sql.db.Find(TableListenPlayer, &dbInfo, condition)
return
}
// findWithGroupID 根据用户steamID和groupID查询信息
func (sql *streamDB) findWithGroupID(steamID int64, groupID string) (dbInfo player, err error) {
sql.Lock()
defer sql.Unlock()
condition := "where steam_id = " + strconv.FormatInt(steamID, 10) + " AND target LIKE '%" + groupID + "%'"
if !sql.db.CanFind(TableListenPlayer, condition) {
return player{}, nil // 规避没有该用户数据的报错
}
err = sql.db.Find(TableListenPlayer, &dbInfo, condition)
return
}
// findAll 查询所有库信息
func (sql *streamDB) findAll() (dbInfos []*player, err error) {
sql.Lock()
defer sql.Unlock()
var info player
num, err := sql.db.Count(TableListenPlayer)
if err != nil || num == 0 {
return
}
dbInfos = make([]*player, 0, num)
err = sql.db.FindFor(TableListenPlayer, &info, "", func() error {
if info.SteamID != 0 {
dbInfos = append(dbInfos, &info)
}
return nil
})
return
}
// del 删除指定数据
func (sql *streamDB) del(steamID int64) error {
sql.Lock()
defer sql.Unlock()
return sql.db.Del(TableListenPlayer, "where steam_id = "+strconv.FormatInt(steamID, 10))
}