X Tutup
Skip to content

Commit 1c4c228

Browse files
authored
add support for User.language_code (python-telegram-bot#624)
* add support for User.language_code * Add language filter Useful is you wanna do something like restrict your shop to a single or a few locales or something like that.
1 parent 2e89e21 commit 1c4c228

File tree

4 files changed

+70
-10
lines changed

4 files changed

+70
-10
lines changed

telegram/ext/filters.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
""" This module contains the Filters for use with the MessageHandler class """
2020
from telegram import Chat
2121

22+
try:
23+
str_type = base_string
24+
except NameError:
25+
str_type = str
26+
2227

2328
class BaseFilter(object):
2429
"""Base class for all Message Filters
@@ -263,3 +268,24 @@ def filter(self, message):
263268
return message.chat.type in [Chat.GROUP, Chat.SUPERGROUP]
264269

265270
group = _Group()
271+
272+
class language(BaseFilter):
273+
"""
274+
Filters messages to only allow those which are from users with a certain language code.
275+
Note that according to telegrams documentation, every single user does not have the
276+
language_code attribute.
277+
278+
Args:
279+
lang (str|list): Which language code(s) to allow through. This will be matched using
280+
.startswith meaning that 'en' will match both 'en_US' and 'en_GB'
281+
"""
282+
283+
def __init__(self, lang):
284+
if isinstance(lang, str_type):
285+
self.lang = [lang]
286+
else:
287+
self.lang = lang
288+
289+
def filter(self, message):
290+
return message.from_user.language_code and any(
291+
[message.from_user.language_code.startswith(x) for x in self.lang])

telegram/user.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,23 @@ class User(TelegramObject):
2626
"""This object represents a Telegram User.
2727
2828
Attributes:
29-
id (int):
30-
first_name (str):
31-
last_name (str):
32-
username (str):
33-
type (str):
29+
id (int): Unique identifier for this user or bot
30+
first_name (str): User's or bot's first name
31+
last_name (str): User's or bot's last name
32+
username (str): User's or bot's username
33+
language_code (str): IETF language tag of the user's language
34+
type (str): Deprecated
3435
3536
Args:
36-
id (int):
37-
first_name (str):
37+
id (int): Unique identifier for this user or bot
38+
first_name (str): User's or bot's first name
3839
**kwargs: Arbitrary keyword arguments.
3940
4041
Keyword Args:
41-
type (Optional[str]):
42-
last_name (Optional[str]):
43-
username (Optional[str]):
42+
type (Optional[str]): Deprecated
43+
last_name (Optional[str]): User's or bot's last name
44+
username (Optional[str]): User's or bot's username
45+
language_code (Optional[str]): IETF language tag of the user's language
4446
bot (Optional[Bot]): The Bot to use for instance methods
4547
"""
4648

@@ -50,6 +52,7 @@ def __init__(self,
5052
type=None,
5153
last_name=None,
5254
username=None,
55+
language_code=None,
5356
bot=None,
5457
**kwargs):
5558
# Required
@@ -59,6 +62,7 @@ def __init__(self,
5962
self.type = type
6063
self.last_name = last_name
6164
self.username = username
65+
self.language_code = language_code
6266

6367
self.bot = bot
6468

tests/test_filters.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,32 @@ class _CustomFilter(BaseFilter):
274274
with self.assertRaises(NotImplementedError):
275275
(custom & Filters.text)(self.message)
276276

277+
def test_language_filter_single(self):
278+
self.message.from_user.language_code = 'en_US'
279+
self.assertTrue((Filters.language('en_US'))(self.message))
280+
self.assertTrue((Filters.language('en'))(self.message))
281+
self.assertFalse((Filters.language('en_GB'))(self.message))
282+
self.assertFalse((Filters.language('da'))(self.message))
283+
self.message.from_user.language_code = 'en_GB'
284+
self.assertFalse((Filters.language('en_US'))(self.message))
285+
self.assertTrue((Filters.language('en'))(self.message))
286+
self.assertTrue((Filters.language('en_GB'))(self.message))
287+
self.assertFalse((Filters.language('da'))(self.message))
288+
self.message.from_user.language_code = 'da'
289+
self.assertFalse((Filters.language('en_US'))(self.message))
290+
self.assertFalse((Filters.language('en'))(self.message))
291+
self.assertFalse((Filters.language('en_GB'))(self.message))
292+
self.assertTrue((Filters.language('da'))(self.message))
293+
294+
def test_language_filter_multiple(self):
295+
f = Filters.language(['en_US', 'da'])
296+
self.message.from_user.language_code = 'en_US'
297+
self.assertTrue(f(self.message))
298+
self.message.from_user.language_code = 'en_GB'
299+
self.assertFalse(f(self.message))
300+
self.message.from_user.language_code = 'da'
301+
self.assertTrue(f(self.message))
302+
277303

278304
if __name__ == '__main__':
279305
unittest.main()

tests/test_user.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,15 @@ def setUp(self):
3737
self.first_name = "Leandro"
3838
self.last_name = "S."
3939
self.username = "leandrotoledo"
40+
self.language_code = "pt-BR"
4041
self.type = "private"
4142

4243
self.json_dict = {
4344
'id': self._id,
4445
'first_name': self.first_name,
4546
'last_name': self.last_name,
4647
'username': self.username,
48+
'language_code': self.language_code,
4749
'type': self.type
4850
}
4951

@@ -54,6 +56,7 @@ def test_user_de_json(self):
5456
self.assertEqual(user.first_name, self.first_name)
5557
self.assertEqual(user.last_name, self.last_name)
5658
self.assertEqual(user.username, self.username)
59+
self.assertEqual(user.language_code, self.language_code)
5760
self.assertEqual(user.type, self.type)
5861

5962
self.assertEqual(user.name, '@leandrotoledo')
@@ -98,6 +101,7 @@ def test_user_to_dict(self):
98101
self.assertEqual(user['first_name'], self.first_name)
99102
self.assertEqual(user['last_name'], self.last_name)
100103
self.assertEqual(user['username'], self.username)
104+
self.assertEqual(user['language_code'], self.language_code)
101105
self.assertEqual(user['type'], self.type)
102106

103107
@flaky(3, 1)

0 commit comments

Comments
 (0)
X Tutup