// package server_stat -- глобальная статистика сервера package server_stat import ( "encoding/json" "fmt" "strings" "time" "wartank/pkg/types" ) // СерверСтат -- структура статистики сервера type СерверСтат struct { серв types.ИСервер CчётСтарт_ int `json:"count_start"` // Количество запусков ВремяВсего_ time.Duration `json:"time_total"` // Общее время работы в секундах ВремяСессия_ time.Duration `json:"time_session"` // Время сессии в секундах } // НовСерверСтат -- возвращает структуру статистики сервера func НовСерверСтат(серв types.ИСервер) (*СерверСтат, error) { if серв == nil { return nil, fmt.Errorf("НовСерверСтат: ИСервер == nil") } сам := &СерверСтат{ серв: серв, CчётСтарт_: 0, ВремяВсего_: 0, ВремяСессия_: 0, } if ош := сам.загр(); ош != nil { return nil, fmt.Errorf("НовСерверСтат: при загрузке статистики, ош=\n\t%w", ош) } сам.CчётСтарт_++ if ош := сам.сохр(); ош != nil { return nil, fmt.Errorf("НовСерверСтат: при сохранении статистики, ош=\n\t%w", ош) } go сам.пуск() return сам, nil } // Загружает статистику сервера func (сам *СерверСтат) загр() error { бинДанные, ош := сам.серв.Хранилище().Получ("server_stat") if ош != nil { if strings.Contains(ош.Error(), "not found") { return nil } return fmt.Errorf("СерверСтат.загр(): при загрузке статистики из хранилища, ош=\n\t%w", ош) } ош = json.Unmarshal(бинДанные, сам) if ош != nil { return fmt.Errorf("СерверСтат.загр(): при декодировании статистики из JSON, ош=\n\t%w", ош) } go сам.пуск() return nil } // Работает в отдельном потоке, считает время работы и счетчик запусков func (сам *СерверСтат) пуск() { фнПуск := func() { сам.ВремяВсего_ += time.Second сам.ВремяСессия_ += time.Second if ош := сам.сохр(); ош != nil { fmt.Printf("СерверСтат.пуск(): при сохранении статистики в хранилище, ош=\n\t%v\n", ош) сам.серв.Отменить() return } time.Sleep(time.Second) } for { select { case <-сам.серв.Done(): return default: фнПуск() } } } // Сохраняет статистику сервера func (сам *СерверСтат) сохр() error { бинДанные, ош := json.Marshal(сам) if ош != nil { return fmt.Errorf("СерверСтат.сохр(): при кодировании статистики в JSON, ош=\n\t%w", ош) } ош = сам.серв.Хранилище().Уст("server_stat", бинДанные) if ош != nil { return fmt.Errorf("СерверСтат.сохр(): при сохранении статистики в хранилище, ош=\n\t%w", ош) } return nil } // СчётСтарт -- счётчик запусков func (сам *СерверСтат) СчётСтарт() int { return сам.CчётСтарт_ } // ВремяСессия -- возвращает время сессии func (сам *СерверСтат) ВремяСессия() string { return сам.ВремяСессия_.String() } // ВремяВсего -- возвращает общее время работы func (сам *СерверСтат) ВремяВсего() string { return сам.ВремяВсего_.String() }