// package dict_warbot -- потокобезопасный словарь ботов package dict_warbot import ( "fmt" "log" "strings" "sync" "wartank/pkg/types" "wartank/server/serv_bots/warbot" ) const ( strBotList = "/bots/list" // Константа путь к списку ботов в базе ) // DictWarBot -- потокобезопасный словарь ботов type DictWarBot struct { server types.ИСервер store types.IStore dict map[string]types.ИБот block sync.RWMutex } // NewDictWarBot -- возвращает новый потокобезопасный словарь ботов func NewDictWarBot(server types.ИСервер) (*DictWarBot, error) { if server == nil { return nil, fmt.Errorf("NewDictWarBot(): IServer==nil") } log.Printf("NewDictWarBot()\n") сам := &DictWarBot{ server: server, store: server.Store(), dict: map[string]types.ИБот{}, } if err := сам.load(); err != nil { return nil, fmt.Errorf("NewDictBot(): in load list bots from store, err=%w", err) } return сам, nil } // ListBot -- возвращает список существующих ботов func (сам *DictWarBot) ListBot() []types.ИБот { сам.block.RLock() defer сам.block.RUnlock() lst := make([]types.ИБот, 0) for _, bot := range сам.dict { lst = append(lst, bot) } return lst } // Get -- возвращает бота по имени func (сам *DictWarBot) Get(botName string) types.ИБот { сам.block.RLock() defer сам.block.RUnlock() bot := сам.dict[botName] return bot } // Add -- добавляет нового бота в словарь func (сам *DictWarBot) Add(bot types.ИБот) { сам.block.Lock() defer сам.block.Unlock() if bot == nil { return } сам.dict[bot.Имя()] = bot сам.save() } // Сохраняет словарь ботов в базе func (сам *DictWarBot) save() { strName := "" for name := range сам.dict { strName += name + ";" } strName = strName[:len(strName)-1] err := сам.store.Put(strBotList, strName) if err != nil { сам.server.CancelApp() } } // Загружает всех ботов с базы func (сам *DictWarBot) load() error { strName, err := сам.store.Get(strBotList) if err != nil { if !strings.Contains(err.Error(), "not found") { return fmt.Errorf("DictWarBot.load(): in get list bot, err=\n\t%w", err) } } if strName == "" { return nil } lstName := strings.Split(strName, ";") for _, name := range lstName { if name == "" { continue } _, isOk := сам.dict[name] if isOk { continue } bot, err := warbot.ЗагрузитьВарБот(сам.server, name) if err != nil { return fmt.Errorf("ServBots.load(): in create bot %q, err=\n\t%w", name, err) } if bot.АвтоИграЕсли() { go bot.Пуск() } сам.dict[name] = bot } return nil }