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