Skip to content

Commit

Permalink
refactor: refactor all commands
Browse files Browse the repository at this point in the history
  • Loading branch information
totanvix committed Jul 5, 2023
1 parent 6fc7837 commit 7be9135
Show file tree
Hide file tree
Showing 12 changed files with 270 additions and 244 deletions.
5 changes: 4 additions & 1 deletion api/hook/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"net/http"
"zeril-bot/utils/bot"
"zeril-bot/utils/structs"
"zeril-bot/utils/telegram"
)

func Handler(w http.ResponseWriter, r *http.Request) {
Expand All @@ -14,7 +15,9 @@ func Handler(w http.ResponseWriter, r *http.Request) {
panic(err)
}

bot := bot.NewBot(data)
telegram := telegram.New(&http.Client{})

bot := bot.NewBot(telegram, data)
res := make(map[string]string)

err = bot.ResolveHook()
Expand Down
19 changes: 7 additions & 12 deletions utils/bitcoin/bitcoin.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,41 +7,36 @@ import (
"net/http"
"strconv"
"zeril-bot/utils/structs"
"zeril-bot/utils/telegram"

"github.com/leekchan/accounting"
)

func SendBitcoinPrice(data structs.DataTele) error {
func GetBitcoinPrice() (string, error) {
acUsd := accounting.Accounting{Symbol: "$", Precision: 2}
acVnd := accounting.Accounting{Symbol: "", Precision: 0, Thousand: "."}

btc, err := getBitcoinPrice()
btc, err := getCurrentPrice()
if err != nil {
return err
return "", err
}

p, err := strconv.ParseFloat(btc.Price, 64)
if err != nil {
return err
return "", err
}

usd := acUsd.FormatMoney(p)
v, err := exchangeUsdToVnd(p)
if err != nil {
return err
return "", err
}

vnd := acVnd.FormatMoney(*v) + " đ"

message := fmt.Sprintf("1 Bitcoin = %s (<b>%s</b>)", usd, vnd)

data.ReplyMessage = message

return telegram.SendMessage(data)
return fmt.Sprintf("1 Bitcoin = %s (<b>%s</b>)", usd, vnd), nil
}

func getBitcoinPrice() (*structs.Btc, error) {
func getCurrentPrice() (*structs.Btc, error) {
res, err := http.Get("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT")
if err != nil {
return nil, err
Expand Down
73 changes: 13 additions & 60 deletions utils/bot/bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,18 @@ package bot

import (
"errors"
"fmt"
"log"
"strings"
"time"

"zeril-bot/utils/bitcoin"
"zeril-bot/utils/kqxs"
"zeril-bot/utils/lunar"
"zeril-bot/utils/qr"
"zeril-bot/utils/quote"
"zeril-bot/utils/random"
"zeril-bot/utils/shortener"
"zeril-bot/utils/structs"
"zeril-bot/utils/telegram"
"zeril-bot/utils/weather"
)

type Bot struct {
HookData structs.HookData
rCh chan rChannel
Telegram *telegram.Telegram
}

type rChannel struct {
Expand All @@ -30,9 +22,9 @@ type rChannel struct {

const numberOfCh = 2

func NewBot(hookData structs.HookData) *Bot {
func NewBot(telegram *telegram.Telegram, hookData structs.HookData) *Bot {
ch := make(chan rChannel, numberOfCh)
return &Bot{HookData: hookData, rCh: ch}
return &Bot{Telegram: telegram, HookData: hookData, rCh: ch}
}

func (b Bot) ResolveHook() error {
Expand Down Expand Up @@ -102,23 +94,23 @@ func (b Bot) resolveCommand() error {
case "/help", "/help@zerill_bot":
err = b.sendHelpMessage(data)
case "/quote", "/quote@zerill_bot":
err = quote.SendAQuote(data)
err = b.sendAQuote(data)
case "/groupid", "/groupid@zerill_bot":
err = b.sendGroupId(data)
case "/lunar", "/lunar@zerill_bot":
err = lunar.SendLunarDateNow(data)
err = b.sendLunarDateNow(data)
case "/weather", "/weather@zerill_bot":
err = weather.SendForecastOfWeather(data)
err = b.sendForecastOfWeather(data)
case "/bitcoin", "/bitcoin@zerill_bot":
err = bitcoin.SendBitcoinPrice(data)
err = b.sendBitcoinPrice(data)
case "/qr", "/qr@zerill_bot":
err = qr.SendQRImage(data)
err = b.sendQRImage(data)
case "/random", "/random@zerill_bot":
err = random.RandomElements(data)
err = b.sendSelectedElement(data)
case "/kqxs", "/kqxs@zerill_bot":
err = kqxs.Send(data)
err = b.sendLottery(data)
case "/shortener", "/shortener@zerill_bot":
shortener.Generate(data)
err = b.generateShortenerURL(data)
default:
err = b.invalidCommand(data)
}
Expand All @@ -131,16 +123,15 @@ func (b Bot) resolveCallbackCommand() error {

defer func() {
b.rCh <- rChannel{err: err}
close(b.rCh)
}()

data := b.getTelegramData()

switch data.Command {
case "/weather":
err = weather.SendForecastOfWeather(data)
err = b.sendForecastOfWeather(data)
case "/kqxs":
err = kqxs.Send(data)
err = b.sendLottery(data)
}

return err
Expand Down Expand Up @@ -203,44 +194,6 @@ func (b Bot) getFirstName() string {
return b.HookData.Message.From.FirstName
}

func (b Bot) sendStartMessage(data structs.DataTele) error {
message := fmt.Sprintf("Xin chào %s \n\nGõ <code>/help</code> để xem danh sách các lệnh mà bot hỗ trợ nhé.\n\nBạn cũng có thể truy cập nhanh các chức năng bằng cách nhấn nút Menu bên dưới.", data.FirstName)
data.ReplyMessage = message
return telegram.SendMessage(data)
}

func (b Bot) sendHelpMessage(data structs.DataTele) error {
messages := ""
botCommands, err := b.getBotCommands()

if err != nil {
return err
}

for _, command := range botCommands.Result {
messages += fmt.Sprintf("<code>/%s</code> - %s\n\n", command.Command, command.Description)
}

data.ReplyMessage = messages

return telegram.SendMessage(data)
}

func (b Bot) getBotCommands() (*structs.BotCommands, error) {
return telegram.GetBotCommands()
}

func (b Bot) sendGroupId(data structs.DataTele) error {
if data.ChatType == "group" {
data.ReplyMessage = fmt.Sprintf("Group ID: <code>%v</code>", data.ChatId)
} else {
data.ReplyMessage = "Không tìm thấy nhóm, bạn cần thêm bot vào nhóm trước khi thực hiện lệnh này !"
}

return telegram.SendMessage(data)
}

func (b Bot) invalidCommand(data structs.DataTele) error {
data.ReplyMessage = "Tôi không hiểu câu lệnh của bạn !!!"
return telegram.SendMessage(data)
}
195 changes: 195 additions & 0 deletions utils/bot/reply.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
package bot

import (
"fmt"
"math/rand"
"strings"
"unicode"
"zeril-bot/utils/bitcoin"
"zeril-bot/utils/lottery"
"zeril-bot/utils/lunar"
"zeril-bot/utils/qr"
"zeril-bot/utils/quote"
"zeril-bot/utils/shortener"
"zeril-bot/utils/structs"
"zeril-bot/utils/weather"
)

func (b Bot) sendStartMessage(data structs.DataTele) error {
message := fmt.Sprintf("Xin chào %s \n\nGõ <code>/help</code> để xem danh sách các lệnh mà bot hỗ trợ nhé.\n\nBạn cũng có thể truy cập nhanh các chức năng bằng cách nhấn nút Menu bên dưới.", data.FirstName)
data.ReplyMessage = message
return b.Telegram.SendMessage(data)
}

func (b Bot) sendHelpMessage(data structs.DataTele) error {
messages := ""
botCommands, err := b.getBotCommands()

if err != nil {
return err
}

for _, command := range botCommands.Result {
messages += fmt.Sprintf("<code>/%s</code> - %s\n\n", command.Command, command.Description)
}

data.ReplyMessage = messages

return b.Telegram.SendMessage(data)
}

func (b Bot) sendGroupId(data structs.DataTele) error {
if data.ChatType == "group" {
data.ReplyMessage = fmt.Sprintf("Group ID: <code>%v</code>", data.ChatId)
} else {
data.ReplyMessage = "Không tìm thấy nhóm, bạn cần thêm bot vào nhóm trước khi thực hiện lệnh này !"
}

return b.Telegram.SendMessage(data)
}

func (b Bot) invalidCommand(data structs.DataTele) error {
data.ReplyMessage = "Tôi không hiểu câu lệnh của bạn !!!"
return b.Telegram.SendMessage(data)
}

func (b Bot) sendAQuote(data structs.DataTele) error {
quote, err := quote.GetAQuote()
if err != nil {
return err
}

quoteFormat := fmt.Sprintf("&quot;%s&quot; - <b>%s</b>", quote.Quote, quote.Author)
data.ReplyMessage = quoteFormat

return b.Telegram.SendMessage(data)
}

func (b Bot) sendLunarDateNow(data structs.DataTele) error {
path, err := lunar.DownloadAndCropImage()
if err != nil {
return err
}

return b.Telegram.SendPhoto(data, path)
}

func (b Bot) sendForecastOfWeather(data structs.DataTele) error {
text := data.RawMessage
text = strings.TrimSpace(text)
arr := strings.Fields(text)
args := arr[1:]

if len(args) == 0 {
message, buttons := weather.GetSuggestForecast(data)
data.ReplyMessage = message
return b.Telegram.SendMessageWithReplyMarkup(data, buttons)
}

cityName := text[9:]
wData, err := weather.GetWeather(cityName)
if err != nil {
data.ReplyMessage = "Không tìm thấy thông tin thời tiết"
return b.Telegram.SendMessage(data)
}

data.ReplyMessage = fmt.Sprintf("🏙 Thời tiết hiện tại ở <b>%s</b>\n\n🌡 Nhiệt độ: <b>%.2f°C</b>\n\n💧 Độ ẩm: <b>%v&#37;</b>\n\nℹ️ Tổng quan: %s", wData.Name, wData.Main.Temp, wData.Main.Humidity, wData.Weather[0].Description)

return b.Telegram.SendMessage(data)
}

func (b Bot) sendBitcoinPrice(data structs.DataTele) error {
message, err := bitcoin.GetBitcoinPrice()
if err != nil {
return err
}

data.ReplyMessage = message

return b.Telegram.SendMessage(data)
}

func (b Bot) sendQRImage(data structs.DataTele) error {
text := data.RawMessage
arr := strings.Fields(text)
args := arr[1:]
if len(args) == 0 {
data.ReplyMessage = "Sử dụng cú pháp <code>/qr nội dung</code> để tạo mã QR."
return b.Telegram.SendMessage(data)
}

content := text[4:]
path, err := qr.CreateImage(content)
if err != nil {
return err
}

return b.Telegram.SendPhoto(data, path)
}

func (b Bot) sendSelectedElement(data structs.DataTele) error {
text := data.RawMessage
arr := strings.Fields(text)

if len(arr[1:]) == 0 {
data.ReplyMessage = "Sử dụng cú pháp <code>/random A, B, C</code> để chọn phần tử ngẫu nhiên"
return b.Telegram.SendMessage(data)

}

f := func(c rune) bool {
return unicode.IsPunct(c) == unicode.IsPunct(',')
}

els := strings.FieldsFunc(text[8:], f)
el := els[rand.Intn(len(els))]

data.ReplyMessage = fmt.Sprintf("Phần từ được chọn sau khi random: %v", strings.TrimSpace(el))

return b.Telegram.SendMessage(data)
}

func (b Bot) sendLottery(data structs.DataTele) error {
text := data.RawMessage
text = strings.TrimSpace(text)
arr := strings.Fields(text)
args := arr[1:]

if len(args) != 1 {
message, buttons := lottery.GetSuggest(data)
data.ReplyMessage = message
return b.Telegram.SendMessageWithReplyMarkup(data, buttons)
}

zone := text[6:]

message, err := lottery.GetDataLottery(zone)
if err != nil {
return err
}

data.ReplyMessage = message

return b.Telegram.SendMessage(data)
}

func (b Bot) generateShortenerURL(data structs.DataTele) error {
text := data.RawMessage
arr := strings.Fields(text)
args := arr[1:]

if len(args) == 0 {
data.ReplyMessage = "Sử dụng cú pháp <code>/shortener https://example.com/</code> để tạo rút gọn liên kết"
return b.Telegram.SendMessage(data)
}

url := text[11:]
message, err := shortener.Generate(url)
if err != nil {
return err
}

data.ReplyMessage = message

return b.Telegram.SendMessage(data)
}
Loading

0 comments on commit 7be9135

Please sign in to comment.