2024-10-11 00:14:11 +08:00

109 lines
2.2 KiB
Go

package jrrp
import (
"database/sql"
"math"
"math/rand"
"time"
"git.lxtend.com/qqbot/sqlite3"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
)
// 初始化 SQLite 数据库
func initDB() {
createTableSQL := `CREATE TABLE IF NOT EXISTS jrrp (
id INTEGER PRIMARY KEY AUTOINCREMENT,
qqid TEXT UNIQUE,
date TEXT,
rp_value INTEGER
);`
sqlite3.TryCreateTable(createTableSQL)
}
// 获取今天的日期
func getTodayFullDate() string {
today := time.Now().Format("2006-01-02")
return today
}
// 构造RP值
func rpValueConstructor() (string, int) {
rand.Seed(time.Now().UnixNano())
rpValue := int(math.Floor(math.Sqrt(rand.Float64()*100) * 10))
if rpValue == 0 {
rpValue = 1
}
return getTodayFullDate(), rpValue
}
// Jrrp 结构体
type Jrrp struct {
}
// NewJrrp 创建 Jrrp 实例
func NewJrrp() *Jrrp {
initDB()
return &Jrrp{}
}
// findJrrp 查找RP数据
func (j *Jrrp) findJrrp(qqid string, tx *sqlx.Tx) (string, int, error) {
var date string
var rpValue int
query := "SELECT date, rp_value FROM jrrp WHERE qqid = ?"
err := tx.QueryRow(query, qqid).Scan(&date, &rpValue)
if err != nil {
if err == sql.ErrNoRows {
return "", 0, nil
}
return "", 0, err
}
return date, rpValue, nil
}
// insertJrrp 插入RP数据
func (j *Jrrp) insertJrrp(qqid string, date string, rpValue int, tx *sqlx.Tx) error {
query := "INSERT OR REPLACE INTO jrrp (qqid, date, rp_value) VALUES (?, ?, ?)"
_, err := tx.Exec(query, qqid, date, rpValue)
return err
}
// GetJrrp 获取RP值
func (j *Jrrp) GetJrrp(qqid string) (int, error) {
tx, err := sqlite3.GetTran()
if err != nil {
return 0, err
}
defer tx.Rollback()
today := getTodayFullDate()
date, rpValue, err := j.findJrrp(qqid, tx)
if err != nil {
return 0, err
}
if date == "" || date != today {
newDate, newRpValue := rpValueConstructor()
err = j.insertJrrp(qqid, newDate, newRpValue, tx)
if err != nil {
return 0, err
}
if err = tx.Commit(); err != nil {
return 0, err
}
return newRpValue, nil
}
if err = tx.Commit(); err != nil {
return 0, err
}
return rpValue, nil
}
// Close 关闭数据库连接
func (j *Jrrp) Close() {
sqlite3.GetDB().Close()
}