2017-10-11 06:53:50 +04:00
// i2_bot – Instinct PokememBro Bot
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
2017-11-21 06:06:32 +04:00
package users
2017-10-11 06:53:50 +04:00
import (
2018-01-29 23:50:25 +04:00
"sort"
2017-11-24 00:16:22 +04:00
"strconv"
2018-01-29 23:50:25 +04:00
"strings"
"time"
2018-05-02 07:25:39 +04:00
"github.com/go-telegram-bot-api/telegram-bot-api"
2018-05-19 12:14:25 +04:00
"github.com/fat0troll/i2_bot/lib/dbmapping"
2017-10-11 06:53:50 +04:00
)
2017-11-21 06:06:32 +04:00
// Internal functions for Users package
2018-01-29 23:50:25 +04:00
func ( u * Users ) findUsersByLevel ( levelID int ) map [ int ] * dbmapping . PlayerProfile {
selectedUsers := make ( map [ int ] * dbmapping . PlayerProfile )
allUsers := c . DataCache . GetPlayersWithCurrentProfiles ( )
2017-11-24 00:16:22 +04:00
2018-01-29 23:50:25 +04:00
for i := range allUsers {
if allUsers [ i ] . Profile . LevelID == levelID {
if allUsers [ i ] . Player . UpdatedAt . After ( time . Now ( ) . UTC ( ) . Add ( - 72 * time . Hour ) ) {
selectedUsers [ i ] = allUsers [ i ]
2017-11-24 00:16:22 +04:00
}
}
}
2018-01-29 23:50:25 +04:00
return selectedUsers
2017-11-24 00:16:22 +04:00
}
2018-01-29 23:50:25 +04:00
func ( u * Users ) findUserByName ( pattern string ) map [ int ] * dbmapping . PlayerProfile {
selectedUsers := make ( map [ int ] * dbmapping . PlayerProfile )
allUsers := c . DataCache . GetPlayersWithCurrentProfiles ( )
2018-01-23 20:13:16 +04:00
2018-01-29 23:50:25 +04:00
for i := range allUsers {
matchedPattern := false
if strings . Contains ( strings . ToLower ( allUsers [ i ] . Profile . Nickname ) , strings . ToLower ( pattern ) ) {
matchedPattern = true
}
if strings . Contains ( strings . ToLower ( allUsers [ i ] . Profile . TelegramNickname ) , strings . ToLower ( pattern ) ) {
matchedPattern = true
}
if matchedPattern {
selectedUsers [ i ] = allUsers [ i ]
}
2018-01-23 20:13:16 +04:00
}
2018-01-29 23:50:25 +04:00
return selectedUsers
2018-01-23 20:13:16 +04:00
}
2018-02-05 13:00:18 +04:00
func ( u * Users ) findUserByTopAttack ( power int ) map [ int ] * dbmapping . PlayerProfile {
selectedUsers := make ( map [ int ] * dbmapping . PlayerProfile )
allPlayers := c . DataCache . GetPlayersWithCurrentProfiles ( )
profiles := make ( [ ] * dbmapping . PlayerProfile , 0 )
for i := range allPlayers {
if allPlayers [ i ] . Player . LeagueID == 1 {
profiles = append ( profiles , allPlayers [ i ] )
}
}
sort . Slice ( profiles , func ( i , j int ) bool {
return profiles [ i ] . Profile . Power > profiles [ j ] . Profile . Power
} )
for i := ( power - 1 ) ; i < ( power + 2 ) ; i ++ {
if profiles [ i ] != nil {
selectedUsers [ i ] = profiles [ i ]
}
}
return selectedUsers
}
2018-01-29 23:50:25 +04:00
func ( u * Users ) foundUsersMessage ( update * tgbotapi . Update , users map [ int ] * dbmapping . PlayerProfile ) {
var keys [ ] int
for i := range users {
keys = append ( keys , i )
2017-12-02 13:45:24 +04:00
}
2018-01-29 23:50:25 +04:00
sort . Ints ( keys )
2017-12-02 13:45:24 +04:00
2018-01-23 20:13:16 +04:00
message := "*Найденные игроки:*\n"
2018-01-29 23:50:25 +04:00
for _ , i := range keys {
message += "#" + strconv . Itoa ( users [ i ] . Player . ID )
if users [ i ] . HaveProfile {
message += " " + users [ i ] . League . Symbol
message += " " + users [ i ] . Profile . Nickname
if users [ i ] . Profile . TelegramNickname != "" {
message += " (@" + u . FormatUsername ( users [ i ] . Profile . TelegramNickname ) + ")"
}
2018-01-23 20:13:16 +04:00
}
2018-01-29 23:50:25 +04:00
message += " /profile" + strconv . Itoa ( users [ i ] . Player . ID ) + "\n"
message += "Telegram ID: " + strconv . Itoa ( users [ i ] . Player . TelegramID ) + "\n"
2018-02-17 15:55:28 +04:00
message += "Последнее обновление: " + users [ i ] . Profile . CreatedAt . Format ( "02.01.2006 15:04:05" ) + "\n"
2018-01-23 20:19:09 +04:00
if len ( message ) > 2000 {
msg := tgbotapi . NewMessage ( update . Message . Chat . ID , message )
msg . ParseMode = "Markdown"
c . Bot . Send ( msg )
message = ""
}
2018-01-23 20:13:16 +04:00
}
msg := tgbotapi . NewMessage ( update . Message . Chat . ID , message )
msg . ParseMode = "Markdown"
c . Bot . Send ( msg )
}
2017-11-29 10:36:36 +04:00
func ( u * Users ) profileAddSuccessMessage ( update * tgbotapi . Update , leagueID int , level int ) {
2017-10-18 07:03:34 +04:00
message := "*Профиль успешно обновлен.*\n\n"
message += "Функциональность бота держится на актуальности профилей. Обновляйся почаще, и да пребудет с тобой Рандом!\n"
2017-10-11 06:53:50 +04:00
message += "Сохраненный профиль ты можешь просмотреть командой /me.\n\n"
2018-02-05 12:37:46 +04:00
message += "/best – посмотреть лучших покемемов для поимки\n"
2018-02-07 15:00:04 +04:00
message += "/advice – посмотреть самых дорогих покемемов для поимки\n"
2018-02-05 12:37:46 +04:00
message += "/top — посмотреть лучших представителей лиги\n"
message += "/top\\_my — посмотреть лучших представителей лиги твоего уровня\n"
2017-10-11 06:53:50 +04:00
2017-11-29 10:04:54 +04:00
if leagueID == 1 {
2017-12-02 19:50:56 +04:00
message += "\n/bastion — получить ссылку на БАСТИОН лиги\n"
if level < 5 {
message += "\n/academy — получить ссылку на АКАДЕМИЮ лиги\n"
2017-11-29 10:36:36 +04:00
}
2017-11-29 10:04:54 +04:00
}
2017-10-18 07:03:34 +04:00
msg := tgbotapi . NewMessage ( update . Message . Chat . ID , message )
msg . ParseMode = "Markdown"
2017-10-11 06:53:50 +04:00
2017-10-18 07:03:34 +04:00
c . Bot . Send ( msg )
2017-10-11 06:53:50 +04:00
}
2017-11-21 06:06:32 +04:00
func ( u * Users ) profileAddFailureMessage ( update * tgbotapi . Update ) {
2017-10-18 07:03:34 +04:00
message := "*Неудачно получилось :(*\n\n"
message += "Случилась жуткая ошибка, и мы не смогли записать профиль в базу. Напиши @fat0troll, он разберется."
2017-10-11 06:53:50 +04:00
2017-10-18 07:03:34 +04:00
msg := tgbotapi . NewMessage ( update . Message . Chat . ID , message )
msg . ParseMode = "Markdown"
2017-10-11 06:53:50 +04:00
2017-10-18 07:03:34 +04:00
c . Bot . Send ( msg )
2017-10-11 06:53:50 +04:00
}
2017-11-24 00:16:22 +04:00
2018-01-29 23:50:25 +04:00
func ( u * Users ) usersList ( update * tgbotapi . Update , page int , users map [ int ] * dbmapping . PlayerProfile ) {
2017-11-24 00:16:22 +04:00
message := "*Зарегистрированные пользователи бота*\n"
message += "Список отсортирован по ID регистрации.\n"
2018-01-29 23:50:25 +04:00
message += "Количество зарегистрированных пользователей: " + strconv . Itoa ( len ( users ) ) + "\n"
2017-11-24 00:16:22 +04:00
message += "Отображаем пользователей с " + strconv . Itoa ( ( ( page - 1 ) * 25 ) + 1 ) + " по " + strconv . Itoa ( page * 25 ) + "\n"
2018-01-29 23:50:25 +04:00
if len ( users ) > page * 25 {
2017-11-24 00:16:22 +04:00
message += "Переход на следующую страницу: /users" + strconv . Itoa ( page + 1 )
}
if page > 1 {
message += "\nПе р е х о д на предыдущую страницу: /users" + strconv . Itoa ( page - 1 )
}
message += "\n\n"
2018-01-29 23:50:25 +04:00
var keys [ ] int
for i := range users {
keys = append ( keys , i )
}
sort . Ints ( keys )
for _ , i := range keys {
2017-11-24 00:16:22 +04:00
if ( i + 1 > 25 * ( page - 1 ) ) && ( i + 1 < ( 25 * page ) + 1 ) {
2018-01-29 23:50:25 +04:00
message += "#" + strconv . Itoa ( users [ i ] . Player . ID )
if users [ i ] . HaveProfile {
message += " " + users [ i ] . League . Symbol
message += " " + users [ i ] . Profile . Nickname
if users [ i ] . Profile . TelegramNickname != "" {
message += " (@" + u . FormatUsername ( users [ i ] . Profile . TelegramNickname ) + ")"
2017-11-24 00:16:22 +04:00
}
2018-01-29 23:50:25 +04:00
message += " /profile" + strconv . Itoa ( users [ i ] . Player . ID ) + "\n"
message += "Telegram ID: " + strconv . Itoa ( users [ i ] . Player . TelegramID ) + "\n"
message += "Последнее обновление: " + users [ i ] . Profile . CreatedAt . Format ( "02.01.2006 15:04:05" ) + "\n"
2017-11-24 00:16:22 +04:00
} else {
2018-01-29 23:50:25 +04:00
if users [ i ] . Player . Status == "special" {
2017-11-26 16:03:31 +04:00
message += " _с у пе р юзе р _\n"
} else {
message += " _б е з пр о филя_\n"
}
2018-01-29 23:50:25 +04:00
message += "Telegram ID: " + strconv . Itoa ( users [ i ] . Player . TelegramID ) + "\n"
2017-11-24 00:16:22 +04:00
}
}
}
2018-01-29 23:50:25 +04:00
if len ( users ) > page * 25 {
2017-11-24 00:16:22 +04:00
message += "\n"
message += "Переход на следующую страницу: /users" + strconv . Itoa ( page + 1 )
}
if page > 1 {
message += "\nПе р е х о д на предыдущую страницу: /users" + strconv . Itoa ( page - 1 )
}
message += "\nЧто б ы добавить пользователя в отряд, введите команду /squad\\_add\\_user _X Y_ или /squad\\_add\\_commander _X Y_, где _X_ — ID отряда (посмотреть все отряды можно командой /squads), а _Y_ — ID пользователя из списка выше."
msg := tgbotapi . NewMessage ( update . Message . Chat . ID , message )
msg . ParseMode = "Markdown"
c . Bot . Send ( msg )
}