@@ -51,8 +51,14 @@ class BaseFilter(object):
51
51
a `filter` method that returns a boolean: `True` if the message should be handled, `False`
52
52
otherwise. Note that the filters work only as class instances, not actual class objects
53
53
(so remember to initialize your filter classes).
54
+
55
+ By default the filters name (what will get printed when converted to a string for display)
56
+ will be the class name. If you want to overwrite this assign a better name to the `name`
57
+ class variable.
54
58
"""
55
59
60
+ name = None
61
+
56
62
def __call__ (self , message ):
57
63
return self .filter (message )
58
64
@@ -65,6 +71,12 @@ def __or__(self, other):
65
71
def __invert__ (self ):
66
72
return InvertedFilter (self )
67
73
74
+ def __repr__ (self ):
75
+ # We do this here instead of in a __init__ so filter don't have to call __init__ or super()
76
+ if self .name is None :
77
+ self .name = self .__class__ .__name__
78
+ return self .name
79
+
68
80
def filter (self , message ):
69
81
raise NotImplementedError
70
82
@@ -82,10 +94,8 @@ def __init__(self, f):
82
94
def filter (self , message ):
83
95
return not self .f (message )
84
96
85
- def __str__ (self ):
86
- return "<telegram.ext.filters.InvertedFilter inverting {}>" .format (self .f )
87
-
88
- __repr__ = __str__
97
+ def __repr__ (self ):
98
+ return "<inverted {}>" .format (self .f )
89
99
90
100
91
101
class MergedFilter (BaseFilter ):
@@ -108,12 +118,9 @@ def filter(self, message):
108
118
elif self .or_filter :
109
119
return self .base_filter (message ) or self .or_filter (message )
110
120
111
- def __str__ (self ):
112
- return ("<telegram.ext.filters.MergedFilter consisting of"
113
- " {} {} {}>" ).format (self .base_filter , "and" if self .and_filter else "or" ,
114
- self .and_filter or self .or_filter )
115
-
116
- __repr__ = __str__
121
+ def __repr__ (self ):
122
+ return "<{} {} {}>" .format (self .base_filter , "and" if self .and_filter else "or" ,
123
+ self .and_filter or self .or_filter )
117
124
118
125
119
126
class Filters (object ):
@@ -122,90 +129,103 @@ class Filters(object):
122
129
"""
123
130
124
131
class _All (BaseFilter ):
132
+ name = 'Filters.all'
125
133
126
134
def filter (self , message ):
127
135
return True
128
136
129
137
all = _All ()
130
138
131
139
class _Text (BaseFilter ):
140
+ name = 'Filters.text'
132
141
133
142
def filter (self , message ):
134
143
return bool (message .text and not message .text .startswith ('/' ))
135
144
136
145
text = _Text ()
137
146
138
147
class _Command (BaseFilter ):
148
+ name = 'Filters.command'
139
149
140
150
def filter (self , message ):
141
151
return bool (message .text and message .text .startswith ('/' ))
142
152
153
+ command = _Command ()
154
+
143
155
class _Reply (BaseFilter ):
156
+ name = 'Filters.reply'
144
157
145
158
def filter (self , message ):
146
159
return bool (message .reply_to_message )
147
160
148
161
reply = _Reply ()
149
162
150
- command = _Command ()
151
-
152
163
class _Audio (BaseFilter ):
164
+ name = 'Filters.audio'
153
165
154
166
def filter (self , message ):
155
167
return bool (message .audio )
156
168
157
169
audio = _Audio ()
158
170
159
171
class _Document (BaseFilter ):
172
+ name = 'Filters.document'
160
173
161
174
def filter (self , message ):
162
175
return bool (message .document )
163
176
164
177
document = _Document ()
165
178
166
179
class _Photo (BaseFilter ):
180
+ name = 'Filters.photo'
167
181
168
182
def filter (self , message ):
169
183
return bool (message .photo )
170
184
171
185
photo = _Photo ()
172
186
173
187
class _Sticker (BaseFilter ):
188
+ name = 'Filters.sticker'
174
189
175
190
def filter (self , message ):
176
191
return bool (message .sticker )
177
192
178
193
sticker = _Sticker ()
179
194
180
195
class _Video (BaseFilter ):
196
+ name = 'Filters.video'
181
197
182
198
def filter (self , message ):
183
199
return bool (message .video )
184
200
185
201
video = _Video ()
186
202
187
203
class _Voice (BaseFilter ):
204
+ name = 'Filters.voice'
188
205
189
206
def filter (self , message ):
190
207
return bool (message .voice )
191
208
192
209
voice = _Voice ()
193
210
194
211
class _Contact (BaseFilter ):
212
+ name = 'Filters.contact'
195
213
196
214
def filter (self , message ):
197
215
return bool (message .contact )
198
216
199
217
contact = _Contact ()
200
218
201
219
class _Location (BaseFilter ):
220
+ name = 'Filters.location'
202
221
203
222
def filter (self , message ):
204
223
return bool (message .location )
205
224
206
225
location = _Location ()
207
226
208
227
class _Venue (BaseFilter ):
228
+ name = 'Filters.venue'
209
229
210
230
def filter (self , message ):
211
231
return bool (message .venue )
@@ -215,41 +235,47 @@ def filter(self, message):
215
235
class _StatusUpdate (BaseFilter ):
216
236
217
237
class _NewChatMembers (BaseFilter ):
238
+ name = 'Filters.status_update.new_chat_members'
218
239
219
240
def filter (self , message ):
220
241
return bool (message .new_chat_members )
221
242
222
243
new_chat_members = _NewChatMembers ()
223
244
224
245
class _LeftChatMember (BaseFilter ):
246
+ name = 'Filters.status_update.left_chat_member'
225
247
226
248
def filter (self , message ):
227
249
return bool (message .left_chat_member )
228
250
229
251
left_chat_member = _LeftChatMember ()
230
252
231
253
class _NewChatTitle (BaseFilter ):
254
+ name = 'Filters.status_update.new_chat_title'
232
255
233
256
def filter (self , message ):
234
257
return bool (message .new_chat_title )
235
258
236
259
new_chat_title = _NewChatTitle ()
237
260
238
261
class _NewChatPhoto (BaseFilter ):
262
+ name = 'Filters.status_update.new_chat_photo'
239
263
240
264
def filter (self , message ):
241
265
return bool (message .new_chat_photo )
242
266
243
267
new_chat_photo = _NewChatPhoto ()
244
268
245
269
class _DeleteChatPhoto (BaseFilter ):
270
+ name = 'Filters.status_update.delete_chat_photo'
246
271
247
272
def filter (self , message ):
248
273
return bool (message .delete_chat_photo )
249
274
250
275
delete_chat_photo = _DeleteChatPhoto ()
251
276
252
277
class _ChatCreated (BaseFilter ):
278
+ name = 'Filters.status_update.chat_created'
253
279
254
280
def filter (self , message ):
255
281
return bool (message .group_chat_created or message .supergroup_chat_created or
@@ -258,19 +284,23 @@ def filter(self, message):
258
284
chat_created = _ChatCreated ()
259
285
260
286
class _Migrate (BaseFilter ):
287
+ name = 'Filters.status_update.migrate'
261
288
262
289
def filter (self , message ):
263
290
return bool (message .migrate_from_chat_id or message .migrate_to_chat_id )
264
291
265
292
migrate = _Migrate ()
266
293
267
294
class _PinnedMessage (BaseFilter ):
295
+ name = 'Filters.status_update.pinned_message'
268
296
269
297
def filter (self , message ):
270
298
return bool (message .pinned_message )
271
299
272
300
pinned_message = _PinnedMessage ()
273
301
302
+ name = 'Filters.status_update'
303
+
274
304
def filter (self , message ):
275
305
return bool (self .new_chat_members (message ) or self .left_chat_member (message ) or
276
306
self .new_chat_title (message ) or self .new_chat_photo (message ) or
@@ -280,13 +310,15 @@ def filter(self, message):
280
310
status_update = _StatusUpdate ()
281
311
282
312
class _Forwarded (BaseFilter ):
313
+ name = 'Filters.forwarded'
283
314
284
315
def filter (self , message ):
285
316
return bool (message .forward_date )
286
317
287
318
forwarded = _Forwarded ()
288
319
289
320
class _Game (BaseFilter ):
321
+ name = 'Filters.game'
290
322
291
323
def filter (self , message ):
292
324
return bool (message .game )
@@ -306,32 +338,37 @@ class entity(BaseFilter):
306
338
307
339
def __init__ (self , entity_type ):
308
340
self .entity_type = entity_type
341
+ self .name = 'Filters.entity({})' .format (self .entity_type )
309
342
310
343
def filter (self , message ):
311
344
return any ([entity .type == self .entity_type for entity in message .entities ])
312
345
313
346
class _Private (BaseFilter ):
347
+ name = 'Filters.private'
314
348
315
349
def filter (self , message ):
316
350
return message .chat .type == Chat .PRIVATE
317
351
318
352
private = _Private ()
319
353
320
354
class _Group (BaseFilter ):
355
+ name = 'Filters.group'
321
356
322
357
def filter (self , message ):
323
358
return message .chat .type in [Chat .GROUP , Chat .SUPERGROUP ]
324
359
325
360
group = _Group ()
326
361
327
362
class _Invoice (BaseFilter ):
363
+ name = 'Filters.invoice'
328
364
329
365
def filter (self , message ):
330
366
return bool (message .invoice )
331
367
332
368
invoice = _Invoice ()
333
369
334
370
class _SuccessfulPayment (BaseFilter ):
371
+ name = 'Filters.successful_payment'
335
372
336
373
def filter (self , message ):
337
374
return bool (message .successful_payment )
@@ -354,6 +391,7 @@ def __init__(self, lang):
354
391
self .lang = [lang ]
355
392
else :
356
393
self .lang = lang
394
+ self .name = 'Filters.language({})' .format (self .lang )
357
395
358
396
def filter (self , message ):
359
397
return message .from_user .language_code and any (
0 commit comments