ZeroBot-Plugin/plugin/niuniu/model.go
github-actions[bot] ff62723e91
chore(lint): 改进代码样式 (#968)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-08-30 18:04:14 +08:00

121 lines
2.4 KiB
Go

// Package niuniu 牛牛大作战
package niuniu
import (
"math/rand"
"sort"
"strconv"
"sync"
"time"
fcext "github.com/FloatTech/floatbox/ctxext"
sql "github.com/FloatTech/sqlite"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
type model struct {
sql sql.Sqlite
sync.RWMutex
}
type userInfo struct {
UID int64
Length float64
UserCount int
}
type users []*userInfo
var (
db = &model{}
getdb = fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
db.sql.DBPath = en.DataFolder() + "niuniu.db"
err := db.sql.Open(time.Hour * 24)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return false
}
return true
})
)
func (m users) positive() []userInfo {
var m1 []userInfo
for _, i2 := range m {
if i2.Length > 0 {
m1 = append(m1, *i2)
}
}
return m1
}
func (m users) negative() []userInfo {
var m1 []userInfo
for _, i2 := range m {
if i2.Length <= 0 {
m1 = append(m1, *i2)
}
}
return m1
}
func (m users) sort(isDesc bool) users {
t := func(i, j int) bool {
return m[i].UserCount < m[j].UserCount
}
if isDesc {
t = func(i, j int) bool {
return m[i].Length > m[j].Length
}
}
sort.Slice(m, t)
return m
}
func (m users) ranking(niuniu float64, uid int64) int {
result := niuniu > 0
for i, user := range m.sort(result) {
if user.UID == uid {
return i + 1
}
}
return -1
}
func (db *model) randLength() float64 {
return float64(rand.Intn(9)+1) + (float64(rand.Intn(100)) / 100)
}
func (db *model) createGIDTable(gid int64) error {
db.Lock()
defer db.Unlock()
return db.sql.Create(strconv.FormatInt(gid, 10), &userInfo{})
}
func (db *model) findniuniu(gid, uid int64) (float64, error) {
db.RLock()
defer db.RUnlock()
u := userInfo{}
err := db.sql.Find(strconv.FormatInt(gid, 10), &u, "where UID = "+strconv.FormatInt(uid, 10))
return u.Length, err
}
func (db *model) insertniuniu(u *userInfo, gid int64) error {
db.Lock()
defer db.Unlock()
return db.sql.Insert(strconv.FormatInt(gid, 10), u)
}
func (db *model) deleteniuniu(gid, uid int64) error {
db.Lock()
defer db.Unlock()
return db.sql.Del(strconv.FormatInt(gid, 10), "where UID = "+strconv.FormatInt(uid, 10))
}
func (db *model) readAllTable(gid int64) (users, error) {
db.Lock()
defer db.Unlock()
a, err := sql.FindAll[userInfo](&db.sql, strconv.FormatInt(gid, 10), "where UserCount = 0")
return a, err
}