|
|
@@ -5,6 +5,7 @@ import (
|
|
|
"context"
|
|
|
"fmt"
|
|
|
"log"
|
|
|
+ "strings"
|
|
|
|
|
|
"wartank/pkg/components/safebool"
|
|
|
"wartank/pkg/types"
|
|
|
@@ -22,8 +23,6 @@ type WarBot struct {
|
|
|
errFinal error // Финальная ошибка работы, если была
|
|
|
angar types.IAngar
|
|
|
botNet types.IBotNet
|
|
|
- name string // Имя бота
|
|
|
- pass string // Пароль бота
|
|
|
isRun *safebool.SafeBool
|
|
|
isAutoRun *safebool.SafeBool
|
|
|
config *warbot_config.WarBotConfig // Конфиг бота для хранения в базе
|
|
|
@@ -31,36 +30,85 @@ type WarBot struct {
|
|
|
fnCancel func() // Функция отменя контекста бота
|
|
|
}
|
|
|
|
|
|
+// LoadWarBot -- загружает бота из базы
|
|
|
+func LoadWarBot(server types.IServer, login string) (*WarBot, error) {
|
|
|
+ { // Предусловия
|
|
|
+ if server == nil {
|
|
|
+ return nil, fmt.Errorf("LoadWarBot(): IApp is nil")
|
|
|
+ }
|
|
|
+ if login == "" {
|
|
|
+ return nil, fmt.Errorf("LoadWarBot(): name is empty")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.Printf("LoadWarBot(): name=%q\n", login)
|
|
|
+ store := server.Store()
|
|
|
+ strData, err := store.Get("/bots/" + login)
|
|
|
+ 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("LoadWarBot(): bot %q not found in store", login)
|
|
|
+ }
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ sf, err := makeCoreWarBot(server, config)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): in make core for bot %q, err=\n\t%w", login, err)
|
|
|
+ }
|
|
|
+ return sf, nil
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
// NewWarBot -- возвращает новый WarBot
|
|
|
-func NewWarBot(server types.IServer, name string) (*WarBot, error) {
|
|
|
+func NewWarBot(server types.IServer, login, pass string) (*WarBot, error) {
|
|
|
{ // Предусловия
|
|
|
if server == nil {
|
|
|
return nil, fmt.Errorf("NewWarBot(): IApp is nil")
|
|
|
}
|
|
|
- if name == "" {
|
|
|
+ if login == "" {
|
|
|
return nil, fmt.Errorf("NewWarBot(): name is empty")
|
|
|
}
|
|
|
}
|
|
|
+ log.Printf("NewWarBot(): name=%q\n", login)
|
|
|
+ config := &warbot_config.WarBotConfig{
|
|
|
+ IsAutoRun_: false,
|
|
|
+ Login_: login,
|
|
|
+ Password_: pass,
|
|
|
+ }
|
|
|
+ sf, err := makeCoreWarBot(server, config)
|
|
|
+ if err != nil {
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): in make core bot %q, err=\n\t%w", login, err)
|
|
|
+ }
|
|
|
+ if err := sf.save(); err != nil {
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): in self save to store, err=\n\t%w", err)
|
|
|
+ }
|
|
|
+ return sf, nil
|
|
|
+}
|
|
|
+
|
|
|
+// Создаёт ядро бота
|
|
|
+func makeCoreWarBot(server types.IServer, config *warbot_config.WarBotConfig) (*WarBot, error) {
|
|
|
+ { // Предусловия
|
|
|
+ if server == nil {
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): IServer==nil")
|
|
|
+ }
|
|
|
+ if config == nil {
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): WarBotConfig==nil")
|
|
|
+ }
|
|
|
+ }
|
|
|
ctx, fnCancel := context.WithCancel(server.CtxApp())
|
|
|
sf := &WarBot{
|
|
|
server: server,
|
|
|
store: server.Store(),
|
|
|
tank: tank.NewTank(),
|
|
|
- name: name,
|
|
|
isRun: safebool.NewSafeBool(),
|
|
|
isAutoRun: safebool.NewSafeBool(),
|
|
|
config: &warbot_config.WarBotConfig{},
|
|
|
ctx: ctx,
|
|
|
fnCancel: fnCancel,
|
|
|
}
|
|
|
- strData, err := sf.store.Get("/bots/" + sf.name)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): in get binData for WarBotConfig from store, err=\n\t%w", err)
|
|
|
- }
|
|
|
- if err = sf.config.Unmarshall(strData); err != nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): in unmarshall WarBotConfig from store, err=\n\t%w", err)
|
|
|
- }
|
|
|
- sf.pass = sf.config.Password_
|
|
|
+ var err error
|
|
|
{ // WarBotNet
|
|
|
sf.botNet, err = warbot_net.NewWarBotNet(sf)
|
|
|
if err != nil {
|
|
|
@@ -69,7 +117,7 @@ func NewWarBot(server types.IServer, name string) (*WarBot, error) {
|
|
|
}
|
|
|
sf.angar, err = angar.NewAngar(sf)
|
|
|
if err != nil {
|
|
|
- return nil, fmt.Errorf("NewWarBot(): bot(%q) in make IAngar, err=\n\t%w", sf.name, err)
|
|
|
+ return nil, fmt.Errorf("NewWarBot(): bot(%q) in make IAngar, err=\n\t%w", sf.Name(), err)
|
|
|
}
|
|
|
if sf.config.IsAutoRun_ {
|
|
|
sf.isAutoRun.Set()
|
|
|
@@ -90,12 +138,12 @@ func (sf *WarBot) IsRun() bool {
|
|
|
|
|
|
// Name -- возвращает имя бота
|
|
|
func (sf *WarBot) Name() string {
|
|
|
- return sf.name
|
|
|
+ return sf.config.Login_
|
|
|
}
|
|
|
|
|
|
// Pass -- возвращает пароль бота
|
|
|
func (sf *WarBot) Pass() string {
|
|
|
- return sf.pass
|
|
|
+ return sf.config.Password_
|
|
|
}
|
|
|
|
|
|
// Run -- запускает бот в работу
|
|
|
@@ -104,7 +152,7 @@ func (sf *WarBot) Run() (err error) {
|
|
|
return nil
|
|
|
}
|
|
|
if err := sf.angar.Run(); err != nil {
|
|
|
- return fmt.Errorf("WarBot.Run(): bot(%q) in run angar, err=\n\t%w", sf.name, err)
|
|
|
+ return fmt.Errorf("WarBot.Run(): bot(%q) in run angar, err=\n\t%w", sf.Name(), err)
|
|
|
}
|
|
|
sf.isRun.Set()
|
|
|
return nil
|
|
|
@@ -155,7 +203,7 @@ func (sf *WarBot) ResetAutoGame() {
|
|
|
func (sf *WarBot) saveConfig() {
|
|
|
log.Printf("WarBot.saveConfig()")
|
|
|
strConf := sf.config.Marshall()
|
|
|
- err := sf.store.Put("/bots/"+sf.name, strConf)
|
|
|
+ err := sf.store.Put("/bots/"+sf.Name(), strConf)
|
|
|
if err != nil {
|
|
|
log.Printf("WarBot.saveConfig(): err=\n\t%v\n", err)
|
|
|
}
|
|
|
@@ -170,3 +218,12 @@ func (sf *WarBot) Ctx() context.Context {
|
|
|
func (sf *WarBot) CancelBot() {
|
|
|
sf.fnCancel()
|
|
|
}
|
|
|
+
|
|
|
+// Сохраняет себя в базу
|
|
|
+func (sf *WarBot) save() error {
|
|
|
+ err := sf.store.Put("/bots/"+sf.Name(), sf.config.Marshall())
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("WarBot.save(): in self save to store bot(%q), err=\n\t%w", sf.Name(), err)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|