fix extra

This commit is contained in:
源文雨
2023-04-08 17:18:36 +08:00
parent 635eb9832a
commit 5c8ead8b1d
14 changed files with 187 additions and 188 deletions

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"strconv"
"strings"
"sync"
"time"
"github.com/FloatTech/floatbox/binary"
@@ -16,19 +17,22 @@ import (
// ----------------------- 远程调用 ----------------------
const (
URL = "https://api.steampowered.com/" // steam API 调用地址
StatusURL = "ISteamUser/GetPlayerSummaries/v2/?key=%+v&steamids=%+v" // 根据用户steamID获取用户状态
steamapikeygid = 3
apiurl = "https://api.steampowered.com/" // steam API 调用地址
statusurl = "ISteamUser/GetPlayerSummaries/v2/?key=%+v&steamids=%+v" // 根据用户steamID获取用户状态
)
var apiKey string
var (
apiKey string
apiKeyMu sync.Mutex
)
func init() {
engine.OnRegex(`^steam绑定\s*api\s*key\s*(.*)$`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
apiKeyMu.Lock()
defer apiKeyMu.Unlock()
apiKey = ctx.State["regex_matched"].([]string)[1]
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
_ = m.Manager.Response(steamapikeygid)
err := m.Manager.SetExtra(steamapikeygid, apiKey)
err := m.SetExtra(apiKey)
if err != nil {
ctx.SendChain(message.Text("[steam] ERROR: 保存apikey失败"))
return
@@ -36,6 +40,8 @@ func init() {
ctx.SendChain(message.Text("保存apikey成功"))
})
engine.OnFullMatch("查看apikey", zero.OnlyPrivate, zero.SuperUserPermission, getDB).SetBlock(true).Handle(func(ctx *zero.Ctx) {
apiKeyMu.Lock()
defer apiKeyMu.Unlock()
ctx.SendChain(message.Text("apikey为: ", apiKey))
})
engine.OnFullMatch("拉取steam订阅", getDB).SetBlock(true).Handle(func(ctx *zero.Ctx) {
@@ -55,7 +61,7 @@ func init() {
localPlayerMap := make(map[int64]*player)
for i := 0; i < len(infos); i++ {
streamIds[i] = strconv.FormatInt(infos[i].SteamID, 10)
localPlayerMap[infos[i].SteamID] = &infos[i]
localPlayerMap[infos[i].SteamID] = infos[i]
}
// 将所有用户状态查一遍
playerStatus, err := getPlayerStatus(streamIds...)
@@ -114,7 +120,9 @@ func init() {
func getPlayerStatus(streamIds ...string) ([]*player, error) {
players := make([]*player, 0)
// 拼接请求地址
url := fmt.Sprintf(URL+StatusURL, apiKey, strings.Join(streamIds, ","))
apiKeyMu.Lock()
url := fmt.Sprintf(apiurl+statusurl, apiKey, strings.Join(streamIds, ","))
apiKeyMu.Unlock()
// 拉取并解析数据
data, err := web.GetData(url)
if err != nil {

View File

@@ -19,6 +19,7 @@ import (
var (
engine = control.Register("steam", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Extra: control.ExtraFromString("steam"),
Brief: "steam相关插件",
Help: "- steam添加订阅 xxxxxxx (可输入需要绑定的 steamid)\n" +
"- steam删除订阅 xxxxxxx (删除你创建的对于 steamid 的绑定)\n" +

View File

@@ -22,14 +22,15 @@ var (
ctx.SendChain(message.Text("[steam] ERROR: ", err))
return false
}
if err = database.db.Create(TableListenPlayer, &player{}); err != nil {
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)
apiKeyMu.Lock()
defer apiKeyMu.Unlock()
_ = m.GetExtra(&apiKey)
if apiKey == "" {
ctx.SendChain(message.Text("ERROR: 未设置steam apikey"))
return false
@@ -45,8 +46,8 @@ type streamDB struct {
}
const (
// TableListenPlayer 存储查询用户信息
TableListenPlayer = "listen_player"
// tableListenPlayer 存储查询用户信息
tableListenPlayer = "listen_player"
)
// player 用户状态存储结构体
@@ -60,58 +61,46 @@ type player struct {
}
// update 如果主键不存在则插入一条新的数据,如果主键存在直接复写
func (sql *streamDB) update(dbInfo *player) error {
sql.Lock()
defer sql.Unlock()
return sql.db.Insert(TableListenPlayer, dbInfo)
func (sdb *streamDB) update(dbInfo *player) error {
sdb.Lock()
defer sdb.Unlock()
return sdb.db.Insert(tableListenPlayer, dbInfo)
}
// find 根据主键查信息
func (sql *streamDB) find(steamID int64) (dbInfo player, err error) {
sql.Lock()
defer sql.Unlock()
func (sdb *streamDB) find(steamID int64) (dbInfo player, err error) {
sdb.Lock()
defer sdb.Unlock()
condition := "where steam_id = " + strconv.FormatInt(steamID, 10)
if !sql.db.CanFind(TableListenPlayer, condition) {
return player{}, nil // 规避没有该用户数据的报错
err = sdb.db.Find(tableListenPlayer, &dbInfo, condition)
if err == sql.ErrNullResult { // 规避没有该用户数据的报错
err = 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()
func (sdb *streamDB) findWithGroupID(steamID int64, groupID string) (dbInfo player, err error) {
sdb.Lock()
defer sdb.Unlock()
condition := "where steam_id = " + strconv.FormatInt(steamID, 10) + " AND target LIKE '%" + groupID + "%'"
if !sql.db.CanFind(TableListenPlayer, condition) {
return player{}, nil // 规避没有该用户数据的报错
err = sdb.db.Find(tableListenPlayer, &dbInfo, condition)
if err == sql.ErrNullResult { // 规避没有该用户数据的报错
err = 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
func (sdb *streamDB) findAll() (dbInfos []*player, err error) {
sdb.Lock()
defer sdb.Unlock()
return sql.FindAll[player](&sdb.db, tableListenPlayer, "")
}
// 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))
func (sdb *streamDB) del(steamID int64) error {
sdb.Lock()
defer sdb.Unlock()
return sdb.db.Del(tableListenPlayer, "where steam_id = "+strconv.FormatInt(steamID, 10))
}