from __future__ import annotations
from .bot_common import (
build_chat_crypto,
build_send_client,
build_stream_client,
decrypt_message_event,
get_event_uuid,
get_message_id,
get_message_sequence_id,
get_text_message,
load_runtime_state,
load_seen_event_uuids,
persist_seen_event_uuids,
send_reaction,
should_reply,
stream_config,
)
from .state import load_state
from .util import as_dict
def main() -> None:
env, token, user_id, private_keys, signing_key_version = load_runtime_state()
chat = build_chat_crypto(private_keys)
stream_client = build_stream_client(env)
send_client = build_send_client(env, token)
enc_key_cache: dict[str, str] = {}
state = load_state()
seen_event_uuids = load_seen_event_uuids(state)
print("Listening for chat.received events...")
for item in stream_client.activity.stream(stream_config=stream_config()):
event = as_dict(item)
data = event.get("data") or {}
if data.get("event_type") != "chat.received":
continue
event_uuid = get_event_uuid(event, data) or "unknown"
print(f"Received event {event_uuid}")
if event_uuid != "unknown":
if event_uuid in seen_event_uuids:
print(f"Skipping duplicate event {event_uuid}")
continue
seen_event_uuids.add(event_uuid)
persist_seen_event_uuids(state, seen_event_uuids)
payload = data.get("payload") or {}
message, conv_id, key_version = decrypt_message_event(
chat, payload, enc_key_cache
)
if not message or not conv_id or not key_version:
continue
message_id = get_message_id(message) or "unknown"
message_sequence_id = get_message_sequence_id(message) or "unknown"
print(
f"Received message {message_id} seq={message_sequence_id} in {conv_id}"
)
text = get_text_message(message)
if text is None:
continue
sender_id = message.get("sender_id") or message.get("senderId")
if sender_id and str(sender_id) == str(user_id):
continue
if not should_reply(str(conv_id), text):
continue
target_sequence_id = (
message_sequence_id if message_sequence_id != "unknown" else message_id
)
if target_sequence_id == "unknown":
continue
try:
send_reaction(
chat=chat,
send_client=send_client,
user_id=str(user_id),
signing_key_version=str(signing_key_version),
conv_id=str(conv_id),
conv_token=payload.get("conversation_token"),
enc_key=enc_key_cache[conv_id],
key_version=str(key_version),
target_message_sequence_id=str(target_sequence_id),
emoji="",
remove=False,
)
print(f"Reacted to {conv_id}: ")
except Exception as exc:
print(f"Reaction failed: {exc!r}")
if __name__ == "__main__":
main()