package net_stat import ( "strconv" "strings" "wartank/pkg/components/kernel/logger" "wartank/pkg/types" ) /* Исходник предоставляет тип для парсинга статистики уровня танка и сервера. */ // NetStat -- статистика уровня танка и сервера type NetStat struct { server types.ИСервер бот types.ИБот лог types.ИЛоггер } // NewNetStat -- возвращает новый *NetStat func NewNetStat(bot types.ИБот) *NetStat { лог := logger.НовЛоггер("NetStat") лог.Инфо("NewNetStat()\n") лог.Паника(bot == nil, "NewNetStat(): ИБот == nil") сам := &NetStat{ server: bot.Сервер(), бот: bot, лог: лог, } return сам } func (сам *NetStat) Update() { // _mt.Println("\n===NetStat.Update()===") сам.findLevelTank() сам.findLevelProgress() сам.атакаНайти() сам.броняНайти() сам.точностьНайти() сам.прочностьНайти() сам.мощностьНайти() сам.игроковОнлайнНайти() } // Ищет в теле текста ангара мощность танка func (сам *NetStat) мощностьНайти() { lstAngar := сам.бот.Ангар().СписПолучить() if len(lstAngar) == 0 { // log._rintf("WARN NetStat.findPower(): lstAngar is empty\n") return } var strOut string for _, strPower := range lstAngar { if strings.Contains(strPower, `/images/icons/power.png?2`) { strOut = strPower break } } // Выделить мощность lstPower := strings.Split(strOut, ` Танковая мощь: `) strPower := lstPower[1] lstPower = strings.Split(strPower, ``) strPower = lstPower[0] iPower, ош := strconv.Atoi(strPower) сам.лог.Паника(ош != nil, "NetStat.мощностьНайти(): мощность(%v) не число, ош=\n\t%v\n", strPower, ош) сам.бот.Стата().Мощь().Уст(iPower) } // Ищет в теле текста ангара прочность танка func (сам *NetStat) прочностьНайти() { var ( strOut string lstAngar = сам.бот.Ангар().СписПолучить() еслиНайдено bool ) if len(lstAngar) == 0 { // log._rintf("WARN NetStat.findHard(): lstAngar пустой\n") return } for _, strOut = range lstAngar { if strings.Contains(strOut, `/images/icons/durability.png?1`) { еслиНайдено = true break } } if !еслиНайдено { return } // Выделить прочность lstHard := strings.Split(strOut, `Прочность Прочность `) strHard := lstHard[1] lstHard = strings.Split(strHard, `
`) strHard = lstHard[0] iHard, ош := strconv.Atoi(strHard) сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): прочность(%v) не число, ош=\n\t%v\n", strHard, ош) сам.бот.Стата().Прочность().Уст(iHard) } // Ищет в теле текста ангара точность танка func (сам *NetStat) точностьНайти() { var ( strOut string lstAngar = сам.бот.Ангар().СписПолучить() еслиНайдено bool ) if len(lstAngar) == 0 { // log._rintf("WARN NetStat.findFyne(): lstAngar пустой\n") return } for _, strOut = range lstAngar { if strings.Contains(strOut, `/images/icons/accuracy.png?1`) { еслиНайдено = true break } } if !еслиНайдено { return } // Выделить броню lstFyne := strings.Split(strOut, `Точность Точность `) strFyne := lstFyne[1] lstFyne = strings.Split(strFyne, `
`) strFyne = lstFyne[0] iFyne, ош := strconv.Atoi(strFyne) сам.лог.Паника(ош != nil, "NetStat.точностьНайти(): точность(%v) не число, ош=\n\t%v\n", strFyne, ош) сам.бот.Стата().Точность().Уст(iFyne) } // Ищет в теле текста ангара броню танка func (сам *NetStat) броняНайти() { var ( strOut string lstAngar = сам.бот.Ангар().СписПолучить() еслиНайдено bool ) if len(lstAngar) == 0 { return } for _, strOut = range lstAngar { if strings.Contains(strOut, `/images/icons/armor.png?1`) { еслиНайдено = true break } } if !еслиНайдено { return } // Выделить броню lstArmor := strings.Split(strOut, `Броня Броня `) strArmor := lstArmor[1] lstArmor = strings.Split(strArmor, `
`) strArmor = lstArmor[0] iArmor, ош := strconv.Atoi(strArmor) сам.лог.Паника(ош != nil, "NetStat.броняНайти(): броня(%v) не число, ош=\n\t%v\n", strArmor, ош) сам.бот.Стата().Броня().Уст(iArmor) } // Ищет в теле текста ангара уровень танка func (сам *NetStat) findLevelTank() { lstAngar := сам.бот.Ангар().СписПолучить() if len(lstAngar) == 0 { // log._rintf("ERRO NetStat.findLevelTank(): пустой lstAngar") return } var strOut string for _, strLevel := range lstAngar { if strings.Contains(strLevel, "/images/icons/level.png?2") { strOut = strLevel break } } // Выделить уровень lstLevel := strings.Split(strOut, `
`) strLevel := lstLevel[1] lstLevel = strings.Split(strLevel, `
`) strLevel = lstLevel[0] iLevel, ош := strconv.Atoi(strLevel) сам.лог.Паника(ош != nil, "NetStat.прочностьНайти(): уровень(%v) не число, ош=\n\t%v\n", strLevel, ош) сам.бот.Ангар().Уровень().Уст(iLevel) } // Ищет в теле текста ангара прогресс уровня танка танка func (сам *NetStat) findLevelProgress() { lstAngar := сам.бот.Ангар().СписПолучить() сам.лог.Паника(len(lstAngar) == 0, "lstAngar пустой") var strOut string for _, strProg := range lstAngar { if strings.Contains(strProg, `class="progr"`) { strOut = strProg break } } // Выделить прогресс lstProg := strings.Split(strOut, `
 
