Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: message type filter #62

Merged
merged 3 commits into from
Jul 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions tgb/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,13 @@ func Regexp(re *regexp.Regexp) Filter {
})
}

// ChatType checks chat type in:
// - Message, EditedMessage, ChannelPost, EditedChannelPost
// - CallbackQuery.Message.Chat.Type (if not nil)
// - InlineQuery.ChatType
// - MyChatMember.Chat.Type
// - ChatMember.Chat.Type
// - ChatJoinRequest.Chat.Type
func ChatType(types ...tg.ChatType) Filter {
return FilterFunc(func(ctx context.Context, update *Update) (bool, error) {
var typ tg.ChatType
Expand All @@ -252,3 +259,18 @@ func ChatType(types ...tg.ChatType) Filter {
return slices.Contains(types, typ), nil
})
}

// MessageType checks Message, EditedMessage, ChannelPost, EditedChannelPost
// for matching type with specified.
// If multiple types are specified, it checks if message type is one of them.
func MessageType(types ...tg.MessageType) Filter {
return FilterFunc(func(ctx context.Context, update *Update) (bool, error) {
msg := getUpdateMessage(update)

if msg != nil {
return slices.Contains(types, msg.Type()), nil
}

return false, nil
})
}
48 changes: 48 additions & 0 deletions tgb/filter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -467,3 +467,51 @@ func TestChatType(t *testing.T) {
})
}
}

func TestMessageType(t *testing.T) {
for _, test := range []struct {
Name string
Update *Update
Allowed []tg.MessageType
Want bool
}{
{
Name: "CallbackQueryShouldBeNotAllowed",
Update: &Update{Update: &tg.Update{
CallbackQuery: &tg.CallbackQuery{},
}},
Allowed: []tg.MessageType{tg.MessageTypeText},
Want: false,
},
{
Name: "MessageWithTextShouldBeAllowed",
Update: &Update{Update: &tg.Update{
Message: &tg.Message{
Text: "text",
},
}},
Allowed: []tg.MessageType{tg.MessageTypeText},
Want: true,
},
{
Name: "MessageWithPhotoForTextFilterShouldBeNotAllowed",
Update: &Update{Update: &tg.Update{
Message: &tg.Message{
Photo: []tg.PhotoSize{{}},
},
}},
Allowed: []tg.MessageType{tg.MessageTypeText},
Want: false,
},
} {
ctx := context.Background()

t.Run(test.Name, func(t *testing.T) {
filter := MessageType(test.Allowed...)

allow, err := filter.Allow(ctx, test.Update)
assert.Equal(t, test.Want, allow)
assert.NoError(t, err)
})
}
}
125 changes: 125 additions & 0 deletions types_gen_ext.go
Original file line number Diff line number Diff line change
Expand Up @@ -737,3 +737,128 @@ func (button MenuButtonWebApp) MarshalJSON() ([]byte, error) {
type alias MenuButtonWebApp
return json.Marshal(alias(button))
}

// MessageType it's type for describe content of Message.
type MessageType int

const (
MessageTypeUnknown MessageType = iota
MessageTypeText
MessageTypeAnimation
MessageTypeAudio
MessageTypeDocument
MessageTypePhoto
MessageTypeSticker
MessageTypeVideo
MessageTypeVideoNote
MessageTypeVoice
MessageTypeContact
MessageTypeDice
MessageTypeGame
MessageTypePoll
MessageTypeVenue
MessageTypeLocation
MessageTypeNewChatMembers
MessageTypeLeftChatMember
MessageTypeNewChatTitle
MessageTypeNewChatPhoto
MessageTypeDeleteChatPhoto
MessageTypeGroupChatCreated
MessageTypeSupergroupChatCreated
MessageTypeChannelChatCreated
MessageTypeMessageAutoDeleteTimerChanged
MessageTypeMigrateToChatID
MessageTypeMigrateFromChatID
MessageTypePinnedMessage
MessageTypeInvoice
MessageTypeSuccessfulPayment
MessageTypeConnectedWebsite
MessageTypePassportData
MessageTypeProximityAlertTriggered
MessageTypeVideoChatScheduled
MessageTypeVideoChatStarted
MessageTypeVideoChatEnded
MessageTypeVideoChatParticipantsInvited
MessageTypeWebAppData
)

