penguin/golifehk

@golifehk bot in Telegram

main.go

raw ยท 2387 bytes

package main

import (
	"fmt"
	"log"
	"os"

	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
	tgadaptor "github.com/tgckpg/golifehk/adaptors/tg"
	cjlookup "github.com/tgckpg/golifehk/datasources/cjlookup"
	kmb "github.com/tgckpg/golifehk/datasources/kmb"
	mtrbus "github.com/tgckpg/golifehk/datasources/mtr/bus"
	query "github.com/tgckpg/golifehk/query"
	utils "github.com/tgckpg/golifehk/utils"
)

func main() {
	bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_API_TOKEN"))
	if err != nil {
		log.Panic(err)
	}

	bot.Debug = true

	log.Printf("Authorized on account %s", bot.Self.UserName)

	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60

	updates := bot.GetUpdatesChan(u)

	for update := range updates {

		if update.CallbackQuery != nil {
			callback := tgbotapi.NewCallback(update.CallbackQuery.ID, "")
			bot.Request(callback)

			q := query.QueryMessage{Lang: "zh-Hant", Text: update.CallbackQuery.Data}
			f_sent, f_err := processQuery(bot, &update, q)

			if !f_sent && f_err != nil {
				mesg := utils.MDv2Text(fmt.Sprintf("%s", f_err))
				tgadaptor.BotSendText(bot, &update, &mesg)
			}

			continue
		}

		if update.Message == nil {
			continue
		}

		log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
		isGroup := (update.Message.Chat.ID < 0)

		mesg, processed := utils.SystemControl(update.Message)
		if processed {
			if mesg != "" {
				tgadaptor.BotSendText(bot, &update, &mesg)
			}
			continue
		}

		tgMesg := update.Message
		q := query.QueryMessage{Lang: "zh-Hant", Text: tgMesg.Text}

		if tgMesg.Location != nil {
			q.Location = &query.GeoLocation{tgMesg.Location.Latitude, tgMesg.Location.Longitude}
		}

		f_sent, f_err := processQuery(bot, &update, q)

		if !isGroup && !f_sent && f_err != nil {
			mesg := utils.MDv2Text(fmt.Sprintf("%s", f_err))
			tgadaptor.BotSendText(bot, &update, &mesg)
		}
	}
}

func processQuery(bot *tgbotapi.BotAPI, update *tgbotapi.Update, q query.QueryMessage) (bool, error) {
	var f_sent bool = false
	var f_err error = nil

	f_queries := []func(query.QueryMessage) query.IQueryResult{
		cjlookup.Query,
		mtrbus.Query,
		kmb.Query,
	}

	for _, Query := range f_queries {

		qResult := Query(q)
		sent, err := tgadaptor.BotSend(bot, update, qResult)

		if sent {
			f_sent = true
		}

		if err != nil {
			f_err = err
		}

		if qResult.Consumed() {
			break
		}
	}

	return f_sent, f_err
}