gopenfusion/db/account.go
CPunch 8569225ec7 major refactoring; started DB
- DB work has started in db. this will be a direct port of the OpenFusion DB format.
- LoginServer is now less of a dummy. You can create and login to accounts, and create a character to go through the tutorial with.
- config.go will host some commonly changed variables.
- protocol: fixed a bug relating to arrays being ignored while encoding packets
2023-03-09 01:48:13 -06:00

67 lines
1.4 KiB
Go

package db
import (
"fmt"
"golang.org/x/crypto/bcrypt"
"github.com/CPunch/GopenFusion/protocol"
"github.com/blockloop/scan"
)
type Account struct {
AccountID int
Login string
Password string
Selected int
AccountLevel int
Created int
LastLogin int
BannedUntil int
BannedSince int
BanReason string
}
func NewAccount(db DBQuery, Login, Password string) (*Account, error) {
hash, err := bcrypt.GenerateFromPassword([]byte(Password), 12)
if err != nil {
return nil, err
}
row, err := db.Query("INSERT INTO Accounts (Login, Password, AccountLevel) VALUES(?, ?, ?) RETURNING *", Login, hash, protocol.CN_ACCOUNT_LEVEL__USER)
if err != nil {
return nil, err
}
var account Account
if err := scan.Row(&account, row); err != nil {
return nil, err
}
return &account, nil
}
var (
LoginErrorInvalidID = fmt.Errorf("Invalid Login ID!")
LoginErrorInvalidPassword = fmt.Errorf("Invalid ID && Password combo!")
)
func TryLogin(db DBQuery, Login, Password string) (*Account, error) {
row, err := db.Query("SELECT * FROM Accounts WHERE Login=?", Login)
if err != nil {
return nil, err
}
var account Account
if err := scan.Row(&account, row); err != nil {
return nil, LoginErrorInvalidID
}
if bcrypt.CompareHashAndPassword([]byte(account.Password), []byte(Password)) != nil {
return nil, LoginErrorInvalidPassword
}
// else, login was a success
return &account, nil
}