67 lines
2.0 KiB
Go
67 lines
2.0 KiB
Go
package parser
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type LogEvent struct {
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Type string `json:"type"` // 'CHAT', 'JOIN', 'LEAVE', 'ADMIN', 'GENERIC'
|
|
Content string `json:"content"`
|
|
PlayerName string `json:"playerName,omitempty"`
|
|
PlayerNameHash string `json:"playerNameHash,omitempty"`
|
|
ServerID string `json:"serverId,omitempty"`
|
|
ServerName string `json:"serverName,omitempty"`
|
|
Raw string `json:"raw,omitempty"`
|
|
}
|
|
|
|
// Reforger-specific regex patterns
|
|
var (
|
|
// Example: 12:30:01.122 SCRIPT : [RJSSupport][Chat] [Global] Zauberklöte: hi, leute...
|
|
chatRegex = regexp.MustCompile(`^(\d{2}:\d{2}:\d{2}\.\d{3})\s+SCRIPT\s+:\s+\[.*?\]\[Chat\]\s+\[.*?\]\s+(.*?):\s+(.*)$`)
|
|
// Example: 09:37:50.865 DEFAULT : BattlEye Server: 'Player #0 Mike1Delta (92.209.175.19:6679) connected'
|
|
joinRegex = regexp.MustCompile(`^(\d{2}:\d{2}:\d{2}\.\d{3})\s+DEFAULT\s+:\s+BattlEye Server:\s+'Player #\d+\s+(.*?)\s+\(.*?\) connected'$`)
|
|
// Example: 09:38:53.842 DEFAULT : BattlEye Server: 'Player #0 Mike1Delta disconnected'
|
|
leaveRegex = regexp.MustCompile(`^(\d{2}:\d{2}:\d{2}\.\d{3})\s+DEFAULT\s+:\s+BattlEye Server:\s+'Player #\d+\s+(.*?) disconnected'$`)
|
|
)
|
|
|
|
func ParseLine(line string) *LogEvent {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
return nil
|
|
}
|
|
|
|
event := &LogEvent{
|
|
Raw: line,
|
|
Type: "GENERIC",
|
|
}
|
|
|
|
// Try Chat
|
|
if matches := chatRegex.FindStringSubmatch(line); matches != nil {
|
|
event.Type = "CHAT"
|
|
event.PlayerName = matches[2]
|
|
event.Content = matches[2] + ": " + matches[3]
|
|
return event
|
|
}
|
|
|
|
// Try Join
|
|
if matches := joinRegex.FindStringSubmatch(line); matches != nil {
|
|
event.Type = "JOIN"
|
|
event.PlayerName = matches[2]
|
|
event.Content = matches[2] + " connected to server"
|
|
return event
|
|
}
|
|
|
|
// Try Leave
|
|
if matches := leaveRegex.FindStringSubmatch(line); matches != nil {
|
|
event.Type = "LEAVE"
|
|
event.PlayerName = matches[2]
|
|
event.Content = matches[2] + " left the server"
|
|
return event
|
|
}
|
|
|
|
return event
|
|
}
|