package main import ( "flag" "fmt" "io" "log" "os" "regexp" "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 var gs GuildService var ps PlayerService var ns NoteService 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() gs = GuildService{db: &db} ps = PlayerService{db: &db} ns = NoteService{db: &db} inputData, err := os.ReadFile(*inputFile) if err != nil { Error.Printf("Failed reading input file: %v", err) return } log.Printf("%#v", string(inputData)) note, err := ParseNote(string(inputData)) if err != nil { Error.Printf("Failed parsing note: %v", err) return } log.Printf("%#v", note) } var associationRe = regexp.MustCompile(`r:(\w+)(?:\(([^)]+)\))?`) 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") matches := associationRe.FindAllStringSubmatch(res.Note, -1) for _, match := range matches { res.Associations = append(res.Associations, NoteAssociationData{ Player: match[1], Note: match[2], }) } return res, nil }