Vladimir Hodakov
c9855116da
As result of profile format change, introduced in game update yesterday we need to change profile regexp. As result of some refactoring, rarely changed data removed from database and added to sources of bot.
242 lines
7.7 KiB
Go
242 lines
7.7 KiB
Go
// i2_bot – Instinct PokememBro Bot
|
||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||
|
||
package users
|
||
|
||
import (
|
||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||
"source.wtfteam.pro/i2_bot/i2_bot/lib/dbmapping"
|
||
"strconv"
|
||
"strings"
|
||
)
|
||
|
||
// FormatUsername formats Telegram username for posting
|
||
func (u *Users) FormatUsername(userName string) string {
|
||
return strings.Replace(userName, "_", `\_`, -1)
|
||
}
|
||
|
||
// FindByLevel finds user with level and recent profile update
|
||
func (u *Users) FindByLevel(update *tgbotapi.Update) string {
|
||
commandArgs := update.Message.CommandArguments()
|
||
if commandArgs == "" {
|
||
c.Talkers.BotError(update)
|
||
return "fail"
|
||
}
|
||
|
||
levelID, err := strconv.Atoi(commandArgs)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
return "fail"
|
||
}
|
||
|
||
users := u.findUsersByLevel(levelID)
|
||
|
||
u.foundUsersMessage(update, users)
|
||
|
||
return "ok"
|
||
}
|
||
|
||
// FindByName finds user with such username or nickname
|
||
func (u *Users) FindByName(update *tgbotapi.Update) string {
|
||
commandArgs := update.Message.CommandArguments()
|
||
if commandArgs == "" {
|
||
c.Talkers.BotError(update)
|
||
return "fail"
|
||
}
|
||
|
||
users := u.findUserByName(commandArgs)
|
||
|
||
u.foundUsersMessage(update, users)
|
||
|
||
return "ok"
|
||
}
|
||
|
||
// FindByTopAttack finds user by top-attack rating
|
||
func (u *Users) FindByTopAttack(update *tgbotapi.Update) string {
|
||
commandArgs := update.Message.CommandArguments()
|
||
if commandArgs == "" {
|
||
c.Talkers.BotError(update)
|
||
return "fail"
|
||
}
|
||
|
||
attackInt, err := strconv.Atoi(commandArgs)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
c.Talkers.BotError(update)
|
||
return "fail"
|
||
}
|
||
|
||
users := u.findUserByTopAttack(attackInt)
|
||
|
||
u.foundUsersMessage(update, users)
|
||
|
||
return "ok"
|
||
}
|
||
|
||
// ForeignProfileMessage shows profile of another user
|
||
func (u *Users) ForeignProfileMessage(update *tgbotapi.Update) string {
|
||
userNum := strings.TrimPrefix(update.Message.Command(), "profile")
|
||
userID, err := strconv.Atoi(userNum)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
return "fail"
|
||
}
|
||
|
||
playerRaw, err := c.DataCache.GetPlayerByID(userID)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
return "fail"
|
||
}
|
||
|
||
_, err = c.DataCache.GetProfileByPlayerID(playerRaw.ID)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
return c.Talkers.BotError(update)
|
||
}
|
||
|
||
return u.ProfileMessage(update, playerRaw)
|
||
}
|
||
|
||
// ProfileAddEffectsMessage shows when user tries to post profile with effects enabled
|
||
func (u *Users) ProfileAddEffectsMessage(update *tgbotapi.Update) string {
|
||
message := "*Наркоман, штоле?*\n\n"
|
||
message += "Бот не принимает профили во время активированных эффектов. Закончи свои дела и принеси чистый профиль через полчаса."
|
||
|
||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||
msg.ParseMode = "Markdown"
|
||
|
||
c.Bot.Send(msg)
|
||
|
||
return "fail"
|
||
}
|
||
|
||
// ProfileMessage shows current player's profile
|
||
func (u *Users) ProfileMessage(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||
profileRaw, err := c.DataCache.GetProfileByPlayerID(playerRaw.ID)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
return c.Talkers.AnyMessageUnauthorized(update)
|
||
}
|
||
league, err := c.DataCache.GetLeagueByID(playerRaw.LeagueID)
|
||
if err != nil {
|
||
c.Log.Error(err.Error())
|
||
return c.Talkers.BotError(update)
|
||
}
|
||
level := dbmapping.Level{}
|
||
err = c.Db.Get(&level, c.Db.Rebind("SELECT * FROM levels WHERE id=?"), profileRaw.LevelID)
|
||
if err != nil {
|
||
c.Log.Error(err)
|
||
}
|
||
weapon, err := c.DataCache.GetWeaponTypeByID(profileRaw.WeaponID)
|
||
if err != nil {
|
||
// It's non critical
|
||
c.Log.Debug(err.Error())
|
||
}
|
||
profilePokememes := []dbmapping.ProfilePokememe{}
|
||
err = c.Db.Select(&profilePokememes, c.Db.Rebind("SELECT * FROM profiles_pokememes WHERE profile_id=?"), profileRaw.ID)
|
||
if err != nil {
|
||
c.Log.Error(err)
|
||
}
|
||
pokememes := []dbmapping.Pokememe{}
|
||
err = c.Db.Select(&pokememes, c.Db.Rebind("SELECT * FROM pokememes"))
|
||
if err != nil {
|
||
c.Log.Error(err)
|
||
}
|
||
|
||
attackPokememes := 0
|
||
for i := range profilePokememes {
|
||
for j := range pokememes {
|
||
if profilePokememes[i].PokememeID == pokememes[j].ID {
|
||
singleAttack := profilePokememes[i].PokememeAttack
|
||
attackPokememes += singleAttack
|
||
}
|
||
}
|
||
}
|
||
|
||
message := "*Профиль игрока "
|
||
message += profileRaw.Nickname + "*"
|
||
if profileRaw.TelegramNickname != "" {
|
||
message += " (@" + u.FormatUsername(profileRaw.TelegramNickname) + ")"
|
||
}
|
||
message += "\nЛига: " + league.Symbol + league.Name
|
||
message += "\n👤 " + strconv.Itoa(profileRaw.LevelID)
|
||
message += " | 🎓 " + strconv.Itoa(profileRaw.Exp) + "/" + strconv.Itoa(level.MaxExp)
|
||
message += " | 🥚 " + strconv.Itoa(profileRaw.EggExp) + "/" + strconv.Itoa(level.MaxEgg)
|
||
message += "\n💲" + c.Statistics.GetPrintablePoints(profileRaw.Wealth)
|
||
message += " |💎" + strconv.Itoa(profileRaw.Crystalls)
|
||
message += " |⭕" + strconv.Itoa(profileRaw.Pokeballs)
|
||
if weapon != nil {
|
||
message += "\n⚔Атака: " + c.Statistics.GetPrintablePoints(weapon.Power) + " + " + c.Statistics.GetPrintablePoints(attackPokememes) + "\n"
|
||
} else {
|
||
message += "\n⚔Атака: " + c.Statistics.GetPrintablePoints(attackPokememes) + "\n"
|
||
}
|
||
|
||
if profileRaw.WeaponID != 0 {
|
||
message += "\n🔫Оружие: " + weapon.Name + " " + c.Statistics.GetPrintablePoints(weapon.Power) + "⚔"
|
||
}
|
||
|
||
message += "\n🐱Покемемы:"
|
||
for i := range profilePokememes {
|
||
for j := range pokememes {
|
||
if profilePokememes[i].PokememeID == pokememes[j].ID {
|
||
message += "\n" + strconv.Itoa(pokememes[j].Grade)
|
||
message += "⃣ " + pokememes[j].Name
|
||
message += " +" + c.Statistics.GetPrintablePoints(profilePokememes[i].PokememeAttack) + "⚔"
|
||
}
|
||
}
|
||
}
|
||
message += "\nСтоимость покемемов на руках: " + c.Statistics.GetPrintablePoints(profileRaw.PokememesWealth) + "$"
|
||
message += "\n\n💳" + strconv.Itoa(playerRaw.TelegramID)
|
||
|
||
if playerRaw.Status == "owner" {
|
||
message += "\n\nСтатус в боте: _владелец_"
|
||
} else if playerRaw.Status == "admin" {
|
||
message += "\n\nСтатус в боте: _администратор_"
|
||
} else if playerRaw.Status == "academic" {
|
||
message += "\n\nСтатус в боте: _академик_"
|
||
} else {
|
||
message += "\n\nСтатус в боте: _игрок_"
|
||
}
|
||
|
||
squadRoles := c.DataCache.GetUserRolesInSquads(playerRaw.ID)
|
||
if len(squadRoles) > 0 {
|
||
for i := range squadRoles {
|
||
if squadRoles[i].UserRole == "commander" {
|
||
message += "\nКомандир отряда " + squadRoles[i].Squad.Chat.Name
|
||
} else {
|
||
message += "\nУчастник отряда " + squadRoles[i].Squad.Chat.Name
|
||
}
|
||
}
|
||
}
|
||
|
||
message += "\n\n⏰Последнее обновление профиля: " + profileRaw.CreatedAt.Format("02.01.2006 15:04:05")
|
||
message += "\nНе забывай обновляться, это важно для получения актуальной информации.\n\n"
|
||
message += "/best – посмотреть лучших покемемов для поимки\n"
|
||
message += "/advice – посмотреть самых дорогих покемемов для поимки\n"
|
||
message += "/top — посмотреть лучших игроков лиги\n"
|
||
message += "/top\\_my — посмотреть лучших игроков лиги твоего уровня\n"
|
||
|
||
c.Log.Debug(message)
|
||
|
||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||
msg.ParseMode = "Markdown"
|
||
|
||
c.Bot.Send(msg)
|
||
|
||
return "ok"
|
||
}
|
||
|
||
// UsersList lists all known users
|
||
func (u *Users) UsersList(update *tgbotapi.Update) string {
|
||
pageNumber := strings.Replace(update.Message.Text, "/users", "", 1)
|
||
pageNumber = strings.Replace(pageNumber, "/users", "", 1)
|
||
page, _ := strconv.Atoi(pageNumber)
|
||
if page == 0 {
|
||
page = 1
|
||
}
|
||
users := c.DataCache.GetPlayersWithCurrentProfiles()
|
||
|
||
u.usersList(update, page, users)
|
||
return "ok"
|
||
}
|