✨ Added many new helpers of types
This commit is contained in:
parent
e8adab1850
commit
ff4a990bcd
120
helpers_bot.go
120
helpers_bot.go
|
@ -1,17 +1,35 @@
|
|||
package telegram
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
import "strings"
|
||||
|
||||
func (bot *Bot) IsMessageFromMe(msg *Message) bool {
|
||||
if msg == nil ||
|
||||
bot == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if msg.From == nil ||
|
||||
bot.Self == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return msg.From.ID == bot.Self.ID
|
||||
}
|
||||
|
||||
func (bot *Bot) IsForwardFromMe(msg *Message) bool {
|
||||
return msg.IsForward() &&
|
||||
msg.ForwardFrom.ID == bot.Self.ID
|
||||
if !msg.IsForward() {
|
||||
return false
|
||||
}
|
||||
|
||||
if bot == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if bot.Self == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return msg.ForwardFrom.ID == bot.Self.ID
|
||||
}
|
||||
|
||||
func (bot *Bot) IsReplyToMe(msg *Message) bool {
|
||||
|
@ -19,37 +37,58 @@ func (bot *Bot) IsReplyToMe(msg *Message) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
return msg.IsReply() &&
|
||||
bot.IsMessageFromMe(msg.ReplyToMessage)
|
||||
}
|
||||
|
||||
func (bot *Bot) IsCommandToMe(msg *Message) bool {
|
||||
if msg.Chat.IsPrivate() {
|
||||
return msg.IsCommand()
|
||||
}
|
||||
|
||||
return msg.IsCommand() &&
|
||||
strings.HasSuffix(
|
||||
strings.ToLower(msg.Command()),
|
||||
strings.ToLower(fmt.Sprint("@", bot.Self.Username)),
|
||||
)
|
||||
}
|
||||
|
||||
func (bot *Bot) IsMessageMentionsMe(msg *Message) bool {
|
||||
if msg.Entities == nil ||
|
||||
len(msg.Entities) <= 0 {
|
||||
if !msg.IsReply() {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, entity := range msg.Entities {
|
||||
if entity.Type != EntityMention ||
|
||||
entity.User == nil {
|
||||
continue
|
||||
return bot.IsMessageFromMe(msg.ReplyToMessage)
|
||||
}
|
||||
|
||||
func (bot *Bot) IsCommandToMe(msg *Message) bool {
|
||||
if !msg.IsCommand() {
|
||||
return false
|
||||
}
|
||||
|
||||
if entity.User.ID == bot.Self.ID {
|
||||
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.Self.Username)
|
||||
}
|
||||
|
||||
func (bot *Bot) IsMessageMentionsMe(msg *Message) bool {
|
||||
if msg == nil ||
|
||||
bot == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if bot.Self == 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.Self.ID == entity.User.ID {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
|
@ -66,13 +105,20 @@ func (bot *Bot) IsReplyMentionsMe(msg *Message) bool {
|
|||
}
|
||||
|
||||
func (bot *Bot) IsMessageToMe(msg *Message) bool {
|
||||
switch {
|
||||
case msg.Chat.IsPrivate(),
|
||||
bot.IsCommandToMe(msg),
|
||||
bot.IsReplyToMe(msg),
|
||||
bot.IsMessageMentionsMe(msg):
|
||||
return true
|
||||
default:
|
||||
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
|
||||
}
|
||||
|
|
|
@ -1,17 +1,37 @@
|
|||
package telegram
|
||||
|
||||
func (chat *Chat) IsPrivate() bool {
|
||||
if chat == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return chat.Type == ChatPrivate
|
||||
}
|
||||
|
||||
func (chat *Chat) IsGroup() bool {
|
||||
if chat == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return chat.Type == ChatGroup
|
||||
}
|
||||
|
||||
func (chat *Chat) IsSuperGroup() bool {
|
||||
if chat == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return chat.Type == ChatSuperGroup
|
||||
}
|
||||
|
||||
func (chat *Chat) IsChannel() bool {
|
||||
if chat == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return chat.Type == ChatChannel
|
||||
}
|
||||
|
||||
func (chat *Chat) HasPinnedMessage() bool {
|
||||
return chat.PinnedMessage != nil
|
||||
}
|
||||
|
|
|
@ -3,9 +3,101 @@ package telegram
|
|||
import "net/url"
|
||||
|
||||
func (entity *MessageEntity) ParseURL() (*url.URL, error) {
|
||||
if entity.Type == EntityTextLink {
|
||||
if entity != nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if entity.IsTextLink() {
|
||||
return url.Parse(entity.URL)
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsBold() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityBold
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsBotCommand() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityBotCommand
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsCode() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityCode
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsEmail() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityEmail
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsHashTag() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityHashtag
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsItalic() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityItalic
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsMention() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityMention
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsPre() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityPre
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsTextLink() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityTextLink
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsTextMention() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityTextMention
|
||||
}
|
||||
|
||||
func (entity *MessageEntity) IsURL() bool {
|
||||
if entity != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return entity.Type == EntityURL
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
package telegram
|
||||
|
||||
func NewInlineQueryResultCachedAudio(
|
||||
resultID, fileID string,
|
||||
) *InlineQueryResultCachedAudio {
|
||||
func NewInlineQueryResultCachedAudio(resultID, fileID string) *InlineQueryResultCachedAudio {
|
||||
return &InlineQueryResultCachedAudio{
|
||||
Type: TypeAudio,
|
||||
ID: resultID,
|
||||
|
@ -10,9 +8,7 @@ func NewInlineQueryResultCachedAudio(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedDocument(
|
||||
resultID, fileID, title string,
|
||||
) *InlineQueryResultCachedDocument {
|
||||
func NewInlineQueryResultCachedDocument(resultID, fileID, title string) *InlineQueryResultCachedDocument {
|
||||
return &InlineQueryResultCachedDocument{
|
||||
Type: TypeDocument,
|
||||
ID: resultID,
|
||||
|
@ -21,9 +17,7 @@ func NewInlineQueryResultCachedDocument(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedGif(
|
||||
resultID, fileID string,
|
||||
) *InlineQueryResultCachedGif {
|
||||
func NewInlineQueryResultCachedGif(resultID, fileID string) *InlineQueryResultCachedGif {
|
||||
return &InlineQueryResultCachedGif{
|
||||
Type: TypeGIF,
|
||||
ID: resultID,
|
||||
|
@ -31,9 +25,7 @@ func NewInlineQueryResultCachedGif(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedMpeg4Gif(
|
||||
resultID, fileID string,
|
||||
) *InlineQueryResultCachedMpeg4Gif {
|
||||
func NewInlineQueryResultCachedMpeg4Gif(resultID, fileID string) *InlineQueryResultCachedMpeg4Gif {
|
||||
return &InlineQueryResultCachedMpeg4Gif{
|
||||
Type: TypeMpeg4Gif,
|
||||
ID: resultID,
|
||||
|
@ -41,9 +33,7 @@ func NewInlineQueryResultCachedMpeg4Gif(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedPhoto(
|
||||
resultID, fileID string,
|
||||
) *InlineQueryResultCachedPhoto {
|
||||
func NewInlineQueryResultCachedPhoto(resultID, fileID string) *InlineQueryResultCachedPhoto {
|
||||
return &InlineQueryResultCachedPhoto{
|
||||
Type: TypePhoto,
|
||||
ID: resultID,
|
||||
|
@ -51,9 +41,7 @@ func NewInlineQueryResultCachedPhoto(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedSticker(
|
||||
resultID, fileID string,
|
||||
) *InlineQueryResultCachedSticker {
|
||||
func NewInlineQueryResultCachedSticker(resultID, fileID string) *InlineQueryResultCachedSticker {
|
||||
return &InlineQueryResultCachedSticker{
|
||||
Type: TypeSticker,
|
||||
ID: resultID,
|
||||
|
@ -61,9 +49,7 @@ func NewInlineQueryResultCachedSticker(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedVideo(
|
||||
resultID, fileID, title string,
|
||||
) *InlineQueryResultCachedVideo {
|
||||
func NewInlineQueryResultCachedVideo(resultID, fileID, title string) *InlineQueryResultCachedVideo {
|
||||
return &InlineQueryResultCachedVideo{
|
||||
Type: TypeVideo,
|
||||
ID: resultID,
|
||||
|
@ -72,9 +58,7 @@ func NewInlineQueryResultCachedVideo(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultCachedVoice(
|
||||
resultID, fileID, title string,
|
||||
) *InlineQueryResultCachedVoice {
|
||||
func NewInlineQueryResultCachedVoice(resultID, fileID, title string) *InlineQueryResultCachedVoice {
|
||||
return &InlineQueryResultCachedVoice{
|
||||
Type: TypeVoice,
|
||||
ID: resultID,
|
||||
|
@ -83,10 +67,7 @@ func NewInlineQueryResultCachedVoice(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultArticle(
|
||||
resultID, title string,
|
||||
content *InputMessageContent,
|
||||
) *InlineQueryResultArticle {
|
||||
func NewInlineQueryResultArticle(resultID, title string, content *InputMessageContent) *InlineQueryResultArticle {
|
||||
return &InlineQueryResultArticle{
|
||||
Type: TypeArticle,
|
||||
ID: resultID,
|
||||
|
@ -95,9 +76,7 @@ func NewInlineQueryResultArticle(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultAudio(
|
||||
resultID, audioURL, title string,
|
||||
) *InlineQueryResultAudio {
|
||||
func NewInlineQueryResultAudio(resultID, audioURL, title string) *InlineQueryResultAudio {
|
||||
return &InlineQueryResultAudio{
|
||||
Type: TypeAudio,
|
||||
ID: resultID,
|
||||
|
@ -106,9 +85,7 @@ func NewInlineQueryResultAudio(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultContact(
|
||||
resultID, phoneNumber, firstName string,
|
||||
) *InlineQueryResultContact {
|
||||
func NewInlineQueryResultContact(resultID, phoneNumber, firstName string) *InlineQueryResultContact {
|
||||
return &InlineQueryResultContact{
|
||||
Type: TypeContact,
|
||||
ID: resultID,
|
||||
|
@ -117,9 +94,7 @@ func NewInlineQueryResultContact(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultGame(
|
||||
resultID, gameShortName string,
|
||||
) *InlineQueryResultGame {
|
||||
func NewInlineQueryResultGame(resultID, gameShortName string) *InlineQueryResultGame {
|
||||
return &InlineQueryResultGame{
|
||||
Type: TypeGame,
|
||||
ID: resultID,
|
||||
|
@ -127,9 +102,7 @@ func NewInlineQueryResultGame(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultDocument(
|
||||
resultID, title, documentURL, mimeType string,
|
||||
) *InlineQueryResultDocument {
|
||||
func NewInlineQueryResultDocument(resultID, title, documentURL, mimeType string) *InlineQueryResultDocument {
|
||||
return &InlineQueryResultDocument{
|
||||
Type: TypeDocument,
|
||||
ID: resultID,
|
||||
|
@ -139,9 +112,7 @@ func NewInlineQueryResultDocument(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultGif(
|
||||
resultID, gifURL, thumbURL string,
|
||||
) *InlineQueryResultGif {
|
||||
func NewInlineQueryResultGif(resultID, gifURL, thumbURL string) *InlineQueryResultGif {
|
||||
return &InlineQueryResultGif{
|
||||
Type: TypeGIF,
|
||||
ID: resultID,
|
||||
|
@ -150,10 +121,7 @@ func NewInlineQueryResultGif(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultLocation(
|
||||
resultID, title string,
|
||||
latitude, longitude float32,
|
||||
) *InlineQueryResultLocation {
|
||||
func NewInlineQueryResultLocation(resultID, title string, latitude, longitude float32) *InlineQueryResultLocation {
|
||||
return &InlineQueryResultLocation{
|
||||
Type: TypeLocation,
|
||||
ID: resultID,
|
||||
|
@ -163,9 +131,7 @@ func NewInlineQueryResultLocation(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultMpeg4Gif(
|
||||
resultID, mpeg4URL, thumbURL string,
|
||||
) *InlineQueryResultMpeg4Gif {
|
||||
func NewInlineQueryResultMpeg4Gif(resultID, mpeg4URL, thumbURL string) *InlineQueryResultMpeg4Gif {
|
||||
return &InlineQueryResultMpeg4Gif{
|
||||
Type: TypeMpeg4Gif,
|
||||
ID: resultID,
|
||||
|
@ -174,9 +140,7 @@ func NewInlineQueryResultMpeg4Gif(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultPhoto(
|
||||
resultID, photoURL, thumbURL string,
|
||||
) *InlineQueryResultPhoto {
|
||||
func NewInlineQueryResultPhoto(resultID, photoURL, thumbURL string) *InlineQueryResultPhoto {
|
||||
return &InlineQueryResultPhoto{
|
||||
Type: TypePhoto,
|
||||
ID: resultID,
|
||||
|
@ -185,10 +149,7 @@ func NewInlineQueryResultPhoto(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultVenue(
|
||||
resultID, title, address string,
|
||||
latitude, longitude float32,
|
||||
) *InlineQueryResultVenue {
|
||||
func NewInlineQueryResultVenue(resultID, title, address string, latitude, longitude float32) *InlineQueryResultVenue {
|
||||
return &InlineQueryResultVenue{
|
||||
Type: TypeVenue,
|
||||
ID: resultID,
|
||||
|
@ -199,9 +160,7 @@ func NewInlineQueryResultVenue(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultVideo(
|
||||
resultID, videoURL, mimeType, thumbURL, title string,
|
||||
) *InlineQueryResultVideo {
|
||||
func NewInlineQueryResultVideo(resultID, videoURL, mimeType, thumbURL, title string) *InlineQueryResultVideo {
|
||||
return &InlineQueryResultVideo{
|
||||
Type: TypeVideo,
|
||||
ID: resultID,
|
||||
|
@ -212,9 +171,7 @@ func NewInlineQueryResultVideo(
|
|||
}
|
||||
}
|
||||
|
||||
func NewInlineQueryResultVoice(
|
||||
resultID, voiceURL, title string,
|
||||
) *InlineQueryResultVoice {
|
||||
func NewInlineQueryResultVoice(resultID, voiceURL, title string) *InlineQueryResultVoice {
|
||||
return &InlineQueryResultVoice{
|
||||
Type: TypeVoice,
|
||||
ID: resultID,
|
||||
|
|
59
helpers_member.go
Normal file
59
helpers_member.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package telegram
|
||||
|
||||
import "time"
|
||||
|
||||
func (member *ChatMember) IsCreator() bool {
|
||||
if member == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return member.Status == StatusCreator
|
||||
}
|
||||
|
||||
func (member *ChatMember) IsAdministrator() bool {
|
||||
if member == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return member.Status == StatusAdministrator
|
||||
}
|
||||
|
||||
func (member *ChatMember) IsMember() bool {
|
||||
if member == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return member.Status == StatusMember
|
||||
}
|
||||
|
||||
func (member *ChatMember) IsRestricted() bool {
|
||||
if member == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return member.Status == StatusRestricted
|
||||
}
|
||||
|
||||
func (member *ChatMember) IsLeft() bool {
|
||||
if member == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return member.Status == StatusLeft
|
||||
}
|
||||
|
||||
func (member *ChatMember) IsKicked() bool {
|
||||
if member == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return member.Status == StatusKicked
|
||||
}
|
||||
|
||||
func (member *ChatMember) UntilTime() time.Time {
|
||||
if member == nil {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
return time.Unix(member.UntilDate, 0)
|
||||
}
|
|
@ -1,15 +1,21 @@
|
|||
package telegram
|
||||
|
||||
import "time"
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (msg *Message) IsCommand() bool {
|
||||
if msg.Entities == nil ||
|
||||
len(msg.Entities) <= 0 {
|
||||
if !msg.IsText() {
|
||||
return false
|
||||
}
|
||||
|
||||
return msg.Entities[0].Offset == 0 &&
|
||||
msg.Entities[0].Type == EntityBotCommand
|
||||
if !msg.HasEntities() {
|
||||
return false
|
||||
}
|
||||
|
||||
entity := msg.Entities[0]
|
||||
return entity.IsBotCommand() && entity.Offset == 0
|
||||
}
|
||||
|
||||
func (msg *Message) Command() string {
|
||||
|
@ -17,37 +23,205 @@ func (msg *Message) Command() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
return strings.Split(msg.RawCommand(), "@")[0]
|
||||
}
|
||||
|
||||
func (msg *Message) RawCommand() string {
|
||||
if !msg.IsCommand() {
|
||||
return ""
|
||||
}
|
||||
|
||||
return string([]rune(msg.Text)[1:msg.Entities[0].Length])
|
||||
}
|
||||
|
||||
func (msg *Message) HasArgument() bool {
|
||||
switch {
|
||||
case msg.IsCommand(),
|
||||
len(msg.CommandArgument()) > 0:
|
||||
return true
|
||||
default:
|
||||
func (msg *Message) HasCommandArgument() bool {
|
||||
if !msg.IsCommand() {
|
||||
return false
|
||||
}
|
||||
|
||||
entity := msg.Entities[0]
|
||||
if !entity.IsBotCommand() {
|
||||
return false
|
||||
}
|
||||
|
||||
return len([]rune(msg.Text)) != entity.Length
|
||||
}
|
||||
|
||||
func (msg *Message) CommandArgument() string {
|
||||
switch {
|
||||
case !msg.IsCommand(),
|
||||
len([]rune(msg.Text)) == msg.Entities[0].Length:
|
||||
if !msg.HasCommandArgument() {
|
||||
return ""
|
||||
default:
|
||||
return string([]rune(msg.Text)[msg.Entities[0].Length+1:])
|
||||
}
|
||||
|
||||
return string([]rune(msg.Text)[msg.Entities[0].Length+1:])
|
||||
}
|
||||
|
||||
func (msg *Message) IsReply() bool {
|
||||
if msg == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return msg.ReplyToMessage != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsForward() bool {
|
||||
if msg == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return msg.ForwardFrom != nil
|
||||
}
|
||||
|
||||
func (msg *Message) Time() time.Time {
|
||||
if msg == nil {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
return time.Unix(msg.Date, 0)
|
||||
}
|
||||
|
||||
func (msg *Message) ForwardTime() time.Time {
|
||||
if msg == nil {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
return time.Unix(msg.ForwardDate, 0)
|
||||
}
|
||||
|
||||
func (msg *Message) EditTime() time.Time {
|
||||
if msg == nil {
|
||||
return time.Time{}
|
||||
}
|
||||
|
||||
return time.Unix(msg.EditDate, 0)
|
||||
}
|
||||
|
||||
func (msg *Message) IsText() bool {
|
||||
if msg == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return msg.Text != ""
|
||||
}
|
||||
|
||||
func (msg *Message) IsAudio() bool {
|
||||
return !msg.IsText() && msg.Audio != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsDocument() bool {
|
||||
return !msg.IsText() && msg.Document != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsGame() bool {
|
||||
return !msg.IsText() && msg.Game != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsPhoto() bool {
|
||||
return !msg.IsText() && len(msg.Photo) > 0
|
||||
}
|
||||
|
||||
func (msg *Message) IsSticker() bool {
|
||||
return !msg.IsText() && msg.Sticker != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsVideo() bool {
|
||||
return !msg.IsText() && msg.Video != nil
|
||||
}
|
||||
func (msg *Message) IsVoice() bool {
|
||||
return !msg.IsText() && msg.Voice != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsVideoNote() bool {
|
||||
return !msg.IsText() && msg.VideoNote != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsContact() bool {
|
||||
return !msg.IsText() && msg.Contact != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsLocation() bool {
|
||||
return !msg.IsText() && msg.Location != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsVenue() bool {
|
||||
return !msg.IsText() && msg.Venue != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsNewChatMembersEvent() bool {
|
||||
return !msg.IsText() && len(msg.NewChatMembers) > 0
|
||||
}
|
||||
|
||||
func (msg *Message) IsLeftChatMemberEvent() bool {
|
||||
return !msg.IsText() && msg.LeftChatMember != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsNewChatTitleEvent() bool {
|
||||
return !msg.IsText() && msg.NewChatTitle != ""
|
||||
}
|
||||
|
||||
func (msg *Message) IsNewChatPhotoEvent() bool {
|
||||
return !msg.IsText() && len(msg.NewChatPhoto) > 0
|
||||
}
|
||||
|
||||
func (msg *Message) IsDeleteChatPhotoEvent() bool {
|
||||
return !msg.IsText() && msg.DeleteChatPhoto
|
||||
}
|
||||
|
||||
func (msg *Message) IsGroupChatCreatedEvent() bool {
|
||||
return !msg.IsText() && msg.GroupChatCreated
|
||||
}
|
||||
|
||||
func (msg *Message) IsSupergroupChatCreatedEvent() bool {
|
||||
return !msg.IsText() && msg.SupergroupChatCreated
|
||||
}
|
||||
|
||||
func (msg *Message) IsChannelChatCreatedEvent() bool {
|
||||
return !msg.IsText() && msg.ChannelChatCreated
|
||||
}
|
||||
|
||||
func (msg *Message) IsPinnedMessage() bool {
|
||||
return !msg.IsText() && msg.PinnedMessage != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsInvoice() bool {
|
||||
return !msg.IsText() && msg.Invoice != nil
|
||||
}
|
||||
|
||||
func (msg *Message) IsSuccessfulPayment() bool {
|
||||
return !msg.IsText() && msg.SuccessfulPayment != nil
|
||||
}
|
||||
|
||||
func (msg *Message) HasEntities() bool {
|
||||
return msg.IsText() && len(msg.Entities) > 0
|
||||
}
|
||||
|
||||
func (msg *Message) HasCaptionEntities() bool {
|
||||
return !msg.IsText() && len(msg.CaptionEntities) > 0
|
||||
}
|
||||
|
||||
func (msg *Message) HasMentions() bool {
|
||||
if !msg.HasEntities() {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, entity := range msg.Entities {
|
||||
if entity.IsMention() || entity.IsTextMention() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (msg *Message) HasCaptionMentions() bool {
|
||||
if !msg.HasCaptionEntities() {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, entity := range msg.CaptionEntities {
|
||||
if entity.IsMention() || entity.IsTextMention() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
|
129
helpers_update.go
Normal file
129
helpers_update.go
Normal file
|
@ -0,0 +1,129 @@
|
|||
package telegram
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/kirillDanshin/dlog"
|
||||
json "github.com/pquerna/ffjson/ffjson"
|
||||
http "github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
type UpdatesChannel <-chan Update
|
||||
|
||||
func (bot *Bot) NewLongPollingChannel(params *GetUpdatesParameters) UpdatesChannel {
|
||||
if params == nil {
|
||||
params = &GetUpdatesParameters{
|
||||
Offset: 0,
|
||||
Limit: 100,
|
||||
Timeout: 60,
|
||||
}
|
||||
}
|
||||
|
||||
channel := make(chan Update, params.Limit)
|
||||
go func() {
|
||||
for {
|
||||
updates, err := bot.GetUpdates(params)
|
||||
if err != nil {
|
||||
dlog.Ln(err.Error())
|
||||
dlog.Ln("Failed to get updates, retrying in 3 seconds...")
|
||||
time.Sleep(time.Second * 3)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, update := range updates {
|
||||
if update.ID >= params.Offset {
|
||||
params.Offset = update.ID + 1
|
||||
channel <- update
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return channel
|
||||
}
|
||||
|
||||
func (bot *Bot) NewWebhookChannel(params *SetWebhookParameters, certFile, keyFile, set, listen, serve string) (updates UpdatesChannel) {
|
||||
if params == nil {
|
||||
params = &SetWebhookParameters{
|
||||
URL: set,
|
||||
MaxConnections: 40,
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
channel := make(chan Update, 100)
|
||||
requiredPath := []byte(listen)
|
||||
dlog.Ln("requiredPath:", string(requiredPath))
|
||||
handleFunc := func(ctx *http.RequestCtx) {
|
||||
dlog.Ln("Request path:", string(ctx.Path()))
|
||||
if !bytes.HasPrefix(ctx.Path(), requiredPath) {
|
||||
dlog.Ln("Unsupported request path:", string(ctx.Path()))
|
||||
return
|
||||
}
|
||||
dlog.Ln("Catched supported request path:", string(ctx.Path()))
|
||||
|
||||
var update Update
|
||||
if err = json.Unmarshal(ctx.Request.Body(), &update); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
channel <- update
|
||||
}
|
||||
|
||||
go func() {
|
||||
if certFile != "" && keyFile != "" {
|
||||
dlog.Ln("Creating TLS router...")
|
||||
err = http.ListenAndServeTLS(serve, certFile, keyFile, handleFunc)
|
||||
} else {
|
||||
dlog.Ln("Creating simple router...")
|
||||
err = http.ListenAndServe(serve, handleFunc)
|
||||
}
|
||||
if err != nil {
|
||||
log.Fatalln(err.Error())
|
||||
}
|
||||
}()
|
||||
|
||||
if _, err = bot.SetWebhook(params); err != nil {
|
||||
log.Fatalln(err.Error())
|
||||
}
|
||||
|
||||
return channel
|
||||
}
|
||||
|
||||
func (upd *Update) IsMessage() bool {
|
||||
return upd.Message != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsEditedMessage() bool {
|
||||
return upd.EditedMessage != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsChannelPost() bool {
|
||||
return upd.ChannelPost != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsEditedChannelPost() bool {
|
||||
return upd.EditedChannelPost != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsInlineQuery() bool {
|
||||
return upd.InlineQuery != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsChosenInlineResult() bool {
|
||||
return upd.ChosenInlineResult != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsCallbackQuery() bool {
|
||||
return upd.CallbackQuery != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsShippingQuery() bool {
|
||||
return upd.ShippingQuery != nil
|
||||
}
|
||||
|
||||
func (upd *Update) IsPreCheckoutQuery() bool {
|
||||
return upd.PreCheckoutQuery != nil
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
package telegram
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/kirillDanshin/dlog"
|
||||
json "github.com/pquerna/ffjson/ffjson"
|
||||
http "github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
type UpdatesChannel <-chan Update
|
||||
|
||||
func (bot *Bot) NewLongPollingChannel(params *GetUpdatesParameters) UpdatesChannel {
|
||||
if params == nil {
|
||||
params = &GetUpdatesParameters{
|
||||
Offset: 0,
|
||||
Limit: 100,
|
||||
Timeout: 60,
|
||||
}
|
||||
}
|
||||
|
||||
channel := make(chan Update, params.Limit)
|
||||
go func() {
|
||||
for {
|
||||
updates, err := bot.GetUpdates(params)
|
||||
if err != nil {
|
||||
dlog.Ln(err.Error())
|
||||
dlog.Ln("Failed to get updates, retrying in 3 seconds...")
|
||||
time.Sleep(time.Second * 3)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, update := range updates {
|
||||
if update.ID >= params.Offset {
|
||||
params.Offset = update.ID + 1
|
||||
channel <- update
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return channel
|
||||
}
|
||||
|
||||
func (bot *Bot) NewWebhookChannel(
|
||||
params *SetWebhookParameters,
|
||||
certFile, keyFile, set, listen, serve string,
|
||||
) (updates UpdatesChannel) {
|
||||
if params == nil {
|
||||
params = &SetWebhookParameters{
|
||||
URL: set,
|
||||
MaxConnections: 40,
|
||||
}
|
||||
}
|
||||
|
||||
channel := make(chan Update, 100)
|
||||
go func() {
|
||||
requiredPath := []byte(listen)
|
||||
dlog.Ln("requiredPath:", string(requiredPath))
|
||||
handleFunc := func(ctx *http.RequestCtx) {
|
||||
dlog.Ln("Request path:", string(ctx.Path()))
|
||||
if !bytes.HasPrefix(ctx.Path(), requiredPath) {
|
||||
dlog.Ln("Unsupported request path:", string(ctx.Path()))
|
||||
return
|
||||
}
|
||||
dlog.Ln("Catched supported request path:", string(ctx.Path()))
|
||||
|
||||
var update Update
|
||||
if err := json.Unmarshal(ctx.Request.Body(), &update); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
channel <- update
|
||||
}
|
||||
|
||||
if certFile != "" && keyFile != "" {
|
||||
dlog.Ln("Creating TLS router...")
|
||||
log.Fatal(http.ListenAndServeTLS(serve, certFile, keyFile, handleFunc))
|
||||
} else {
|
||||
dlog.Ln("Creating simple router...")
|
||||
log.Fatal(http.ListenAndServe(serve, handleFunc))
|
||||
}
|
||||
}()
|
||||
|
||||
if _, err := bot.SetWebhook(params); err != nil {
|
||||
log.Fatalln(err.Error())
|
||||
}
|
||||
|
||||
return channel
|
||||
}
|
32
helpers_user.go
Normal file
32
helpers_user.go
Normal file
|
@ -0,0 +1,32 @@
|
|||
package telegram
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
func (user *User) Language() *language.Tag {
|
||||
if user == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
tag, err := language.Parse(user.LanguageCode)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &tag
|
||||
}
|
||||
|
||||
func (user *User) FullName() string {
|
||||
if user == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
if user.LastName != "" {
|
||||
return fmt.Sprint(user.FirstName, " ", user.LastName)
|
||||
}
|
||||
|
||||
return user.FirstName
|
||||
}
|
Loading…
Reference in New Issue
Block a user