func (msg *Message) Type() MessageType {
switch {
case msg.Text != "":
return MessageTypeText
case msg.Animation != nil:
return MessageTypeAnimation
case msg.Audio != nil:
return MessageTypeAudio
case msg.Document != nil:
return MessageTypeDocument
case msg.Photo != nil:
return MessageTypePhoto
case msg.Sticker != nil:
return MessageTypeSticker
case msg.Video != nil:
return MessageTypeVideo
case msg.VideoNote != nil:
return MessageTypeVideoNote
case msg.Voice != nil:
return MessageTypeVoice
case msg.Contact != nil:
return MessageTypeContact
case msg.Dice != nil:
return MessageTypeDice
case msg.Game != nil:
return MessageTypeGame
case msg.Poll != nil:
return MessageTypePoll
case msg.Venue != nil:
return MessageTypeVenue
case msg.Location != nil:
return MessageTypeLocation
case len(msg.NewChatMembers) > 0:
return MessageTypeNewChatMembers
case msg.LeftChatMember != nil:
return MessageTypeLeftChatMember
case msg.NewChatTitle != "":
return MessageTypeNewChatTitle
case len(msg.NewChatPhoto) > 0:
return MessageTypeNewChatPhoto
case msg.DeleteChatPhoto:
return MessageTypeDeleteChatPhoto
case msg.GroupChatCreated:
return MessageTypeGroupChatCreated
case msg.SupergroupChatCreated:
return MessageTypeSupergroupChatCreated
case msg.ChannelChatCreated:
return MessageTypeChannelChatCreated
case msg.MessageAutoDeleteTimerChanged != nil:
return MessageTypeMessageAutoDeleteTimerChanged
case msg.MigrateToChatID != 0:
return MessageTypeMigrateToChatID
case msg.MigrateFromChatID != 0:
return MessageTypeMigrateFromChatID
case msg.PinnedMessage != nil:
return MessageTypePinnedMessage
case msg.Invoice != nil:
return MessageTypeInvoice
case msg.SuccessfulPayment != nil:
return MessageTypeSuccessfulPayment
case msg.ConnectedWebsite != "":
return MessageTypeConnectedWebsite
case msg.PassportData != nil:
return MessageTypePassportData
case msg.ProximityAlertTriggered != nil:
return MessageTypeProximityAlertTriggered
case msg.VideoChatScheduled != nil:
return MessageTypeVideoChatScheduled
case msg.VideoChatStarted != nil:
return MessageTypeVideoChatStarted
case msg.VideoChatEnded != nil:
return MessageTypeVideoChatEnded
case msg.VideoChatParticipantsInvited != nil:
return MessageTypeVideoChatParticipantsInvited
case msg.WebAppData != nil:
return MessageTypeWebAppData
default:
return MessageTypeUnknown
}
}
162 changes: 162 additions & 0 deletions types_gen_ext_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -569,3 +569,165 @@ func TestMenuButton(t *testing.T) {
test.Scope.isMenuButton()
}
}

