Jelajahi Sumber

Add some of the database and new user stuffz

I can at least assign a User.Name, but next will be to get the other
stuff like User.Class
Apollo 8 bulan lalu
induk
melakukan
16c9c95491
5 mengubah file dengan 235 tambahan dan 0 penghapusan
  1. 8 0
      .gitignore
  2. 124 0
      db.go
  3. 20 0
      go.mod
  4. 16 0
      go.sum
  5. 67 0
      main.go

+ 8 - 0
.gitignore

@@ -0,0 +1,8 @@
+doorgo/
+*.sys
+*.log
+*.db3
+*.json
+*.toml
+geode
+

+ 124 - 0
db.go

@@ -0,0 +1,124 @@
+package main
+
+import (
+	"log"
+	"strings"
+	"time"
+
+	"gorm.io/driver/sqlite"
+	"gorm.io/gorm"
+)
+
+type UserDB struct {
+	DB *gorm.DB
+}
+
+type Model struct {
+	Id        uint64 `gorm:"primaryKey"`
+	CreatedAt time.Time
+	UpdatedAt time.Time
+}
+
+func (u *UserDB) Open(filename string) error {
+	var err error
+	u.DB, err = gorm.Open(sqlite.Open(filename), &gorm.Config{})
+	if err != nil {
+		return err
+	}
+	err = u.DB.AutoMigrate(&User{}, &Faction{})
+	return err
+}
+
+type User struct {
+	Model
+	BBSName             string
+	BBSNick             string
+	Name                string   `gorm:"unique,collate:nocase"`
+	Faction             *Faction `gorm:"-"`
+	FactionId           uint64
+	FactionSO           bool
+	FactionO            bool
+	X                   uint64
+	Y                   uint64
+	World               uint32
+	Health              uint32
+	MaxHealth           uint32
+	Magic               uint32
+	MaxMagic            uint32
+	Class               uint8
+	Level               uint32
+	Xp                  uint64
+	Weapon              uint8
+	WeaponEnchant       uint8
+	Armor               uint8
+	ArmorEnchant        uint8
+	RangedWeapon        uint8
+	RangedWeaponEnchant uint8
+	Shield              uint8
+	Ring                uint8
+	Amulet              uint8
+	Gold                uint64
+	GoldBanked          uint64
+	GemRed              uint32
+	GemGreen            uint32
+	GemBlue             uint32
+}
+
+func (u *UserDB) FindUser(name string) *User {
+	parts := strings.Split(name, "@")
+	var usr *User
+	result := u.DB.First(&usr, &User{BBSName: parts[1], BBSNick: parts[0]})
+	if result.Error != nil {
+		log.Printf("UserDB.FindUser(name='%s') > %v", name, result.Error)
+		return nil
+	}
+	// Hot load the users faction if they are in one
+	if usr != nil && usr.FactionId != 0 {
+		fac := u.FindFactionById(usr.FactionId)
+		if fac != nil {
+			usr.Faction = fac
+		}
+	}
+	return usr
+}
+
+func (u *UserDB) SaveUser(usr *User) error {
+	result := u.DB.Save(usr)
+	return result.Error
+}
+
+type Faction struct {
+	Model
+	Name        string `gorm:"unique,collate:nocase"`
+	Description string
+	LeaderId    uint64 `gorm:"unique"`
+	Gold        uint64
+	GemRed      uint32
+	GemGreen    uint32
+	GemBlue     uint32
+}
+
+func (u *UserDB) FindFactionByName(name string) *Faction {
+	var fac *Faction
+	result := u.DB.First(&fac, &Faction{Name: name})
+	if result.Error != nil {
+		log.Printf("UserDB.FindFactionByName(name='%s') > %v", name, result.Error)
+		return nil
+	}
+	return fac
+}
+
+func (u *UserDB) FindFactionById(id uint64) *Faction {
+	var fac *Faction
+	result := u.DB.First(&fac, id)
+	if result.Error != nil {
+		log.Printf("UserDB.FindFactionById(id=%d) > %v", id, result.Error)
+		return nil
+	}
+	return fac
+}
+
+func (u *UserDB) SaveFaction(fac *Faction) error {
+	result := u.DB.Save(fac)
+	return result.Error
+}

+ 20 - 0
go.mod

