Bläddra i källkod

d06 Исправления

SVI 2 år sedan
förälder
incheckning
f3fb677353

+ 0 - 140
pkg/components/scene_net/netclient/netclient.go

@@ -1,140 +0,0 @@
-package netclient
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"log"
-	"net/http"
-	"strings"
-	"sync"
-	"time"
-
-	"wartank/pkg/components/scene_net/netstat"
-	"wartank/pkg/types"
-)
-
-/*
-	Объект сетевого соединения
-*/
-
-// Ответ после запроса
-type response struct {
-	lstString []string
-	err       error
-}
-
-// NetClient -- объект сетевого соединения
-type NetClient struct {
-	botNet types.ИБотСеть
-	conn   *http.Client
-	stat   *netstat.NetStat
-	chRes  chan *response // Канал ответа от http-клиента
-	block  sync.Mutex
-}
-
-// NewNetClient -- возвращает сетевого клиента
-func NewNetClient(botNet types.ИБотСеть) *NetClient {
-	сам := &NetClient{
-		botNet: botNet,
-		conn:   botNet.Коннект(),
-		stat:   netstat.NewNetStat(botNet),
-		chRes:  make(chan *response, 2),
-	}
-	return сам
-}
-
-// Get -- выполняет безопасный GET-запрос в сеть
-func (сам *NetClient) Get(strLink string) (lstString []string, err error) {
-	сам.block.Lock()
-	defer сам.block.Unlock()
-	// if strLink == "https://wartank.ru/production/Mine" {
-	log.Printf("NetClient.Get(): link=%v\n", strLink)
-	// }
-	ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Кнт(), time.Second*10)
-	defer fnCancel()
-	defer func() { // Возможный перехват паники
-		if _panic := recover(); _panic != nil {
-			err = fmt.Errorf("NetClient.Get().defer(): перехвачена паника для URL(%v), panic=%v", strLink, _panic)
-			lstString = nil
-			time.Sleep(time.Millisecond * 250) // Чтобы не насиловать не работающую сеть
-		}
-	}()
-	go сам.get(strLink)
-	select {
-	case <-ctxCancel.Done(): // Таймаут по ожиданию
-		err = fmt.Errorf("NetClient.get(): таймаут ожидания ответа")
-		сам.botNet.Отмена()
-		return nil, err
-	case resp := <-сам.chRes: // Получен ответ
-		if resp.err != nil {
-			return nil, resp.err
-		}
-		return resp.lstString, nil
-	}
-}
-
-// Внутренний вызов для сокрытия под общей блокировкой
-func (сам *NetClient) get(strLink string) {
-	resp := &response{}
-	defer func() {
-		if resp.err != nil {
-			сам.stat.IncErr()
-		}
-	}()
-	req, err := http.NewRequest("GET", strLink, nil)
-	if err != nil {
-		resp.err = fmt.Errorf("NetClient.get(): при создании запроса, err=\n\t%w", err)
-		return
-	}
-	req.Header.Set("User-Agent", "Mozilla Firefox 94.1")
-	httpResp, err := сам.conn.Do(req)
-	if err != nil {
-		resp.err = fmt.Errorf("NetClient.get(): при выполнении GET-запроса, err=\n\t%w", err)
-		return
-	}
-	defer сам.closeGetBody(strLink, httpResp, resp)
-
-	if httpResp.StatusCode != http.StatusOK {
-		resp.err = fmt.Errorf("NetClient.get(): code=%v, status=%v", httpResp.StatusCode, httpResp.Status)
-		return
-	}
-	binData, err := io.ReadAll(httpResp.Body)
-	if err != nil {
-		resp.err = fmt.Errorf("NetClient.get(): при чтении тела ответа, err=\n\t%w", err)
-		return
-	}
-	if len(binData) == 0 {
-		resp.err = fmt.Errorf("NetClient.get(): пустое тело ответа, err=\n\t%w", err)
-		return
-	}
-	lenData := len(binData) + len(strLink)
-	сам.stat.AddByte(lenData)
-
-	lstString := strings.Split(string(binData), "\n")
-	if len(lstString) == 0 {
-		resp.err = fmt.Errorf("NetClient.get(): lstString is empty")
-		return
-	}
-	resp.lstString = lstString
-}
-
-// Вызывается по завершению вызова, закрывает тело запроса
-func (сам *NetClient) closeGetBody(strLink string, httpResp *http.Response, resp *response) {
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			// log._rintf("NetClient.closeGetBody(): strLink='%v', panic=%v\n", strLink, _panic)
-			сам.botNet.Отмена()
-		}
-	}()
-	err := httpResp.Body.Close()
-	if err != nil {
-		_err := fmt.Errorf("NetClient.closeGetBody(): ошибка при закрытии запроса URL(%q), err=\n\t%w", strLink, err)
-		if resp.err != nil { // Есть и ошибка в закрытии тела запроса и внутренняя
-			resp.err = fmt.Errorf("NetClient.closeGetBody(): двойная ошибка при закрытии запроса URL(%q), err=\n\t%w\n\tinternal err=\n\t%w", strLink, _err, resp.err)
-		}
-		resp.lstString = nil
-		сам.stat.IncErr()
-	}
-	сам.chRes <- resp
-}

+ 8 - 11
pkg/components/scene_net/section_net.go

@@ -14,7 +14,8 @@ import (
 
 // СекцияСеть -- базовый тип для сетевых сцен
 type СценаСеть struct {
-	клиент types.ИСетьКлиент
+	types.ИБотСеть
+	клиент types.ИВебВоркер
 	секция types.ИСценаСтр
 	стрУрл string
 	блок   sync.Mutex
@@ -32,9 +33,10 @@ func НовСекцияСеть(сцена types.ИСценаСтр, стрУр
 		}
 	}
 	сам := &СценаСеть{
-		секция: сцена,
-		стрУрл: стрУрл,
-		клиент: сцена.Бот().Сеть().КлиентСеть(),
+		ИБотСеть: сцена.Бот().Сеть(),
+		секция:   сцена,
+		стрУрл:   стрУрл,
+		клиент:   сцена.Бот().Сеть().ВебВоркер(),
 	}
 	return сам, nil
 }
