1
0
Fork 0
telegram/utils_bot.go

184 lines
2.8 KiB
Go

package telegram
import (
"fmt"
"net/url"
"strings"
)
type Bot struct {
AccessToken string
*User
}
func New(accessToken string) (*Bot, error) {
var err error
bot := &Bot{AccessToken: accessToken}
bot.User, err = bot.GetMe()
return bot, err
}
func (bot *Bot) IsMessageFromMe(msg *Message) bool {
if msg == nil || bot == nil {
return false
}
if msg.From == nil || bot.User == nil {
return false
}
return msg.From.ID == bot.ID
}
func (bot *Bot) IsForwardFromMe(msg *Message) bool {
if !msg.IsForward() {
return false
}
if bot == nil {
return false
}
if bot.User == nil {
return false
}
return msg.ForwardFrom.ID == bot.ID
}
func (bot *Bot) IsReplyToMe(msg *Message) bool {
if msg.Chat.IsPrivate() {
return true
}
if !msg.IsReply() {
return false
}
return bot.IsMessageFromMe(msg.ReplyToMessage)
}
func (bot *Bot) IsCommandToMe(msg *Message) bool {
if !msg.IsCommand("") {
return false
}
if msg.Chat.IsPrivate() {
return true
}
parts := strings.Split(msg.RawCommand(), "@")
if len(parts) <= 1 {
return false
}
return strings.ToLower(parts[1]) == strings.ToLower(bot.User.Username)
}
func (bot *Bot) IsMessageMentionsMe(msg *Message) bool {
if msg == nil || bot == nil {
return false
}
if bot.User == nil {
return false
}
if bot.IsCommandToMe(msg) {
return true
}
var entities []MessageEntity
switch {
case msg.HasMentions():
entities = msg.Entities
case msg.HasCaptionMentions():
entities = msg.CaptionEntities
}
for _, entity := range entities {
if entity.IsMention() {
if bot.ID == entity.User.ID {
return true
}
}
}
return false
}
func (bot *Bot) IsForwardMentionsMe(msg *Message) bool {
return msg.IsForward() && bot.IsMessageMentionsMe(msg)
}
func (bot *Bot) IsReplyMentionsMe(msg *Message) bool {
return msg.IsReply() && bot.IsMessageMentionsMe(msg.ReplyToMessage)
}
func (bot *Bot) IsMessageToMe(msg *Message) bool {
if msg == nil {
return false
}
if msg.Chat == nil {
return false
}
if msg.Chat.IsPrivate() ||
bot.IsCommandToMe(msg) ||
bot.IsReplyToMe(msg) ||
bot.IsMessageMentionsMe(msg) {
return true
}
return false
}
func (bot *Bot) NewFileURL(filePath string) *url.URL {
if bot == nil {
return nil
}
if bot.AccessToken == "" || filePath == "" {
return nil
}
return &url.URL{
Scheme: "https",
Host: "api.telegram.org",
Path: fmt.Sprint("/file/bot", bot.AccessToken, "/", filePath),
}
}
func (bot *Bot) NewRedirectURL(group bool, param string) *url.URL {
if bot == nil {
return nil
}
if bot.User == nil {
return nil
}
if bot.User.Username == "" {
return nil
}
link := &url.URL{
Scheme: "https",
Host: "t.me",
Path: bot.User.Username,
}
q := link.Query()
if group {
q.Add("startgroup", param)
} else {
q.Add("start", param)
}
link.RawQuery = q.Encode()
return link
}