func TestMessage_Type(t *testing.T) {
for _, test := range []struct {
Message *Message
Want MessageType
}{
{
Message: &Message{},
Want: MessageTypeUnknown,
},
{
Message: &Message{Text: "hello"},
Want: MessageTypeText,
},
{
Message: &Message{Animation: &Animation{}},
Want: MessageTypeAnimation,
},
{
Message: &Message{Audio: &Audio{}},
Want: MessageTypeAudio,
},
{
Message: &Message{Document: &Document{}},
Want: MessageTypeDocument,
},
{
Message: &Message{Photo: []PhotoSize{{}}},
Want: MessageTypePhoto,
},
{
Message: &Message{Sticker: &Sticker{}},
Want: MessageTypeSticker,
},
{
Message: &Message{Video: &Video{}},
Want: MessageTypeVideo,
},
{
Message: &Message{VideoNote: &VideoNote{}},
Want: MessageTypeVideoNote,
},
{
Message: &Message{Voice: &Voice{}},
Want: MessageTypeVoice,
},
{
Message: &Message{Contact: &Contact{}},
Want: MessageTypeContact,
},
{
Message: &Message{Dice: &Dice{}},
Want: MessageTypeDice,
},
{
Message: &Message{Game: &Game{}},
Want: MessageTypeGame,
},
{
Message: &Message{Poll: &Poll{}},
Want: MessageTypePoll,
},
{
Message: &Message{Venue: &Venue{}},
Want: MessageTypeVenue,
},
{
Message: &Message{Location: &Location{}},
Want: MessageTypeLocation,
},
{
Message: &Message{NewChatMembers: []User{{}}},
Want: MessageTypeNewChatMembers,
},
{
Message: &Message{LeftChatMember: &User{}},
Want: MessageTypeLeftChatMember,
},
{
Message: &Message{NewChatTitle: "hello"},
Want: MessageTypeNewChatTitle,
},
{
Message: &Message{NewChatPhoto: []PhotoSize{{}}},
Want: MessageTypeNewChatPhoto,
},
{
Message: &Message{DeleteChatPhoto: true},
Want: MessageTypeDeleteChatPhoto,
},
{
Message: &Message{GroupChatCreated: true},
Want: MessageTypeGroupChatCreated,
},
{
Message: &Message{SupergroupChatCreated: true},
Want: MessageTypeSupergroupChatCreated,
},
{
Message: &Message{ChannelChatCreated: true},
Want: MessageTypeChannelChatCreated,
},
{
Message: &Message{MessageAutoDeleteTimerChanged: &MessageAutoDeleteTimerChanged{}},
Want: MessageTypeMessageAutoDeleteTimerChanged,
},
{
Message: &Message{MigrateToChatID: -10023123123},
Want: MessageTypeMigrateToChatID,
},
{
Message: &Message{MigrateFromChatID: -10023123123},
Want: MessageTypeMigrateFromChatID,
},
{
Message: &Message{PinnedMessage: &Message{}},
Want: MessageTypePinnedMessage,
},
{
Message: &Message{Invoice: &Invoice{}},
Want: MessageTypeInvoice,
},
{
Message: &Message{SuccessfulPayment: &SuccessfulPayment{}},
Want: MessageTypeSuccessfulPayment,
},
{
Message: &Message{ConnectedWebsite: "telegram.me"},
Want: MessageTypeConnectedWebsite,
},
{
Message: &Message{PassportData: &PassportData{}},
Want: MessageTypePassportData,
},
{
Message: &Message{ProximityAlertTriggered: &ProximityAlertTriggered{}},
Want: MessageTypeProximityAlertTriggered,
},
{
Message: &Message{VideoChatScheduled: &VideoChatScheduled{}},
Want: MessageTypeVideoChatScheduled,
},
{
Message: &Message{VideoChatStarted: &VideoChatStarted{}},
Want: MessageTypeVideoChatStarted,
},
{
Message: &Message{VideoChatEnded: &VideoChatEnded{}},
Want: MessageTypeVideoChatEnded,
},
{
Message: &Message{VideoChatParticipantsInvited: &VideoChatParticipantsInvited{}},
Want: MessageTypeVideoChatParticipantsInvited,
},
{
Message: &Message{WebAppData: &WebAppData{}},
Want: MessageTypeWebAppData,
},
} {
assert.Equal(t, test.Want, test.Message.Type())
}
}