@@ -52,7 +54,7 @@ func (сам *СценаСеть) Обновить() error {
 	if сам.секция.Имя() == "Арсенал" {
 		log.Printf("СекцияСеть.Обновить(): арсенал\n")
 	}
-	lstString, err := сам.клиент.Get(сам.стрУрл)
+	lstString, err := сам.клиент.Получ(сам.стрУрл)
 	if err != nil {
 		return fmt.Errorf("СценаСеть.Обновить(): in make request, err=\n\t%w", err)
 	}
@@ -70,14 +72,9 @@ func (сам *СценаСеть) Get(strLink string) (lstString []string, err e
 	if !strings.Contains(strLink, сам.стрУрл) {
 		return nil, fmt.Errorf("СценаСеть.Get(): strLink(%v) не содержит strUrl(%v)", strLink, сам.стрУрл)
 	}
-	lstString, err = сам.клиент.Get(strLink)
+	lstString, err = сам.клиент.Получ(strLink)
 	if err != nil {
 		return nil, fmt.Errorf("СценаСеть.Get(): err=\n\t%v", err)
 	}
 	return lstString, nil
 }
-
-// Клиент -- возвращает хранимого клиента
-func (сам *СценаСеть) Клиент() types.ИСетьКлиент {
-	return сам.клиент
-}

+ 80 - 0
pkg/components/scene_net/web_worker/netclient.go

@@ -0,0 +1,80 @@
+// package web_worker -- веб-воркер бота
+package web_worker
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"log"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+
+	"wartank/pkg/components/scene_net/netstat"
+	"wartank/pkg/types"
+)
+
+// ВебВоркер -- объект сетевого испонлителя бота
+type ВебВоркер struct {
+	botNet types.ИБотСеть
+	conn   *http.Client
+	stat   *netstat.NetStat
+	block  sync.Mutex
+}
+
+// НовВебВоркер -- возвращает веб-воркера бота
+func НовВебВоркер(botNet types.ИБотСеть, conn *http.Client) types.ИВебВоркер {
+	сам := &ВебВоркер{
+		botNet: botNet,
+		conn:   conn,
+		stat:   netstat.NewNetStat(botNet),
+	}
+	return сам
+}
+
+// Получ -- потокобезопасно возвращает список строк по ссылке
+func (сам *ВебВоркер) Получ(strLink string) ([]string, error) {
+	сам.block.Lock()
+	defer сам.block.Unlock()
+	// if strLink == "https://wartank.ru/production/Mine" {
+	log.Printf("ВебВоркер.Получ(): link=%v\n", strLink)
+	// }
+	ctxCancel, fnCancel := context.WithTimeout(сам.botNet.Кнт(), time.Second*10)
+	defer fnCancel()
+	req, err := http.NewRequestWithContext(ctxCancel, "GET", strLink, nil)
+	if err != nil {
+		сам.stat.IncErr()
+		return nil, fmt.Errorf("ВебВоркер.Получ(): при создании запроса, err=\n\t%w", err)
+	}
+	req.Header.Set("User-Agent", "Mozilla Firefox 94.1")
+	httpResp, err := сам.conn.Do(req)
+	if err != nil {
+		сам.stat.IncErr()
+		return nil, fmt.Errorf("ВебВоркер.Получ(): при выполнении GET-запроса, err=\n\t%w", err)
+	}
+	defer httpResp.Body.Close()
+
+	if httpResp.StatusCode != http.StatusOK {
+		сам.stat.IncErr()
+		return nil, fmt.Errorf("ВебВоркер.Получ(): code=%v, status=%v", httpResp.StatusCode, httpResp.Status)
+	}
+	binData, err := io.ReadAll(httpResp.Body)
+	if err != nil {
+		сам.stat.IncErr()
+		return nil, fmt.Errorf("ВебВоркер.Получ(): при чтении тела ответа, err=\n\t%w", err)
+	}
+	if len(binData) == 0 {
+		сам.stat.IncErr()
+		return nil, fmt.Errorf("ВебВоркер.Получ(): пустое тело ответа, err=\n\t%w", err)
+	}
+	lenData := len(binData) + len(strLink)
+	сам.stat.AddByte(lenData)
+
+	lstString := strings.Split(string(binData), "\n")
+	if len(lstString) == 0 {
+		сам.stat.IncErr()
+		return nil, fmt.Errorf("ВебВоркер.Получ(): lstString is empty")
+	}
+	return lstString, nil
+}

+ 2 - 5
pkg/types/ibot_net.go

@@ -2,7 +2,6 @@ package types
 
 import (
 	"context"
-	"net/http"
 
 	"wartank/pkg/components/safe_bool"
 )
