diff --git a/cardsinfo/names.go b/cardsinfo/names.go index de0c65f..24ccaa6 100644 --- a/cardsinfo/names.go +++ b/cardsinfo/names.go @@ -5,6 +5,18 @@ import ( "strings" ) +func GetNameByCardId(set string, number string) string { + /* + From https://docs.magicthegathering.io/#api_v1cards_list + + Number: This is a string, not an integer, + because some cards have letters in their numbers. + */ + cards, _, _ := mtg.NewQuery().Where(mtg.CardSet, set).Where(mtg.CardNumber, number).PageS(1, 1) + name := fetchCardNameFromSlice(cards) + return name +} + func GetOriginalName(name string) string { langs := []string{"Russian", ""} channel := make(chan string) @@ -22,12 +34,16 @@ func GetOriginalName(name string) string { func getOriginalNameFromLang(name, lang string, channel chan string) { cards, _, _ := mtg.NewQuery().Where(mtg.CardLanguage, lang).Where(mtg.CardName, name).PageS(1, 1) + originalName := fetchCardNameFromSlice(cards) + channel <- originalName +} + +func fetchCardNameFromSlice(cards []*mtg.Card) string { if len(cards) > 0 { name := getCardName(cards[0]) - channel <- name - } else { - channel <- "" + return name } + return "" } func getCardName(card *mtg.Card) string { diff --git a/cardsinfo/scgprices.go b/cardsinfo/scgprices.go index 5dddd62..d56be58 100644 --- a/cardsinfo/scgprices.go +++ b/cardsinfo/scgprices.go @@ -110,7 +110,7 @@ func parsePrice(container *html.Node) float64 { } func parseLink(container *html.Node) string { - linkNodes := htmlquery.Find(container, "//td[contains(@class, 'search_results_2')]/a") + linkNodes := htmlquery.Find(container, "//td[contains(@class, 'search_results_1')]/b/a") if len(linkNodes) == 0 { return "" } diff --git a/main.go b/main.go index 7877e63..7d5c049 100644 --- a/main.go +++ b/main.go @@ -11,5 +11,5 @@ func main() { rand.Seed(time.Now().UTC().UnixNano()) r := gin.Default() r.POST("callback/message", vk.HandleMessage) - r.Run(":8000") + r.Run(":80") } diff --git a/tests/names_test.go b/tests/names_test.go index 8d479c9..6286d64 100644 --- a/tests/names_test.go +++ b/tests/names_test.go @@ -35,3 +35,13 @@ func TestGetCardByStringWrong(t *testing.T) { name := cardsinfo.GetOriginalName("fwijefiwjfew") assert.Equal(t, "", name) } + +func TestGetCardBySetId(t *testing.T) { + name := cardsinfo.GetNameByCardId("DOM", "207") + assert.Equal(t, "Teferi, Hero of Dominaria", name) +} + +func TestGetCardBySetIdWrong(t *testing.T) { + name := cardsinfo.GetNameByCardId("DOM", "1207") + assert.Equal(t, "", name) +} diff --git a/vk/handlers.go b/vk/handlers.go index 4e2eebf..f070284 100644 --- a/vk/handlers.go +++ b/vk/handlers.go @@ -1,9 +1,11 @@ package vk import ( + "errors" "github.com/flygrounder/mtg-price-vk/cardsinfo" "github.com/gin-gonic/gin" "net/http" + "strings" ) const CARDSLIMIT = 8 @@ -18,16 +20,23 @@ func min(a, b int) int { func HandleMessage(c *gin.Context) { var req MessageRequest c.BindJSON(&req) - if (req.Type == "confirmation") && (req.GroupId == GROUPID) { - c.String(http.StatusOK, CONFIRMATION_STRING) - return - } - defer c.String(http.StatusOK, "ok") if req.Secret != SECRET_KEY { return } - cardName := cardsinfo.GetOriginalName(req.Object.Body) - if cardName == "" { + switch req.Type { + case "confirmation": + handleConfirmation(c, &req) + case "message_new": + handleSearch(c, &req) + } +} + +func handleSearch(c *gin.Context, req *MessageRequest) { + defer c.String(http.StatusOK, "ok") + cardName, err := getCardNameByCommand(req.Object.Body) + if err != nil { + Message(req.Object.UserId, "Некорректная команда") + } else if cardName == "" { Message(req.Object.UserId, "Карта не найдена") } else { prices, _ := cardsinfo.GetSCGPrices(cardName) @@ -37,3 +46,26 @@ func HandleMessage(c *gin.Context) { Message(req.Object.UserId, priceInfo) } } + +func getCardNameByCommand(command string) (string, error) { + var name string + switch { + case strings.HasPrefix(command, "!s"): + split := strings.Split(command, " ") + if len(split) < 3 { + return "", errors.New("wrong command") + } + set := split[1] + number := split[2] + name = cardsinfo.GetNameByCardId(set, number) + default: + name = cardsinfo.GetOriginalName(command) + } + return name, nil +} + +func handleConfirmation(c *gin.Context, req *MessageRequest) { + if (req.Type == "confirmation") && (req.GroupId == GROUPID) { + c.String(http.StatusOK, CONFIRMATION_STRING) + } +}