185 lines
4.5 KiB
Go
185 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
var Error *log.Logger
|
|
var Warning *log.Logger
|
|
|
|
func init() {
|
|
log.SetFlags(log.Lmicroseconds | log.Lshortfile)
|
|
logFile, err := os.Create("main.log")
|
|
if err != nil {
|
|
log.Printf("Error creating log file: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
logger := io.MultiWriter(os.Stdout, logFile)
|
|
log.SetOutput(logger)
|
|
|
|
Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout),
|
|
fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"),
|
|
log.Lmicroseconds|log.Lshortfile)
|
|
Warning = log.New(io.MultiWriter(logFile, os.Stdout),
|
|
fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"),
|
|
log.Lmicroseconds|log.Lshortfile)
|
|
}
|
|
|
|
var db DB
|
|
|
|
func main() {
|
|
inputFile := flag.String("if", "input", "Input file")
|
|
flag.Parse()
|
|
log.Printf("Input file: %s", *inputFile)
|
|
|
|
db = DB{
|
|
path: "data/db.db",
|
|
}
|
|
err := db.Open()
|
|
if err != nil {
|
|
Error.Printf("Failed opening database: %v", err)
|
|
return
|
|
}
|
|
defer db.Close()
|
|
|
|
inputData, err := os.ReadFile(*inputFile)
|
|
if err != nil {
|
|
Error.Printf("Failed reading input file: %v", err)
|
|
return
|
|
}
|
|
note, err := ParseNote(string(inputData))
|
|
if err != nil {
|
|
Error.Printf("Failed parsing note: %v", err)
|
|
return
|
|
}
|
|
|
|
err = SaveNote(note)
|
|
if err != nil {
|
|
Error.Printf("Failed saving note: %v", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
func ParseNote(data string) (NoteData, error) {
|
|
res := NoteData{}
|
|
lines := strings.Split(data, "\n")
|
|
note := []string{}
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
parts := strings.Split(line, ":")
|
|
switch parts[0] {
|
|
case "p":
|
|
res.Player = parts[1]
|
|
case "d":
|
|
var err error
|
|
res.Date, err = time.Parse(time.DateOnly, parts[1])
|
|
if err != nil {
|
|
return res, fmt.Errorf("failed to parse date: %v", err)
|
|
}
|
|
case "g":
|
|
res.Guild = parts[1]
|
|
default:
|
|
note = append(note, line)
|
|
}
|
|
}
|
|
res.Note = strings.Join(note, "\n")
|
|
return res, nil
|
|
}
|
|
|
|
func SaveNote(data NoteData) error {
|
|
guild, err := GetOrCreateGuildByName(data.Guild)
|
|
if err != nil {
|
|
return fmt.Errorf("failed getting guild for %s: %v", data.Guild, err)
|
|
}
|
|
|
|
stinky, err := GetOrCreateStinkyByName(data.Player, guild)
|
|
if err != nil {
|
|
return fmt.Errorf("failed getting stinky for %s: %v", data.Player, err)
|
|
}
|
|
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetOrCreateGuildByName(name string) (Guild, error) {
|
|
var guild Guild
|
|
err := db.readConn.QueryRow("select id, name from guild where name = ?", name).Scan(&guild.ID, &guild.Name)
|
|
if err != nil {
|
|
guild, err = CreateGuild(name)
|
|
if err != nil {
|
|
return guild, fmt.Errorf("failed creating guild: %v", err)
|
|
}
|
|
}
|
|
return guild, nil
|
|
}
|
|
|
|
func CreateGuild(name string) (Guild, error) {
|
|
guild := Guild{}
|
|
res, err := db.writeConn.Exec("insert into guild (name) values (?)", name)
|
|
if err != nil {
|
|
return guild, fmt.Errorf("failed to insert guild: %v", err)
|
|
}
|
|
|
|
id, err := res.LastInsertId()
|
|
if err != nil {
|
|
return guild, fmt.Errorf("failed to get last insert id: %v", err)
|
|
}
|
|
|
|
return GetGuildById(int(id))
|
|
}
|
|
|
|
func GetGuildById(id int) (Guild, error) {
|
|
var guild Guild
|
|
err := db.readConn.QueryRow("select id, name from guild where id = ?", id).Scan(&guild.ID, &guild.Name)
|
|
if err != nil {
|
|
log.Printf("Guild not found: %v", err)
|
|
}
|
|
return guild, nil
|
|
}
|
|
|
|
func GetOrCreateStinkyByName(name string, guild Guild) (Stinky, error) {
|
|
var stinky Stinky
|
|
err := db.readConn.QueryRow("select id, name, guild from stinky where name = ?", name).Scan(&stinky.ID, &stinky.Name, &stinky.Guild.ID)
|
|
if err != nil {
|
|
log.Printf("Stinky not found: %v", err)
|
|
stinky, err = CreateStinky(name, Guild{})
|
|
if err != nil {
|
|
return stinky, fmt.Errorf("failed creating stinky: %v", err)
|
|
}
|
|
}
|
|
return stinky, nil
|
|
}
|
|
|
|
func CreateStinky(name string, guild Guild) (Stinky, error) {
|
|
stinky := Stinky{}
|
|
res, err := db.writeConn.Exec("insert into stinky (name, guild) values (?, ?)", name, guild.ID)
|
|
if err != nil {
|
|
return stinky, fmt.Errorf("failed to insert stinky: %v", err)
|
|
}
|
|
|
|
id, err := res.LastInsertId()
|
|
if err != nil {
|
|
return stinky, fmt.Errorf("failed getting last insert id for %d: %v", id, err)
|
|
}
|
|
|
|
return GetStinkyById(int(id))
|
|
}
|
|
|
|
func GetStinkyById(id int) (Stinky, error) {
|
|
stinky := Stinky{}
|
|
err := db.readConn.QueryRow("select id, name, guild from stinky where id = ?", id).Scan(&stinky.ID, &stinky.Name, &stinky.Guild.ID)
|
|
if err != nil {
|
|
return stinky, fmt.Errorf("failed getting stinky for %d: %v", id, err)
|
|
}
|
|
return stinky, nil
|
|
}
|