#!/usr/bin/env python3 from deltachat_rpc_client import events, run_bot_cli, EventType, Message from email_validator import validate_email, EmailNotValidError from keyserver_bot.wkd import request_from_wkd from keyserver_bot.koo import request_from_koo from keyserver_bot.vcard import construct_vcard, save_vcard hooks = events.HookCollection() HELP_MSG = ( "If you send me an email address, " "I will fetch it's public PGP key " "(from WKD and keys.openpgp.org) " "and send you a contact you can encrypt to." ) @hooks.on(events.NewMessage) def command(event): snapshot = event.message_snapshot if snapshot.text == "/generate-invite": return snapshot.chat.send_text(snapshot.chat.account.get_qr_code()) if snapshot.text == "Messages are guaranteed to be end-to-end encrypted from now on.": return email = snapshot.text try: validate_email(email, check_deliverability=False) except EmailNotValidError: return snapshot.chat.send_text(HELP_MSG + f"\n\n{email} is not an email address :/") public_key = request_key_by_email(email) if not public_key: return snapshot.chat.send_text("Sorry, I could not find a key for this user.") vcard = construct_vcard(email, public_key) vcard_path = f"/tmp/{email}.vcf" save_vcard(vcard_path, vcard) return snapshot.chat.send_file(vcard_path) def request_key_by_email(email) -> str: domain = email.split("@")[1] public_key = request_from_wkd(email, domain) if not public_key: public_key = request_from_wkd(email, f"openpgpkey.{domain}") if not public_key: public_key = request_from_koo(email) return public_key @hooks.on(events.RawEvent) def cleanup(event): print(event) if event.kind == EventType.MSG_DELIVERED or event.kind == EventType.MSG_FAILED: msg = Message(event.account, event.msg_id).get_snapshot() delete_data(msg) def delete_data(msg): contacts = msg.chat.get_contacts() msg.chat.delete() for member in contacts: member.delete() def main(): run_bot_cli(hooks) if __name__ == "__main__": main()