@@ -0,0 +1,20 @@
+module git.red-green.com/david/geode
+
+go 1.22.5
+
+replace git.red-green.com/RedGreen/doorgo => ./doorgo/door
+
+require (
+	git.red-green.com/RedGreen/doorgo v0.0.0-00010101000000-000000000000
+	gorm.io/driver/sqlite v1.5.6
+	gorm.io/gorm v1.25.11
+)
+
+require (
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/mattn/go-sqlite3 v1.14.22 // indirect
+	golang.org/x/sys v0.5.0 // indirect
+	golang.org/x/term v0.2.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+)

+ 16 - 0
go.sum

@@ -0,0 +1,16 @@
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+gorm.io/driver/sqlite v1.5.6 h1:fO/X46qn5NUEEOZtnjJRWRzZMe8nqJiQ9E+0hi+hKQE=
+gorm.io/driver/sqlite v1.5.6/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
+gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg=
+gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=

+ 67 - 0
main.go

@@ -0,0 +1,67 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+
+	door "git.red-green.com/RedGreen/doorgo"
+)
+
+var (
+	d   door.Door
+	udb *UserDB
+	u   *User
+)
+
+func main() {
+	d.Init("Geode")
+	defer d.Close()
+	udb = &UserDB{}
+	err := udb.Open("users.db3")
+	if err != nil {
+		fmt.Printf("UserDB.Open(filename='users.db3') > %v\r\n", err)
+		return
+	}
+	u = udb.FindUser(d.Config.Handle + "@" + d.Config.BBSID)
+	if u != nil {
+		d.WriteS(door.ColorTextS("BRI YEL ON BLA") + "Geode" + door.ColorTextS("WHI ON BLA") + " by " + door.ColorTextS("BRI RED ON BLA") + "Apollo" + door.ColorTextS("BRI BLA ON BLA") + "@" + door.ColorTextS("BRI GRE ON BLA") + "21:1/236" + door.Reset + door.CRNL + door.ColorTextS("BRI CYA ON BLA") + fmt.Sprintf("Welcome back %s%s", door.ColorTextS("BRI WHI ON BLA"), u.Name) + door.CRNL)
+		d.WaitKey(door.Inactivity)
+	} else {
+		u = &User{}
+		d.WriteS(door.ColorTextS("BRI YEL ON BLA") + "Geode" + door.ColorTextS("WHI ON BLA") + " by " + door.ColorTextS("BRI RED ON BLA") + "Apollo" + door.ColorTextS("BRI BLA ON BLA") + "@" + door.ColorTextS("BRI GRE ON BLA") + "21:1/236" + door.Reset + door.CRNL + door.ColorTextS("BRI CYA ON BLA") + "Welcome new user" + door.CRNL)
+	NEW_NAME:
+		for {
+			d.WriteS(door.GotoS(1, 4) + door.Reset + strings.Repeat(" ", door.Width-1))
+			d.WriteS(door.GotoS(1, 3) + door.ColorTextS("BRI YEL ON BLA") + "Your Name: " + door.ColorTextS("BRI WHI ON BLU"))
+			name := d.Input(30)
+			if len(name) == 0 {
+				d.WriteS(door.Reset + door.CRNL + "Goodbye!")
+				return
+			}
+			d.WriteS(door.Reset + door.CRNL + door.ColorTextS("BRI WHI ON BLA") + name + door.ColorTextS("BRI GRE ON BLA") + " ok?" + door.Reset + " ")
+			r, _, err := d.WaitKey(door.Inactivity)
+			if err != nil {
+				if errors.Is(err, door.ErrDisconnected) {
+					return
+				} else {
+					continue NEW_NAME
+				}
+			}
+			if r == 'y' || r == 'Y' {
+				u.BBSName = d.Config.BBSID
+				u.BBSNick = d.Config.Handle
+				u.Name = name
+				err = udb.SaveUser(u)
+				if err != nil {
+					d.WriteS(fmt.Sprintf("%sErr: %v", door.ColorTextS("BRI RED ON BLA"), err) + door.CRNL)
+					d.WaitKey(door.Inactivity)
+					return
+				} else {
+					d.WriteS(door.CRNL + door.Reset + "Saved!" + door.CRNL)
+				}
+				break NEW_NAME
+			}
+		}
+	}
+}