package jrrp import ( "database/sql" "fmt" "log" "math" "math/rand" "time" _ "github.com/mattn/go-sqlite3" ) // 初始化 SQLite 数据库 func initDB() { db, err := sql.Open("sqlite3", "./jrrp.db") if err != nil { log.Print(err) } defer db.Close() createTableSQL := `CREATE TABLE IF NOT EXISTS jrrp ( id INTEGER PRIMARY KEY AUTOINCREMENT, qqid TEXT UNIQUE, date TEXT, rp_value INTEGER );` _, err = db.Exec(createTableSQL) if err != nil { log.Print(err) } } // 获取今天的日期 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 { db *sql.DB } // NewJrrp 创建 Jrrp 实例 func NewJrrp() *Jrrp { initDB() db, err := sql.Open("sqlite3", "./jrrp.db") if err != nil { log.Print(err) } return &Jrrp{db: db} } // findJrrp 查找RP数据 func (j *Jrrp) findJrrp(qqid string) (string, int, error) { var date string var rpValue int query := "SELECT date, rp_value FROM jrrp WHERE qqid = ?" err := j.db.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) error { query := "INSERT OR REPLACE INTO jrrp (qqid, date, rp_value) VALUES (?, ?, ?)" _, err := j.db.Exec(query, qqid, date, rpValue) return err } // updateJrrp 更新RP数据 func (j *Jrrp) updateJrrp(qqid string) error { date, _, err := j.findJrrp(qqid) if err != nil { return err } if date == "" { return fmt.Errorf("updateJrrp()-> Error: the qqid does not exist!") } newDate, newRpValue := rpValueConstructor() return j.insertJrrp(qqid, newDate, newRpValue) } // GetJrrp 获取RP值 func (j *Jrrp) GetJrrp(qqid string) (int, error) { today := getTodayFullDate() date, rpValue, err := j.findJrrp(qqid) if err != nil { return 0, err } if date == "" || date != today { newDate, newRpValue := rpValueConstructor() err = j.insertJrrp(qqid, newDate, newRpValue) if err != nil { return 0, err } return newRpValue, nil } return rpValue, nil } // Close 关闭数据库连接 func (j *Jrrp) Close() { j.db.Close() }