You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.0 KiB
98 lines
2.0 KiB
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
|
|
}
|
|
}
|
|
}
|
|
}
|