Massive refactoring for future development
This commit is contained in:
24
lib/pokedexer/exported.go
Normal file
24
lib/pokedexer/exported.go
Normal file
@@ -0,0 +1,24 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package pokedexer
|
||||
|
||||
import (
|
||||
// local
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/appcontext"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/pokedexer/pokedexerinterface"
|
||||
)
|
||||
|
||||
var (
|
||||
c *appcontext.Context
|
||||
)
|
||||
|
||||
// Pokedexer is a function-handling struct for package pokedexer
|
||||
type Pokedexer struct{}
|
||||
|
||||
// New is an initialization function for appcontext
|
||||
func New(ac *appcontext.Context) {
|
||||
c = ac
|
||||
p := &Pokedexer{}
|
||||
c.RegisterPokedexerInterface(pokedexerinterface.PokedexerInterface(p))
|
||||
}
|
180
lib/pokedexer/getters.go
Normal file
180
lib/pokedexer/getters.go
Normal file
@@ -0,0 +1,180 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package pokedexer
|
||||
|
||||
import (
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Internal functions
|
||||
|
||||
func (p *Pokedexer) formFullPokememes(pokememes []dbmapping.Pokememe) ([]dbmapping.PokememeFull, bool) {
|
||||
pokememesArray := []dbmapping.PokememeFull{}
|
||||
elements := []dbmapping.Element{}
|
||||
err := c.Db.Select(&elements, "SELECT * FROM elements")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return pokememesArray, false
|
||||
}
|
||||
locations := []dbmapping.Location{}
|
||||
err = c.Db.Select(&locations, "SELECT * FROM locations")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return pokememesArray, false
|
||||
}
|
||||
pokememesElements := []dbmapping.PokememeElement{}
|
||||
err = c.Db.Select(&pokememesElements, "SELECT * FROM pokememes_elements")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return pokememesArray, false
|
||||
}
|
||||
pokememesLocations := []dbmapping.PokememeLocation{}
|
||||
err = c.Db.Select(&pokememesLocations, "SELECT * FROM pokememes_locations")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return pokememesArray, false
|
||||
}
|
||||
|
||||
for i := range pokememes {
|
||||
fullPokememe := dbmapping.PokememeFull{}
|
||||
elementsListed := []dbmapping.Element{}
|
||||
locationsListed := []dbmapping.Location{}
|
||||
|
||||
for j := range pokememesLocations {
|
||||
if pokememesLocations[j].PokememeID == pokememes[i].ID {
|
||||
for l := range locations {
|
||||
if pokememesLocations[j].LocationID == locations[l].ID {
|
||||
locationsListed = append(locationsListed, locations[l])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for k := range pokememesElements {
|
||||
if pokememesElements[k].PokememeID == pokememes[i].ID {
|
||||
for e := range elements {
|
||||
if pokememesElements[k].ElementID == elements[e].ID {
|
||||
elementsListed = append(elementsListed, elements[e])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fullPokememe.Pokememe = pokememes[i]
|
||||
fullPokememe.Elements = elementsListed
|
||||
fullPokememe.Locations = locationsListed
|
||||
|
||||
pokememesArray = append(pokememesArray, fullPokememe)
|
||||
}
|
||||
|
||||
return pokememesArray, true
|
||||
}
|
||||
|
||||
// External functions
|
||||
|
||||
// GetPokememes returns all existing pokememes, known by bot
|
||||
func (p *Pokedexer) GetPokememes() ([]dbmapping.PokememeFull, bool) {
|
||||
pokememesArray := []dbmapping.PokememeFull{}
|
||||
pokememes := []dbmapping.Pokememe{}
|
||||
err := c.Db.Select(&pokememes, "SELECT * FROM pokememes ORDER BY grade asc, name asc")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return pokememesArray, false
|
||||
}
|
||||
|
||||
pokememesArray, ok := p.formFullPokememes(pokememes)
|
||||
return pokememesArray, ok
|
||||
}
|
||||
|
||||
func (p *Pokedexer) getBestPokememes(playerID int) ([]dbmapping.PokememeFull, bool) {
|
||||
pokememesArray := []dbmapping.PokememeFull{}
|
||||
playerRaw, ok := c.Users.GetPlayerByID(playerID)
|
||||
if !ok {
|
||||
return pokememesArray, ok
|
||||
}
|
||||
profileRaw, ok := c.Users.GetProfile(playerID)
|
||||
if !ok {
|
||||
return pokememesArray, ok
|
||||
}
|
||||
|
||||
if playerRaw.LeagueID == 0 {
|
||||
return pokememesArray, false
|
||||
}
|
||||
|
||||
// TODO: make it more complicated
|
||||
pokememes := []dbmapping.Pokememe{}
|
||||
err := c.Db.Select(&pokememes, c.Db.Rebind("SELECT p.* FROM pokememes p, pokememes_elements pe, elements e WHERE e.league_id = ? AND p.grade = ? AND pe.element_id = e.id AND pe.pokememe_id = p.id ORDER BY p.attack DESC"), playerRaw.LeagueID, profileRaw.LevelID+1)
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return pokememesArray, false
|
||||
}
|
||||
|
||||
pokememesArray, ok = p.formFullPokememes(pokememes)
|
||||
return pokememesArray, ok
|
||||
}
|
||||
|
||||
// GetPokememeByID returns single pokememe based on internal ID in database
|
||||
func (p *Pokedexer) GetPokememeByID(pokememeID string) (dbmapping.PokememeFull, bool) {
|
||||
fullPokememe := dbmapping.PokememeFull{}
|
||||
pokememe := dbmapping.Pokememe{}
|
||||
err := c.Db.Get(&pokememe, c.Db.Rebind("SELECT * FROM pokememes WHERE id=?"), pokememeID)
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return fullPokememe, false
|
||||
}
|
||||
elements := []dbmapping.Element{}
|
||||
err = c.Db.Select(&elements, "SELECT * FROM elements")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return fullPokememe, false
|
||||
}
|
||||
locations := []dbmapping.Location{}
|
||||
err = c.Db.Select(&locations, "SELECT * FROM locations")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return fullPokememe, false
|
||||
}
|
||||
pokememesElements := []dbmapping.PokememeElement{}
|
||||
err = c.Db.Select(&pokememesElements, "SELECT * FROM pokememes_elements WHERE pokememe_id='"+strconv.Itoa(pokememe.ID)+"'")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return fullPokememe, false
|
||||
}
|
||||
pokememesLocations := []dbmapping.PokememeLocation{}
|
||||
err = c.Db.Select(&pokememesLocations, "SELECT * FROM pokememes_locations WHERE pokememe_id='"+strconv.Itoa(pokememe.ID)+"'")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return fullPokememe, false
|
||||
}
|
||||
|
||||
elementsListed := []dbmapping.Element{}
|
||||
locationsListed := []dbmapping.Location{}
|
||||
|
||||
for j := range pokememesLocations {
|
||||
if pokememesLocations[j].PokememeID == pokememe.ID {
|
||||
for l := range locations {
|
||||
if pokememesLocations[j].LocationID == locations[l].ID {
|
||||
locationsListed = append(locationsListed, locations[l])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for k := range pokememesElements {
|
||||
if pokememesElements[k].PokememeID == pokememe.ID {
|
||||
for e := range elements {
|
||||
if pokememesElements[k].ElementID == elements[e].ID {
|
||||
elementsListed = append(elementsListed, elements[e])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fullPokememe.Pokememe = pokememe
|
||||
fullPokememe.Elements = elementsListed
|
||||
fullPokememe.Locations = locationsListed
|
||||
|
||||
return fullPokememe, true
|
||||
}
|
251
lib/pokedexer/parsers.go
Normal file
251
lib/pokedexer/parsers.go
Normal file
@@ -0,0 +1,251 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package pokedexer
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// ParsePokememe parses pokememe, forwarded from PokememeBroBot, to database
|
||||
func (p *Pokedexer) ParsePokememe(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
text := update.Message.Text
|
||||
var defendablePokememe = false
|
||||
pokememeStringsArray := strings.Split(text, "\n")
|
||||
pokememeRunesArray := make([][]rune, 0)
|
||||
for i := range pokememeStringsArray {
|
||||
pokememeRunesArray = append(pokememeRunesArray, []rune(pokememeStringsArray[i]))
|
||||
}
|
||||
|
||||
if len(pokememeRunesArray) == 13 {
|
||||
defendablePokememe = true
|
||||
}
|
||||
|
||||
// Getting elements
|
||||
elements := []dbmapping.Element{}
|
||||
elementEmojis := make([]string, 0)
|
||||
elementEmojis = append(elementEmojis, string(pokememeRunesArray[4][11]))
|
||||
if len(pokememeRunesArray[4]) > 12 {
|
||||
elementEmojis = append(elementEmojis, string(pokememeRunesArray[4][13]))
|
||||
}
|
||||
if len(pokememeRunesArray[4]) > 14 {
|
||||
elementEmojis = append(elementEmojis, string(pokememeRunesArray[4][15]))
|
||||
}
|
||||
|
||||
err := c.Db.Select(&elements, "SELECT * FROM elements WHERE symbol IN ('"+strings.Join(elementEmojis, "', '")+"')")
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
|
||||
// Getting hit-points
|
||||
hitPointsRx := regexp.MustCompile("(\\d|\\.)+(K|M)?")
|
||||
hitPoints := hitPointsRx.FindAllString(string(pokememeRunesArray[5]), -1)
|
||||
if len(hitPoints) != 3 {
|
||||
c.Log.Error("Can't parse hitpoints!")
|
||||
c.Log.Debug(pokememeRunesArray[5])
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
|
||||
defence := "0"
|
||||
price := "0"
|
||||
|
||||
locations := []dbmapping.Location{}
|
||||
|
||||
purchaseable := false
|
||||
image := ""
|
||||
|
||||
if defendablePokememe {
|
||||
// Actions for high-grade pokememes
|
||||
defenceMatch := hitPointsRx.FindAllString(string(pokememeRunesArray[6]), -1)
|
||||
if len(defenceMatch) < 1 {
|
||||
c.Log.Error("Can't parse defence!")
|
||||
c.Log.Debug(pokememeRunesArray[6])
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
defence = defenceMatch[0]
|
||||
priceMatch := hitPointsRx.FindAllString(string(pokememeRunesArray[7]), -1)
|
||||
if len(priceMatch) < 1 {
|
||||
c.Log.Error("Can't parse price!")
|
||||
c.Log.Debug(pokememeRunesArray[7])
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
price = priceMatch[0]
|
||||
locationsPrepare := strings.Split(string(pokememeRunesArray[8]), ": ")
|
||||
if len(locationsPrepare) < 2 {
|
||||
c.Log.Error("Can't parse locations!")
|
||||
c.Log.Debug(pokememeRunesArray[8])
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
locationsNames := strings.Split(locationsPrepare[1], ", ")
|
||||
if len(locationsNames) < 1 {
|
||||
c.Log.Error("Can't parse locations!")
|
||||
c.Log.Debug(locationsPrepare)
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
|
||||
err2 := c.Db.Select(&locations, "SELECT * FROM locations WHERE name IN ('"+strings.Join(locationsNames, "', '")+"')")
|
||||
if err2 != nil {
|
||||
c.Log.Error(err2.Error())
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
if strings.HasSuffix(string(pokememeRunesArray[9]), "Можно") {
|
||||
purchaseable = true
|
||||
}
|
||||
image = strings.Replace(string(pokememeRunesArray[12]), " ", "", -1)
|
||||
} else {
|
||||
// Actions for low-grade pokememes
|
||||
defence = hitPoints[0]
|
||||
priceMatch := hitPointsRx.FindAllString(string(pokememeRunesArray[6]), -1)
|
||||
if len(priceMatch) < 1 {
|
||||
c.Log.Error("Can't parse price!")
|
||||
c.Log.Debug(pokememeRunesArray[6])
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
price = priceMatch[0]
|
||||
locationsPrepare := strings.Split(string(pokememeRunesArray[7]), ": ")
|
||||
if len(locationsPrepare) < 2 {
|
||||
c.Log.Error("Can't parse locations!")
|
||||
c.Log.Debug(pokememeRunesArray[7])
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
locationsNames := strings.Split(locationsPrepare[1], ", ")
|
||||
if len(locationsNames) < 1 {
|
||||
c.Log.Error("Can't parse locations!")
|
||||
c.Log.Debug(locationsPrepare)
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
|
||||
err2 := c.Db.Select(&locations, "SELECT * FROM locations WHERE name IN ('"+strings.Join(locationsNames, "', '")+"')")
|
||||
if err2 != nil {
|
||||
c.Log.Error(err2.Error())
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
if strings.HasSuffix(string(pokememeRunesArray[8]), "Можно") {
|
||||
purchaseable = true
|
||||
}
|
||||
image = strings.Replace(string(pokememeRunesArray[11]), " ", "", -1)
|
||||
}
|
||||
|
||||
grade := string(pokememeRunesArray[0][0])
|
||||
name := string(pokememeRunesArray[0][3:])
|
||||
description := string(pokememeRunesArray[1])
|
||||
c.Log.Debug("Pokememe grade: " + grade)
|
||||
c.Log.Debug("Pokememe name: " + name)
|
||||
c.Log.Debug("Pokememe description: " + description)
|
||||
c.Log.Debug("Elements:")
|
||||
for i := range elements {
|
||||
c.Log.Debug(elements[i].Symbol + " " + elements[i].Name)
|
||||
}
|
||||
c.Log.Debug("Attack: " + hitPoints[0])
|
||||
c.Log.Debug("HP: " + hitPoints[1])
|
||||
c.Log.Debug("MP: " + hitPoints[2])
|
||||
c.Log.Debug("Defence: " + defence)
|
||||
c.Log.Debug("Price: " + price)
|
||||
c.Log.Debug("Locations:")
|
||||
for i := range locations {
|
||||
c.Log.Debug(locations[i].Symbol + " " + locations[i].Name)
|
||||
}
|
||||
if purchaseable {
|
||||
c.Log.Debug("Purchaseable")
|
||||
} else {
|
||||
c.Log.Debug("Non-purchaseable")
|
||||
}
|
||||
c.Log.Debug("Image: " + image)
|
||||
|
||||
// Building pokememe
|
||||
pokememe := dbmapping.Pokememe{}
|
||||
// Checking if pokememe exists in database
|
||||
err3 := c.Db.Get(&pokememe, c.Db.Rebind("SELECT * FROM pokememes WHERE grade='"+grade+"' AND name='"+name+"';"))
|
||||
if err3 != nil {
|
||||
c.Log.Debug("Adding new pokememe...")
|
||||
} else {
|
||||
c.Log.Info("This pokememe already exist. Return specific error.")
|
||||
p.pokememeAddDuplicateMessage(update)
|
||||
return "dup"
|
||||
}
|
||||
|
||||
gradeInt, _ := strconv.Atoi(grade)
|
||||
attackInt := c.Statistics.GetPoints(hitPoints[0])
|
||||
hpInt := c.Statistics.GetPoints(hitPoints[1])
|
||||
mpInt := c.Statistics.GetPoints(hitPoints[2])
|
||||
defenceInt := c.Statistics.GetPoints(defence)
|
||||
priceInt := c.Statistics.GetPoints(price)
|
||||
|
||||
pokememe.Grade = gradeInt
|
||||
pokememe.Name = name
|
||||
pokememe.Description = description
|
||||
pokememe.Attack = attackInt
|
||||
pokememe.HP = hpInt
|
||||
pokememe.MP = mpInt
|
||||
pokememe.Defence = defenceInt
|
||||
pokememe.Price = priceInt
|
||||
if purchaseable {
|
||||
pokememe.Purchaseable = true
|
||||
} else {
|
||||
pokememe.Purchaseable = false
|
||||
}
|
||||
pokememe.ImageURL = image
|
||||
pokememe.PlayerID = playerRaw.ID
|
||||
pokememe.CreatedAt = time.Now().UTC()
|
||||
|
||||
_, err4 := c.Db.NamedExec("INSERT INTO pokememes VALUES(NULL, :grade, :name, :description, :attack, :hp, :mp, :defence, :price, :purchaseable, :image_url, :player_id, :created_at)", &pokememe)
|
||||
if err4 != nil {
|
||||
c.Log.Error(err4.Error())
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
|
||||
// Getting new pokememe
|
||||
err5 := c.Db.Get(&pokememe, c.Db.Rebind("SELECT * FROM pokememes WHERE grade='"+grade+"' AND name='"+name+"';"))
|
||||
if err5 != nil {
|
||||
c.Log.Error("Pokememe isn't added!")
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
for i := range elements {
|
||||
link := dbmapping.PokememeElement{}
|
||||
link.PokememeID = pokememe.ID
|
||||
link.ElementID = elements[i].ID
|
||||
link.CreatedAt = time.Now().UTC()
|
||||
|
||||
_, err6 := c.Db.NamedExec("INSERT INTO pokememes_elements VALUES(NULL, :pokememe_id, :element_id, :created_at)", &link)
|
||||
if err6 != nil {
|
||||
c.Log.Error(err6.Error())
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
}
|
||||
for i := range locations {
|
||||
link := dbmapping.PokememeLocation{}
|
||||
link.PokememeID = pokememe.ID
|
||||
link.LocationID = locations[i].ID
|
||||
link.CreatedAt = time.Now().UTC()
|
||||
|
||||
_, err7 := c.Db.NamedExec("INSERT INTO pokememes_locations VALUES(NULL, :pokememe_id, :location_id, :created_at)", &link)
|
||||
if err7 != nil {
|
||||
c.Log.Error(err7.Error())
|
||||
p.pokememeAddFailureMessage(update)
|
||||
return "fail"
|
||||
}
|
||||
}
|
||||
|
||||
p.pokememeAddSuccessMessage(update)
|
||||
return "ok"
|
||||
}
|
85
lib/pokedexer/pokedexer.go
Normal file
85
lib/pokedexer/pokedexer.go
Normal file
@@ -0,0 +1,85 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package pokedexer
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func (p *Pokedexer) pokememesListing(update *tgbotapi.Update, page int, pokememesArray []dbmapping.PokememeFull) {
|
||||
message := "*Известные боту покемемы*\n"
|
||||
message += "Список отсортирован по грейду и алфавиту.\n"
|
||||
message += "Покедекс: " + strconv.Itoa(len(pokememesArray)) + " / 219\n"
|
||||
message += "Отображаем покемемов с " + strconv.Itoa(((page-1)*50)+1) + " по " + strconv.Itoa(page*50) + "\n"
|
||||
if len(pokememesArray) > page*50 {
|
||||
message += "Переход на следующую страницу: /pokedeks" + strconv.Itoa(page+1)
|
||||
}
|
||||
if page > 1 {
|
||||
message += "\nПереход на предыдущую страницу: /pokedeks" + strconv.Itoa(page-1)
|
||||
}
|
||||
message += "\n\n"
|
||||
|
||||
for i := range pokememesArray {
|
||||
if (i+1 > 50*(page-1)) && (i+1 < (50*page)+1) {
|
||||
pk := pokememesArray[i].Pokememe
|
||||
pkE := pokememesArray[i].Elements
|
||||
message += strconv.Itoa(i+1) + ". " + strconv.Itoa(pk.Grade)
|
||||
message += "⃣ *" + pk.Name
|
||||
message += "* (" + c.Statistics.GetPrintablePoints(pk.HP) + "-" + c.Statistics.GetPrintablePoints(pk.MP) + ") ⚔️ *"
|
||||
message += c.Statistics.GetPrintablePoints(pk.Attack) + "* \\["
|
||||
for j := range pkE {
|
||||
message += pkE[j].Symbol
|
||||
}
|
||||
message += "] " + c.Statistics.GetPrintablePoints(pk.Price) + "$ /pk" + strconv.Itoa(pk.ID)
|
||||
message += "\n"
|
||||
}
|
||||
}
|
||||
|
||||
if len(pokememesArray) > page*50 {
|
||||
message += "\n"
|
||||
message += "Переход на следующую страницу: /pokedeks" + strconv.Itoa(page+1)
|
||||
}
|
||||
if page > 1 {
|
||||
message += "\nПереход на предыдущую страницу: /pokedeks" + strconv.Itoa(page-1)
|
||||
}
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
|
||||
func (p *Pokedexer) pokememeAddSuccessMessage(update *tgbotapi.Update) {
|
||||
message := "*Покемем успешно добавлен.*\n\n"
|
||||
message += "Посмотреть всех известных боту покемемов можно командой /pokedeks"
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
|
||||
func (p *Pokedexer) pokememeAddDuplicateMessage(update *tgbotapi.Update) {
|
||||
message := "*Мы уже знаем об этом покемеме*\n\n"
|
||||
message += "Посмотреть всех известных боту покемемов можно командой /pokedeks\n\n"
|
||||
message += "Если у покемема изменились описание или характеристики, напиши @fat0troll для обновления базы."
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
|
||||
func (p *Pokedexer) pokememeAddFailureMessage(update *tgbotapi.Update) {
|
||||
message := "*Неудачно получилось :(*\n\n"
|
||||
message += "Случилась жуткая ошибка, и мы не смогли записать покемема в базу. Напиши @fat0troll, он разберется.\n\n"
|
||||
message += "Посмотреть всех известных боту покемемов можно командой /pokedeks"
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
}
|
21
lib/pokedexer/pokedexerinterface/pokedexerinterface.go
Normal file
21
lib/pokedexer/pokedexerinterface/pokedexerinterface.go
Normal file
@@ -0,0 +1,21 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package pokedexerinterface
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
)
|
||||
|
||||
// PokedexerInterface implements Pokedexer for importing via appcontext.
|
||||
type PokedexerInterface interface {
|
||||
ParsePokememe(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
|
||||
PokememesList(update *tgbotapi.Update)
|
||||
PokememeInfo(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
BestPokememesList(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
|
||||
GetPokememes() ([]dbmapping.PokememeFull, bool)
|
||||
GetPokememeByID(pokememeID string) (dbmapping.PokememeFull, bool)
|
||||
}
|
148
lib/pokedexer/responders.go
Normal file
148
lib/pokedexer/responders.go
Normal file
@@ -0,0 +1,148 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package pokedexer
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// BestPokememesList shows list for catching based on player league and grade
|
||||
func (p *Pokedexer) BestPokememesList(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
pokememes, ok := p.getBestPokememes(playerRaw.ID)
|
||||
if !ok {
|
||||
c.Log.Error("Cannot get pokememes from getter!")
|
||||
return "fail"
|
||||
}
|
||||
|
||||
message := "*Лучшие покемемы для ловли*\n\n"
|
||||
for i := range pokememes {
|
||||
pk := pokememes[i].Pokememe
|
||||
pkL := pokememes[i].Locations
|
||||
pkE := pokememes[i].Elements
|
||||
message += strconv.Itoa(pk.Grade) + "⃣ "
|
||||
message += pk.Name + " (⚔"
|
||||
message += c.Statistics.GetPrintablePoints(pk.Attack)
|
||||
message += ", 🛡" + c.Statistics.GetPrintablePoints(pk.Defence) + ")"
|
||||
for i := range pkE {
|
||||
message += pkE[i].Symbol
|
||||
}
|
||||
message += " /pk" + strconv.Itoa(pk.ID) + "\n"
|
||||
message += "Локации: "
|
||||
for i := range pkL {
|
||||
message += pkL[i].Symbol + pkL[i].Name
|
||||
if i+1 < len(pkL) {
|
||||
message += ", "
|
||||
}
|
||||
}
|
||||
message += "\nКупить: "
|
||||
if pk.Purchaseable {
|
||||
message += "💲" + c.Statistics.GetPrintablePoints(pk.Price*3)
|
||||
} else {
|
||||
message += "Нельзя"
|
||||
}
|
||||
message += "\n\n"
|
||||
}
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
|
||||
return "ok"
|
||||
}
|
||||
|
||||
// PokememesList lists all known pokememes
|
||||
func (p *Pokedexer) PokememesList(update *tgbotapi.Update) {
|
||||
pageNumber := strings.Replace(update.Message.Text, "/pokedex", "", 1)
|
||||
pageNumber = strings.Replace(pageNumber, "/pokedeks", "", 1)
|
||||
page, _ := strconv.Atoi(pageNumber)
|
||||
if page == 0 {
|
||||
page = 1
|
||||
}
|
||||
pokememesArray, ok := p.GetPokememes()
|
||||
if !ok {
|
||||
c.Talkers.BotError(update)
|
||||
} else {
|
||||
p.pokememesListing(update, page, pokememesArray)
|
||||
}
|
||||
}
|
||||
|
||||
// PokememeInfo shows information about single pokememe based on internal ID
|
||||
func (p *Pokedexer) PokememeInfo(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
pokememeNumber := strings.Replace(update.Message.Text, "/pk", "", 1)
|
||||
var calculatePossibilites = true
|
||||
profileRaw, ok := c.Users.GetProfile(playerRaw.ID)
|
||||
if !ok {
|
||||
calculatePossibilites = false
|
||||
}
|
||||
|
||||
pokememe, ok := p.GetPokememeByID(pokememeNumber)
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
pk := pokememe.Pokememe
|
||||
|
||||
message := strconv.Itoa(pk.Grade) + "⃣ *" + pk.Name + "*\n"
|
||||
message += pk.Description + "\n\n"
|
||||
message += "Элементы:"
|
||||
for i := range pokememe.Elements {
|
||||
message += " " + pokememe.Elements[i].Symbol
|
||||
}
|
||||
message += "\n⚔ Атака: *" + c.Statistics.GetPrintablePoints(pk.Attack)
|
||||
message += "*\n❤️ HP: *" + c.Statistics.GetPrintablePoints(pk.HP)
|
||||
message += "*\n💙 MP: *" + c.Statistics.GetPrintablePoints(pk.MP)
|
||||
if pk.Defence != pk.Attack {
|
||||
message += "*\n🛡Защита: *" + c.Statistics.GetPrintablePoints(pk.Defence) + "* _(сопротивляемость покемема к поимке)_"
|
||||
} else {
|
||||
message += "*"
|
||||
}
|
||||
message += "\nСтоимость: *" + c.Statistics.GetPrintablePoints(pk.Price)
|
||||
message += "*\nКупить: *"
|
||||
if pk.Purchaseable {
|
||||
message += "Можно"
|
||||
} else {
|
||||
message += "Нельзя"
|
||||
}
|
||||
message += "*\nОбитает:"
|
||||
for i := range pokememe.Locations {
|
||||
message += " *" + pokememe.Locations[i].Name + "*"
|
||||
if (i + 1) < len(pokememe.Locations) {
|
||||
message += ","
|
||||
}
|
||||
}
|
||||
|
||||
if calculatePossibilites {
|
||||
if (pk.Grade < profileRaw.LevelID+2) && (pk.Grade > profileRaw.LevelID-3) {
|
||||
message += "\nВероятность поимки:"
|
||||
for i := range pokememe.Locations {
|
||||
percentile, pokeballs := c.Statistics.PossibilityRequiredPokeballs(pokememe.Locations[i].ID, pk.Grade, profileRaw.LevelID)
|
||||
message += "\n" + pokememe.Locations[i].Name + " – "
|
||||
message += strconv.FormatFloat(percentile, 'f', 2, 64) + "% или "
|
||||
message += strconv.Itoa(pokeballs) + "⭕"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
message += "\n" + pk.ImageURL
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
keyboard := tgbotapi.InlineKeyboardMarkup{}
|
||||
for i := range pokememe.Locations {
|
||||
var row []tgbotapi.InlineKeyboardButton
|
||||
btn := tgbotapi.NewInlineKeyboardButtonSwitch(pokememe.Locations[i].Symbol+pokememe.Locations[i].Name, pokememe.Locations[i].Symbol+pokememe.Locations[i].Name)
|
||||
row = append(row, btn)
|
||||
keyboard.InlineKeyboard = append(keyboard.InlineKeyboard, row)
|
||||
}
|
||||
|
||||
msg.ReplyMarkup = keyboard
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
|
||||
return "ok"
|
||||
}
|
Reference in New Issue
Block a user