diff --git a/telegram/utils.go b/telegram/utils.go index bf99046..109e16d 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -2857,6 +2857,39 @@ func (c *Client) IsMessageSendingPermitted(permissions *client.ChatPermissions) permissions.CanSendOtherMessages } +// GetMyStatusInChat checks the membership status of current account in the given chat +func (c *Client) GetMyStatusInChat(chatID int64) ChatMemberStatus { + if c.me == nil { + return ChatMemberStatusIllegal + } + + member, err := c.client.GetChatMember(&client.GetChatMemberRequest{ + ChatId: chatID, + MemberId: &client.MessageSenderUser{UserId: c.me.Id}, + }) + if err != nil { + return ChatMemberStatusIllegal + } + return c.getChatMemberStatus(member.Status) +} + +func (c *Client) getChatMemberStatus(status client.ChatMemberStatus) ChatMemberStatus { + switch status.ChatMemberStatusType() { + case client.TypeChatMemberStatusCreator, client.TypeChatMemberStatusAdministrator: + return ChatMemberStatusPromoted + case client.TypeChatMemberStatusMember: + return ChatMemberStatusUnbanned + case client.TypeChatMemberStatusRestricted: + return ChatMemberStatusMuted + case client.TypeChatMemberStatusLeft: + return ChatMemberStatusKicked + case client.TypeChatMemberStatusBanned: + return ChatMemberStatusBanned + } + + return ChatMemberStatusIllegal +} + // GetErrorCode obtains an error code from a Telegram response error func GetErrorCode(err error) (int32, bool) { responseError, ok := err.(client.ResponseError) diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 206e93e..e18f98b 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -595,6 +595,13 @@ func handleMUCPresence(s xmpp.Sender, p stanza.Presence, mucExt stanza.MucPresen return } + status := session.GetMyStatusInChat(chatId) + // TODO: seems to be impossible for basic groups, check back when supergroups are supported + if status == telegram.ChatMemberStatusBanned { + presenceReplySetError(reply, 403) + return + } + log.Debugf("%#v", mucExt) maxStanzas, maxStanzasOk := mucExt.History.MaxStanzas.Get() maxChars, maxCharsOk := mucExt.History.MaxChars.Get()