/
handlers.py
98 lines (69 loc) · 2.5 KB
/
handlers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import re
from bottery.exceptions import ValidationError
class CaseSensitiveOptionMixin:
def clean_case_senstive(self):
if not self.kwargs.get('case_sensitive'):
self.message.text = self.message.text.lower()
class PlatformsOptionMixin:
def clean_platforms(self):
platforms = self.kwargs.get('platforms')
if platforms is None:
return
if not isinstance(platforms, (list, tuple,)):
raise Exception('platforms option must be a list or a tuple')
if self.message.platform not in platforms:
raise ValidationError('message not from {}'.format(platforms))
class BaseHandler(PlatformsOptionMixin):
def __init__(self, pattern=None, view=None, *args, **kwargs):
self.pattern = pattern
self.view = view
self.kwargs = kwargs
def check(self, message):
self.message = message
try:
self.full_clean()
except ValidationError:
return False
else:
return self.match(self.message)
def full_clean(self):
for method_name in dir(self):
if method_name.startswith('clean_'):
method = getattr(self, method_name)
method()
def match(self, message):
raise Exception('Method Not Implemented')
class RegexHandler(BaseHandler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.regex = None
def match(self, message):
if not self.regex:
self.regex = re.compile(self.pattern)
if self.regex.match(message.text):
return True
return False
class MessageHandler(CaseSensitiveOptionMixin, BaseHandler):
def match(self, message):
if message.text == self.pattern:
return True
return False
class StartswithHandler(CaseSensitiveOptionMixin, BaseHandler):
def match(self, message):
if message.text.startswith(self.pattern):
return True
return False
class DefaultHandler(BaseHandler):
def __init__(self, view, *args, **kwargs):
super().__init__(view=view, *args, **kwargs)
def check(self, message):
return True
def _handle_msg(pattern, view=None, Handler=None, *args, **kwargs):
if not view:
# Hello, I'm a hack! Nice to meet up
view, pattern = pattern, view
return (Handler(pattern, **kwargs), view)
default = DefaultHandler
message = MessageHandler
regex = RegexHandler
startswith = StartswithHandler