8000 Add Parameter `chat_id` to `ChatMemberHandler` (#4290) · gtkacz/python-telegram-bot@9e70ac8 · GitHub
[go: up one dir, main page]

8000
Skip to content

Commit 9e70ac8

Browse files
authored
Add Parameter chat_id to ChatMemberHandler (python-telegram-bot#4290)
1 parent cf72849 commit 9e70ac8

File tree

2 files changed

+86
-11
lines changed

2 files changed

+86
-11
lines changed

telegram/ext/_handlers/chatmemberhandler.py

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
from telegram import Update
2323
from telegram._utils.defaultvalue import DEFAULT_TRUE
24-
from telegram._utils.types import DVType
24+
from telegram._utils.types import SCT, DVType
2525
from telegram.ext._handlers.basehandler import BaseHandler
26+
from telegram.ext._utils._update_parsing import parse_chat_id
2627
from telegram.ext._utils.types import CCT, HandlerCallback
2728

2829
RT = TypeVar("RT")
@@ -58,6 +59,9 @@ async def callback(update: Update, context: CallbackContext)
5859
:meth:`telegram.ext.Application.process_update`. Defaults to :obj:`True`.
5960
6061
.. seealso:: :wiki:`Concurrency`
62+
chat_id (:obj:`int` | Collection[:obj:`int`], optional): Filters chat member updates from
63+
specified chat ID(s) only.
64+
.. versionadded:: NEXT.VERSION
6165
6266
Attributes:
6367
callback (:term:`coroutine function`): The callback function for this handler.
@@ -70,7 +74,10 @@ async def callback(update: Update, context: CallbackContext)
7074
7175
"""
7276

73-
__slots__ = ("chat_member_types",)
77+
__slots__ = (
78+
"_chat_ids",
79+
"chat_member_types",
80+
)
7481
MY_CHAT_MEMBER: Final[int] = -1
7582
""":obj:`int`: Used as a constant to handle only :attr:`telegram.Update.my_chat_member`."""
7683
CHAT_MEMBER: Final[int] = 0
@@ -84,10 +91,12 @@ def __init__(
8491
callback: HandlerCallback[Update, CCT, RT],
8592
chat_member_types: int = MY_CHAT_MEMBER,
8693
block: DVType[bool] = DEFAULT_TRUE,
94+
chat_id: Optional[SCT[int]] = None,
8795
):
8896
super().__init__(callback, block=block)
8997

9098
self.chat_member_types: Optional[int] = chat_member_types
99+
self._chat_ids = parse_chat_id(chat_id)
91100

92101
def check_update(self, update: object) -> bool:
93102
"""Determines whether an update should be passed to this handler's :attr:`callback`.
@@ -99,12 +108,18 @@ def check_update(self, update: object) -> bool:
99108
:obj:`bool`
100109
101110
"""
102-
if isinstance(update, Update):
103-
if not (update.my_chat_member or update.chat_member):
104-
return False
105-
if self.chat_member_types == self.ANY_CHAT_MEMBER:
106-
return True
107-
if self.chat_member_types == self.CHAT_MEMBER:
108-
return bool(update.chat_member)
109-
return bool(update.my_chat_member)
110-
return False
111+
if not isinstance(update, Update):
112+
return False
113+
if not (update.my_chat_member or update.chat_member):
114+
return False
115+
if (
116+
self._chat_ids
117+
and update.effective_chat
118+
and update.effective_chat.id not in self._chat_ids
119+
):
120+
return False
121+
if self.chat_member_types == self.ANY_CHAT_MEMBER:
122+
return True
123+
if self.chat_member_types == self.CHAT_MEMBER:
124+
return bool(update.chat_member)
125+
return bool(update.my_chat_member)

tests/ext/test_chatmemberhandler.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,66 @@ async def test_chat_member_types(
144144
await app.process_update(chat_member)
145145
assert self.test_flag == result_2
146146

147+
@pytest.mark.parametrize(
148+
argnames=["allowed_types", "chat_id", "expected"],
149+
argvalues=[
150+
(ChatMemberHandler.MY_CHAT_MEMBER, None, (True, False)),
151+
(ChatMemberHandler.CHAT_MEMBER, None, (False, True)),
152+
(ChatMemberHandler.ANY_CHAT_MEMBER, None, (True, True)),
153+
(ChatMemberHandler.MY_CHAT_MEMBER, 1, (True, False)),
154+
(ChatMemberHandler.CHAT_MEMBER, 1, (False, True)),
155+
(ChatMemberHandler.ANY_CHAT_MEMBER, 1, (True, True)),
156+
(ChatMemberHandler.MY_CHAT_MEMBER, [1], (True, False)),
157+
(ChatMemberHandler.CHAT_MEMBER, [1], (False, True)),
158+
(ChatMemberHandler.ANY_CHAT_MEMBER, [1], (True, True)),
159+
(ChatMemberHandler.MY_CHAT_MEMBER, 2, (False, False)),
160+
(ChatMemberHandler.CHAT_MEMBER, 2, (False, False)),
161+
(ChatMemberHandler.ANY_CHAT_MEMBER, 2, (False, False)),
162+
(ChatMemberHandler.MY_CHAT_MEMBER, [2], (False, False)),
163+
(ChatMemberHandler.CHAT_MEMBER, [2], (False, False)),
164+
(ChatMemberHandler.ANY_CHAT_MEMBER, [2], (False, False)),
165+
],
166+
ids=[
167+
"MY_CHAT_MEMBER",
168+
"CHAT_MEMBER",
169+
"ANY_CHAT_MEMBER",
170+
"MY_CHAT_MEMBER, CHAT=1 ",
171+
"CHAT_MEMBER, CHAT=1",
172+
"ANY_CHAT_MEMBER, CHAT=1",
173+
"MY_CHAT_MEMBER, CHAT=[1] ",
174+
"CHAT_MEMBER, CHAT=[1]",
175+
"ANY_CHAT_MEMBER, CHAT=[1]",
176+
"MY_CHAT_MEMBER, CHAT=2 ",
177+
"CHAT_MEMBER, CHAT=2",
178+
"ANY_CHAT_MEMBER, CHAT=2",
179+
"MY_CHAT_MEMBER, CHAT=[2] ",
180+
"CHAT_MEMBER, CHAT=[2]",
181+
"ANY_CHAT_MEMBER, CHAT=[2]",
182+
],
183+
)
184+
async def test_chat_member_types_with_chat_id(
185+
self, app, chat_member_updated, chat_member, expected, allowed_types, chat_id
186+
):
187+
result_1, result_2 = expected
188+
189+
handler = ChatMemberHandler(
190+
self.callback, chat_member_types=allowed_types, chat_id=chat_id
191+
)
192+
app.add_handler(handler)
193+
194+
async with app:
195+
assert handler.check_update(chat_member) == result_1
196+
await app.process_update(chat_member)
197+
assert self.test_flag == result_1
198+
199+
self.test_flag = False
200+
chat_member.my_chat_member = None
201+
chat_member.chat_member = chat_member_updated
202+
203+
assert handler.check_update(chat_member) == result_2
204+
await app.process_update(chat_member)
205+
assert self.test_flag == result_2
206+
147207
def test_other_update_types(self, false_update):
148208
handler = ChatMemberHandler(self.callback)
149209
assert not handler.check_update(false_update)

0 commit comments

Comments
 (0)
0