Georg Pfuetzenreuter
dfe7deff72
Allow the database file to reside in a user defined location instead of requiring it to be in the working directory. Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
144 lines
3.0 KiB
Go
144 lines
3.0 KiB
Go
package wat
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
"gorm.io/driver/sqlite"
|
|
)
|
|
|
|
type Player struct {
|
|
gorm.Model
|
|
Nick string
|
|
Host string
|
|
Watting int64
|
|
Anarchy int64
|
|
Trickery int64
|
|
Coins uint64 `gorm:"default:100"`
|
|
Health int64
|
|
LastMined int64
|
|
LastRested int64
|
|
CoinsLost uint64
|
|
Bankrupcy int64 // how many times someone has been bankrupt
|
|
}
|
|
|
|
type Action struct {
|
|
PlayerId uint `gorm:"primary_key;auto_increment:false"`
|
|
Type ActionType `gorm:"primary_key;auto_increment:false"`
|
|
Performed int64
|
|
}
|
|
|
|
func (p *Player) LoseCoins(coins uint64) {
|
|
p.Coins -= coins
|
|
p.CoinsLost += coins
|
|
}
|
|
|
|
func (p *Player) Conscious() bool {
|
|
return (p.Health > 0)
|
|
}
|
|
|
|
func (p *Player) Level(xp int64) int64 {
|
|
if xp < 100 {
|
|
return xp / 10
|
|
} else if xp < 900 {
|
|
return 10 + (xp / 100)
|
|
} else {
|
|
return 99
|
|
}
|
|
}
|
|
|
|
type WatDb struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewWatDb(dbpath string) *WatDb {
|
|
w := WatDb{}
|
|
var err error
|
|
w.db, err = gorm.Open(sqlite.Open(dbpath), &gorm.Config{})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
w.db.AutoMigrate(&Action{}, &Player{})
|
|
return &w
|
|
}
|
|
|
|
func (w *WatDb) User(nick, host string, create bool) Player {
|
|
var player Player
|
|
query := "nick = ?"
|
|
if host != "" {
|
|
query = query + " or host = ?"
|
|
}
|
|
// Try and get a user
|
|
if err := w.db.First(&player, query, nick, host).Error; err != nil && create {
|
|
fmt.Printf("Creating user: %s\n", err.Error())
|
|
// No user, make another
|
|
player.Nick = nick
|
|
player.Host = host
|
|
w.db.Create(&player)
|
|
w.db.First(&player, "nick = ? or host = ?", nick, host)
|
|
}
|
|
return player
|
|
}
|
|
|
|
func (w *WatDb) Update(upd ...interface{}) {
|
|
for _, u := range upd {
|
|
//fmt.Printf("Updating %+v\n", u)
|
|
w.db.Save(u)
|
|
}
|
|
}
|
|
|
|
const (
|
|
Action_Mine ActionType = 1
|
|
Action_Rest ActionType = 2
|
|
Action_Lift ActionType = 3
|
|
Action_Riot ActionType = 4
|
|
Action_Bankrupt ActionType = 5
|
|
)
|
|
|
|
type ActionType int
|
|
|
|
func (w *WatDb) LastActed(player *Player, actionType ActionType) int64 {
|
|
action := Action{}
|
|
w.db.First(&action, "type = ? AND player_id = ?", actionType, player.Model.ID)
|
|
return action.Performed
|
|
}
|
|
|
|
func (w *WatDb) Act(player *Player, actionType ActionType) {
|
|
action := Action{player.Model.ID, actionType, time.Now().Unix()}
|
|
if err := w.db.First(&action, "type = ? AND player_id = ?", actionType, player.Model.ID).Error; err != nil {
|
|
w.db.Create(&action)
|
|
} else {
|
|
action.Performed = time.Now().Unix()
|
|
w.Update(&action)
|
|
}
|
|
}
|
|
|
|
func (w *WatDb) Strongest() []Player {
|
|
return w.GetTopColumn("anarchy")
|
|
}
|
|
|
|
func (w *WatDb) GetTopColumn(tipe string) []Player {
|
|
var user = make([]Player, 10)
|
|
w.db.Limit(10).Order(tipe + " desc").Find(&user)
|
|
return user
|
|
}
|
|
|
|
func (w *WatDb) Healthiest() []Player {
|
|
return w.GetTopColumn("health")
|
|
}
|
|
|
|
func (w *WatDb) TopLost() []Player {
|
|
return w.GetTopColumn("coins_lost")
|
|
}
|
|
|
|
func (w *WatDb) Bankruptest() []Player {
|
|
return w.GetTopColumn("bankrupcy")
|
|
}
|
|
|
|
func (w *WatDb) TopTen() []Player {
|
|
var user = make([]Player, 10)
|
|
w.db.Where("nick != 'watt'").Limit(10).Order("coins desc").Find(&user)
|
|
return user
|
|
}
|