|
|
@@ -4,6 +4,7 @@ import (
|
|
|
"fmt"
|
|
|
"log"
|
|
|
"strings"
|
|
|
+ "time"
|
|
|
|
|
|
"wartank/pkg/components/section"
|
|
|
"wartank/pkg/types"
|
|
|
@@ -14,25 +15,25 @@ import (
|
|
|
Объект рынка
|
|
|
*/
|
|
|
|
|
|
-// Market -- объект рынка
|
|
|
-type Market struct {
|
|
|
+// Рынок -- объект рынка
|
|
|
+type Рынок struct {
|
|
|
*section.Section
|
|
|
- bot types.ИБот
|
|
|
- net *marketnet.MarketNet
|
|
|
+ бот types.ИБот
|
|
|
+ сеть *marketnet.MarketNet
|
|
|
}
|
|
|
|
|
|
-// NewMarket -- возвращает новый рынок
|
|
|
-func NewMarket(base types.ИБаза) (*Market, error) {
|
|
|
- section, err := section.NewSection(base.Бот(), "Рынок", `<title>Рынок</title>`)
|
|
|
+// НовРынок -- возвращает новый рынок
|
|
|
+func НовРынок(база types.ИБаза) (*Рынок, error) {
|
|
|
+ section, err := section.NewSection(база.Бот(), "Рынок", `<title>Рынок</title>`)
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("NewMarket(): in create *Section, err=\n\t%w", err)
|
|
|
}
|
|
|
- sf := &Market{
|
|
|
+ sf := &Рынок{
|
|
|
Section: section,
|
|
|
- bot: base.Бот(),
|
|
|
+ бот: база.Бот(),
|
|
|
}
|
|
|
{ // Маркет
|
|
|
- sf.net, err = marketnet.NewMarketNet(sf)
|
|
|
+ sf.сеть, err = marketnet.NewMarketNet(sf)
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("NewMarket(): in create NetMarket, err=\n\t%w", err)
|
|
|
}
|
|
|
@@ -40,44 +41,48 @@ func NewMarket(base types.ИБаза) (*Market, error) {
|
|
|
return sf, nil
|
|
|
}
|
|
|
|
|
|
-// Run -- запускает всю работу рынка в отдельном потоке
|
|
|
-func (sf *Market) Run() error {
|
|
|
- go sf.run()
|
|
|
+// Пуск -- запускает всю работу рынка в отдельном потоке
|
|
|
+func (сам *Рынок) Пуск() error {
|
|
|
+ go сам.пуск()
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// выполняет опрос рынка базы, должен работать как горутина
|
|
|
-func (sf *Market) run() {
|
|
|
- sf.SetCountDown(25)
|
|
|
+func (сам *Рынок) пуск() {
|
|
|
+ сам.SetCountDown(25)
|
|
|
for {
|
|
|
select {
|
|
|
- case <-sf.bot.Кнт().Done():
|
|
|
- sf.ВремяОпрос().Стоп()
|
|
|
+ case <-сам.бот.Кнт().Done():
|
|
|
+ сам.ВремяОпрос().Стоп()
|
|
|
return
|
|
|
- case <-sf.ВремяОпрос().КаналСиг():
|
|
|
- log.Printf("Market.run(): timeCount=%v\n", sf.ВремяОпрос().Получ())
|
|
|
- _ = sf.buyGold()
|
|
|
+ case <-сам.ВремяОпрос().КаналСиг():
|
|
|
+ log.Printf("Market.run(): timeCount=%v\n", сам.ВремяОпрос().Получ())
|
|
|
+ _ = сам.купитьЗолото()
|
|
|
// Если золото не куплено -- обновить время ожидания
|
|
|
- sf.checkTime()
|
|
|
- sf.SetCountDown(120)
|
|
|
+ сам.SetCountDown(120)
|
|
|
}
|
|
|
+ сам.проверОжидание()
|
|
|
+ for сам.купитьЗолото() {
|
|
|
+
|
|
|
+ }
|
|
|
+ time.Sleep(time.Minute * 1)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Проверяет время ожидания рынка
|
|
|
-func (sf *Market) checkTime() {
|
|
|
+func (сам *Рынок) проверОжидание() {
|
|
|
var (
|
|
|
strOut string
|
|
|
isFind bool
|
|
|
)
|
|
|
// countDown := sf.CountDown().Get()
|
|
|
- fnIsSilver := func() bool { // Найти счётчик цены серебра
|
|
|
- if err := sf.net.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка
|
|
|
+ фнЕслиСеребро := func() bool { // Найти счётчик цены серебра
|
|
|
+ if err := сам.сеть.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка
|
|
|
log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err)
|
|
|
return false
|
|
|
}
|
|
|
isFind := false
|
|
|
- lstMarket := sf.СписПолучить()
|
|
|
+ lstMarket := сам.СписПолучить()
|
|
|
for _, strOut = range lstMarket {
|
|
|
if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
|
|
|
isFind = true
|
|
|
@@ -91,13 +96,18 @@ func (sf *Market) checkTime() {
|
|
|
case "10", "50", "100", "500":
|
|
|
return true
|
|
|
default:
|
|
|
+ серебро := сам.бот.Ангар().СереброВсего()
|
|
|
+ if серебро.Получ() > 1_000_000 {
|
|
|
+ return true
|
|
|
+ }
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
|
return false
|
|
|
}
|
|
|
+
|
|
|
fnGetCountDown := func() { // Искать счётчик времени
|
|
|
- lstMarket := sf.СписПолучить()
|
|
|
+ lstMarket := сам.СписПолучить()
|
|
|
// Найти счётчик времени
|
|
|
for _, strOut = range lstMarket {
|
|
|
if strings.Contains(strOut, `Минимальная цена через `) {
|
|
|
@@ -110,24 +120,24 @@ func (sf *Market) checkTime() {
|
|
|
}
|
|
|
lstTime := strings.Split(strOut, `Минимальная цена через `)
|
|
|
strTime := lstTime[1]
|
|
|
- if err := sf.ParseCountDown(strTime); err != nil {
|
|
|
+ if err := сам.ParseCountDown(strTime); err != nil {
|
|
|
// log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err)
|
|
|
return // Возможно минимальная цена
|
|
|
}
|
|
|
}
|
|
|
- if fnIsSilver() {
|
|
|
+ if фнЕслиСеребро() {
|
|
|
return
|
|
|
}
|
|
|
fnGetCountDown()
|
|
|
}
|
|
|
|
|
|
// Проверяет рынок на режим покупки
|
|
|
-func (sf *Market) buyGold() bool {
|
|
|
+func (сам *Рынок) купитьЗолото() bool {
|
|
|
var (
|
|
|
ind int
|
|
|
isFind bool
|
|
|
strOut string
|
|
|
- lstMarket = sf.СписПолучить()
|
|
|
+ lstMarket = сам.СписПолучить()
|
|
|
strSilver string
|
|
|
)
|
|
|
for ind, strOut = range lstMarket {
|
|
|
@@ -136,38 +146,50 @@ func (sf *Market) buyGold() bool {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- if isFind { // Найдена продажа золота за серебро
|
|
|
- lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
|
|
|
- strSilver = lstSilver[1]
|
|
|
- switch strSilver {
|
|
|
- case "10", "50", "100", "500": // Допустимые суммы трат
|
|
|
- ind -= 15
|
|
|
- strOut = lstMarket[ind]
|
|
|
- lstLink := strings.Split(strOut, `<a class="simple-but border mb5" href="`)
|
|
|
- if len(lstLink) < 2 {
|
|
|
- return false
|
|
|
- }
|
|
|
- strLink := lstLink[1]
|
|
|
- lstLink = strings.Split(strLink, `"><span><span>Получить `)
|
|
|
- strLink = "http://wartank.ru/" + lstLink[0]
|
|
|
- lstMarket, err := sf.net.Get(strLink)
|
|
|
- if err != nil {
|
|
|
- // log._rintf("ERRO Market.buyGold(): при выполнении GET-команды на покупку золота, err=\n\t%v\n", err)
|
|
|
- return true
|
|
|
- }
|
|
|
- for _, strOut = range lstMarket {
|
|
|
- if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) {
|
|
|
- // log._rintf("ERRO Market.buyGold(): при получении lstMarket, strHTML=%v, err=\nt%v\n", strOut, err)
|
|
|
- return false
|
|
|
- }
|
|
|
- }
|
|
|
- if err = sf.СтрОбновить(lstMarket); err != nil {
|
|
|
- // log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err)
|
|
|
- return true
|
|
|
- }
|
|
|
- default: // Недопустимая сумма, либо больше чем надо
|
|
|
+ if !isFind { // Не найдена продажа золота за серебро
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
|
|
|
+ strSilver = lstSilver[1]
|
|
|
+ серебро := сам.бот.Ангар().СереброВсего().Получ()
|
|
|
+ еслиКупить := false
|
|
|
+ switch strSilver {
|
|
|
+ case "10", "50", "100", "500": // Допустимые суммы трат
|
|
|
+ еслиКупить = true
|
|
|
+ case "1000": // Если стоит тысяча серебра
|
|
|
+ if серебро > 500_000 { // Если серебра больше полумиллона -- покупаем
|
|
|
+ еслиКупить = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if серебро > 1_000_000 { // Если серебра больше миллиона то покупаем, пока не будет меньше миллиона
|
|
|
+ еслиКупить = true
|
|
|
+ }
|
|
|
+ if !еслиКупить {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ ind -= 15
|
|
|
+ strOut = lstMarket[ind]
|
|
|
+ lstLink := strings.Split(strOut, `<a class="simple-but border mb5" href="`)
|
|
|
+ if len(lstLink) < 2 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ strLink := lstLink[1]
|
|
|
+ lstLink = strings.Split(strLink, `"><span><span>Получить `)
|
|
|
+ strLink = "http://wartank.ru/" + lstLink[0]
|
|
|
+ lstMarket, err := сам.сеть.Get(strLink)
|
|
|
+ if err != nil {
|
|
|
+ // log._rintf("ERRO Market.buyGold(): при выполнении GET-команды на покупку золота, err=\n\t%v\n", err)
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ for _, strOut = range lstMarket {
|
|
|
+ if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) {
|
|
|
+ // log._rintf("ERRO Market.buyGold(): при получении lstMarket, strHTML=%v, err=\nt%v\n", strOut, err)
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
|
+ if err = сам.СтрОбновить(lstMarket); err != nil {
|
|
|
+ // log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err)
|
|
|
+ return true
|
|
|
+ }
|
|
|
return true
|
|
|
}
|