diff --git a/.gitignore b/.gitignore index 36fa4f0..5a386d0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ __pycache__/ /venv/ bot.db/ teams_bot_data/ +team_bot_data/ diff --git a/README.md b/README.md index fe0df74..51bfcc9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Teams Bot +# Team Bot This bot connects your team to the outside and makes it addressable. @@ -22,8 +22,8 @@ To install this bot, run: ``` -git clone https://git.0x90.space/missytake/teams-bot -cd teams-bot +git clone https://github.com/deltachat-bot/team-bot +cd team-bot pip install . ``` @@ -32,19 +32,19 @@ with an email address you want to use as a team: ``` -teams-bot init --email helpdesk@example.org --password p455w0rD +team-bot init --email helpdesk@example.org --password p455w0rD ``` This command will show a QR code; scan it with Delta Chat to become part of the "team", -the verified group which manages the Teams Bot. +the verified group which manages the Team Bot. Now to run it, simply execute: ``` -teams-bot run -v +team-bot run -v ``` The bot only works as long as this command is running. @@ -59,9 +59,9 @@ you can deploy this bot with it. Just import it into your [deploy.py file](https://docs.pyinfra.com/en/2.x/getting-started.html#create-a-deploy) like this: ``` -from teams_bot.pyinfra import deploy_teams_bot +from team_bot.pyinfra import deploy_team_bot -deploy_teams_bot( +deploy_team_bot( unix_user='root', # an existing UNIX user (doesn't need root or sudo privileges) bot_email='helpdesk@example.org', # the email address your team wants to use bot_passwd='p4ssw0rd', # the password to the email account @@ -79,7 +79,7 @@ login to the user with ssh and run: ``` -export $(cat ~/.env | xargs) && ~/.local/lib/teams-bot.venv/bin/teams-bot init +export $(cat ~/.env | xargs) && ~/.local/lib/team-bot.venv/bin/team-bot init ``` Then, @@ -88,11 +88,11 @@ and keep it running in the background, run: ``` -systemctl --user enable --now teams-bot +systemctl --user enable --now team-bot ``` You can view the log output -with `journalctl --user -fu teams-bot` +with `journalctl --user -fu team-bot` to confirm that it works. ## Development Environment diff --git a/setup.cfg b/setup.cfg index 29a6b9e..0eb812c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,14 +1,14 @@ [metadata] -name = teams-bot +name = team-bot version = 0.0.1 author = missytake author_email = missytake@systemli.org description = This bot connects your team to the outside and makes it addressable. long_description = file: README.md long_description_content_type = text/markdown -url = https://git.0x90.space/missytake/teams-bot +url = https://github.com/deltachat-bot/team-bot project_urls = - Bug Tracker = https://git.0x90.space/missytake/teams-bot/issues + Bug Tracker = https://github.com/deltachat-bot/team-bot/issues classifiers = Programming Language :: Python :: 3 License :: OSI Approved :: ISC License (ISCL) @@ -31,7 +31,7 @@ where = src [options.entry_points] console_scripts = - teams-bot = teams_bot.cli:main + team-bot = team_bot.cli:main [tox:tox] envlist = lint, py310 diff --git a/src/teams_bot/__init__.py b/src/team_bot/__init__.py similarity index 100% rename from src/teams_bot/__init__.py rename to src/team_bot/__init__.py diff --git a/src/teams_bot/bot.py b/src/team_bot/bot.py similarity index 99% rename from src/teams_bot/bot.py rename to src/team_bot/bot.py index 40bc1c8..3577d17 100644 --- a/src/teams_bot/bot.py +++ b/src/team_bot/bot.py @@ -239,12 +239,12 @@ class RelayPlugin: if not chat.get_name().startswith( "[%s] " % (self.account.get_config("addr").split("@")[0],) ): - return False # all relay groups' names begin with a [tag] with the localpart of the teamsbot's address + return False # all relay groups' names begin with a [tag] with the localpart of the team-bot's address if ( chat.get_messages()[0].get_sender_contact() != self.account.get_self_contact() ): - return False # all relay groups were started by the teamsbot + return False # all relay groups were started by the team-bot if chat.is_protected(): return False # relay groups don't need to be protected, so they are not for crew_member in self.crew.get_contacts(): diff --git a/src/teams_bot/cli.py b/src/team_bot/cli.py similarity index 96% rename from src/teams_bot/cli.py rename to src/team_bot/cli.py index 2e7da41..6bd9533 100644 --- a/src/teams_bot/cli.py +++ b/src/team_bot/cli.py @@ -29,11 +29,11 @@ def set_log_level(verbose: int, db: str): cls=click.Group, context_settings={"help_option_names": ["-h", "--help"]} ) @click.pass_context -def teams_bot(ctx): +def team_bot(ctx): """This bot connects your team to the outside and makes it addressable.""" -@teams_bot.command() +@team_bot.command() @click.option("--email", type=str, default=None, help="the email account for the bot") @click.option( "--password", type=str, default=None, help="the password of the email account" @@ -41,7 +41,7 @@ def teams_bot(ctx): @click.option( "--dbdir", type=str, - default="teams_bot_data", + default="team_bot_data", help="path to the bot's database", envvar="TEAMS_DBDIR", ) @@ -123,11 +123,11 @@ def init(ctx, email: str, password: str, dbdir: str, verbose: int): logging.info("Successfully changed crew ID to the new group.") -@teams_bot.command() +@team_bot.command() @click.option( "--dbdir", type=str, - default="teams_bot_data", + default="team_bot_data", help="path to the bot's database", envvar="TEAMS_DBDIR", ) @@ -157,11 +157,11 @@ def run(ctx, dbdir: str, verbose: int): ac.wait_shutdown() -@teams_bot.command() +@team_bot.command() @click.option( "--dbdir", type=str, - default="teams_bot_data", + default="team_bot_data", help="path to the bot's database", envvar="TEAMS_DBDIR", ) @@ -191,7 +191,7 @@ def verify_crypto(ctx, dbdir: str, verbose: int): def main(): - teams_bot(auto_envvar_prefix="TEAMS") + team_bot(auto_envvar_prefix="TEAMS") if __name__ == "__main__": diff --git a/src/teams_bot/commands.py b/src/team_bot/commands.py similarity index 100% rename from src/teams_bot/commands.py rename to src/team_bot/commands.py diff --git a/src/teams_bot/pyinfra.py b/src/team_bot/pyinfra.py similarity index 73% rename from src/teams_bot/pyinfra.py rename to src/team_bot/pyinfra.py index fe877ea..2116597 100644 --- a/src/teams_bot/pyinfra.py +++ b/src/team_bot/pyinfra.py @@ -6,7 +6,7 @@ from pyinfra import host from pyinfra.facts.systemd import SystemdStatus -def deploy_teams_bot( +def deploy_team_bot( unix_user: str, bot_email: str, bot_passwd: str, dbdir: str = None ): """Deploy TeamsBot to a UNIX user, with specified credentials @@ -14,13 +14,13 @@ def deploy_teams_bot( :param unix_user: the existing UNIX user of the bot :param bot_email: the email address for the bot account :param bot_passwd: the password for the bot's email account - :param dbdir: the directory where the bot's data will be stored. default: ~/.config/teams-bot/email@example.org + :param dbdir: the directory where the bot's data will be stored. default: ~/.config/team-bot/email@example.org """ clone_repo = git.repo( - name="Pull the teams-bot repository", - src="https://git.0x90.space/missytake/teams-bot", - dest=f"/home/{unix_user}/teams-bot", + name="Pull the team-bot repository", + src="https://github.com/deltachat-bot/team-bot", + dest=f"/home/{unix_user}/team-bot", rebase=True, _su_user=unix_user, _use_su_login=True, @@ -28,7 +28,7 @@ def deploy_teams_bot( if clone_repo.changed: server.script( - name="Setup virtual environment for teams-bot", + name="Setup virtual environment for team-bot", src=importlib.resources.files(__package__) / "pyinfra_assets" / "setup-venv.sh", @@ -37,16 +37,16 @@ def deploy_teams_bot( ) server.shell( - name="Compile teams-bot", + name="Compile team-bot", commands=[ - f". .local/lib/teams-bot.venv/bin/activate && cd /home/{unix_user}/teams-bot && pip install ." + f". .local/lib/team-bot.venv/bin/activate && cd /home/{unix_user}/team-bot && pip install ." ], _su_user=unix_user, _use_su_login=True, ) if not dbdir: - dbdir = f"/home/{unix_user}/.config/teams_bot/{bot_email}/" + dbdir = f"/home/{unix_user}/.config/team_bot/{bot_email}/" secrets = [ f"TEAMS_DBDIR={dbdir}", f"TEAMS_INIT_EMAIL={bot_email}", @@ -70,18 +70,18 @@ def deploy_teams_bot( ) files.template( - name="upload teams-bot systemd unit", + name="upload team-bot systemd unit", src=importlib.resources.files(__package__) / "pyinfra_assets" - / "teams-bot.service.j2", - dest=f"/home/{unix_user}/.config/systemd/user/teams-bot.service", + / "team-bot.service.j2", + dest=f"/home/{unix_user}/.config/systemd/user/team-bot.service", user=unix_user, unix_user=unix_user, bot_email=bot_email, ) systemd.daemon_reload( - name=f"{unix_user}: load teams-bot systemd service", + name=f"{unix_user}: load team-bot systemd service", user_name=unix_user, user_mode=True, _su_user=unix_user, @@ -101,10 +101,10 @@ def deploy_teams_bot( _use_su_login=True, ) try: - if services["teams-bot.service"]: + if services["team-bot.service"]: systemd.service( - name=f"{unix_user}: restart teams-bot systemd service", - service="teams-bot.service", + name=f"{unix_user}: restart team-bot systemd service", + service="team-bot.service", running=True, restarted=True, user_mode=True, diff --git a/src/team_bot/pyinfra_assets/setup-venv.sh b/src/team_bot/pyinfra_assets/setup-venv.sh new file mode 100644 index 0000000..7cb8b61 --- /dev/null +++ b/src/team_bot/pyinfra_assets/setup-venv.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +python3 -m venv ~/.local/lib/team-bot.venv +source ~/.local/lib/team-bot.venv/bin/activate +pip install -U pip wheel + diff --git a/src/teams_bot/pyinfra_assets/teams-bot.service.j2 b/src/team_bot/pyinfra_assets/team-bot.service.j2 similarity index 50% rename from src/teams_bot/pyinfra_assets/teams-bot.service.j2 rename to src/team_bot/pyinfra_assets/team-bot.service.j2 index 08ac6e6..acd7187 100644 --- a/src/teams_bot/pyinfra_assets/teams-bot.service.j2 +++ b/src/team_bot/pyinfra_assets/team-bot.service.j2 @@ -1,8 +1,8 @@ [Unit] -Description=run deltachat teams-bot: {{ bot_email }} +Description=run deltachat team-bot: {{ bot_email }} [Service] -ExecStart=/home/{{ unix_user }}/.local/lib/teams-bot.venv/bin/teams-bot run -v +ExecStart=/home/{{ unix_user }}/.local/lib/team-bot.venv/bin/team-bot run -v EnvironmentFile=/home/{{ unix_user }}/.env Restart=on-failure RestartSec=5s diff --git a/src/teams_bot/pyinfra_assets/setup-venv.sh b/src/teams_bot/pyinfra_assets/setup-venv.sh deleted file mode 100644 index 4c4a65b..0000000 --- a/src/teams_bot/pyinfra_assets/setup-venv.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -python3 -m venv ~/.local/lib/teams-bot.venv -source ~/.local/lib/teams-bot.venv/bin/activate -pip install -U pip wheel - diff --git a/tests/conftest.py b/tests/conftest.py index 8e65c1b..3ee6308 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,7 @@ import deltachat import pytest from _pytest.pytester import LineMatcher -from teams_bot.bot import RelayPlugin +from team_bot.bot import RelayPlugin class ClickRunner: @@ -65,9 +65,9 @@ def _perform_match(output, fnl): @pytest.fixture def cmd(): """invoke a command line subcommand.""" - from teams_bot.cli import teams_bot + from team_bot.cli import team_bot - return ClickRunner(teams_bot) + return ClickRunner(team_bot) @pytest.fixture @@ -88,28 +88,28 @@ def relaycrew(crew): @pytest.fixture -def crew(teams_bot, teams_user, tmpdir): - from teams_bot.bot import SetupPlugin +def crew(team_bot, team_user, tmpdir): + from team_bot.bot import SetupPlugin - crew = teams_bot.create_group_chat( - f"Team: {teams_bot.get_config('addr')}", verified=True + crew = team_bot.create_group_chat( + f"Team: {team_bot.get_config('addr')}", verified=True ) setupplugin = SetupPlugin(crew.id) - teams_bot.add_account_plugin(setupplugin) + team_bot.add_account_plugin(setupplugin) qr = crew.get_join_qr() - teams_user.qr_join_chat(qr) + team_user.qr_join_chat(qr) setupplugin.member_added.wait(timeout=30) - crew.user = teams_user - crew.bot = teams_bot + crew.user = team_user + crew.bot = team_bot crew.bot.setupplugin = setupplugin # wait until old user is properly added to crew - last_message = teams_user.wait_next_incoming_message().text + last_message = team_user.wait_next_incoming_message().text while ( - f"Member Me ({teams_user.get_config('addr')}) added by bot" not in last_message + f"Member Me ({team_user.get_config('addr')}) added by bot" not in last_message ): print("User received message:", last_message) - last_message = teams_user.wait_next_incoming_message().text + last_message = team_user.wait_next_incoming_message().text crew.kvstore = pickledb.load(tmpdir + "pickle.db", True) crew.kvstore.set("crew_id", crew.id) @@ -117,7 +117,7 @@ def crew(teams_bot, teams_user, tmpdir): @pytest.fixture -def teams_bot(tmpdir): +def team_bot(tmpdir): ac = account(tmpdir + "/bot.sqlite", show_ffi=True) yield ac ac.shutdown() @@ -125,7 +125,7 @@ def teams_bot(tmpdir): @pytest.fixture -def teams_user(tmpdir): +def team_user(tmpdir): ac = account(tmpdir + "/user.sqlite") yield ac ac.shutdown() diff --git a/tests/test_cli.py b/tests/test_cli.py index 59452e3..63bf448 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2,7 +2,7 @@ def test_help(cmd): cmd.run_ok( [], """ - Usage: teams-bot [OPTIONS] COMMAND [ARGS]... + Usage: team-bot [OPTIONS] COMMAND [ARGS]... * -h, --help Show this message and exit. * init Scan a QR code to create a crew and join it * run Run the bot, so it relays messages from and to the outside