diff --git a/chatmaild/pyproject.toml b/chatmaild/pyproject.toml index e87fc15b..32b495b8 100644 --- a/chatmaild/pyproject.toml +++ b/chatmaild/pyproject.toml @@ -8,6 +8,8 @@ version = "0.2" dependencies = [ "aiosmtpd", "iniconfig", + "deltachat-rpc-server", + "deltachat-rpc-client", ] [tool.setuptools] @@ -19,6 +21,7 @@ where = ['src'] [project.scripts] doveauth = "chatmaild.doveauth:main" filtermail = "chatmaild.filtermail:main" +echobot = "chatmaild.echo:main" [project.entry-points.pytest11] "chatmaild.testplugin" = "chatmaild.tests.plugin" diff --git a/chatmaild/src/chatmaild/doveauth.py b/chatmaild/src/chatmaild/doveauth.py index 8a764d33..3fe1a03e 100644 --- a/chatmaild/src/chatmaild/doveauth.py +++ b/chatmaild/src/chatmaild/doveauth.py @@ -46,13 +46,14 @@ def is_allowed_to_create(config: Config, user, cleartext_password) -> bool: len(localpart) > config.username_max_length or len(localpart) < config.username_min_length ): - logging.warning( - "localpart %s has to be between %s and %s chars long", - localpart, - config.username_min_length, - config.username_max_length, - ) - return False + if localpart != "echo": + logging.warning( + "localpart %s has to be between %s and %s chars long", + localpart, + config.username_min_length, + config.username_max_length, + ) + return False return True diff --git a/chatmaild/src/chatmaild/echo.py b/chatmaild/src/chatmaild/echo.py new file mode 100644 index 00000000..e8618cd4 --- /dev/null +++ b/chatmaild/src/chatmaild/echo.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""Advanced echo bot example. + +it will echo back any message that has non-empty text and also supports the /help command. +""" +import logging +import os +import sys +from threading import Thread + +from deltachat_rpc_client import Bot, DeltaChat, EventType, Rpc, events + +from chatmaild.newemail import create_newemail_dict +from chatmaild.config import read_config + +hooks = events.HookCollection() + + +@hooks.on(events.RawEvent) +def log_event(event): + if event.kind == EventType.INFO: + logging.info(event.msg) + elif event.kind == EventType.WARNING: + logging.warning(event.msg) + + +@hooks.on(events.RawEvent(EventType.ERROR)) +def log_error(event): + logging.error(event.msg) + + +@hooks.on(events.MemberListChanged) +def on_memberlist_changed(event): + logging.info( + "member %s was %s", event.member, "added" if event.member_added else "removed" + ) + + +@hooks.on(events.GroupImageChanged) +def on_group_image_changed(event): + logging.info("group image %s", "deleted" if event.image_deleted else "changed") + + +@hooks.on(events.GroupNameChanged) +def on_group_name_changed(event): + logging.info("group name changed, old name: %s", event.old_name) + + +@hooks.on(events.NewMessage(func=lambda e: not e.command)) +def echo(event): + snapshot = event.message_snapshot + if snapshot.text or snapshot.file: + snapshot.chat.send_message(text=snapshot.text, file=snapshot.file) + + +@hooks.on(events.NewMessage(command="/help")) +def help_command(event): + snapshot = event.message_snapshot + snapshot.chat.send_text("Send me any message and I will echo it back") + + +def main(): + path = os.environ.get("PATH") + venv_path = sys.argv[0].strip("echobot") + os.environ["PATH"] = path + ":" + venv_path + with Rpc() as rpc: + deltachat = DeltaChat(rpc) + system_info = deltachat.get_system_info() + logging.info("Running deltachat core %s", system_info.deltachat_core_version) + + accounts = deltachat.get_all_accounts() + account = accounts[0] if accounts else deltachat.add_account() + + bot = Bot(account, hooks) + if not bot.is_configured(): + config = read_config(sys.argv[1]) + password = create_newemail_dict(config).get("password") + email = "echo@" + config.mail_domain + configure_thread = Thread( + target=bot.configure, kwargs={"email": email, "password": password} + ) + configure_thread.start() + bot.run_forever() + + +if __name__ == "__main__": + logging.basicConfig(level=logging.INFO) + main() diff --git a/chatmaild/src/chatmaild/echobot.service.f b/chatmaild/src/chatmaild/echobot.service.f new file mode 100644 index 00000000..52d9eef2 --- /dev/null +++ b/chatmaild/src/chatmaild/echobot.service.f @@ -0,0 +1,11 @@ +[Unit] +Description=Chatmail echo bot for testing it works + +[Service] +ExecStart={execpath} {config_path} +Environment="PATH={remote_venv_dir}:$PATH" +Restart=always +RestartSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/cmdeploy/src/cmdeploy/__init__.py b/cmdeploy/src/cmdeploy/__init__.py index 2942d017..3e3a7082 100644 --- a/cmdeploy/src/cmdeploy/__init__.py +++ b/cmdeploy/src/cmdeploy/__init__.py @@ -88,10 +88,12 @@ def _install_remote_venv_with_chatmaild(config) -> None: for fn in ( "doveauth", "filtermail", + "echobot", ): params = dict( execpath=f"{remote_venv_dir}/bin/{fn}", config_path=remote_chatmail_inipath, + remote_venv_dir=remote_venv_dir, ) source_path = importlib.resources.files("chatmaild").joinpath(f"{fn}.service.f") content = source_path.read_text().format(**params).encode()