This commit is contained in:
Linrador 2025-06-15 22:43:19 +02:00
parent b316d1f7a6
commit 2cadb34efd
3 changed files with 54 additions and 28 deletions

82
main.go
View File

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"math" "math"
"os" "os"
"time"
demoinfocs "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs" demoinfocs "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs"
"github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/common" "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/common"
@ -16,10 +15,13 @@ import (
type PlayerStats struct { type PlayerStats struct {
Name string `json:"name"` Name string `json:"name"`
SteamID string `json:"steamId"` SteamID string `json:"steamId"`
Team string `json:"team"`
Kills int `json:"kills"` Kills int `json:"kills"`
Deaths int `json:"deaths"` Deaths int `json:"deaths"`
Assists int `json:"assists"` Assists int `json:"assists"`
FlashAssists int `json:"flashAssists"` FlashAssists int `json:"flashAssists"`
TotalDamage int `json:"totalDamage"`
UtilityDamage int `json:"utilityDamage"`
MVPs int `json:"mvps"` MVPs int `json:"mvps"`
MVPReason1 int `json:"mvpEliminations"` MVPReason1 int `json:"mvpEliminations"`
MVPReason2 int `json:"mvpDefuse"` MVPReason2 int `json:"mvpDefuse"`
@ -56,7 +58,6 @@ type DemoMeta struct {
WinnerTeam string `json:"winnerTeam"` WinnerTeam string `json:"winnerTeam"`
RoundCount int `json:"roundCount"` RoundCount int `json:"roundCount"`
RoundHistory []RoundResult `json:"roundHistory"` RoundHistory []RoundResult `json:"roundHistory"`
DemoDate string `json:"demoDate"`
} }
func sanitizeFloat(value float64) float64 { func sanitizeFloat(value float64) float64 {
@ -66,14 +67,6 @@ func sanitizeFloat(value float64) float64 {
return value return value
} }
func getDemoTimestamp(path string) string {
info, err := os.Stat(path)
if err != nil {
return ""
}
return info.ModTime().UTC().Format("2006-01-02T15:04:05Z")
}
func reasonToString(reason events.RoundEndReason) string { func reasonToString(reason events.RoundEndReason) string {
switch reason { switch reason {
case events.RoundEndReasonTargetBombed: case events.RoundEndReasonTargetBombed:
@ -146,22 +139,37 @@ func main() {
} }
playerStats := make(map[uint64]*PlayerStats) playerStats := make(map[uint64]*PlayerStats)
playerInitialTeams := make(map[uint64]string)
getOrCreate := func(sid uint64, name string) *PlayerStats { getOrCreate := func(player common.Player) *PlayerStats {
sid := player.SteamID64
stat := playerStats[sid] stat := playerStats[sid]
if stat == nil { if stat == nil {
stat = &PlayerStats{ stat = &PlayerStats{
Name: name, Name: player.Name,
SteamID: fmt.Sprintf("%d", sid), SteamID: fmt.Sprintf("%d", sid),
Team: "", // später gesetzt
} }
playerStats[sid] = stat playerStats[sid] = stat
} }
return stat return stat
} }
p.RegisterEventHandler(func(e events.MatchStart) {
for _, player := range p.GameState().Participants().Playing() {
switch player.Team {
case common.TeamTerrorists:
playerInitialTeams[player.SteamID64] = "T"
case common.TeamCounterTerrorists:
playerInitialTeams[player.SteamID64] = "CT"
}
}
})
// Eventhandler (Kill, Hurt, etc.)
p.RegisterEventHandler(func(e events.Kill) { p.RegisterEventHandler(func(e events.Kill) {
if e.Killer != nil && e.Killer.SteamID64 != e.Victim.SteamID64 { if e.Killer != nil && e.Killer.SteamID64 != e.Victim.SteamID64 {
stat := getOrCreate(e.Killer.SteamID64, e.Killer.Name) stat := getOrCreate(*e.Killer)
stat.Kills++ stat.Kills++
if e.IsHeadshot { if e.IsHeadshot {
stat.Headshots++ stat.Headshots++
@ -188,25 +196,38 @@ func main() {
} }
} }
if e.Victim != nil { if e.Victim != nil {
stat := getOrCreate(e.Victim.SteamID64, e.Victim.Name) stat := getOrCreate(*e.Victim)
stat.Deaths++ stat.Deaths++
} }
if e.Assister != nil { if e.Assister != nil {
stat := getOrCreate(e.Assister.SteamID64, e.Assister.Name) stat := getOrCreate(*e.Assister)
stat.Assists++ stat.Assists++
} }
}) })
p.RegisterEventHandler(func(e events.PlayerFlashed) { p.RegisterEventHandler(func(e events.PlayerFlashed) {
if e.Attacker != nil && e.Attacker.SteamID64 != e.Player.SteamID64 { if e.Attacker != nil && e.Attacker.SteamID64 != e.Player.SteamID64 {
stat := getOrCreate(e.Attacker.SteamID64, e.Attacker.Name) stat := getOrCreate(*e.Attacker)
stat.FlashAssists++ stat.FlashAssists++
} }
}) })
p.RegisterEventHandler(func(e events.PlayerHurt) {
if e.Attacker != nil && e.Attacker != e.Player {
stat := getOrCreate(*e.Attacker)
stat.TotalDamage += e.HealthDamage
if e.Weapon != nil {
switch e.Weapon.Type {
case common.EqHE, common.EqIncendiary, common.EqMolotov:
stat.UtilityDamage += e.HealthDamage
}
}
}
})
p.RegisterEventHandler(func(e events.RoundMVPAnnouncement) { p.RegisterEventHandler(func(e events.RoundMVPAnnouncement) {
if e.Player != nil { if e.Player != nil {
stat := getOrCreate(e.Player.SteamID64, e.Player.Name) stat := getOrCreate(*e.Player)
stat.MVPs++ stat.MVPs++
switch e.Reason { switch e.Reason {
case events.MVPReasonMostEliminations: case events.MVPReasonMostEliminations:
@ -243,7 +264,7 @@ func main() {
p.RegisterEventHandler(func(e events.RankUpdate) { p.RegisterEventHandler(func(e events.RankUpdate) {
if e.Player != nil { if e.Player != nil {
stat := getOrCreate(e.Player.SteamID64, e.Player.Name) stat := getOrCreate(*e.Player)
stat.RankOld = e.RankOld stat.RankOld = e.RankOld
stat.RankNew = e.RankNew stat.RankNew = e.RankNew
stat.RankChange = int(e.RankChange) stat.RankChange = int(e.RankChange)
@ -258,9 +279,13 @@ func main() {
} }
teamCT := p.GameState().TeamCounterTerrorists().ClanName() teamCT := p.GameState().TeamCounterTerrorists().ClanName()
if teamCT == "" {
teamCT = "CT"
}
teamT := p.GameState().TeamTerrorists().ClanName() teamT := p.GameState().TeamTerrorists().ClanName()
scoreCT = p.GameState().TeamCounterTerrorists().Score() if teamT == "" {
scoreT = p.GameState().TeamTerrorists().Score() teamT = "T"
}
winnerTeam := "Draw" winnerTeam := "Draw"
if scoreCT > scoreT { if scoreCT > scoreT {
@ -269,11 +294,6 @@ func main() {
winnerTeam = teamT winnerTeam = teamT
} }
demoDate := getDemoTimestamp(filePath)
if demoDate == "" {
demoDate = time.Now().UTC().Format("2006-01-02T15:04:05Z")
}
duration := sanitizeFloat(header.PlaybackTime.Seconds()) duration := sanitizeFloat(header.PlaybackTime.Seconds())
tickRate := 0.0 tickRate := 0.0
if duration > 0 { if duration > 0 {
@ -296,17 +316,23 @@ func main() {
WinnerTeam: winnerTeam, WinnerTeam: winnerTeam,
RoundCount: roundCount, RoundCount: roundCount,
RoundHistory: roundHistory, RoundHistory: roundHistory,
DemoDate: demoDate,
} }
for _, stat := range playerStats { // Final: Teamzuweisung korrekt, keine Überschreibung
for sid, stat := range playerStats {
if stat.Team == "" || stat.Team == "Unknown" {
if team, ok := playerInitialTeams[sid]; ok {
stat.Team = team
} else {
stat.Team = "Unknown"
}
}
result.Players = append(result.Players, *stat) result.Players = append(result.Players, *stat)
} }
jsonData, err := json.Marshal(result) jsonData, err := json.Marshal(result)
if err != nil { if err != nil {
fmt.Printf("❌ Fehler beim JSON-Export: %v\n", err) fmt.Printf("❌ Fehler beim JSON-Export: %v\n", err)
fmt.Printf("⛔ Dump vor Fehler: %+v\n", result)
os.Exit(1) os.Exit(1)
} }

Binary file not shown.

Binary file not shown.