diff --git a/bot.go b/bot.go index 815cfb7..326c3f6 100644 --- a/bot.go +++ b/bot.go @@ -73,7 +73,9 @@ func (b *Bot) BotHandlers() { b.bot.Handle("/passwd", botPasswd) b.bot.Handle("/say", botSay) b.bot.Handle("/help", botHelp) + b.bot.Handle("/version", botVersion) + b.bot.Handle("/save", botSave) b.bot.Handle("/reset", botReset) b.bot.Handle("/ready", botReady) @@ -283,7 +285,9 @@ func botActuallyReset(m *tb.Message) { if time.Now().Sub(a.Time) > time.Minute { bot.SendChat(m.Chat.ID, "Request expired.") } else { + cfg.Save("backup." + *configFlag) cfg.Game.Started = false + cfg.Stats = make(map[uint8]map[string]*Stat) for _, cc := range cfg.Clients { cc.Ready = false cc.CompanyID = 255 @@ -511,6 +515,31 @@ func botVersion(m *tb.Message) { return } +func botSave(m *tb.Message) { + if m.Sender.ID != int(cfg.Telegram.AdminID) { + bot.SendChat(m.Chat.ID, "Only the admin can use this command.") + return + } + + r := regexp.MustCompile("^\\/save @(?P[a-zA-Z0-9._]+)") + + if !r.MatchString(m.Text) { + bot.SendChat(m.Chat.ID, "Wrong usage.") + return + } + + filename := r.ReplaceAllString(m.Text, "${Filename}") + + err := cfg.Save(filename + ".json") + logErrorDebug(err, "botSave : Config.Save(%s)", filename+".json") + if err != nil { + bot.SendChat(m.Chat.ID, fmt.Sprintf("Error : %s", err)) + } else { + bot.SendChat(m.Chat.ID, "Saved.") + } + return +} + func botTransfer(m *tb.Message) { r := regexp.MustCompile("^\\/transfer @(?P[a-zA-Z0-9]+) (?P[a-z0-9]+)") diff --git a/config.go b/config.go index d585c98..1e3c8f7 100644 --- a/config.go +++ b/config.go @@ -44,10 +44,11 @@ type ClientConfig struct { } type Config struct { - Server *ServerConfig `json:"server"` - Telegram *TelegramConfig `json:"telegram"` - Game *GameConfig `json:"game"` - Clients map[int]*ClientConfig `json:"clients"` + Server *ServerConfig `json:"server"` + Telegram *TelegramConfig `json:"telegram"` + Game *GameConfig `json:"game"` + Clients map[int]*ClientConfig `json:"clients"` + Stats map[uint8]map[string]*Stat `json:"stats"` } // Init values for a config based on package defaults diff --git a/stats.go b/stats.go new file mode 100644 index 0000000..a54d4a9 --- /dev/null +++ b/stats.go @@ -0,0 +1,28 @@ +package main + +import "time" + +type Stat struct { + CompanyID uint8 + Date time.Time + Trains int + Lorries int + Busses int + Planes int + Ships int + TrainStations int + LorryStations int + BusStops int + Airports int + Harbours int + Money int64 + Loan int64 + Income int64 + DeliveredCargoThisQuarter int + CompanyValueLastQuarter int64 + PerformanceLastQuarter int + DeliveredCargoLastQuarter int + CompanyValuePreviousQuarter int64 + PerformancePreviousQuarter int + DeliveredCargoPreviousQuarter int +} diff --git a/ttd.go b/ttd.go index fa1cbe6..7913d1a 100644 --- a/ttd.go +++ b/ttd.go @@ -382,13 +382,60 @@ func (s *ServerTTD) Poll(stop chan struct{}) { Packet: p, } sp.Read(buffer[:p.PLength]) - logInfoDebug("Server.Poll() : PacketServerCompanyEconomy :\n- CompanyID: %d\n- M: %d\tL: %d\tI: %d\n- Delivered now: %d\tLast: %d\tPrevious: %d\n,- Performance last: %d\t Previous: %d\n- Value last: %d\t Previous: %d", sp.CompanyID, sp.Money, sp.Loan, sp.Income, sp.DeliveredCargoThisQuarter, sp.DeliveredCargoLastQuarter, sp.DeliveredCargoPreviousQuarter, sp.PerformanceLastQuarter, sp.PerformancePreviousQuarter, sp.CompanyValueLastQuarter, sp.CompanyValuePreviousQuarter) + logInfoDebug("Server.Poll() : PacketServerCompanyEconomy :\n- CompanyID: %d\n- M: %d\tL: %d\tI: %d\n- Delivered now: %d\tLast: %d\tPrevious: %d\n- Performance last: %d\t Previous: %d\n- Value last: %d\t Previous: %d", sp.CompanyID, sp.Money, sp.Loan, sp.Income, sp.DeliveredCargoThisQuarter, sp.DeliveredCargoLastQuarter, sp.DeliveredCargoPreviousQuarter, sp.PerformanceLastQuarter, sp.PerformancePreviousQuarter, sp.CompanyValueLastQuarter, sp.CompanyValuePreviousQuarter) + cStats, ok := cfg.Stats[sp.CompanyID] + if !ok { + cStats = make(map[string]*Stat) + cfg.Stats[sp.CompanyID] = cStats + } + dStats, ok := cStats[s.Status.GameDate.Format("20060102")] + if !ok { + dStats = &Stat{ + CompanyID: sp.CompanyID, + Date: s.Status.GameDate, + } + cStats[s.Status.GameDate.Format("20060102")] = dStats + } + dStats.Money = int64(sp.Money) + dStats.Loan = int64(sp.Loan) + dStats.Income = sp.Income + dStats.DeliveredCargoThisQuarter = int(sp.DeliveredCargoThisQuarter) + dStats.DeliveredCargoLastQuarter = int(sp.DeliveredCargoLastQuarter) + dStats.DeliveredCargoPreviousQuarter = int(sp.DeliveredCargoPreviousQuarter) + dStats.PerformanceLastQuarter = int(sp.PerformanceLastQuarter) + dStats.PerformancePreviousQuarter = int(sp.PerformancePreviousQuarter) + dStats.CompanyValueLastQuarter = int64(sp.CompanyValueLastQuarter) + dStats.CompanyValuePreviousQuarter = int64(sp.CompanyValuePreviousQuarter) case AdminPacketServerCompanyStats: sp := PacketServerCompanyStats{ Packet: p, } sp.Read(buffer[:p.PLength]) logInfoDebug("Server.Poll() : PacketServerCompanyStats :\n- CompanyID: %d\n- Vehicles T: %d\tL: %d\tB: %d\tP: %d\tS: %d\n- Stations T: %d\tL: %d\tB: %d\tP: %d\tS: %d", sp.CompanyID, sp.Trains, sp.Lorries, sp.Busses, sp.Planes, sp.Ships, sp.TrainStations, sp.LorryStations, sp.BusStops, sp.Airports, sp.Harbours) + cStats, ok := cfg.Stats[sp.CompanyID] + if !ok { + cStats = make(map[string]*Stat) + cfg.Stats[sp.CompanyID] = cStats + } + dStats, ok := cStats[s.Status.GameDate.Format("20060102")] + if !ok { + dStats = &Stat{ + CompanyID: sp.CompanyID, + Date: s.Status.GameDate, + } + cStats[s.Status.GameDate.Format("20060102")] = dStats + } + dStats.Trains = int(sp.Trains) + dStats.TrainStations = int(sp.TrainStations) + dStats.Busses = int(sp.Busses) + dStats.BusStops = int(sp.BusStops) + dStats.Lorries = int(sp.Lorries) + dStats.LorryStations = int(sp.LorryStations) + dStats.Planes = int(sp.Planes) + dStats.Airports = int(sp.Airports) + dStats.Ships = int(sp.Ships) + dStats.Harbours = int(sp.Harbours) + case AdminPacketServerChat: sp := PacketServerChat{ Packet: p, diff --git a/version.go b/version.go index 9dc0289..f52bd00 100644 --- a/version.go +++ b/version.go @@ -1,6 +1,6 @@ // Code generated by version.sh (@generated) DO NOT EDIT. package main -var githash = "0a4b2f4" -var buildstamp = "2021-12-04_14:37:53" -var commits = "221" -var version = "0a4b2f4-b221 - 2021-12-04_14:37:53" +var githash = "fc3fff6" +var buildstamp = "2021-12-05_07:41:29" +var commits = "222" +var version = "fc3fff6-b222 - 2021-12-05_07:41:29"