From 81119c2d17d46b2a30a5c23e75f0c8f33f66a032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Tue, 29 Dec 2020 15:28:31 +0100 Subject: [PATCH] Update documentation --- .env-example => .env.example | 0 Bot.png | Bin 0 -> 19351 bytes Dockerfile => Docker/Dockerfile | 0 Docker/README.md | 115 ++++++++++++++++++ .../docker-compose.yml | 0 README.md | 74 +++++++---- main.py | 2 +- 7 files changed, 166 insertions(+), 25 deletions(-) rename .env-example => .env.example (100%) create mode 100644 Bot.png rename Dockerfile => Docker/Dockerfile (100%) create mode 100644 Docker/README.md rename docker-compose.yml => Docker/docker-compose.yml (100%) diff --git a/.env-example b/.env.example similarity index 100% rename from .env-example rename to .env.example diff --git a/Bot.png b/Bot.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc7f9be0d6dfb6a35fc77c0c259445a10dffad0 GIT binary patch literal 19351 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 literal 0 HcmV?d00001 diff --git a/Dockerfile b/Docker/Dockerfile similarity index 100% rename from Dockerfile rename to Docker/Dockerfile diff --git a/Docker/README.md b/Docker/README.md new file mode 100644 index 0000000..d130825 --- /dev/null +++ b/Docker/README.md @@ -0,0 +1,115 @@ +# Discord-reminder-bot + +Discord bot that allows you to set reminders. + +![Bot](/Bot.png) + +Theme is [DiscordNight by KillYoy](https://github.com/KillYoy/DiscordNight) + +## Usage + +### docker-compose with .env file + +More information on [Docker Hub](https://hub.docker.com/repository/docker/thelovinator/discord-reminder-bot) + +```yaml +version: "3" +services: + discord-reminder-bot: + image: thelovinator/discord-reminder-bot + env_file: + - .env + container_name: discord-reminder-bot + environment: + - BOT_TOKEN=${BOT_TOKEN} + - TIMEZONE=${TIMEZONE} + - LOG_LEVEL=${LOG_LEVEL} + - SQLITE_LOCATION=/data/jobs.sqlite + restart: unless-stopped + volumes: + - data_folder:/home/botuser/data/ +volumes: + data_folder: +``` + +### docker cli + +```console +docker run -d \ + --name=discord-reminder-bot \ + -e BOT_TOKEN=JFIiasfjioFIAOJFOIJIOSAF.AFo-7A.akwFakeopfaWPOKawPOFKOAKFPA \ + -e TIMEZONE=Europe/Stockholm \ + -e LOG_LEVEL=INFO \ + -e SQLITE_LOCATION=/data/jobs.sqlite \ + -v /path/to/data:/home/botuser/data/ \ + --restart unless-stopped \ + thelovinator/discord-reminder-bot +``` + +> **_NOTE:_** SQLITE_LOCATION must be on a volume to keep the reminders if you restart the Docker container! + +## Environment Variables + +| Parameter | Function | +| :------------------------------------------------------------------------: | ----------------------------------------------------------------------------------- | +| `-e BOT_TOKEN=JFIiasfjioFIAOJFOIJIOSAF.AFo-7A.akwFakeopfaWPOKawPOFKOAKFPA` | Discord bot token ([Where to get one](https://discord.com/developers/applications)) | +| `-e TZ=Europe/London` | Specify a time zone to use, this is used by the time zone converter and APScheduler | +| `-e SQLITE_LOCATION=/home/botuser/data/` | Where to store the database file. It should be stored on a volume | +| `-e LOG_LEVEL=INFO` | Log severity. Can be CRITICAL, ERROR, WARNING, INFO or DEBUG | +| `-v /path/to/data:/home/botuser/data/` | Folder to store the database | + +## Application Setup + +Add reminders with the `![remind|reminder|remindme|at] ` command. + +## Support Info + +* Shell access whilst the container is running: `docker exec -it discord-reminder-bot /bin/bash` +* To monitor the logs of the container in real-time: `docker logs -f discord-reminder-bot` + +## Help + +* Email: tlovinator@gmail.com +* Discord: TheLovinator#9276 +* Steam: [steamcommunity.com/id/TheLovinator/](https://steamcommunity.com/id/TheLovinator/) + +## Updating + +### Via Docker Compose + +* Update all images: `docker-compose pull` + * or update a single image: `docker-compose pull discord-reminder-bot` +* Let compose update all containers as necessary: `docker-compose up -d` + * or update a single container: `docker-compose up -d discord-reminder-bot` +* You can also remove the old dangling images: `docker image prune` + +### Via Docker Run + +* Update the image: `docker pull thelovinator/discord-reminder-bot` +* Stop the running container: `docker stop discord-reminder-bot` +* Delete the container: `docker rm discord-reminder-bot` +* Recreate a new container with the same docker run parameters as instructed above (if you mapped `/home/botuser/data/` to your computer your `jobs.sqlite` file and reminders will be preserved) +* You can also remove the old dangling images: `docker image prune` + +## Building locally + +If you want to make local modifications to these images for development purposes or just to customize the logic: + +```console +git clone https://github.com/TheLovinator1/discord-reminder-bot.git + +cd discord-reminder-bot + +docker build \ + --no-cache \ + --pull \ + -t thelovinator/discord-reminder-bot:latest . +``` + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details + +### Acknowledgments + +This README is based on the READMEs from [LinuxServer.io](https://github.com/linuxserver) diff --git a/docker-compose.yml b/Docker/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to Docker/docker-compose.yml diff --git a/README.md b/README.md index bda6aac..1dcaa24 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,74 @@ -Discord-reminder-bot -========= +# Discord-reminder-bot Discord bot that allows you to set reminders. +![Bot](/Bot.png) + +Theme is [DiscordNight by KillYoy](https://github.com/KillYoy/DiscordNight) + +## Environment Variables + +* `BOT_TOKEN` - Discord bot token ([Where to get one](https://discord.com/developers/applications)) +* `TIMEZONE` - Your time zone ([List of time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) +* `SQLITE_LOCATION` - (Optional) Where to store the database. Docker users need to change this to "/data/jobs.sqlite" +* `LOG_LEVEL` - Can be CRITICAL, ERROR, WARNING, INFO or DEBUG + ## Installation -* Install latest version of Python 3. -* Install pipenv - * `pip install pipenv` -* Install requirements and make virtual enviroment - * `pipenv install` -* Rename .env-example to .env and fill in. -* Start the bot - * `pipenv run python main.py` +You have two choices, install directly on your computer or using [Docker](https://registry.hub.docker.com/r/thelovinator/discord-reminder-bot). + +[hub.docker.com/r//thelovinator/discord-reminder-bot](https://registry.hub.docker.com/r/thelovinator/discord-reminder-bot) + +[docker-compose.yml](docker-compose.yml) + +[Dockerfile](Dockerfile) + +### Install directly on your computer + +* Install latest version of Python 3 for your operating system +* (Optional) Create a virtual environment: + * `python -m venv .venv` + * Activate virtual environment: + * Windows: `.\.venv\Scripts\activate` + * Not windows: `source .venv/bin/activate` +* Install requirements + * `pip install -r requirements.txt` +* Rename .env.example to .env and fill it out. +* Start the bot (inside the virtual environment if you made one): + * `python main.py` + +### Start the bot when your Linux server boots -## Autostart - Linux (systemd) * Keep services running after logout - * `loginctl enable-linger` + * `loginctl enable-linger` * Move service file to correct location (You may have to modify WorkingDirectory and/or ExecStart) - * `cp discord-reminder-bot.service ~/.config/systemd/user/discord-reminder-bot.service` + * `cp discord-reminder-bot.service ~/.config/systemd/user/discord-reminder-bot.service` * Start bot now and at boot - * `systemctl --user enable --now discord-reminder-bot` + * `systemctl --user enable --now discord-reminder-bot` +#### systemd examples -systemd examples: * Start bot automatically at boot - * `systemctl --user enable discord-reminder-bot` + * `systemctl --user enable discord-reminder-bot` * Don't start automatically - * `systemctl --user disable discord-reminder-bot` + * `systemctl --user disable discord-reminder-bot` * Restart - * `systemctl --user restart discord-reminder-bot` + * `systemctl --user restart discord-reminder-bot` * Stop - * `systemctl --user stop discord-reminder-bot` + * `systemctl --user stop discord-reminder-bot` * Start - * `systemctl --user start discord-reminder-bot` + * `systemctl --user start discord-reminder-bot` * Check status - * `systemctl --user status discord-reminder-bot` + * `systemctl --user status discord-reminder-bot` * Reading the journal - * `journalctl --user-unit discord-reminder-bot` + * `journalctl --user-unit discord-reminder-bot` ## Help + * Email: tlovinator@gmail.com * Discord: TheLovinator#9276 -* Steam: https://steamcommunity.com/id/TheLovinator/ +* Steam: [steamcommunity.com/id/TheLovinator/](https://steamcommunity.com/id/TheLovinator/) ## License -This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details \ No newline at end of file + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details diff --git a/main.py b/main.py index cb6f8eb..a534b4b 100644 --- a/main.py +++ b/main.py @@ -74,7 +74,7 @@ async def remind(ctx, message_date: str, message_reason: str): message = ( f"Hello {ctx.message.author.name}, I will notify you at:\n" f"**{remove_timezone_from_date}**\n" - f"With message:\n**{message_reason}**. " + f"With the message:\n**{message_reason}**. " ) logging.debug(f"Message we sent back to user in Discord:\n {message}") await ctx.send(message)