|
|
@@ -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)
|
|
|
}
|