diff options
Diffstat (limited to 'mastodon/streaming.py')
-rw-r--r-- | mastodon/streaming.py | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/mastodon/streaming.py b/mastodon/streaming.py index cac2456..92a02dc 100644 --- a/mastodon/streaming.py +++ b/mastodon/streaming.py | |||
@@ -67,10 +67,6 @@ class StreamListener(object): | |||
67 | else: | 67 | else: |
68 | event[key] = value | 68 | event[key] = value |
69 | 69 | ||
70 | # end of stream | ||
71 | if event: | ||
72 | log.warn("outstanding partial event at end of stream: %s", event) | ||
73 | |||
74 | def _dispatch(self, event): | 70 | def _dispatch(self, event): |
75 | try: | 71 | try: |
76 | name = event['event'] | 72 | name = event['event'] |
@@ -92,8 +88,44 @@ class StreamListener(object): | |||
92 | handler_name = 'on_' + name | 88 | handler_name = 'on_' + name |
93 | try: | 89 | try: |
94 | handler = getattr(self, handler_name) | 90 | handler = getattr(self, handler_name) |
95 | except AttributeError: | 91 | except AttributeError as err: |
96 | log.warn("Unhandled event '%s'", name) | 92 | six.raise_from( |
93 | MastodonMalformedEventError('Bad event type', name), | ||
94 | err | ||
95 | ) | ||
97 | else: | 96 | else: |
98 | # TODO: allow handlers to return/raise to stop streaming cleanly | 97 | # TODO: allow handlers to return/raise to stop streaming cleanly |
99 | handler(payload) | 98 | handler(payload) |
99 | |||
100 | class CallbackStreamListener(StreamListener): | ||
101 | """ | ||
102 | Simple callback stream handler class. | ||
103 | Can optionally additionally send local update events to a separate handler. | ||
104 | """ | ||
105 | def __init__(self, update_handler = None, local_update_handler = None, delete_handler = None, notification_handler = None): | ||
106 | super(CallbackStreamListener, self).__init__() | ||
107 | self.update_handler = update_handler | ||
108 | self.local_update_handler = local_update_handler | ||
109 | self.delete_handler = delete_handler | ||
110 | self.notification_handler = notification_handler | ||
111 | |||
112 | def on_update(self, status): | ||
113 | if self.update_handler != None: | ||
114 | self.update_handler(status) | ||
115 | |||
116 | try: | ||
117 | if self.local_update_handler != None and not "@" in status["account"]["acct"]: | ||
118 | self.local_update_handler(status) | ||
119 | except Exception as err: | ||
120 | six.raise_from( | ||
121 | MastodonMalformedEventError('received bad update', status), | ||
122 | err | ||
123 | ) | ||
124 | |||
125 | def on_delete(self, deleted_id): | ||
126 | if self.delete_handler != None: | ||
127 | self.delete_handler(deleted_id) | ||
128 | |||
129 | def on_notification(self, notification): | ||
130 | if self.notification_handler != None: | ||
131 | self.notification_handler(notification) \ No newline at end of file | ||