Browse Source

d03 Доработка под шахту-свинец

SVI 2 years ago
parent
commit
ffcf5b5622

+ 1 - 1
server/serv_bots/warbot/angar/base/base.go

@@ -136,7 +136,7 @@ func (sf *База) runComponent() error {
 	if err := sf.банк.Run(); err != nil {
 		return fmt.Errorf("Base.run(): in run IBank, err=\n\t%w", err)
 	}
-	if err := sf.шахта.Run(); err != nil {
+	if err := sf.шахта.Пуск(); err != nil {
 		return fmt.Errorf("Base.run(): in run IMine, err=\n\t%w", err)
 	}
 	if err := sf.ранок.Пуск(); err != nil {

+ 130 - 61
server/serv_bots/warbot/angar/base/mine/mine.go

@@ -5,6 +5,7 @@ import (
 	"log"
 	"strconv"
 	"strings"
+	"time"
 
 	"wartank/pkg/components/section"
 	"wartank/pkg/types"
@@ -19,7 +20,7 @@ import (
 // Шахта -- объект шахты на базе
 type Шахта struct {
 	*section.Section
-	net        *minenet.MineNet
+	сеть       *minenet.MineNet
 	бот        types.ИБот
 	база       types.ИБаза
 	руда       types.ИСтатПарам
@@ -65,20 +66,20 @@ func НовШахта(база types.ИБаза) (*Шахта, error) {
 		свинец:     свинец,
 		numProduct: добычаЧисло,
 	}
-	sf.net, err = minenet.NewMineNet(sf)
+	sf.сеть, err = minenet.NewMineNet(sf)
 	if err != nil {
 		return nil, fmt.Errorf("NewMine(): in create NetMine, err=\n\t%w", err)
 	}
 	return sf, nil
 }
 
-func (sf *Шахта) Run() error {
-	go sf.run()
+func (sf *Шахта) Пуск() error {
+	go sf.пуск()
 	return nil
 }
 
-// run -- запускает обработку шахты
-func (sf *Шахта) run() {
+// пуск -- запускает обработку шахты
+func (sf *Шахта) пуск() {
 	sf.SetCountDown(1)
 	for {
 		select {
@@ -86,34 +87,37 @@ func (sf *Шахта) run() {
 			sf.ВремяОпрос().Стоп()
 			return
 		case <-sf.ВремяОпрос().КаналСиг():
-			log.Printf("Mine.run(): time sig")
+		default:
+			log.Printf("Шахта.пуск(): time sig")
 			sf.Section.SetCountDown(120)
 			work := sf.РежимТекущ().Режим()
-			log.Printf("Mine.run(): work=%v\n", work)
+			log.Printf("Шахта.пуск(): work=%v\n", work)
 			if work == "upgrade" {
 				continue
 			}
-			if err := sf.net.UpdateLst(); err != nil {
+			if err := sf.сеть.UpdateLst(); err != nil {
 				log.Printf("ERRO Mine.Run(): при обновлении lstMine, err=\n\t%v\n", err)
 				continue
 			}
-			if err := sf.selectProduct(); err != nil {
-				log.Printf("ERRO MineNet.Run(): при выборе продукции, err=\n\t%v\n", err)
+			if err := sf.выбратьМеталл(); err != nil {
+				log.Printf("ERRO Шахта.пуск(): при выборе продукции, err=\n\t%v\n", err)
 				continue
 			}
 
 			switch work {
 			case "руда":
-				sf.makeRuda()
+				sf.сделатьРуду()
 			case "железо":
 				sf.makeFerrum()
 			case "сталь":
 				sf.makeSteel()
+			case "свинец":
+				sf.сделатьСвинец()
 			default:
-				// log._rintf("ERRO MineNet.Run(): неизвестный режим производства, режим=%q\n", work)
+				// log._rintf("ERRO Шахта.Run(): неизвестный режим производства, режим=%q\n", work)
 			}
 		}
-		// time.Sleep(time.Second * 30)
+		time.Sleep(time.Minute * 5)
 	}
 }
 
@@ -123,38 +127,44 @@ func (sf *Шахта) Свинец() types.ИСтатПарам {
 }
 
 // Сталь -- возвращает объект стали
-func (sf *Шахта) Сталь() types.ИСтатПарам {
-	return sf.сталь
+func (сам *Шахта) Сталь() types.ИСтатПарам {
+	return сам.сталь
 }
 
 // Железо -- возвращает объект железа
-func (sf *Шахта) Железо() types.ИСтатПарам {
-	return sf.железо
+func (сам *Шахта) Железо() types.ИСтатПарам {
+	return сам.железо
 }
 
 // Руда -- возвращает объект руды
-func (sf *Шахта) Руда() types.ИСтатПарам {
-	return sf.руда
+func (сам *Шахта) Руда() types.ИСтатПарам {
+	return сам.руда
 }
 
 // КолвоСделатьСейчас -- возвращает количество прозводимого продукта
-func (sf *Шахта) КолвоСделатьСейчас() types.ИСтатПарам {
-	return sf.numProduct
+func (сам *Шахта) КолвоСделатьСейчас() types.ИСтатПарам {
+	return сам.numProduct
 }
 
 // Выбирает продукцию по возможности произвести и её количеству
-func (sf *Шахта) selectProduct() error {
+func (сам *Шахта) выбратьМеталл() error {
 	var (
 		mapProduct = make(map[string]bool) // Словарь известной продукции
-		lstMine    = sf.СписПолучить()
+		lstMine    = сам.СписПолучить()
 	)
 
-	fnProduct := func() { // вычисляет список допустимой продукции
+	фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
 		mapProduct["ruda"] = true // Руда есть всегда
 		mapProduct["ferrum"] = false
 		mapProduct["steel"] = false
 		mapProduct["plumbum"] = false
-		for _, strProd := range lstMine { // Проверить железо
+		for _, strProd := range lstMine { // Проверить руду
+			if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
+				mapProduct["ruda"] = true
+				break
+			}
+		}
+		for _, strProd := range lstMine { // Проверить руду
 			if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
 				mapProduct["ferrum"] = true
 				break
@@ -173,28 +183,27 @@ func (sf *Шахта) selectProduct() error {
 			}
 		}
 	}
-	fnProduct()
-	sf.РежимТекущ().РежимУст("руда")
-	ruda := sf.Руда().Получ()
-
-	ferrum := sf.Железо().Получ()
+	фнВыбратьПродукт()
+	сам.РежимТекущ().РежимУст("руда")
+	руда := сам.Руда().Получ()
+	железо := сам.Железо().Получ()
 	if mapProduct["ferrum"] {
-		if ruda >= ferrum*2 {
-			sf.РежимТекущ().РежимУст("железо")
+		if руда >= железо*2 {
+			сам.РежимТекущ().РежимУст("железо")
 		}
 	}
 
-	steel := sf.Сталь().Получ()
+	steel := сам.Сталь().Получ()
 	if mapProduct["steel"] {
-		if ferrum >= steel*2 {
-			sf.РежимТекущ().РежимУст("сталь")
+		if железо >= steel*2 {
+			сам.РежимТекущ().РежимУст("сталь")
 		}
 	}
 
-	plumbum := sf.Свинец().Получ()
+	plumbum := сам.Свинец().Получ()
 	if mapProduct["plumbum"] {
 		if steel > plumbum*2 {
-			sf.РежимТекущ().РежимУст("свинец")
+			сам.РежимТекущ().РежимУст("свинец")
 		}
 	}
 
@@ -202,9 +211,9 @@ func (sf *Шахта) selectProduct() error {
 }
 
 // Создаёт руду
-func (sf *Шахта) makeRuda() {
+func (сам *Шахта) сделатьРуду() {
 	var (
-		lstMine = sf.СписПолучить()
+		lstMine = сам.СписПолучить()
 		ind     int
 		strOut  string
 		strTime string
@@ -231,24 +240,24 @@ func (sf *Шахта) makeRuda() {
 	strLink = lstLink[1]
 	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 	strLink = "http://wartank.ru/production/" + lstLink[0]
-	lstMine, err := sf.net.Get(strLink)
+	lstMine, err := сам.сеть.Get(strLink)
 	if err != nil {
-		// log._rintf("ERRO MineNet.makeRuda(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
+		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
 		return
 	}
 	isFind = false
 	for _, strOut = range lstMine {
 		if strings.Contains(strOut, `<title>База</title>`) {
-			// log._rintf("WARN MineNet.makeRuda(): при обновлении lstMine обнаружено lstBase\n")
+			// log._rintf("WARN Шахта.сделатьРуду(): при обновлении lstMine обнаружено lstBase\n")
 			return
 		}
 	}
-	if err = sf.СтрОбновить(lstMine); err != nil {
-		// log._rintf("ERRO MineNet.makeRuda(): при обновлении lstMine, err=\n\t%v\n", err)
+	if err = сам.СтрОбновить(lstMine); err != nil {
+		// log._rintf("ERRO Шахта.сделатьРуду(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	if err := sf.ParseCountDown(strTime); err != nil {
-		log.Printf("ERRO Mine.makeRuda(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
+	if err := сам.ParseCountDown(strTime); err != nil {
+		log.Printf("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
 	strNum = lstNum[1]
@@ -256,16 +265,16 @@ func (sf *Шахта) makeRuda() {
 	strNum = lstNum[0]
 	iNum, err := strconv.Atoi(strNum)
 	if err != nil {
-		// log._rintf("ERRO MineNet.makeRuda(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
+		// log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return
 	}
-	sf.КолвоСделатьСейчас().Уст(iNum)
+	сам.КолвоСделатьСейчас().Уст(iNum)
 }
 
 // Создаёт железо
-func (sf *Шахта) makeFerrum() {
+func (сам *Шахта) makeFerrum() {
 	var (
-		lstMine = sf.СписПолучить()
+		lstMine = сам.СписПолучить()
 		ind     int
 		strOut  string
 		strTime string
@@ -292,7 +301,7 @@ func (sf *Шахта) makeFerrum() {
 	strLink = lstLink[1]
 	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 	strLink = "http://wartank.ru/production/" + lstLink[0]
-	lstMine, err := sf.net.Get(strLink)
+	lstMine, err := сам.сеть.Get(strLink)
 	if err != nil {
 		// log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
 		return
@@ -303,11 +312,11 @@ func (sf *Шахта) makeFerrum() {
 			return
 		}
 	}
-	if err = sf.СтрОбновить(lstMine); err != nil {
+	if err = сам.СтрОбновить(lstMine); err != nil {
 		// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	if err := sf.ParseCountDown(strTime); err != nil {
+	if err := сам.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
@@ -319,13 +328,13 @@ func (sf *Шахта) makeFerrum() {
 		// log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return
 	}
-	sf.КолвоСделатьСейчас().Уст(iNum)
+	сам.КолвоСделатьСейчас().Уст(iNum)
 }
 
 // Создаёт сталь
-func (sf *Шахта) makeSteel() {
+func (сам *Шахта) makeSteel() {
 	var (
-		lstMine = sf.СписПолучить()
+		lstMine = сам.СписПолучить()
 		ind     int
 		strOut  string
 		strTime string
@@ -352,7 +361,7 @@ func (sf *Шахта) makeSteel() {
 	strLink = lstLink[1]
 	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
 	strLink = "http://wartank.ru/production/" + lstLink[0]
-	lstMine, err := sf.net.Get(strLink)
+	lstMine, err := сам.сеть.Get(strLink)
 	if err != nil {
 		// log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
 		return
@@ -363,11 +372,11 @@ func (sf *Шахта) makeSteel() {
 			return
 		}
 	}
-	if err = sf.СтрОбновить(lstMine); err != nil {
+	if err = сам.СтрОбновить(lstMine); err != nil {
 		// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
 		return
 	}
-	if err := sf.ParseCountDown(strTime); err != nil {
+	if err := сам.ParseCountDown(strTime); err != nil {
 		log.Printf("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
 	}
 	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
@@ -379,5 +388,65 @@ func (sf *Шахта) makeSteel() {
 		// log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
 		return
 	}
-	sf.КолвоСделатьСейчас().Уст(iNum)
+	сам.КолвоСделатьСейчас().Уст(iNum)
+}
+
+// Создаёт свинец
+func (сам *Шахта) сделатьСвинец() {
+	var (
+		lstMine = сам.СписПолучить()
+		ind     int
+		strOut  string
+		strTime string
+		strLink string
+		strNum  string
+		isFind  bool
+	)
+	for ind, strOut = range lstMine {
+		if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
+			strNum = lstMine[ind+1]
+			strTime = lstMine[ind+3]
+			strLink = lstMine[ind+10]
+			isFind = true
+			break
+		}
+	}
+	if !isFind {
+		return
+	}
+	if !strings.Contains(strLink, `>Начать производство<`) {
+		return
+	}
+	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
+	strLink = lstLink[1]
+	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
+	strLink = "http://wartank.ru/production/" + lstLink[0]
+	lstMine, err := сам.сеть.Get(strLink)
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
+		return
+	}
+	for _, strOut := range lstMine { // Проверка на базу
+		if strings.Contains(strOut, `<title>База</title>`) {
+			// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
+			return
+		}
+	}
+	if err = сам.СтрОбновить(lstMine); err != nil {
+		// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine, err=\n\t%v\n", err)
+		return
+	}
+	if err := сам.ParseCountDown(strTime); err != nil {
+		log.Printf("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
+	}
+	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
+	strNum = lstNum[1]
+	lstNum = strings.Split(strNum, `</span><br/>`)
+	strNum = lstNum[0]
+	iNum, err := strconv.Atoi(strNum)
+	if err != nil {
+		// log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
+		return
+	}
+	сам.КолвоСделатьСейчас().Уст(iNum)
 }