This repository has been archived on 2023-12-11. You can view files and clone it, but cannot push or open issues or pull requests.
archive/golang/sacredeer-bot/handlers.go

157 lines
5.4 KiB
Go
Raw Permalink Normal View History

2023-07-29 14:42:28 +03:00
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)
}