package main
import (
"fmt"
"html"
"log"
"os"
"strings"
"github.com/PaulSonOfLars/gotgbot/v2"
"github.com/PaulSonOfLars/gotgbot/v2/ext"
"github.com/PaulSonOfLars/gotgbot/v2/ext/handlers"
"github.com/PaulSonOfLars/gotgbot/v2/ext/handlers/filters/inlinequery"
"github.com/bobesa/go-domain-util/domainutil"
"github.com/likexian/whois"
whoisparser "github.com/likexian/whois-parser"
"github.com/pelletier/go-toml"
)
type Config struct {
Token string
}
func main() {
doc, err := os.ReadFile("config.toml")
if err != nil {
log.Fatal(err)
}
var config Config
if err := toml.Unmarshal(doc, &config); err != nil {
log.Fatal(err)
}
bot, err := gotgbot.NewBot(config.Token, nil)
if err != nil {
log.Fatal(err)
}
user, err := bot.GetMe()
if err != nil {
log.Fatal(err)
}
updater := ext.NewUpdater(&ext.UpdaterOpts{
DispatcherOpts: ext.DispatcherOpts{
Error: func(bot *gotgbot.Bot, ctx *ext.Context, err error) ext.DispatcherAction {
log.Println("error handling update:", err)
return ext.DispatcherActionNoop
},
},
})
dispatcher := updater.Dispatcher
dispatcher.AddHandler(handlers.NewInlineQuery(inlinequery.All, handler))
if err := updater.StartPolling(bot, &ext.PollingOpts{
GetUpdatesOpts: gotgbot.GetUpdatesOpts{
AllowedUpdates: []string{},
},
}); err != nil {
log.Fatal("failed to start polling:", err)
}
log.Printf("started @%s", user.Username)
updater.Idle()
}
func handler(bot *gotgbot.Bot, ctx *ext.Context) error {
q := ctx.Update.InlineQuery
domain := domainutil.Domain(q.Query)
if domain == "" {
log.Printf("query from [%d]: %q, no domain", q.From.Id, q.Query)
return nil
}
raw, err := whois.Whois(domain)
if err != nil {
log.Printf("query from [%d]: %q, domain: %q, whois err", q.From.Id, q.Query, domain)
return err
}
w, err := whoisparser.Parse(raw)
if err != nil {
log.Printf("query from [%d]: %q, domain: %q, whois parsing err", q.From.Id, q.Query, domain)
return err
}
_, err = q.Answer(bot, []gotgbot.InlineQueryResult{gotgbot.InlineQueryResultArticle{
Id: q.Query,
Title: domain,
InputMessageContent: gotgbot.InputTextMessageContent{
ParseMode: "HTML",
DisableWebPagePreview: true,
MessageText: fmt.Sprintf(
strings.Join([]string{
"<b>Domain:</b> %s",
"<b>Registrar:</b> <a href=\"%s\">%s</a>",
"<b>Name servers:</b> %s",
"<b>Full WHOIS:</b> https://1api.net/whois?query=%s",
}, "\n"),
domain,
w.Registrar.ReferralURL,
html.EscapeString(w.Registrar.Name),
strings.Join(w.Domain.NameServers, ", "),
domain,
),
},
}}, nil)
log.Printf("query from [%d]: %q, domain: %q, whois success", q.From.Id, q.Query, domain)
return err
}