Return 403 on join if banned from a group

This commit is contained in:
Bohdan Horbeshko 2025-06-28 07:49:04 -04:00
parent 06645eaa8c
commit d5c1d6ff2a
2 changed files with 40 additions and 0 deletions

View file

@ -2857,6 +2857,39 @@ func (c *Client) IsMessageSendingPermitted(permissions *client.ChatPermissions)
permissions.CanSendOtherMessages 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 // GetErrorCode obtains an error code from a Telegram response error
func GetErrorCode(err error) (int32, bool) { func GetErrorCode(err error) (int32, bool) {
responseError, ok := err.(client.ResponseError) responseError, ok := err.(client.ResponseError)

View file

@ -595,6 +595,13 @@ func handleMUCPresence(s xmpp.Sender, p stanza.Presence, mucExt stanza.MucPresen
return 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) log.Debugf("%#v", mucExt)
maxStanzas, maxStanzasOk := mucExt.History.MaxStanzas.Get() maxStanzas, maxStanzasOk := mucExt.History.MaxStanzas.Get()
maxChars, maxCharsOk := mucExt.History.MaxChars.Get() maxChars, maxCharsOk := mucExt.History.MaxChars.Get()