annotate bots/unread_to_mqtt.py @ 2:6fc2c741f1a6 default tip

dead code
author drewp@bigasterisk.com
date Tue, 11 Feb 2025 19:21:39 -0800
parents 2a288d2cb88c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
1 import asyncio
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
2 import json
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
3 import logging
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
4 import sys
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
5 from dataclasses import dataclass
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
6
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
7 import aiomqtt
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
8
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
9 from bigastbot import BigAstBot
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
10
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
11 logging.basicConfig(level=logging.DEBUG,
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
12 format='%(asctime)s %(levelname)s %(name)s %(message)s',
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
13 datefmt='%Y-%m-%d %H:%M:%S')
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
14 log = logging.getLogger()
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
15
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
16
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
17 @dataclass
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
18 class UnreadToMqtt:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
19 email: str
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
20 mqtt: aiomqtt.Client
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
21
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
22 async def run(self):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
23 while True:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
24 try:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
25 log.info(f'connecting to zulip as {self.email}')
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
26 bot = BigAstBot(email=self.email)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
27 self.unread_msg_ids = set()
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
28 self.last_sent: int | None = None
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
29
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
30 async for ev in bot.get_registration_and_events(event_types=[
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
31 'message',
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
32 'update_message_flags',
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
33 ]):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
34 await self._update_unreads_with_event(ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
35 except aiomqtt.MqttError:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
36 raise
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
37 except Exception as e:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
38 log.error(e)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
39 await asyncio.sleep(1)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
40 continue
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
41
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
42 async def _update_unreads_with_event(self, ev):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
43 if 'unread_msgs' in ev:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
44 # looks like registration response
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
45 self._on_registration_response(ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
46 elif ev['type'] == 'message':
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
47 self._on_message_event(ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
48 elif ev['type'] == 'update_message_flags':
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
49 self._on_flag_change_event(ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
50
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
51 if self.last_sent != len(self.unread_msg_ids):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
52 await self._send_to_mqtt(len(self.unread_msg_ids))
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
53
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
54 def _on_flag_change_event(self, ev):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
55 log.debug("_on_flag_change_event: %s", ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
56 if ev['flag'] == 'read':
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
57 for msg_id in ev['messages']:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
58 self.unread_msg_ids.discard(msg_id)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
59
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
60 def _on_message_event(self, ev):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
61 log.debug("_on_message_event: %s", ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
62 if 'read' not in ev['flags']:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
63 self.unread_msg_ids.add(ev['message']['id'])
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
64
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
65 def _on_registration_response(self, ev):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
66 log.debug("_on_registration_response: %s", ev)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
67 for msg_type in ['pms', 'streams', 'huddles']: # mentions?
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
68 for group in ev['unread_msgs'][msg_type]:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
69 self.unread_msg_ids.update(group['unread_message_ids'])
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
70
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
71 async def _send_to_mqtt(self, num_unread):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
72 await self.mqtt.publish(f'/zulip/unread/{self.email}',
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
73 json.dumps({'all': num_unread}),
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
74 retain=True)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
75 self.last_sent = num_unread
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
76
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
77
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
78 async def main():
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
79 user_emails = sys.argv[1:]
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
80 while True:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
81 try:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
82 log.info('connecting to mqtt')
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
83 async with aiomqtt.Client("mqtt2.bigasterisk.com") as client:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
84 await asyncio.gather(*[
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
85 UnreadToMqtt(email=user_email, mqtt=client).run()
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
86 for user_email in user_emails
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
87 ])
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
88 except aiomqtt.MqttError:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
89 continue
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
90
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
91
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents:
diff changeset
92 asyncio.run(main())