157 lines
5.4 KiB
Go
157 lines
5.4 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/json"
|
|||
|
"fmt"
|
|||
|
"log"
|
|||
|
"math/rand"
|
|||
|
"net/http"
|
|||
|
"os"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
|
|||
|
"github.com/PuerkitoBio/goquery"
|
|||
|
"github.com/go-redis/redis"
|
|||
|
"github.com/yanzay/tbot/v2"
|
|||
|
)
|
|||
|
|
|||
|
var opt, err = redis.ParseURL(os.Getenv("REDIS_URL"))
|
|||
|
var client = redis.NewClient(&redis.Options{
|
|||
|
Addr: opt.Addr,
|
|||
|
Password: opt.Password,
|
|||
|
DB: opt.DB,
|
|||
|
})
|
|||
|
|
|||
|
//deer by asciiart.eu
|
|||
|
//flower by eng50232@leonis.nus.sg
|
|||
|
var magicDeer = `
|
|||
|
\ / . *
|
|||
|
* : )) ((
|
|||
|
\ // (") \\ ' .
|
|||
|
: \\_\)/_//
|
|||
|
. \ ~/~ ' ~\~\
|
|||
|
( Q/ _/Q ~ o
|
|||
|
o / / ,|
|
|||
|
' (~~~)__.-\ |
|
|||
|
\'~~ | | *
|
|||
|
. | | |
|
|||
|
`
|
|||
|
|
|||
|
type Author struct {
|
|||
|
Sign string `json:"sign"`
|
|||
|
}
|
|||
|
|
|||
|
// Handle the /start command here
|
|||
|
func (a *application) startHandler(m *tbot.Message) {
|
|||
|
msg := "Что может *сакральный олень?*\n\nОтветить на вопрос:\nЗадай вопрос и ты получишь ответ." +
|
|||
|
"\nНа вопрос ответом должны быть да/нет.\n\nВыбрать из нескольких вариантов:" +
|
|||
|
"\nРаздели варианты союзом *или*.\nМинимум - 2 варианта, максимума нет.\nНе забудь про *пробелы*, пример:" +
|
|||
|
"\nЛечь спать *или* дочитать мангу?\n" +
|
|||
|
"\nПредсказать будущее:\nДля начала выбери свой знак зодиака.\nОтправь его в чат на русском языке." +
|
|||
|
"\nДалее введи соответствующую команду:\n*/today* - предсказание на сегодня\n*/tomorrow* - предсказание на завтра" +
|
|||
|
//сделаю "\n*/daily* - ежедневные предсказания" +
|
|||
|
"\n\nВнимание:\n*Сакрального оленя* нельзя тревожить," +
|
|||
|
"\nзадавая тот же вопрос несколько раз.\nТакже нельзя задавать любые\nвопросы связанные с *оленем*.\n" +
|
|||
|
"\nВ случае нарушения правил выше\nты не получишь достоверного ответа."
|
|||
|
a.client.SendMessage(m.Chat.ID, msg, tbot.OptParseModeMarkdown)
|
|||
|
}
|
|||
|
|
|||
|
// Handle the msg command here
|
|||
|
func (a *application) msgHandler(m *tbot.Message) {
|
|||
|
msg := "Ты сделал что-то не так"
|
|||
|
signs := map[string]string{
|
|||
|
"овен": "aries",
|
|||
|
"телец": "taurus",
|
|||
|
"близнецы": "gemini",
|
|||
|
"рак": "cancer",
|
|||
|
"лев": "leo",
|
|||
|
"дева": "virgo",
|
|||
|
"весы": "libra",
|
|||
|
"скорпион": "scorpio",
|
|||
|
"стрелец": "sagittarius",
|
|||
|
"козерог": "capricorn",
|
|||
|
"водолей": "aquarius",
|
|||
|
"рыбы": "pisces"}
|
|||
|
|
|||
|
if signs[strings.ToLower(strings.TrimRight(m.Text, " .!"))] != "" {
|
|||
|
json, err := json.Marshal(Author{Sign: m.Text})
|
|||
|
if err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
err = client.Set(m.Chat.ID, json, 0).Err()
|
|||
|
if err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
msg = fmt.Sprintf("Знак зодиака изменён, %s.", strings.TrimRight(m.Text, " .!"))
|
|||
|
} else if m.Text == "/today" || m.Text == "/tomorrow" {
|
|||
|
sign, err := client.Get(m.Chat.ID).Result()
|
|||
|
if err == redis.Nil {
|
|||
|
msg = "Сначала выбери знак зодиака!\nКоманда /start в помощь."
|
|||
|
} else {
|
|||
|
sign = strings.TrimLeft(sign, `{"sign":"`)
|
|||
|
sign = strings.TrimRight(sign, `"}`)
|
|||
|
day := "tod"
|
|||
|
outday := "на сегодня"
|
|||
|
if m.Text != "/today" {
|
|||
|
day = "tom"
|
|||
|
outday = "на завтра"
|
|||
|
}
|
|||
|
res, err := http.Get("https://ignio.com/r/daily/" + day + "/" + signs[strings.ToLower(strings.TrimRight(sign, " .!"))] + ".html")
|
|||
|
if err != nil {
|
|||
|
log.Fatal(err)
|
|||
|
}
|
|||
|
defer res.Body.Close()
|
|||
|
if res.StatusCode != 200 {
|
|||
|
log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
|
|||
|
}
|
|||
|
|
|||
|
// Load the HTML document
|
|||
|
doc, err := goquery.NewDocumentFromReader(res.Body)
|
|||
|
if err != nil {
|
|||
|
log.Fatal(err)
|
|||
|
}
|
|||
|
doc.Find(`div[style="margin: 20px 0;"]`).Each(func(i int, s *goquery.Selection) {
|
|||
|
btext := fmt.Sprintf("%s", s.Text())
|
|||
|
if m.Text == "/tomorrow"{
|
|||
|
replacer := strings.NewReplacer("Сегодня", "Завтра", "сегодня", "завтра")
|
|||
|
btext = replacer.Replace(btext)}
|
|||
|
msg = fmt.Sprintf("Гороскоп %s, %s: \n%s", outday, sign, strings.TrimSpace(btext))
|
|||
|
})}
|
|||
|
} else {
|
|||
|
answer := map[int]string{
|
|||
|
0: "Да",
|
|||
|
1: "Нет",
|
|||
|
2: "Это не важно",
|
|||
|
3: "...",
|
|||
|
4: "У тебя есть проблемы серьёзней",
|
|||
|
5: "Да, хотя зря",
|
|||
|
6: "Никогда",
|
|||
|
7: "100%",
|
|||
|
8: "1 из 100",
|
|||
|
9: "Попробуй ещё раз"}
|
|||
|
rand.Seed(time.Now().UnixNano())
|
|||
|
arr := strings.Split(m.Text, " или ")
|
|||
|
if len(arr) > 1 {
|
|||
|
msg = "Ты не оставил мне выбора"
|
|||
|
for i := 0; i < len(arr)-1; i++ {
|
|||
|
if strings.TrimRight(arr[i], "?") != strings.TrimRight(arr[i+1], "?") {
|
|||
|
rnd := rand.Intn(len(arr))
|
|||
|
msg = strings.TrimRight(arr[rnd], "?")
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
rnd := rand.Intn(10)
|
|||
|
msg = answer[rnd]
|
|||
|
}
|
|||
|
}
|
|||
|
if strings.ToLower(strings.TrimRight(m.Text, " .!")) == "спасибо" {
|
|||
|
msg = "Пожалуйста"
|
|||
|
}
|
|||
|
msg = fmt.Sprintf("```\n< %s > %s```", msg, magicDeer)
|
|||
|
a.client.SendChatAction(m.Chat.ID, tbot.ActionTyping)
|
|||
|
tsleep := rand.Intn(1000-200) + 200
|
|||
|
time.Sleep(time.Duration(tsleep) * time.Millisecond)
|
|||
|
a.client.SendMessage(m.Chat.ID, msg, tbot.OptParseModeMarkdown)
|
|||
|
}
|