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
2023-07-29 16:42:28 +05:00

157 lines
5.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}