-
Notifications
You must be signed in to change notification settings - Fork 2
/
magnet_api.py
75 lines (56 loc) · 1.68 KB
/
magnet_api.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
# Magnet2 by Grom PE. Public domain.
import time
LEVEL_IGNORED = 0
LEVEL_DEVOICED_GUEST = 1
LEVEL_GUEST = 2
LEVEL_DEVOICED_MEMBER = 3
LEVEL_MEMBER = 4
LEVEL_MODERATOR = 5
LEVEL_ADMIN = 6
LEVEL_OWNER = 7
LEVEL_BOT_OWNER = 8
ROSTER_AFFILIATION = 0
ROSTER_ROLE = 1
ROSTER_JID = 2
ROSTER_STATUS = 3
ROSTER_STATUS_TEXT = 4
class Event(object):
def __init__(self):
self.handlers = []
def add(self, handler):
self.handlers.append(handler)
return self
def remove(self, handler):
self.handlers.remove(handler)
return self
def try_handler(self, handler, sender, arg=None):
if hasattr(sender, 'exception_in'):
try: handler(sender, arg)
except: sender.exception_in(handler)
else:
return handler(sender, arg)
def fire(self, sender, arg=None):
for handler in self.handlers:
if self.try_handler(handler, sender, arg): break
__call__ = fire
class TimedEventHandler(object):
def __init__(self, handler, period):
self.lastcall = 0
self.handler = handler
self.period = period
def fire(self, sender, arg=None):
self.handler(sender, arg)
__call__ = fire
class TimedEvent(Event):
def add(self, handler):
if not isinstance(handler, TimedEventHandler):
raise ValueError('handler must be an instance of TimedEventHandler')
self.handlers.append(handler)
return self
def fire(self, sender, arg=None):
timenow = time.time()
for handler in self.handlers:
if timenow - handler.lastcall > handler.period:
handler.lastcall = timenow
if self.try_handler(handler, sender, arg): break
__call__ = fire