| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // 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()
- }
|