@@ -15,12 +14,10 @@ import (
 type ИБотСеть interface {
 	// ЕслиОнлайн -- возвращает признак подключенности к интернету
 	ЕслиОнлайн() *safe_bool.БезопБул
-	// Коннект -- возвращает объект сетевого подключения
-	Коннект() *http.Client
 	// Куки -- возвращает объект кукисов
 	Куки() ИБотКуки
-	// КлиентСеть -- возвращает сетевой клиент бота
-	КлиентСеть() ИСетьКлиент
+	// ВебВоркер -- возвращает веб-воркер бота
+	ВебВоркер() ИВебВоркер
 	// Кнт -- контекст сетевого клиента
 	Кнт() context.Context
 	// Отмена -- вызывает отмену котекста сетевого клиента бота

+ 0 - 7
pkg/types/inet_client.go

@@ -1,7 +0,0 @@
-package types
-
-// ИСетьКлиент -- интерфейс к GET-запросу
-type ИСетьКлиент interface {
-	// Get -- теневая функция на блокировку
-	Get(strLink string) (lstString []string, err error)
-}

+ 7 - 0
pkg/types/iweb_worker.go

@@ -0,0 +1,7 @@
+package types
+
+// ИВебВоркер -- интерфейс потокобезопасного веб-воркера бота
+type ИВебВоркер interface {
+	// Получ -- потокобезопасно возвращает список строк по ссылке
+	Получ(ссылка string) ([]string, error)
+}

+ 9 - 9
server/serv_bots/warbot/angar/base/arsenal/arsenal.go

@@ -180,7 +180,7 @@ func (сам *Арсенал) пуск() {
 
 // Обновляет текущий уровень оружейки (может быть не построена)
 func (сам *Арсенал) уровеньОбновить() bool {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Арсенал.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
@@ -212,7 +212,7 @@ func (сам *Арсенал) уровеньОбновить() bool {
 
 // Строит оружейку при нулевом уровне
 func (сам *Арсенал) построить() bool {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Арсенал.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
@@ -255,7 +255,7 @@ func (сам *Арсенал) построить() bool {
 	_стр = strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
 	_стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
 	ссылка := "https://wartank.ru/" + _стр
-	списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+	списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("ERRO Арсенал.построить(): при GET-команде 'построить оружейку', err=\n\t%v\n", ош)
 		return false
@@ -275,7 +275,7 @@ func (сам *Арсенал) построить() bool {
 	_стр = strings.TrimSuffix(_стр, "\">")
 	// http://wartank.ru/building-upgrade/Armory?16-1.ILinkListener-upgradeLink-link
 	ссылка = "https://wartank.ru/building-upgrade/" + _стр
-	_, ош = сам.сеть.Клиент().Get(ссылка)
+	_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("ERRO Арсенал.построить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
 		return false
@@ -294,7 +294,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 	)
 	фнКупить := func() bool {
 		defer time.Sleep(time.Millisecond * 1000)
-		списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Armory")
+		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Armory")
 		if ош != nil {
 			log.Printf("Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
 			return false
@@ -315,7 +315,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 		// https://wartank.ru/building-upgrade/Armory?4-1.ILinkListener-upgradeLink-link
 		// <a class="simple-but border mb5" href="Armory?50-1.ILinkListener-upgradeLink-link">
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Арсенал.проапгрейдить().фнКупить(): при GET-команде 'купить постройку оружейки', err=\n\t%v\n", ош)
 			return false
@@ -347,7 +347,7 @@ func (сам *Арсенал) проапгрейдить() bool {
 		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
 		// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
 		ссылка := "https://wartank.ru" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Арсенал.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -699,7 +699,7 @@ func (сам *Арсенал) сделатьРемку() bool {
 		еслиНайдено bool
 		инд         int
 	)
-	lstArsenal, ош := сам.сеть.Клиент().Get("https://wartank.ru/production/Armory")
+	lstArsenal, ош := сам.сеть.ВебВоркер().Получ("https://wartank.ru/production/Armory")
 	if ош != nil {
 		log.Printf("Арсенал.сделатьРемку(): при получении страницы оружейки, err=\n\t%v\n", ош)
 		return false
@@ -725,7 +725,7 @@ func (сам *Арсенал) сделатьРемку() bool {
 	// https://wartank.ru/production/Armory?37-1.ILinkListener-productions-3-production-startProduceLink
 	ссылка := "https://wartank.ru/production/" + _ссылка
 	time.Sleep(time.Millisecond * 50)
-	if _, err := сам.сеть.Клиент().Get(ссылка); err != nil {
+	if _, err := сам.сеть.ВебВоркер().Получ(ссылка); err != nil {
 		log.Printf("Арсенал.сделатьРемку(): при отдаче команды сделать ремку, err=\n\t%v\n", err)
 		return false
 	}

+ 8 - 8
server/serv_bots/warbot/angar/base/bank/bank.go

@@ -105,7 +105,7 @@ func (сам *Банк) проверитьУскорить() bool {
 		стрСсылка   = ""
 		еслиНайдено = false
 	)
-	списБанк, ош := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	списБанк, ош := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Банк.проверУскорить(): при получении страницы базы, ош=\n\t%v\n", ош)
 		return false
@@ -123,7 +123,7 @@ func (сам *Банк) проверитьУскорить() bool {
 	_ссылка := strings.TrimPrefix(стрСсылка, `<td style="width:50%;padding-left:1px;"><a class="simple-but border" href="`)
 	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Ускорение</span></span></a>`)
 	ссылка := "https://wartank.ru/" + _ссылка
-	_, ош = сам.сеть.Клиент().Get(ссылка)
+	_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("Банк.проверУскорить(): при выполнении ускорения, ош=\n\t%v\n", ош)
 		return false
@@ -137,7 +137,7 @@ func (сам *Банк) забрать() {
 		strOut      string
 		еслиНайдено bool
 	)
-	списБанк, ош := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	списБанк, ош := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Банк.забрать(): при выполнении GET-запроса 'получить страницу базы', ош=\n\t%v\n", ош)
 		return
@@ -156,7 +156,7 @@ func (сам *Банк) забрать() {
 	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
 	// https://wartank.ru/buildings?3-1.ILinkListener-buildings-1-building-rootBlock-actionPanel-takeProductionLink
 	ссылка := "https://wartank.ru/" + _ссылка
-	_, ош = сам.сеть.Клиент().Get(ссылка)
+	_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("Банк.забрать(): при выполнении GET-запроса 'забрать серебро', err=\n\t%v\n", ош)
 		return
@@ -171,7 +171,7 @@ func (сам *Банк) построитьУлучшить() bool {
 	)
 	{ // Зайти на страницу постройки
 		// https://wartank.ru/building-upgrade/Bank
-		списБанк, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Bank")
+		списБанк, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Bank")
 		if ош != nil {
 			log.Printf("Банк.построитьПровер(): при чтении страницы строительства банка, ош=\n\t%v\n", ош)
 			return false
@@ -192,7 +192,7 @@ func (сам *Банк) построитьУлучшить() bool {
 		_ссылка = strings.TrimSuffix(_ссылка, `">`)
 		ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
 		// https://wartank.ru/building-upgrade/Bank?162-1.ILinkListener-upgradeLink-link
-		списБанк, ош = сам.сеть.Клиент().Get(ссылка)
+		списБанк, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Банк.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
 			return false
@@ -214,7 +214,7 @@ func (сам *Банк) построитьУлучшить() bool {
 			_ссылка = strings.TrimSuffix(_ссылка, `">`)
 			ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
 			// https://wartank.ru/building-upgrade/Bank?162-1.ILinkListener-upgradeLink-link
-			списБанк, ош = сам.сеть.Клиент().Get(ссылка)
+			списБанк, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 			if ош != nil {
 				log.Printf("Банк.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
 				return false
@@ -238,7 +238,7 @@ func (сам *Банк) построитьУлучшить() bool {
 		_ссылка = strings.TrimSuffix(_ссылка, "\"><span><span>да, подтверждаю</span></span></a>")
 		ссылка := "https://wartank.ru/" + _ссылка
 		// https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink
-		_, ош = сам.сеть.Клиент().Get(ссылка)
+		_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Банк.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
 			return false

+ 9 - 9
server/serv_bots/warbot/angar/base/fuel/fuel.go

@@ -94,7 +94,7 @@ func (сам *СкладТоплива) количествоПолучить() {
 		strOut      string
 		еслиНайдено bool
 	)
-	lstMine, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	lstMine, err := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if err != nil {
 		log.Printf("СкладТоплива.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
 		return
@@ -122,7 +122,7 @@ func (сам *СкладТоплива) количествоПолучить() {
 
 // Проверяет ускорение строительства
 func (сам *СкладТоплива) ускорениеПровер() {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("СкладТоплива.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
 		return
@@ -145,7 +145,7 @@ func (сам *СкладТоплива) ускорениеПровер() {
 
 // Обновляет текущий уровень шахты (может быть не построена)
 func (сам *СкладТоплива) уровеньОбновить() bool {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("СкладТоплива.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
@@ -201,7 +201,7 @@ func (сам *СкладТоплива) проапгрейдить() bool {
 	)
 	фнКупить := func() bool {
 		defer time.Sleep(time.Millisecond * 1000)
-		списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/FuelStorage")
+		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/FuelStorage")
 		if ош != nil {
 			log.Printf("СкладТоплива.проапгрейдить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -222,7 +222,7 @@ func (сам *СкладТоплива) проапгрейдить() bool {
 		// https://wartank.ru/building-upgrade/FuelStorage?4-1.ILinkListener-upgradeLink-link
 		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("СкладТоплива.проапгрейдить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -254,7 +254,7 @@ func (сам *СкладТоплива) проапгрейдить() bool {
 		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
 		// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
 		ссылка := "https://wartank.ru" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("СкладТоплива.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -297,7 +297,7 @@ func (сам *СкладТоплива) построить() bool {
 	)
 	фнКупить := func() bool {
 		defer time.Sleep(time.Millisecond * 1000)
-		списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/FuelStorage")
+		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/FuelStorage")
 		if ош != nil {
 			log.Printf("СкладТоплива.построить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -319,7 +319,7 @@ func (сам *СкладТоплива) построить() bool {
 		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
 		// https://wartank.ru/building-upgrade/FuelStorage?72-1.ILinkListener-upgradeLink-link
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("СкладТоплива.построить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -352,7 +352,7 @@ func (сам *СкладТоплива) построить() bool {
 		// https://wartank.ru/wicket/page?4-1.ILinkListener-confirmLink
 		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
 		ссылка := "https://wartank.ru" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("СкладТоплива.построить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
 			return false

+ 5 - 5
server/serv_bots/warbot/angar/base/labor/labor.go

@@ -56,9 +56,9 @@ func (сам *Лаборатория) работать() {
 // Улучшает параметры лаборатории
 func (сам *Лаборатория) улучшить() error {
 	// https://wartank.ru/buildings
-	клиент := сам.бот.Сеть().КлиентСеть()
+	клиент := сам.бот.Сеть().ВебВоркер()
 	фнПостроить := func() error {
-		лстСтр, ош := клиент.Get("https://wartank.ru/buildings")
+		лстСтр, ош := клиент.Получ("https://wartank.ru/buildings")
 		if ош != nil {
 			return fmt.Errorf("Лаборатория.улучшить(): при получении страницы постройки лаборатории с сервера, ош=\n\t%w", ош)
 		}
@@ -74,14 +74,14 @@ func (сам *Лаборатория) улучшить() error {
 			return nil
 		}
 		// https://wartank.ru/building-upgrade/Laboratory
-		_, ош = клиент.Get("https://wartank.ru/building-upgrade/Laboratory")
+		_, ош = клиент.Получ("https://wartank.ru/building-upgrade/Laboratory")
 		if ош != nil {
 			return fmt.Errorf("Лаборатория.улучшить(): при построении лаборатории, ош=\n\t%w", ош)
 		}
 		return nil
 	}
 	фнКупить := func() error {
-		лстСтр, ош := клиент.Get("https://wartank.ru/building-upgrade/Laboratory")
+		лстСтр, ош := клиент.Получ("https://wartank.ru/building-upgrade/Laboratory")
 		if ош != nil {
 			return fmt.Errorf("Лаборатория.улучшить(): при получении страницы покупки лаборатории с сервера, ош=\n\t%w", ош)
 		}
@@ -99,7 +99,7 @@ func (сам *Лаборатория) улучшить() error {
 		стрВых = strings.TrimSuffix(стрВых, `">`)
 		// https://wartank.ru/building-upgrade/Laboratory?117-1.ILinkListener-upgradeLink-link
 		стрВых = "https://wartank.ru/building-upgrade/" + стрВых
-		_, ош = клиент.Get(стрВых)
+		_, ош = клиент.Получ(стрВых)
 		if ош != nil {
 			return fmt.Errorf("Лаборатория.улучшить(): при покупки лаборатории, ош=\n\t%w", ош)
 		}

+ 8 - 8
server/serv_bots/warbot/angar/base/market/market.go

@@ -77,7 +77,7 @@ func (сам *Рынок) пуск() {
 
 // Проверяет ускорение строительства
 func (сам *Рынок) ускорениеПровер() {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Рынок.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
 		return
@@ -100,7 +100,7 @@ func (сам *Рынок) ускорениеПровер() {
 
 // Обновляет текущий уровень рынка (может быть не построен)
 func (сам *Рынок) уровеньОбновить() bool {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Рынок.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
@@ -157,7 +157,7 @@ func (сам *Рынок) построить() bool {
 	)
 	фнКупить := func() bool {
 		defer time.Sleep(time.Millisecond * 1000)
-		списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Market")
+		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Market")
 		if ош != nil {
 			log.Printf("Рынок.построить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -178,7 +178,7 @@ func (сам *Рынок) построить() bool {
 		// https://wartank.ru/building-upgrade/Market?18-1.ILinkListener-upgradeLink-link
 		// <a class="simple-but border mb5" href="Market?19-1.ILinkListener-upgradeLink-link">
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Рынок.построить().фнКупить(): при GET-команде 'купить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -210,7 +210,7 @@ func (сам *Рынок) построить() bool {
 		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
 		// https://wartank.ru/wicket/page?20-1.ILinkListener-confirmLink
 		ссылка := "https://wartank.ru" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Рынок.построить().фнПодтверждение(): при GET-команде 'подтвердить постройку склада топлива', err=\n\t%v\n", ош)
 			return false
@@ -250,7 +250,7 @@ func (сам *Рынок) проапгрейдить() bool {
 	)
 	фнКупить := func() bool {
 		defer time.Sleep(time.Millisecond * 1000)
-		списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Market")
+		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Market")
 		if ош != nil {
 			log.Printf("Рынок.проапгрейдить().фнКупить(): при GET-команде 'купить постройку рынка', err=\n\t%v\n", ош)
 			return false
@@ -271,7 +271,7 @@ func (сам *Рынок) проапгрейдить() bool {
 		// https://wartank.ru/building-upgrade/Market?4-1.ILinkListener-upgradeLink-link
 		// <a class="simple-but border mb5" href="Market?50-1.ILinkListener-upgradeLink-link">
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Рынок.проапгрейдить().фнКупить(): при GET-команде 'купить постройку рынка', err=\n\t%v\n", ош)
 			return false
@@ -303,7 +303,7 @@ func (сам *Рынок) проапгрейдить() bool {
 		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
 		// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
 		ссылка := "https://wartank.ru" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Рынок.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку рынка', err=\n\t%v\n", ош)
 			return false

+ 42 - 29
server/serv_bots/warbot/angar/base/mine/mine.go

@@ -105,22 +105,38 @@ func (сам *Шахта) пуск() {
 			}
 		}()
 		сам.бот.Ангар().РесурсыОбновить()
-		счёт := 5
-		for счёт > 0 { // Забрать из шахты
-			if сам.шахтаЗабрать() {
-				break
+		{ // Построить
+
+			счёт := 5
+			for счёт > 0 {
+				еcлиНет := сам.построить()
+				if еcлиНет {
+					break
+				}
+				счёт--
+			}
+		}
+		{
+			счёт := 5
+			for счёт > 0 { // Забрать из шахты
+				if сам.шахтаЗабрать() {
+					break
+				}
+				счёт--
 			}
-			счёт--
 		}
 		сам.уровеньОбновить()
 		сам.ускорениеПровер()
-		счёт = 5
-		for счёт > 0 {
-			if сам.проапгрейдить() {
-				break
+		{
+			счёт := 5
+			for счёт > 0 {
+				if сам.проапгрейдить() {
+					break
+				}
+				счёт--
 			}
-			счёт--
 		}
+
 		сам.количествоПолучить()
 		сам.бот.Ангар().РесурсыОбновить()
 		сам.Сделать()
@@ -147,7 +163,7 @@ func (сам *Шахта) количествоПолучить() {
 		еслиНайдено bool
 		режим       string
 	)
-	lstMine, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	lstMine, err := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if err != nil {
 		log.Printf("Шахта.количествоПолучить(): при обновлении строк шахты, ош=\n\t%v\n", err)
 		return
@@ -254,7 +270,7 @@ func (сам *Шахта) шахтаЗабрать() bool {
 		strOut      string
 		еслиНайдено bool
 	)
-	списШахта, ош := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	списШахта, ош := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Шахта.шахтаЗабрать(): при обновлении списШахта, ош=\n\t%v\n", ош)
 		return false
@@ -273,7 +289,7 @@ func (сам *Шахта) шахтаЗабрать() bool {
 	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
 	ссылка := "https://wartank.ru/" + _ссылка
 	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
-	lstBase1, err := сам.сеть.Клиент().Get(ссылка)
+	lstBase1, err := сам.сеть.ВебВоркер().Получ(ссылка)
 	if err != nil {
 		log.Printf("Шахта.шахтаЗабрать(): при выполнении Get-запроса 'забрать', err=\n\t%v\n", err)
 		return false
@@ -287,7 +303,7 @@ func (сам *Шахта) шахтаЗабрать() bool {
 
 // Проверяет ускорение строительства
 func (сам *Шахта) ускорениеПровер() {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Шахта.ускорениеПровер(): in make request, err=\n\t%v\n", ош)
 		return
@@ -315,7 +331,7 @@ func (сам *Шахта) Уровень() types.ИСтатПарам {
 
 // Обновляет текущий уровень шахты (может быть не построена)
 func (сам *Шахта) уровеньОбновить() bool {
-	списСтр, ош := сам.сеть.Клиент().Get("http://wartank.ru/buildings")
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
 	if ош != nil {
 		log.Printf("Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
 		return false
@@ -343,14 +359,6 @@ func (сам *Шахта) уровеньОбновить() bool {
 	}
 	сам.уровень.Уст(иУровень)
 	switch иУровень {
-	case 0: // шахту надо построить
-		счёт := 5
-		for счёт > 0 {
-			if сам.построить(списСтр) {
-				break
-			}
-			счёт--
-		}
 	default: // Пробуем проапгрейдить
 		счёт := 5
 		for счёт > 0 {
@@ -364,12 +372,17 @@ func (сам *Шахта) уровеньОбновить() bool {
 }
 
 // Строит шахту при нулевом уровне
-func (сам *Шахта) построить(списСтр []string) bool {
+func (сам *Шахта) построить() bool {
 	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Mine"><span><span>Построить</span></span></a></td>
 	var (
 		еслиНайти = false
 		стр       = ""
 	)
+	списСтр, ош := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
+	if ош != nil {
+		log.Printf("Шахта.уровеньОбновить(): in make request, err=\n\t%v\n", ош)
+		return false
+	}
 	for _, стр = range списСтр {
 		if strings.Contains(стр, `href="building-upgrade/Mine"><span><span>Построить</span></span>`) {
 			еслиНайти = true
@@ -383,7 +396,7 @@ func (сам *Шахта) построить(списСтр []string) bool {
 	_стр := strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
 	_стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
 	ссылка := "https://wartank.ru/" + _стр
-	списСтр, ош := сам.сеть.Клиент().Get(ссылка)
+	списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("ERRO Шахта.построить(): при GET-команде 'построить шахту', err=\n\t%v\n", ош)
 		return false
@@ -403,7 +416,7 @@ func (сам *Шахта) построить(списСтр []string) bool {
 	_стр = strings.TrimSuffix(_стр, "\">")
 	// http://wartank.ru/building-upgrade/Mine?16-1.ILinkListener-upgradeLink-link
 	ссылка = "https://wartank.ru/building-upgrade/" + _стр
-	_, ош = сам.сеть.Клиент().Get(ссылка)
+	_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("ERRO Шахта.построить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
 		return false
@@ -422,7 +435,7 @@ func (сам *Шахта) проапгрейдить() bool {
 	)
 	фнКупить := func() bool {
 		defer time.Sleep(time.Millisecond * 1000)
-		списСтр, ош = сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Mine")
+		списСтр, ош = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Mine")
 		if ош != nil {
 			log.Printf("Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
 			return false
@@ -443,7 +456,7 @@ func (сам *Шахта) проапгрейдить() bool {
 		// https://wartank.ru/building-upgrade/Mine?4-1.ILinkListener-upgradeLink-link
 		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
 		ссылка := "https://wartank.ru/building-upgrade/" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Шахта.проапгрейдить().фнКупить(): при GET-команде 'купить постройку шахты', err=\n\t%v\n", ош)
 			return false
@@ -475,7 +488,7 @@ func (сам *Шахта) проапгрейдить() bool {
 		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
 		// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
 		ссылка := "https://wartank.ru" + _стр
-		списСтр, ош = сам.сеть.Клиент().Get(ссылка)
+		списСтр, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Шахта.проапгрейдить().фнПодтверждение(): при GET-команде 'подтвердить постройку шахты', err=\n\t%v\n", ош)
 			return false

+ 5 - 5
server/serv_bots/warbot/angar/base/polygon/polygon.go

@@ -153,7 +153,7 @@ func (сам *Полигон) уровеньПолучить() bool {
 		стрВых     = ""
 		еслиНидено bool
 	)
-	lstBase, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	lstBase, err := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if err != nil {
 		log.Printf("Полигон.уровеньПолучить(): при обновлении строк базы, err=\n\t%v\n", err)
 		return false
@@ -184,7 +184,7 @@ func (сам *Полигон) проверитьУскорение() {
 		strOut      = ""
 		еслиНайдено bool
 	)
-	lstBase, err := сам.сеть.Клиент().Get("https://wartank.ru/buildings")
+	lstBase, err := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
 	if err != nil {
 		log.Printf("Полигон.проверитьУскорение(): при обновлении строк базы, err=\n\t%v\n", err)
 		return
@@ -249,7 +249,7 @@ func (сам *Полигон) проверитьУскорение() {
 func (сам *Полигон) построитьПровер() {
 	фнПостроить := func() bool { // Поиск кнопки строительства
 		// https://wartank.ru/building-upgrade/Polygon
-		списПолигон, ош := сам.сеть.Клиент().Get("https://wartank.ru/building-upgrade/Polygon")
+		списПолигон, ош := сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Polygon")
 		if ош != nil {
 			log.Printf("Полигон.построитьПровер(): при чтении страницы строительства полигона, ош=\n\t%v\n", ош)
 			return false
@@ -270,7 +270,7 @@ func (сам *Полигон) построитьПровер() {
 		_ссылка = strings.TrimSuffix(_ссылка, `">`)
 		ссылка := "https://wartank.ru/building-upgrade/" + _ссылка
 		// https://wartank.ru/building-upgrade/Polygon?83-1.ILinkListener-upgradeLink-link
-		списПолигон, ош = сам.сеть.Клиент().Get(ссылка)
+		списПолигон, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 		if ош != nil {
 			log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
 			return false
@@ -297,7 +297,7 @@ func (сам *Полигон) построитьПровер() {
 			_ссылка = strings.TrimSuffix(_ссылка, "\"><span><span>да, подтверждаю</span></span></a>")
 			ссылка := "https://wartank.ru/" + _ссылка
 			// https://wartank.ru/wicket/page?135-1.ILinkListener-confirmLink
-			_, ош = сам.сеть.Клиент().Get(ссылка)
+			_, ош = сам.сеть.ВебВоркер().Получ(ссылка)
 			if ош != nil {
 				log.Printf("Полигон.построитьПровер(): при выполнении запроса на строительство, ош=\n\t%v\n", ош)
 				return false

+ 2 - 3
server/serv_bots/warbot/angar/battle/battle.go

@@ -3,7 +3,6 @@ package battle
 
 import (
 	"fmt"
-	"net/http"
 	"time"
 
 	"wartank/pkg/section"
@@ -17,7 +16,7 @@ import (
 type Сражение struct {
 	*section.Секция
 	бот    types.ИБот
-	клиент *http.Client
+	клиент types.ИВебВоркер
 
 	регистрация *battle_register.СхваткаРегистрация // Регистратор на сражение
 	ожидание    *battle_wait.СхваткаОжидание        // Ождатель начала сражения
@@ -35,7 +34,7 @@ func НовСражение(бот types.ИБот) (*Сражение, error) {
 	сам := &Сражение{
 		Секция: секция,
 		бот:    бот,
-		клиент: бот.Сеть().Коннект(),
+		клиент: бот.Сеть().ВебВоркер(),
 	}
 	{
 		сам.регистрация, ош = battle_register.НовСражениеРегистрация(бот)

+ 5 - 5
server/serv_bots/warbot/angar/convoy/convoy.go

@@ -209,7 +209,7 @@ func (сам *Конвой) найтиВбой() string {
 		strOut      = ""
 		еслиНайдено bool
 	)
-	lstConvoy, err := сам.net.Клиент().Get("https://wartank.ru/convoy")
+	lstConvoy, err := сам.net.ВебВоркер().Получ("https://wartank.ru/convoy")
 	if err != nil {
 		log.Printf("Конвой.атакаНачать(): при обновлении lstConvoy, ош=\n\t%v\n", err)
 		return ""
@@ -278,7 +278,7 @@ func (сам *Конвой) атакаНачать() {
 	}
 	strLink := strOut
 	// Можно начать разведку
-	lstConvoy, err := сам.net.Клиент().Get(strLink)
+	lstConvoy, err := сам.net.ВебВоркер().Получ(strLink)
 	if err != nil {
 		log.Printf("ERRO Конвой.атакаНачать(): при выполнении GET-команды 'В атаку!', err=\n\t%v\n", err)
 		return
@@ -328,7 +328,7 @@ func (сам *Конвой) начатьРазведку() {
 	link := "https://wartank.ru/" + _link
 	{ // Выполнить атаку
 		var err error
-		lstConvoy, err = сам.net.Клиент().Get(link)
+		lstConvoy, err = сам.net.ВебВоркер().Получ(link)
 		if err != nil {
 			log.Printf("Конвой.attack(): in get page find attack, err=\n\t%v\n", err)
 			return
@@ -366,7 +366,7 @@ func (сам *Конвой) проверитьМиссияРазведкаКон
 	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
 	// https://wartank.ru/convoy?23-1.ILinkListener-missions-cc-0-c-awardLink
 	ссылка := "https://wartank.ru/" + _ссылка
-	lstConvoy, err := сам.net.Клиент().Get(ссылка)
+	lstConvoy, err := сам.net.ВебВоркер().Получ(ссылка)
 	if err != nil {
 		log.Printf("Конвой.проверитьМиссияРазведкаКонвой(): при выполнени команды GET, err=\n\t%v\n", err)
 		return
@@ -451,7 +451,7 @@ func (сам *Конвой) проверитьМиссия6фрагов() {
 	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
 	// https://wartank.ru/convoy?15-1.ILinkListener-missions-cc-1-c-awardLink
 	ссылка := "https://wartank.ru/" + _ссылка
-	lstConvoy, ош := сам.net.Клиент().Get(ссылка)
+	lstConvoy, ош := сам.net.ВебВоркер().Получ(ссылка)
 	if ош != nil {
 		log.Printf("Конвой.проверитьМиссия6фрагов(): при выполнени команды GET, err=\n\t%v\n", ош)
 		return

+ 2 - 3
server/serv_bots/warbot/angar/death_match/battle.go

@@ -3,7 +3,6 @@ package death_match
 
 import (
 	"fmt"
-	"net/http"
 	"time"
 
 	"wartank/pkg/section"
@@ -17,7 +16,7 @@ import (
 type Схватка struct {
 	*section.Секция
 	бот    types.ИБот
-	клиент *http.Client
+	клиент types.ИВебВоркер
 
 	регистрация *battle_register.СхваткаРегистрация // Регистратор на сражение
 	ожидание    *battle_wait.СхваткаОжидание        // Ождатель начала схватки
@@ -35,7 +34,7 @@ func НовСхватка(бот types.ИБот) (*Схватка, error) {
 	сам := &Схватка{
 		Секция: секция,
 		бот:    бот,
-		клиент: бот.Сеть().Коннект(),
+		клиент: бот.Сеть().ВебВоркер(),
 	}
 	{
 		сам.регистрация, ош = battle_register.НовСражениеРегистрация(бот)

+ 2 - 3
server/serv_bots/warbot/angar/division/divwar/divwar.go

@@ -3,7 +3,6 @@ package divwar
 import (
 	"fmt"
 	"log"
-	"net/http"
 	"strings"
 	"sync"
 	"time"
@@ -27,7 +26,7 @@ type DivWar struct {
 	bot   types.ИБот
 	alarm types.ИСтатПарам
 	net   *divwarnet.DivWarNet
-	conn  *http.Client
+	conn  types.ИВебВоркер
 
 	// Непосредственная битва
 	divon *divwaron.DivWarOn
@@ -53,7 +52,7 @@ func NewDivWar(bot types.ИБот) (*DivWar, error) {
 		alarm:    еслиНач,
 		chDivWar: make(chan int, 1),
 		sound:    divwarsound.NewDivWarSound(),
-		conn:     bot.Сеть().Коннект(),
+		conn:     bot.Сеть().ВебВоркер(),
 		login:    "prospero tank",
 	}
 	// сам.shotTimeFull.Set(8000) // 8000 msec

+ 5 - 5
server/serv_bots/warbot/angar/tank_params/tank_params.go

@@ -64,9 +64,9 @@ func (сам *ТанкПараметры) работать() {
 // Улучшает параметры танка
 func (сам *ТанкПараметры) улучшить() error {
 	// https://wartank.ru/pimp/34479487
-	клиент := сам.бот.Сеть().КлиентСеть()
+	клиент := сам.бот.Сеть().ВебВоркер()
 	фнУлучшить := func() error {
-		лстСтр, ош := клиент.Get("https://wartank.ru/pimp/" + сам.номер)
+		лстСтр, ош := клиент.Получ("https://wartank.ru/pimp/" + сам.номер)
 		if ош != nil {
 			return fmt.Errorf("ТанкПараметры.улучшить(): при получении страницы улучшения танка с сервера, ош=\n\t%w", ош)
 		}
@@ -88,7 +88,7 @@ func (сам *ТанкПараметры) улучшить() error {
 		стрВых = strings.TrimSuffix(стрВых, `">`)
 		// https://wartank.ru/pimp/34479487?21-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link
 		стрСсыль := "https://wartank.ru/pimp/" + стрВых
-		_, ош = клиент.Get(стрСсыль)
+		_, ош = клиент.Получ(стрСсыль)
 		if ош != nil {
 			return fmt.Errorf("ТанкПараметры.улучшить(): при улучшении танка с сервера, ош=\n\t%w", ош)
 		}
@@ -109,8 +109,8 @@ func (сам *ТанкПараметры) улучшить() error {
 
 // Получает собственный номер танка с сервера
 func (сам *ТанкПараметры) номерПолуч() error {
-	клиент := сам.бот.Сеть().КлиентСеть()
-	лстСтр, ош := клиент.Get("https://wartank.ru/angar")
+	клиент := сам.бот.Сеть().ВебВоркер()
+	лстСтр, ош := клиент.Получ("https://wartank.ru/angar")
 	if ош != nil {
 		return fmt.Errorf("ТанкПараметры.номерПолуч(): при получении страницы ангара с сервера, ош=\n\t%w", ош)
 	}

+ 0 - 41
server/serv_bots/warbot/warbot_net/bot_net_conn/bot_net_conn.go

@@ -1,41 +0,0 @@
-// package bot_net_conn -- сетевое соединение бота
-package bot_net_conn
-
-import (
-	"net/http"
-	"net/http/cookiejar"
-	"time"
-
-	"wartank/pkg/types"
-	"wartank/server/serv_bots/warbot/warbot_net/bot_cookie"
-)
-
-// БотСетьСокет -- сетевое соединение бота
-type БотСетьСокет struct {
-	клиент http.Client          // Фактический клиент бота
-	куки   bot_cookie.BotCookie // Кукисы бота
-}
-
-// НовБотСетьСокет -- возвращает новое сетевое соединение бота
-func НовБотСетьСокет() *БотСетьСокет {
-	сам := &БотСетьСокет{
-		клиент: http.Client{
-			Transport: nil,
-			Jar:       nil,
-			Timeout:   time.Second * 10,
-		},
-		куки: bot_cookie.NewBotCookie(),
-	}
-	сам.клиент.Jar, _ = cookiejar.New(nil)
-	return сам
-}
-
-// Клиент -- возвращает сетевого клиента
-func (сам *БотСетьСокет) Клиент() *http.Client {
-	return &сам.клиент
-}
-
-// Куки -- возвращает куки клиента
-func (сам *БотСетьСокет) Куки() types.ИБотКуки {
-	return &сам.куки
-}

+ 15 - 15
server/serv_bots/warbot/warbot_net/bot_net_login/bot_net_login.go

@@ -13,26 +13,26 @@ import (
 
 // БотСетьЛогин -- объект сетевого входа на сервер
 type БотСетьЛогин struct {
-	сеть   types.ИБотСеть
-	клиент *http.Client
-	куки   types.ИБотКуки
+	сеть types.ИБотСеть
+	conn *http.Client // Сырой клиент HTTP
+	куки types.ИБотКуки
 }
 
 // НовБотСетьЛогин -- возвращает новый *БотСетьЛогин
-func НовБотСетьЛогин(ботСеть types.ИБотСеть) (БотСетьЛогин, error) {
+func НовБотСетьЛогин(ботСеть types.ИБотСеть, conn *http.Client) (*БотСетьЛогин, error) {
 	{ // Предусловия
 		if ботСеть == nil {
-			return БотСетьЛогин{}, fmt.Errorf("НовБотСетьЛогин(): ИБотСеть пустышка")
+			return nil, fmt.Errorf("НовБотСетьЛогин(): ИБотСеть пустышка")
 		}
 	}
 
-	сам := БотСетьЛогин{
-		сеть:   ботСеть,
-		клиент: ботСеть.Коннект(),
-		куки:   ботСеть.Куки(),
+	сам := &БотСетьЛогин{
+		сеть: ботСеть,
+		conn: conn,
+		куки: ботСеть.Куки(),
 	}
 	if err := сам.подключить(); err != nil {
-		return БотСетьЛогин{}, fmt.Errorf("НовБотСетьЛогин() in connect to server, err=\n\t%w", err)
+		return nil, fmt.Errorf("НовБотСетьЛогин() in connect to server, err=\n\t%w", err)
 	}
 	return сам, nil
 }
@@ -59,7 +59,7 @@ func (сам *БотСетьЛогин) подключить() (err error) {
 			return fmt.Errorf("БотСетьЛогин.подключить(): in get page angar, err=\n\t%w", ош1)
 
 		}
-		resp, ош2 := сам.клиент.Do(запр)
+		resp, ош2 := сам.conn.Do(запр)
 		if ош2 != nil {
 			return fmt.Errorf("БотСетьЛогин.подключить(): in make request, err=\n\t%w", ош2)
 		}
@@ -75,7 +75,7 @@ func (сам *БотСетьЛогин) подключить() (err error) {
 // Прочитать главную страницу для получения кукисов
 func (сам *БотСетьЛогин) получСтрГлав() (string, error) {
 	// _mt.Println("\БотСетьЛогин.getMainPage()")
-	ответ, ош := сам.клиент.Get("https://wartank.ru/")
+	ответ, ош := сам.conn.Get("https://wartank.ru/")
 	if ош != nil {
 		return "", fmt.Errorf("БотСетьЛогин.получСтрГлав(): err=\n\t%w", ош)
 	}
@@ -117,7 +117,7 @@ func (сам *БотСетьЛогин) получСтрГлав() (string, erro
 // Получает страницу логина
 func (сам *БотСетьЛогин) получСтрЛогин(linkBegin string) (string, error) {
 	// _mt.Println("\БотСетьЛогин.getPageLogin()")
-	ответ, ош := сам.клиент.Get(linkBegin)
+	ответ, ош := сам.conn.Get(linkBegin)
 	if ош != nil {
 		return "", fmt.Errorf("БотСетьЛогин.получСтрЛогин(): in mske GET-request for send login page, err=\n\t%w", ош)
 	}
@@ -158,7 +158,7 @@ func (сам *БотСетьЛогин) выполнитьЛогин(strBody str
 		form.Add("login", сам.сеть.Бот().Имя())
 		form.Add("password", сам.сеть.Бот().Пароль())
 
-		resp, err := сам.клиент.PostForm(postLink, form)
+		resp, err := сам.conn.PostForm(postLink, form)
 		if err != nil {
 			return fmt.Errorf("БотСетьЛогин.makePostLogin(): in get POST-login response, err=\n\t%w", err)
 		}
@@ -167,7 +167,7 @@ func (сам *БотСетьЛогин) выполнитьЛогин(strBody str
 			return fmt.Errorf("БотСетьЛогин.makePostLogin(): in read body POST-login response, err=\n\t%w", err)
 		}
 		urlObj, _ := url.Parse("https://wartank.ru/")
-		сам.клиент.Jar.SetCookies(urlObj, сам.куки.Получ())
+		сам.conn.Jar.SetCookies(urlObj, сам.куки.Получ())
 	}
 	return nil
 }

+ 46 - 0
server/serv_bots/warbot/warbot_net/bot_web_conn/bot_web_conn.go

@@ -0,0 +1,46 @@
+// package bot_web_conn -- сетевое соединение бота
+package bot_web_conn
+
+import (
+	"net/http"
+	"net/http/cookiejar"
+	"time"
+
+	"wartank/pkg/types"
+	"wartank/server/serv_bots/warbot/warbot_net/bot_cookie"
+)
+
+// БотСетьСокет -- сетевое соединение бота
+type БотВебСокет struct {
+	клиент *http.Client         // Фактический клиент бота
+	куки   bot_cookie.BotCookie // Кукисы бота
+}
+
+// НовБотСетьСокет -- возвращает новое сетевое соединение бота
+func НовБотВебСокет() *БотВебСокет {
+	клиент := &http.Client{
+		Transport: &http.Transport{
+			MaxIdleConns:      10,
+			IdleConnTimeout:   30 * time.Second,
+			DisableKeepAlives: false,
+		},
+		Jar:     nil,
+		Timeout: time.Second * 10,
+	}
+	сам := &БотВебСокет{
+		клиент: клиент,
+		куки:   bot_cookie.NewBotCookie(),
+	}
+	сам.клиент.Jar, _ = cookiejar.New(nil)
+	return сам
+}
+
+// ВебСокет -- возвращает сетевого клиента
+func (сам *БотВебСокет) ВебСокет() *http.Client {
+	return сам.клиент
+}
+
+// Куки -- возвращает куки клиента
+func (сам *БотВебСокет) Куки() types.ИБотКуки {
+	return &сам.куки
+}

+ 13 - 20
server/serv_bots/warbot/warbot_net/warbot_net.go

@@ -4,13 +4,12 @@ import (
 	"context"
 	"fmt"
 	"log"
-	"net/http"
 
 	"wartank/pkg/components/safe_bool"
-	"wartank/pkg/components/scene_net/netclient"
+	"wartank/pkg/components/scene_net/web_worker"
 	"wartank/pkg/types"
-	"wartank/server/serv_bots/warbot/warbot_net/bot_net_conn"
 	"wartank/server/serv_bots/warbot/warbot_net/bot_net_login"
+	"wartank/server/serv_bots/warbot/warbot_net/bot_web_conn"
 )
 
 /*
@@ -20,16 +19,16 @@ import (
 // ВарБотСеть -- веб-клиент для выполнения запросов на веб-сервер
 type ВарБотСеть struct {
 	бот        types.ИБот
-	сокет      *bot_net_conn.БотСетьСокет
-	логин      bot_net_login.БотСетьЛогин
+	вебСокет   *bot_web_conn.БотВебСокет
+	логин      *bot_net_login.БотСетьЛогин
 	еслиОнлайн *safe_bool.БезопБул
-	сеть       *netclient.NetClient
+	вебВоркер  types.ИВебВоркер
 	ctx        context.Context
 	фнОтмена   func()
 }
 
 // НовВарБотСеть -- возвращает новый коннект к сети бота
-func НовВарБотСеть(бот types.ИБот) (*ВарБотСеть, error) {
+func НовВарБотСеть(бот types.ИБот) (types.ИБотСеть, error) {
 	if бот == nil {
 		return nil, fmt.Errorf("НовВарБотСеть(): IBot == nil")
 	}
@@ -37,21 +36,20 @@ func НовВарБотСеть(бот types.ИБот) (*ВарБотСеть, e
 	ctx, фнОтмена := context.WithCancel(бот.Кнт())
 	сам := &ВарБотСеть{
 		бот:        бот,
-		сокет:      bot_net_conn.НовБотСетьСокет(),
+		вебСокет:   bot_web_conn.НовБотВебСокет(),
 		еслиОнлайн: safe_bool.НовБезопБул(),
 		ctx:        ctx,
 		фнОтмена:   фнОтмена,
 	}
-	сам.сеть = netclient.NewNetClient(сам)
+	сам.вебВоркер = web_worker.НовВебВоркер(сам, сам.вебСокет.ВебСокет())
 	{ // Подключаем сетевой логин
 		var err error
-		сам.логин, err = bot_net_login.НовБотСетьЛогин(сам)
+		сам.логин, err = bot_net_login.НовБотСетьЛогин(сам, сам.вебСокет.ВебСокет())
 		if err != nil {
 			return nil, fmt.Errorf("НовВарБотСеть(): при создании BotNetLogin, err=\n\t%w", err)
 		}
 	}
 	сам.еслиОнлайн.Уст()
-	_ = types.ИБотСеть(сам)
 	return сам, nil
 }
 
@@ -75,17 +73,12 @@ func (сам *ВарБотСеть) ЕслиОнлайн() *safe_bool.Безоп
 	return сам.еслиОнлайн
 }
 
-// КлиентСеть -- возвращает исполнитель запросов
-func (сам *ВарБотСеть) КлиентСеть() types.ИСетьКлиент {
-	return сам.сеть
-}
-
-// Коннект -- возвращает HTTP-коннект
-func (сам *ВарБотСеть) Коннект() *http.Client {
-	return сам.сокет.Клиент()
+// ВебВоркер -- возвращает веб-воркер бота
+func (сам *ВарБотСеть) ВебВоркер() types.ИВебВоркер {
+	return сам.вебВоркер
 }
 
 // Куки -- возвращает куки для HTTP-коннект
 func (сам *ВарБотСеть) Куки() types.ИБотКуки {
-	return сам.сокет.Куки()
+	return сам.вебСокет.Куки()
 }