69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
|
|
//Import this driver to be used by the SQL package.
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
var db *sql.DB
|
|
|
|
var errNotFound = errors.New("db: the requested entry was not found")
|
|
var errAlreadyExists = errors.New("db: attempting to write to an entry that already exists")
|
|
var errInviteUsed = errors.New("db: the requested invite has already been used")
|
|
|
|
func init() {
|
|
var err error
|
|
db, err = sql.Open("sqlite3", "terraocean.db")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
_, err = db.Exec("CREATE TABLE IF NOT EXISTS invite (code TEXT, owner TEXT, used BOOLEAN)")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func getInviteOwner(inviteCode string) (string, error) {
|
|
rows, err := db.Query("SELECT owner, used FROM invite WHERE code=?", inviteCode)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if rows.Next() {
|
|
var owner string
|
|
var used bool
|
|
err := rows.Scan(&owner, &used)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if used {
|
|
return "", errInviteUsed
|
|
}
|
|
return owner, nil
|
|
}
|
|
return "", errNotFound
|
|
}
|
|
|
|
func setInviteOwner(inviteCode, owner string) error {
|
|
_, err := getInviteOwner(inviteCode)
|
|
if err == nil {
|
|
return errAlreadyExists
|
|
}
|
|
if err != errNotFound {
|
|
return err
|
|
}
|
|
_, err = db.Exec("INSERT INTO invite(code, owner, used) VALUES(?,?,?)", inviteCode, owner, false)
|
|
return err
|
|
}
|
|
|
|
func useInvite(inviteCode string) error {
|
|
owner, err := getInviteOwner(inviteCode)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = db.Exec("REPLACE INTO invite(code, owner, used) VALUES(?,?,?)", inviteCode, owner, true)
|
|
return err
|
|
}
|