|
|
@@ -15,83 +15,83 @@ import (
|
|
|
"wartank/server/serv_bots/warbot/warbot_net"
|
|
|
)
|
|
|
|
|
|
-// WarBot -- бот для игры в вартанк
|
|
|
-type WarBot struct {
|
|
|
- server types.ИСервер
|
|
|
- store types.IStore
|
|
|
- tank *tank.Tank
|
|
|
- errFinal error // Финальная ошибка работы, если была
|
|
|
- angar types.ИАнгар
|
|
|
- botNet types.ИБотСеть
|
|
|
- isRun *safebool.SafeBool
|
|
|
- isAutoRun *safebool.SafeBool
|
|
|
- config *warbot_config.WarBotConfig // Конфиг бота для хранения в базе
|
|
|
- ctx context.Context // Контекст бота
|
|
|
- fnCancel func() // Функция отменя контекста бота
|
|
|
-}
|
|
|
-
|
|
|
-// LoadWarBot -- загружает бота из базы
|
|
|
-func LoadWarBot(server types.ИСервер, login string) (*WarBot, error) {
|
|
|
+// ВарБот -- бот для игры в вартанк
|
|
|
+type ВарБот struct {
|
|
|
+ сервер types.ИСервер
|
|
|
+ store types.IStore
|
|
|
+ танк *tank.Танк
|
|
|
+ errFinal error // Финальная ошибка работы, если была
|
|
|
+ ангар types.ИАнгар
|
|
|
+ сеть types.ИБотСеть
|
|
|
+ еслиРаботает *safebool.SafeBool
|
|
|
+ еслиАвтозапуск *safebool.SafeBool
|
|
|
+ конфиг *warbot_config.ВарБотКонфиг // Конфиг бота для хранения в базе
|
|
|
+ кнт context.Context // Контекст бота
|
|
|
+ фтОтмена func() // Функция отменя контекста бота
|
|
|
+}
|
|
|
+
|
|
|
+// ЗагрузитьВарБот -- загружает бота из базы
|
|
|
+func ЗагрузитьВарБот(сервер types.ИСервер, логин string) (*ВарБот, error) {
|
|
|
{ // Предусловия
|
|
|
- if server == nil {
|
|
|
- return nil, fmt.Errorf("LoadWarBot(): IApp is nil")
|
|
|
+ if сервер == nil {
|
|
|
+ return nil, fmt.Errorf("ЗагрузитьВарБот(): IApp is nil")
|
|
|
}
|
|
|
- if login == "" {
|
|
|
- return nil, fmt.Errorf("LoadWarBot(): name is empty")
|
|
|
+ if логин == "" {
|
|
|
+ return nil, fmt.Errorf("ЗагрузитьВарБот(): name is empty")
|
|
|
}
|
|
|
}
|
|
|
- log.Printf("LoadWarBot(): name=%q\n", login)
|
|
|
- store := server.Store()
|
|
|
- strData, err := store.Get("/bots/" + login)
|
|
|
+ log.Printf("ЗагрузитьВарБот(): name=%q\n", логин)
|
|
|
+ store := сервер.Store()
|
|
|
+ strData, err := store.Get("/bots/" + логин)
|
|
|
if err != nil {
|
|
|
if !strings.Contains(err.Error(), "not found") {
|
|
|
- return nil, fmt.Errorf("LoadWarBot(): in load bot %q from store, err=\n\t%w", login, err)
|
|
|
+ return nil, fmt.Errorf("ЗагрузитьВарБот(): in load bot %q from store, err=\n\t%w", логин, err)
|
|
|
}
|
|
|
- return nil, fmt.Errorf("LoadWarBot(): bot %q not found in store", login)
|
|
|
+ return nil, fmt.Errorf("ЗагрузитьВарБот(): bot %q not found in store", логин)
|
|
|
}
|
|
|
- config := &warbot_config.WarBotConfig{}
|
|
|
- if err = config.Unmarshall(strData); err != nil {
|
|
|
- return nil, fmt.Errorf("LoadWarBot(): in unmarshall WarBotConfig(%q) from store, err=\n\t%w", login, err)
|
|
|
+ конфиг := &warbot_config.ВарБотКонфиг{}
|
|
|
+ if err = конфиг.Unmarshall(strData); err != nil {
|
|
|
+ return nil, fmt.Errorf("ЗагрузитьВарБот(): in unmarshall WarBotConfig(%q) from store, err=\n\t%w", логин, err)
|
|
|
}
|
|
|
- sf, err := makeCoreWarBot(server, config)
|
|
|
+ sf, err := создатьЯдроВарБот(сервер, конфиг)
|
|
|
if err != nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): in make core for bot %q, err=\n\t%w", login, err)
|
|
|
+ return nil, fmt.Errorf("ЗагрузитьВарБот(): in make core for bot %q, err=\n\t%w", логин, err)
|
|
|
}
|
|
|
return sf, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
-// NewWarBot -- возвращает новый WarBot
|
|
|
-func NewWarBot(server types.ИСервер, login, pass string) (*WarBot, error) {
|
|
|
+// НовВарБот -- возвращает новый WarBot
|
|
|
+func НовВарБот(сервер types.ИСервер, логин, пароль string) (*ВарБот, error) {
|
|
|
{ // Предусловия
|
|
|
- if server == nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): IApp is nil")
|
|
|
+ if сервер == nil {
|
|
|
+ return nil, fmt.Errorf("НовВарБот(): IApp is nil")
|
|
|
}
|
|
|
- if login == "" {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): login is empty")
|
|
|
+ if логин == "" {
|
|
|
+ return nil, fmt.Errorf("НовВарБот(): login is empty")
|
|
|
}
|
|
|
- if pass == "" {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): pass is empty")
|
|
|
+ if пароль == "" {
|
|
|
+ return nil, fmt.Errorf("НовВарБот(): pass is empty")
|
|
|
}
|
|
|
}
|
|
|
- log.Printf("NewWarBot(): name=%q\n", login)
|
|
|
- config := &warbot_config.WarBotConfig{
|
|
|
- IsAutoRun_: false,
|
|
|
- Login_: login,
|
|
|
- Password_: pass,
|
|
|
+ log.Printf("НовВарБот(): name=%q\n", логин)
|
|
|
+ config := &warbot_config.ВарБотКонфиг{
|
|
|
+ ЕслиАвтозапуск_: false,
|
|
|
+ Логин_: логин,
|
|
|
+ Пароль_: пароль,
|
|
|
}
|
|
|
- sf, err := makeCoreWarBot(server, config)
|
|
|
+ sf, err := создатьЯдроВарБот(сервер, config)
|
|
|
if err != nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): in make core bot %q, err=\n\t%w", login, err)
|
|
|
+ return nil, fmt.Errorf("НовВарБот(): in make core bot %q, err=\n\t%w", логин, err)
|
|
|
}
|
|
|
if err := sf.save(); err != nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): in self save to store, err=\n\t%w", err)
|
|
|
+ return nil, fmt.Errorf("НовВарБот(): in self save to store, err=\n\t%w", err)
|
|
|
}
|
|
|
return sf, nil
|
|
|
}
|
|
|
|
|
|
// Создаёт ядро бота
|
|
|
-func makeCoreWarBot(server types.ИСервер, config *warbot_config.WarBotConfig) (*WarBot, error) {
|
|
|
+func создатьЯдроВарБот(server types.ИСервер, config *warbot_config.ВарБотКонфиг) (*ВарБот, error) {
|
|
|
{ // Предусловия
|
|
|
if server == nil {
|
|
|
return nil, fmt.Errorf("NewWarBot(): IServer==nil")
|
|
|
@@ -100,112 +100,116 @@ func makeCoreWarBot(server types.ИСервер, config *warbot_config.WarBotCon
|
|
|
return nil, fmt.Errorf("NewWarBot(): WarBotConfig==nil")
|
|
|
}
|
|
|
}
|
|
|
+ танк, ош := tank.NewTank()
|
|
|
+ if ош != nil {
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): при создании параметров танка, ош=\n\t%w", ош)
|
|
|
+ }
|
|
|
ctx, fnCancel := context.WithCancel(server.CtxApp())
|
|
|
- sf := &WarBot{
|
|
|
- server: server,
|
|
|
- store: server.Store(),
|
|
|
- tank: tank.NewTank(),
|
|
|
- isRun: safebool.NewSafeBool(),
|
|
|
- isAutoRun: safebool.NewSafeBool(),
|
|
|
- config: config,
|
|
|
- ctx: ctx,
|
|
|
- fnCancel: fnCancel,
|
|
|
+ sf := &ВарБот{
|
|
|
+ сервер: server,
|
|
|
+ store: server.Store(),
|
|
|
+ танк: танк,
|
|
|
+ еслиРаботает: safebool.NewSafeBool(),
|
|
|
+ еслиАвтозапуск: safebool.NewSafeBool(),
|
|
|
+ конфиг: config,
|
|
|
+ кнт: ctx,
|
|
|
+ фтОтмена: fnCancel,
|
|
|
}
|
|
|
var err error
|
|
|
{ // WarBotNet
|
|
|
- sf.botNet, err = warbot_net.NewWarBotNet(sf)
|
|
|
+ sf.сеть, err = warbot_net.NewWarBotNet(sf)
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("NewWarBot(): in make IBotNet, err=\n\t%w", err)
|
|
|
}
|
|
|
}
|
|
|
- sf.angar, err = angar.NewAngar(sf)
|
|
|
+ sf.ангар, err = angar.НовАнгар(sf)
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("NewWarBot(): bot(%q) in make IAngar, err=\n\t%w", sf.Имя(), err)
|
|
|
}
|
|
|
- if sf.config.IsAutoRun_ {
|
|
|
- sf.isAutoRun.Set()
|
|
|
+ if sf.конфиг.ЕслиАвтозапуск_ {
|
|
|
+ sf.еслиАвтозапуск.Set()
|
|
|
sf.Пуск()
|
|
|
}
|
|
|
return sf, nil
|
|
|
}
|
|
|
|
|
|
// Сервер -- возвращает ссылку на объект сервера
|
|
|
-func (sf *WarBot) Сервер() types.ИСервер {
|
|
|
- return sf.server
|
|
|
+func (sf *ВарБот) Сервер() types.ИСервер {
|
|
|
+ return sf.сервер
|
|
|
}
|
|
|
|
|
|
// ЕслиПуск -- возвращает признак, что бот подключен
|
|
|
-func (sf *WarBot) ЕслиПуск() bool {
|
|
|
- return sf.isRun.Get()
|
|
|
+func (sf *ВарБот) ЕслиПуск() bool {
|
|
|
+ return sf.еслиРаботает.Get()
|
|
|
}
|
|
|
|
|
|
// Имя -- возвращает имя бота
|
|
|
-func (sf *WarBot) Имя() string {
|
|
|
- return sf.config.Login_
|
|
|
+func (sf *ВарБот) Имя() string {
|
|
|
+ return sf.конфиг.Логин_
|
|
|
}
|
|
|
|
|
|
// Пароль -- возвращает пароль бота
|
|
|
-func (sf *WarBot) Пароль() string {
|
|
|
- return sf.config.Password_
|
|
|
+func (sf *ВарБот) Пароль() string {
|
|
|
+ return sf.конфиг.Пароль_
|
|
|
}
|
|
|
|
|
|
// Пуск -- запускает бот в работу
|
|
|
-func (sf *WarBot) Пуск() (err error) {
|
|
|
- if sf.isRun.Get() {
|
|
|
+func (sf *ВарБот) Пуск() (err error) {
|
|
|
+ if sf.еслиРаботает.Get() {
|
|
|
return nil
|
|
|
}
|
|
|
- if err := sf.angar.Пуск(); err != nil {
|
|
|
+ if err := sf.ангар.Пуск(); err != nil {
|
|
|
return fmt.Errorf("WarBot.Run(): bot(%q) in run angar, err=\n\t%w", sf.Имя(), err)
|
|
|
}
|
|
|
- sf.isRun.Set()
|
|
|
+ sf.еслиРаботает.Set()
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// Error -- возвращает финальную ошибку работы, если была
|
|
|
-func (sf *WarBot) Error() error {
|
|
|
+func (sf *ВарБот) Error() error {
|
|
|
return sf.errFinal
|
|
|
}
|
|
|
|
|
|
// Ангар -- возвращает ангар игры
|
|
|
-func (sf *WarBot) Ангар() types.ИАнгар {
|
|
|
- return sf.angar
|
|
|
+func (sf *ВарБот) Ангар() types.ИАнгар {
|
|
|
+ return sf.ангар
|
|
|
}
|
|
|
|
|
|
// Танк -- возвращает объект танка
|
|
|
-func (sf *WarBot) Танк() types.ИТанк {
|
|
|
- return sf.tank
|
|
|
+func (sf *ВарБот) Танк() types.ИТанк {
|
|
|
+ return sf.танк
|
|
|
}
|
|
|
|
|
|
// Сеть -- возвращает ссылку на свой сетевой клиент
|
|
|
-func (sf *WarBot) Сеть() types.ИБотСеть {
|
|
|
- return sf.botNet
|
|
|
+func (sf *ВарБот) Сеть() types.ИБотСеть {
|
|
|
+ return sf.сеть
|
|
|
}
|
|
|
|
|
|
// АвтоИграЕсли -- возвращает признак автоматичского запуска бота
|
|
|
-func (sf *WarBot) АвтоИграЕсли() bool {
|
|
|
- return sf.isAutoRun.Get()
|
|
|
+func (sf *ВарБот) АвтоИграЕсли() bool {
|
|
|
+ return sf.еслиАвтозапуск.Get()
|
|
|
}
|
|
|
|
|
|
// АвтоИграУст -- устанавливает признак автоматического запуска бота
|
|
|
-func (sf *WarBot) АвтоИграУст() {
|
|
|
+func (sf *ВарБот) АвтоИграУст() {
|
|
|
log.Printf("WarBot.SetAutoGame()")
|
|
|
- sf.isAutoRun.Set()
|
|
|
- sf.config.IsAutoRun_ = true
|
|
|
+ sf.еслиАвтозапуск.Set()
|
|
|
+ sf.конфиг.ЕслиАвтозапуск_ = true
|
|
|
sf.saveConfig()
|
|
|
}
|
|
|
|
|
|
// АвтоИграСброс -- сбрасывает признак автоматического запуска бота
|
|
|
-func (sf *WarBot) АвтоИграСброс() {
|
|
|
+func (sf *ВарБот) АвтоИграСброс() {
|
|
|
log.Printf("WarBot.ResetAutoGame()")
|
|
|
- sf.isAutoRun.Set()
|
|
|
- sf.config.IsAutoRun_ = false
|
|
|
+ sf.еслиАвтозапуск.Set()
|
|
|
+ sf.конфиг.ЕслиАвтозапуск_ = false
|
|
|
sf.saveConfig()
|
|
|
}
|
|
|
|
|
|
// Сохраняет конфиг бота
|
|
|
-func (sf *WarBot) saveConfig() {
|
|
|
+func (sf *ВарБот) saveConfig() {
|
|
|
log.Printf("WarBot.saveConfig()")
|
|
|
- strConf := sf.config.Marshall()
|
|
|
+ strConf := sf.конфиг.Marshall()
|
|
|
err := sf.store.Put("/bots/"+sf.Имя(), strConf)
|
|
|
if err != nil {
|
|
|
log.Printf("WarBot.saveConfig(): err=\n\t%v\n", err)
|
|
|
@@ -213,18 +217,18 @@ func (sf *WarBot) saveConfig() {
|
|
|
}
|
|
|
|
|
|
// Кнт -- возвращает контекст бота
|
|
|
-func (sf *WarBot) Кнт() context.Context {
|
|
|
- return sf.ctx
|
|
|
+func (sf *ВарБот) Кнт() context.Context {
|
|
|
+ return sf.кнт
|
|
|
}
|
|
|
|
|
|
// Закончить -- отменяет контекст бота
|
|
|
-func (sf *WarBot) Закончить() {
|
|
|
- sf.fnCancel()
|
|
|
+func (sf *ВарБот) Закончить() {
|
|
|
+ sf.фтОтмена()
|
|
|
}
|
|
|
|
|
|
// Сохраняет себя в базу
|
|
|
-func (sf *WarBot) save() error {
|
|
|
- err := sf.store.Put("/bots/"+sf.Имя(), sf.config.Marshall())
|
|
|
+func (sf *ВарБот) save() error {
|
|
|
+ err := sf.store.Put("/bots/"+sf.Имя(), sf.конфиг.Marshall())
|
|
|
if err != nil {
|
|
|
return fmt.Errorf("WarBot.save(): in self save to store bot(%q), err=\n\t%w", sf.Имя(), err)
|
|
|
}
|