`) strProg = lstProg[0] iProg, ош := strconv.Atoi(strProg) сам.лог.Паника(ош != nil, "NetStat.прогрессНайти(): прогресс(%v) не число, ош=\n\t%v\n", strProg, ош) сам.бот.Ангар().Прогресс().Уст(iProg) } // Ищет в теле текста ангара силу атаки танка func (сам *NetStat) атакаНайти() { var ( strOut string lstAngar = сам.бот.Ангар().СписПолучить() еслиНайдено bool ) for _, strOut = range lstAngar { if strings.Contains(strOut, `/images/icons/attack.png?1`) { еслиНайдено = true break } } if !еслиНайдено { return } // Выделить атаку списАтака := strings.Split(strOut, `Атака Атака `) стрАтака := списАтака[1] списАтака = strings.Split(стрАтака, `
`) стрАтака = списАтака[0] целАтака, ош := strconv.Atoi(стрАтака) сам.лог.Паника(ош != nil, "NetStat.атакаНайти(): атака(%v) не число, ош=\n\t%v\n", стрАтака, ош) сам.бот.Стата().Атака().Уст(целАтака) } // Ищет в теле текста ангара силу атаки танка func (сам *NetStat) игроковОнлайнНайти() { lstAngar := сам.бот.Ангар().СписПолучить() var strOut string for _, стрАтака := range lstAngar { if strings.Contains(стрАтака, `>Онлайн: `) { strOut = стрАтака break } } // Выделить число игроков онлайн lstAngar = strings.Split(strOut, ``) if len(lstAngar) <= 1 { сам.server.Отменить() return } strOnline := lstAngar[1] lstAngar = strings.Split(strOnline, ``) strOnline = lstAngar[0] iOnline, ош := strconv.Atoi(strOnline) сам.лог.Паника(ош != nil, "NetStat.findOnline(): игроков онлайн(%v) не число, ош=\n\t%v\n", strOnline, ош) сам.бот.Ангар().ИгрокиОнлайн().Уст(iOnline) }