annotate bots/bigastbot.py @ 1:2a288d2cb88c

add unread_to_mqtt bridge
author drewp@bigasterisk.com
date Tue, 11 Feb 2025 19:20:47 -0800
parents 96f842f12121
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: 0
diff changeset
1 import asyncio
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
2 from typing import AsyncGenerator, cast
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
3
0
drewp@bigasterisk.com
parents:
diff changeset
4 import zulip
drewp@bigasterisk.com
parents:
diff changeset
5 from kubernetes import client, config
drewp@bigasterisk.com
parents:
diff changeset
6
drewp@bigasterisk.com
parents:
diff changeset
7 config.load_kube_config()
drewp@bigasterisk.com
parents:
diff changeset
8
drewp@bigasterisk.com
parents:
diff changeset
9
drewp@bigasterisk.com
parents:
diff changeset
10 def get_secret_api_key(email: str) -> str:
drewp@bigasterisk.com
parents:
diff changeset
11 api = client.CoreV1Api()
drewp@bigasterisk.com
parents:
diff changeset
12 secret = api.read_namespaced_secret('zulip-api-secrets', 'default')
drewp@bigasterisk.com
parents:
diff changeset
13 secret_key = email.replace('@', '.')
drewp@bigasterisk.com
parents:
diff changeset
14 return secret.data[secret_key] # type: ignore
drewp@bigasterisk.com
parents:
diff changeset
15
drewp@bigasterisk.com
parents:
diff changeset
16
drewp@bigasterisk.com
parents:
diff changeset
17 class BigAstBot:
drewp@bigasterisk.com
parents:
diff changeset
18
drewp@bigasterisk.com
parents:
diff changeset
19 def __init__(self, email: str):
drewp@bigasterisk.com
parents:
diff changeset
20
drewp@bigasterisk.com
parents:
diff changeset
21 class Options:
drewp@bigasterisk.com
parents:
diff changeset
22 zulip_api_key = get_secret_api_key(email)
drewp@bigasterisk.com
parents:
diff changeset
23 zulip_email = email
drewp@bigasterisk.com
parents:
diff changeset
24 zulip_site = 'https://chat.bigasterisk.com'
drewp@bigasterisk.com
parents:
diff changeset
25 cert_bundle = None
drewp@bigasterisk.com
parents:
diff changeset
26 client_cert = None
drewp@bigasterisk.com
parents:
diff changeset
27 client_cert_key = None
drewp@bigasterisk.com
parents:
diff changeset
28 insecure = False
drewp@bigasterisk.com
parents:
diff changeset
29 verbose = True
drewp@bigasterisk.com
parents:
diff changeset
30 zulip_client = None
drewp@bigasterisk.com
parents:
diff changeset
31 zulip_config_file = None
drewp@bigasterisk.com
parents:
diff changeset
32
drewp@bigasterisk.com
parents:
diff changeset
33 self.zulip_client = zulip.init_from_options(Options())
drewp@bigasterisk.com
parents:
diff changeset
34
drewp@bigasterisk.com
parents:
diff changeset
35 def send_to_channel(self, channelName: str, topic: str, content: str):
drewp@bigasterisk.com
parents:
diff changeset
36 msg = dict(type="stream",
drewp@bigasterisk.com
parents:
diff changeset
37 to=[channelName],
drewp@bigasterisk.com
parents:
diff changeset
38 topic=topic,
drewp@bigasterisk.com
parents:
diff changeset
39 content=content)
drewp@bigasterisk.com
parents:
diff changeset
40 return self.zulip_client.send_message(msg)
1
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
41
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
42 async def get_registration_and_events(
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
43 self, **register_kw) -> AsyncGenerator[dict, None]:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
44 """yields the registration response, then the events as they come"""
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
45 reg = self.zulip_client.register(**register_kw)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
46 yield reg
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
47
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
48 last = reg['last_event_id']
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
49 while True:
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
50 update = self.zulip_client.get_events(queue_id=reg['queue_id'],
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
51 last_event_id=last)
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
52 for ev in cast(list[dict], update['events']):
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
53 yield ev
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
54 last = max(last, ev['id'])
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
55
2a288d2cb88c add unread_to_mqtt bridge
drewp@bigasterisk.com
parents: 0
diff changeset
56 await asyncio.sleep(1)