|
|
package main
import ( "io/ioutil" "log" "os" "strings" "time" )
// LogFile contains the meta-data and entries
// of a lobgot3 file.
type LogFile struct { Path string Channel string Time time.Time Title string Tag string Entries []LogEntry }
// LogEntry represents one line in a log-file
type LogEntry struct { Type string Time time.Time Nick string Text string }
// NewLogFile creates a new logfile, but it doesn't
// load it.
func NewLogFile(path string) *LogFile { split := strings.Split(path, "/") name := strings.Replace(split[len(split)-1], ".txt", "", 1) tokens := strings.Split(name, "_")
channel := tokens[len(tokens)-1] parsedTime, err := time.Parse("2006-01-02 150405", strings.Join(tokens[0:2], " ")[:17])
if err != nil { log.Fatalf("Failed to parse filename %s:\n\t%s", path, err) }
logFile := new(LogFile) logFile.Path = path logFile.Channel = channel logFile.Time = parsedTime
return logFile }
// Load loads the file and populates the remaining data
func (logFile *LogFile) Load() { file, err := os.Open(logFile.Path) if err != nil { log.Fatalf("Failed to open file %s:\n\t%s", logFile.Path, err) }
data, err := ioutil.ReadAll(file) if err != nil || len(data) == 0 { log.Fatalf("Failed to read file %s:\n\t%s", logFile.Path, err) }
rootDate := logFile.Time.Format("2006-01-02") lines := strings.Split(string(data), "\n") for _, line := range lines { split := strings.Split(line, " :") tokens := strings.Split(split[0], " ") text := ""
if len(split) > 1 { text = split[1] }
switch tokens[0] { case "ACTION", "TEXT": { parsedTime, _ := time.Parse("2006-01-02 15:04:05", rootDate+" "+tokens[2]) entry := LogEntry{Nick: tokens[1], Text: text, Type: tokens[0], Time: parsedTime}
// Handle midnights
if entry.Time.Before(logFile.Time) { entry.Time = entry.Time.Add(time.Hour * 24) }
logFile.Entries = append(logFile.Entries, entry) } case "TITLE": { logFile.Title = text } case "TAG": { logFile.Tag = text } } } }
|