Explorar o código

SVI Введение политики нулевой терпимости к ошибкам

SVI hai 1 ano
pai
achega
3f53825c02

+ 2 - 6
server/serv_bots/serv_bots.go

@@ -72,12 +72,8 @@ func (сам *БотоФерма) НовБот(логин, пароль string,
 	for !фнНомерПровер() {
 		номер++
 	}
-	{ // Нет такого бота, надо его создать
-		bot, err := warbot.НовВарБот(сам.серв, номер, логин, пароль, еслиАвто)
-		if err != nil {
-			return fmt.Errorf("БотоФерма.НовБот(): in create bot %q, err=\n\t%w", логин, err)
-		}
+	// Нет такого бота, надо его создать
+		bot := warbot.НовВарБот(сам.серв, номер, логин, пароль, еслиАвто)
 		сам.словБот.Add(bot)
-	}
 	return nil
 }

+ 7 - 19
server/serv_bots/warbot/angar/angar.go

@@ -16,7 +16,7 @@ import (
 	"wartank/server/serv_bots/warbot/angar/fuel_attack"
 	"wartank/server/serv_bots/warbot/angar/masters"
 	"wartank/server/serv_bots/warbot/angar/missions"
-	"wartank/server/serv_bots/warbot/angar/netstat"
+	"wartank/server/serv_bots/warbot/angar/net_stat"
 	"wartank/server/serv_bots/warbot/angar/tank_params"
 	"wartank/server/serv_bots/warbot/stat_resurs"
 	"wartank/server/serv_bots/warbot/stat_tank/static_param"
@@ -40,7 +40,7 @@ type Ангар struct {
 
 	silverOnline types.ИСтатПарам
 
-	сетьТанкСтат *netstat.NetStat
+	сетьТанкСтат *net_stat.NetStat
 	танкПарам    *tank_params.ТанкПараметры
 	словАрена    map[alias.АренаИмя]types.ИАрена
 	ресурсы      *stat_resurs.СтатРесурсы
@@ -48,11 +48,7 @@ type Ангар struct {
 
 // НовАнгар -- возвращает новый *Angar
 func НовАнгар(бот types.ИБот) (*Ангар, error) {
-	танкПарам, ош := tank_params.НовТанкПараметры(бот)
-	if ош != nil {
-		return nil, fmt.Errorf("НовАнгар(): при создании параметров танка, ош=\n\t%w", ош)
-	}
-
+	танкПарам := tank_params.НовТанкПараметры(бот)
 	сам := &Ангар{
 		слог:          бот.Сервер().Слог(),
 		бот:           бот,
@@ -78,12 +74,9 @@ func НовАнгар(бот types.ИБот) (*Ангар, error) {
 		return nil, fmt.Errorf("НовАнгар(): in create <AngarAttackNet>, err=\n\t%w", err)
 	}
 	сам.словАрена["топливоБой"] = топливоБой
-	{ // Статистика
-		сам.сетьТанкСтат, err = netstat.NewNetStat(сам.бот)
-		if err != nil {
-			return nil, fmt.Errorf("НовАнгар(): in create NetResource, err=\n\t%w", err)
-		}
-	}
+	// Статистика
+	сам.сетьТанкСтат = net_stat.NewNetStat(сам.бот)
+
 	конвой := convoy.НовКонвой(сам.бот)
 	сам.словАрена["конвой"] = конвой
 	сражение := battle.НовСражение(сам.бот)
@@ -108,12 +101,7 @@ func НовАнгар(бот types.ИБот) (*Ангар, error) {
 // Обновить -- обновить ангар принудительно
 func (сам *Ангар) Обновить() {
 	сам.РесурсыОбновить()
-	ош := сам.сетьТанкСтат.Update()
-	if ош != nil {
-		сам.слог.Инфо("НовАнгар(): при обновлении статистики, ош=\n\t%w\n", ош)
-		сам.бот.Сервер().Отменить()
-		return
-	}
+	сам.сетьТанкСтат.Update()
 	сам.словАрена["конвой"].Пуск()
 	сам.ресурсы.Топливо().Обновить()
 }

+ 52 - 101
server/serv_bots/warbot/angar/netstat/netstat.go → server/serv_bots/warbot/angar/net_stat/net_stat.go

@@ -1,11 +1,9 @@
-package netstat
+package net_stat
 
 import (
-	"fmt"
-	// "log"
 	"strconv"
 	"strings"
-
+	"wartank/pkg/components/kernel/logger"
 	"wartank/pkg/types"
 )
 
@@ -17,50 +15,36 @@ import (
 type NetStat struct {
 	server types.ИСервер
 	бот    types.ИБот
+	лог    types.ИЛоггер
 }
 
 // NewNetStat -- возвращает новый *NetStat
-func NewNetStat(bot types.ИБот) (*NetStat, error) {
-	if bot == nil {
-		return nil, fmt.Errorf("NewNetStat(): IBot == nil")
-	}
+func NewNetStat(bot types.ИБот) *NetStat {
+	лог := logger.НовЛоггер("NetStat")
+	лог.Инфо("NewNetStat()\n")
+	лог.Паника(bot == nil, "NewNetStat(): ИБот == nil")
 	сам := &NetStat{
 		server: bot.Сервер(),
 		бот:    bot,
+		лог:    лог,
 	}
-	return сам, nil
+	return сам
 }
 
-func (сам *NetStat) Update() (err error) {
+func (сам *NetStat) Update() {
 	// _mt.Println("\n===NetStat.Update()===")
 	сам.findLevelTank()
-	if err = сам.findLevelProgress(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find level progress, err=\n\t%w", err)
-	}
-	if err = сам.findAtack(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find atack, err=\n\t%w", err)
-	}
-	if err = сам.findArmor(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
-	}
-	if err = сам.findFyne(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find woll, err=\n\t%w", err)
-	}
-	if err = сам.findHard(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find body, err=\n\t%w", err)
-	}
-	if err = сам.findPower(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find power, err=\n\t%w", err)
-	}
-	if err = сам.findOnline(); err != nil {
-		return fmt.Errorf("NetStat.Update(): in find online, err=\n\t%w", err)
-	}
-	return nil
+	сам.findLevelProgress()
+	сам.атакаНайти()
+	сам.броняНайти()
+	сам.точностьНайти()
+	сам.прочностьНайти()
+	сам.мощностьНайти()
+	сам.игроковОнлайнНайти()
 }
 
 // Ищет в теле текста ангара мощность танка
-func (сам *NetStat) findPower() (err error) {
-	// _mt.Println("\tNetStat.findPower()")
+func (сам *NetStat) мощностьНайти() {
 	lstAngar := сам.бот.Ангар().СписПолучить()
 	if len(lstAngar) == 0 {
 		// log._rintf("WARN NetStat.findPower(): lstAngar is empty\n")
@@ -78,16 +62,13 @@ func (сам *NetStat) findPower() (err error) {
 	strPower := lstPower[1]
 	lstPower = strings.Split(strPower, `</span>`)
 	strPower = lstPower[0]
-	iPower, err := strconv.Atoi(strPower)
-	if err != nil {
-		return fmt.Errorf("NetStat.findPower(): power(%v) not number, err=\n\t%w", strPower, err)
-	}
+	iPower, ош := strconv.Atoi(strPower)
+	сам.лог.Паника(ош != nil, "NetStat.мощностьНайти(): мощность(%v) не число, ош=\n\t%v\n", strPower, ош)
 	сам.бот.Стата().Мощь().Уст(iPower)
-	return nil
 }
 
 // Ищет в теле текста ангара прочность танка
-func (сам *NetStat) findHard() (err error) {
+func (сам *NetStat) прочностьНайти() {
 	var (
 		strOut      string
 		lstAngar    = сам.бот.Ангар().СписПолучить()
@@ -111,17 +92,13 @@ func (сам *NetStat) findHard() (err error) {
 	strHard := lstHard[1]
 	lstHard = strings.Split(strHard, `</span><br/>`)
 	strHard = lstHard[0]
-	iHard, err := strconv.Atoi(strHard)
-	if err != nil {
-		return fmt.Errorf("NetStat.findHard(): hard(%v) not number, err=\n\t%w", strHard, err)
-	}
+	iHard, ош := strconv.Atoi(strHard)
+	сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): прочность(%v) не число, ош=\n\t%v\n", strHard, ош)
 	сам.бот.Стата().Прочность().Уст(iHard)
-	return nil
 }
 
 // Ищет в теле текста ангара точность танка
-func (сам *NetStat) findFyne() (err error) {
-	// _mt.Println("\tNetStat.findFyne()")
+func (сам *NetStat) точностьНайти() {
 	var (
 		strOut      string
 		lstAngar    = сам.бот.Ангар().СписПолучить()
@@ -138,32 +115,27 @@ func (сам *NetStat) findFyne() (err error) {
 		}
 	}
 	if !еслиНайдено {
-		return nil
+		return
 	}
 	// Выделить броню
 	lstFyne := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/accuracy.png?1" alt="Точность" title="Точность"/> Точность <span class="green2">`)
 	strFyne := lstFyne[1]
 	lstFyne = strings.Split(strFyne, `</span><br/>`)
 	strFyne = lstFyne[0]
-	iFyne, err := strconv.Atoi(strFyne)
-	if err != nil {
-		return fmt.Errorf("NetStat.findFyne(): fyne(%v) not number, err=\n\t%w", strFyne, err)
-	}
+	iFyne, ош := strconv.Atoi(strFyne)
+	сам.лог.Паника(ош != nil, "NetStat.точностьНайти(): точность(%v) не число, ош=\n\t%v\n", strFyne, ош)
 	сам.бот.Стата().Точность().Уст(iFyne)
-	return nil
 }
 
 // Ищет в теле текста ангара броню танка
-func (сам *NetStat) findArmor() (err error) {
-	// _mt.Println("\tNetStat.findArmor()")
-
+func (сам *NetStat) броняНайти() {
 	var (
 		strOut      string
 		lstAngar    = сам.бот.Ангар().СписПолучить()
 		еслиНайдено bool
 	)
 	if len(lstAngar) == 0 {
-		return nil
+		return
 	}
 	for _, strOut = range lstAngar {
 		if strings.Contains(strOut, `/images/icons/armor.png?1`) {
@@ -179,17 +151,13 @@ func (сам *NetStat) findArmor() (err error) {
 	strArmor := lstArmor[1]
 	lstArmor = strings.Split(strArmor, `</span><br/>`)
 	strArmor = lstArmor[0]
-	iArmor, err := strconv.Atoi(strArmor)
-	if err != nil {
-		return fmt.Errorf("NetStat.findArmor(): armor(%v) not number, err=\n\t%w", strArmor, err)
-	}
+	iArmor, ош := strconv.Atoi(strArmor)
+	сам.лог.Паника(ош != nil, "NetStat.броняНайти(): броня(%v) не число, ош=\n\t%v\n", strArmor, ош)
 	сам.бот.Стата().Броня().Уст(iArmor)
-	return nil
 }
 
 // Ищет в теле текста ангара уровень танка
 func (сам *NetStat) findLevelTank() {
-	// _mt.Println("\tNetStat.findLevelTank()")
 	lstAngar := сам.бот.Ангар().СписПолучить()
 	if len(lstAngar) == 0 {
 		// log._rintf("ERRO NetStat.findLevelTank(): пустой lstAngar")
@@ -207,22 +175,15 @@ func (сам *NetStat) findLevelTank() {
 	strLevel := lstLevel[1]
 	lstLevel = strings.Split(strLevel, `</span></span></div></td>`)
 	strLevel = lstLevel[0]
-	iLevel, err := strconv.Atoi(strLevel)
-	if err != nil {
-		// log._rintf("ERRO NetStat.findLevelTank(): level(%v) не число, err=\n\t%v\n", strLevel, err)
-		return
-	}
+	iLevel, ош := strconv.Atoi(strLevel)
+	сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): уровень(%v) не число, ош=\n\t%v\n", strLevel, ош)
 	сам.бот.Ангар().Уровень().Уст(iLevel)
 }
 
 // Ищет в теле текста ангара прогресс уровня танка танка
-func (сам *NetStat) findLevelProgress() error {
-	// _mt.Println("\tNetStat.findLevelProgress()")
+func (сам *NetStat) findLevelProgress() {
 	lstAngar := сам.бот.Ангар().СписПолучить()
-	if len(lstAngar) == 0 {
-		// log._rintf("WARN NetStat.findLevelProgress(): lstAngar пустой\n")
-		return nil
-	}
+	сам.лог.Паника(len(lstAngar) == 0, "lstAngar пустой")
 	var strOut string
 	for _, strProg := range lstAngar {
 		if strings.Contains(strProg, `class="progr"`) {
@@ -235,16 +196,13 @@ func (сам *NetStat) findLevelProgress() error {
 	strProg := lstProg[1]
 	lstProg = strings.Split(strProg, `%;">&nbsp;</div></div></td>`)
 	strProg = lstProg[0]
-	iProg, err := strconv.Atoi(strProg)
-	if err != nil {
-		return fmt.Errorf("NetStat.findLevelProgress(): progress(%v) not number, err=\n\t%w", strProg, err)
-	}
+	iProg, ош := strconv.Atoi(strProg)
+	сам.лог.Паника(ош != nil, "NetStat.прогрессНайти(): прогресс(%v) не число, ош=\n\t%v\n", strProg, ош)
 	сам.бот.Ангар().Прогресс().Уст(iProg)
-	return nil
 }
 
 // Ищет в теле текста ангара силу атаки танка
-func (сам *NetStat) findAtack() (err error) {
+func (сам *NetStat) атакаНайти() {
 	var (
 		strOut      string
 		lstAngar    = сам.бот.Ангар().СписПолучить()
@@ -257,29 +215,25 @@ func (сам *NetStat) findAtack() (err error) {
 		}
 	}
 	if !еслиНайдено {
-		return nil
+		return
 	}
 	// Выделить атаку
-	lstAtack := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">`)
-	strAtack := lstAtack[1]
-	lstAtack = strings.Split(strAtack, `</span><br/>`)
-	strAtack = lstAtack[0]
-	iAtack, err := strconv.Atoi(strAtack)
-	if err != nil {
-		return fmt.Errorf("NetStat.findAtack(): atack(%v) not number, err=\n\t%w", strAtack, err)
-	}
-	сам.бот.Стата().Атака().Уст(iAtack)
-	return nil
+	списАтака := strings.Split(strOut, `<img width="14" height="14" src="/images/icons/attack.png?1" alt="Атака" title="Атака"/> Атака <span class="green2">`)
+	стрАтака := списАтака[1]
+	списАтака = strings.Split(стрАтака, `</span><br/>`)
+	стрАтака = списАтака[0]
+	целАтака, ош := strconv.Atoi(стрАтака)
+	сам.лог.Паника(ош != nil, "NetStat.атакаНайти(): атака(%v) не число, ош=\n\t%v\n", стрАтака, ош)
+	сам.бот.Стата().Атака().Уст(целАтака)
 }
 
 // Ищет в теле текста ангара силу атаки танка
-func (сам *NetStat) findOnline() (err error) {
-	// _mt.Println("\tNetStat.findOnline()")
+func (сам *NetStat) игроковОнлайнНайти() {
 	lstAngar := сам.бот.Ангар().СписПолучить()
 	var strOut string
-	for _, strAtack := range lstAngar {
-		if strings.Contains(strAtack, `>Онлайн</a>: `) {
-			strOut = strAtack
+	for _, стрАтака := range lstAngar {
+		if strings.Contains(стрАтака, `>Онлайн</a>: `) {
+			strOut = стрАтака
 			break
 		}
 	}
@@ -292,10 +246,7 @@ func (сам *NetStat) findOnline() (err error) {
 	strOnline := lstAngar[1]
 	lstAngar = strings.Split(strOnline, `</span>`)
 	strOnline = lstAngar[0]
-	iOnline, err := strconv.Atoi(strOnline)
-	if err != nil {
-		return fmt.Errorf("NetStat.findOnline(): online(%v) not number, err=\n\t%w", iOnline, err)
-	}
+	iOnline, ош := strconv.Atoi(strOnline)
+	сам.лог.Паника(ош != nil, "NetStat.findOnline(): игроков онлайн(%v) не число, ош=\n\t%v\n", strOnline, ош)
 	сам.бот.Ангар().ИгрокиОнлайн().Уст(iOnline)
-	return nil
 }

+ 15 - 20
server/serv_bots/warbot/angar/tank_params/tank_params.go

@@ -7,6 +7,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"wartank/pkg/components/kernel/logger"
 	"wartank/pkg/types"
 )
 
@@ -14,17 +15,19 @@ import (
 type ТанкПараметры struct {
 	бот   types.ИБот
 	номер string // Номер танка в игре
+	лог types.ИЛоггер
 }
 
 // НовТанкПараметры -- возвращает новые параметры танка
-func НовТанкПараметры(бот types.ИБот) (*ТанкПараметры, error) {
-	if бот == nil {
-		return nil, fmt.Errorf("НовТанкПараметры(): ИБот == nil")
-	}
+func НовТанкПараметры(бот types.ИБот) *ТанкПараметры {
+	лог:=logger.НовЛоггер("ТанкПараметры")
+	лог.Инфо("НовТанкПараметры()\n")
+	лог.Паника(бот==nil, "НовТанкПараметры(): ИБот == nil")
 	сам := &ТанкПараметры{
 		бот: бот,
+		лог: лог,
 	}
-	return сам, nil
+	return сам
 }
 
 // Пуск -- запуск в работу
@@ -54,17 +57,14 @@ func (сам *ТанкПараметры) пуск() {
 // Основной метод работы
 func (сам *ТанкПараметры) работать() {
 	defer time.Sleep(time.Second * 300)
-	if ош := сам.улучшить(); ош != nil {
-		log.Printf("ТанкПараметры.работать(): ош=\n\t%v\n", ош)
-		return
-	}
+	сам.улучшить()
 }
 
 // Улучшает параметры танка
-func (сам *ТанкПараметры) улучшить() error {
+func (сам *ТанкПараметры) улучшить() {
 	// https://wartank.ru/pimp/34479487
 	клиент := сам.бот.Сеть().ВебВоркер()
-	фнУлучшить := func() error {
+	фнУлучшить := func() bool{
 		лстСтр := клиент.Получ("https://wartank.ru/pimp/" + сам.номер)
 		var (
 			стрВых    string
@@ -77,27 +77,22 @@ func (сам *ТанкПараметры) улучшить() error {
 				break
 			}
 		}
-		if !еслиНашли {
-			return fmt.Errorf("ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
-		}
+		сам.лог.Паника(!еслиНашли, "ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
 		стрВых = strings.TrimPrefix(стрВых, `<a class="simple-but border mb5" href="`)
 		стрВых = strings.TrimSuffix(стрВых, `">`)
 		// https://wartank.ru/pimp/34479487?21-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link
 		стрСсылка := "https://wartank.ru/pimp/" + стрВых
 		_ = клиент.Получ(стрСсылка)
-		return nil
+		return true
 	}
 	счётОш := 5
 	for счётОш > 0 {
-		ош := фнУлучшить()
-		if ош == nil {
-			return nil
+		if фнУлучшить(){
+			break
 		}
-		log.Printf("ТанкПараметры.улучшить(): ош=\n\t%v\n", ош)
 		счётОш--
 		time.Sleep(time.Millisecond * 350)
 	}
-	return nil
 }
 
 // Получает собственный номер танка с сервера

+ 22 - 40
server/serv_bots/warbot/warbot.go

@@ -30,6 +30,7 @@ type ВарБот struct {
 	конфиг         *warbot_config.ВарБотКонфиг // Конфиг бота для хранения в базе
 	кнт            context.Context             // Контекст бота
 	фтОтмена       func()                      // Функция отменя контекста бота
+	лог            types.ИЛоггер
 }
 
 // ЗагрузитьВарБот -- загружает бота из базы
@@ -50,8 +51,7 @@ func ЗагрузитьВарБот(сервер types.ИСервер, номе
 	}
 	конфиг := &warbot_config.ВарБотКонфиг{}
 	конфиг.Unmarshal(binData)
-	сам, err := создатьЯдроВарБот(сервер, конфиг)
-	лог.Паника(err!=nil, "ЗагрузитьВарБот(): in make core for bot '%v', err=\n\t%v\n", номер, err)
+	сам := создатьЯдроВарБот(сервер, конфиг)
 	go сам.рестарт()
 	_ = types.ИБот(сам)
 	return сам
@@ -65,18 +65,12 @@ func (сам *ВарБот) рестарт() {
 }
 
 // НовВарБот -- возвращает новый WarBot
-func НовВарБот(сервер types.ИСервер, номер alias.БотНомер, логин, пароль string, еслиАвто bool) (types.ИБот, error) {
-	{ // Предусловия
-		if сервер == nil {
-			return nil, fmt.Errorf("НовВарБот(): IApp is nil")
-		}
-		if логин == "" {
-			return nil, fmt.Errorf("НовВарБот(): login is empty")
-		}
-		if пароль == "" {
-			return nil, fmt.Errorf("НовВарБот(): pass is empty")
-		}
-	}
+func НовВарБот(сервер types.ИСервер, номер alias.БотНомер, логин, пароль string, еслиАвто bool) *ВарБот {
+	лог := logger.НовЛоггер("ВарБот")
+	лог.Инфо("НовВарБот()\n")
+	лог.Паника(сервер == nil, "НовВарБот(): ИСервер == nil")
+	лог.Паника(логин == "", "НовВарБот(): логин пустой")
+	лог.Паника(пароль == "", "НовВарБот(): пароль пустой")
 	log.Printf("НовВарБот(): name=%q\n", логин)
 	config := &warbot_config.ВарБотКонфиг{
 		ЕслиАвтозапуск_: еслиАвто,
@@ -84,26 +78,18 @@ func НовВарБот(сервер types.ИСервер, номер alias.Бо
 		Пароль_:         пароль,
 		Номер_:          номер,
 	}
-	сам, err := создатьЯдроВарБот(сервер, config)
-	if err != nil {
-		return nil, fmt.Errorf("НовВарБот(): in make core bot %q, err=\n\t%w", логин, err)
-	}
-	if err := сам.сохр(); err != nil {
-		return nil, fmt.Errorf("НовВарБот(): in self save to store, err=\n\t%w", err)
-	}
-	return сам, nil
+	сам := создатьЯдроВарБот(сервер, config)
+	сам.сохр()
+	_ = types.ИБот(сам)
+	return сам
 }
 
 // Создаёт ядро бота
-func создатьЯдроВарБот(серв types.ИСервер, конфиг *warbot_config.ВарБотКонфиг) (*ВарБот, error) {
-	{ // Предусловия
-		if серв == nil {
-			return nil, fmt.Errorf("NewWarBot(): IServer==nil")
-		}
-		if конфиг == nil {
-			return nil, fmt.Errorf("NewWarBot(): WarBotConfig==nil")
-		}
-	}
+func создатьЯдроВарБот(серв types.ИСервер, конфиг *warbot_config.ВарБотКонфиг) *ВарБот {
+	лог := logger.НовЛоггер("ВарБот")
+	лог.Инфо("создатьЯдроВарБот()\n")
+	лог.Паника(серв==nil, "создатьЯдроВарБот(): ИСервер == nil")
+	лог.Паника(конфиг == nil, "создатьЯдроВарБот(): ВарБотКонфиг==nil")
 	ctx, fnCancel := context.WithCancel(серв.Контекст())
 	сам := &ВарБот{
 		сервер:         серв,
@@ -114,19 +100,18 @@ func создатьЯдроВарБот(серв types.ИСервер, конф
 		конфиг:         конфиг,
 		кнт:            ctx,
 		фтОтмена:       fnCancel,
+		лог:            лог,
 	}
 	var err error
 	// WarBotNet
 	сам.сеть = warbot_net.НовВарБотСеть(сам)
 	сам.ангар, err = angar.НовАнгар(сам)
-	if err != nil {
-		return nil, fmt.Errorf("NewWarBot(): bot(%q) in make IAngar, err=\n\t%w", сам.Имя(), err)
-	}
+	сам.лог.Паника(err != nil, "НовВарБот(): in make IAngar, err=\n\t%w", err)
 	if сам.конфиг.ЕслиАвтозапуск_ {
 		сам.еслиАвтозапуск.Уст()
 		сам.Пуск()
 	}
-	return сам, nil
+	return сам
 }
 
 // Сервер -- возвращает ссылку на объект сервера
@@ -225,11 +210,8 @@ func (сам *ВарБот) Закончить() {
 }
 
 // Сохраняет себя в базу
-func (сам *ВарБот) сохр() error {
+func (сам *ВарБот) сохр() {
 	стрНомер := fmt.Sprint(сам.Номер())
 	err := сам.store.Уст("/bots/"+стрНомер, сам.конфиг.Marshall())
-	if err != nil {
-		return fmt.Errorf("WarBot.save(): in self save to store bot(%q), err=\n\t%w", сам.Имя(), err)
-	}
-	return nil
+	сам.лог.Паника(err != nil, "ВарБот.сохр(): err=\n\t%v\n", err)
 }