From af91883635c17d10facaee5ab0042caec51a71ab Mon Sep 17 00:00:00 2001 From: Joshua Arulsamy Date: Sun, 9 Aug 2020 15:24:15 -0600 Subject: [PATCH] :pencil: Overhaul docs Add better detail of bot creation Add badges Add sample docker-compose.yml --- README.md | 94 ++++++++++++++++++++++++++++++++++-------- assets/screenshot.png | Bin 0 -> 17541 bytes 2 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 assets/screenshot.png diff --git a/README.md b/README.md index e694d04..4caba35 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,113 @@ # Plex-Bot +[![GPLv3 license](https://img.shields.io/badge/License-GPLv3-blue.svg)](http://perso.crans.org/besson/LICENSE.html) +![docker pulls](https://img.shields.io/docker/pulls/jarulsamy/plex-bot) +![docker img size](https://img.shields.io/docker/image-size/jarulsamy/plex-bot) +Code style: black + A Python-based Plex music bot for discord. +![screenshot](assets/screenshot.png) + ## Setup Plex-Bot runs entirely in a Docker container. Ensure you have Docker and docker-compose installed according to the official Docker [documentation](https://docs.docker.com/get-docker/). -1. Clone the repository and `cd` into it: +1. Create a new folder and `cd` into it: ``` -$ git clone https://github.com/jarulsamy/Plex-Bot +$ mkdir Plex-Bot $ cd Plex-Bot ``` -2. Create a configuration folder: +2. Make a `docker-compose.yml` file or use this sample: -Create a new `config` folder and copy the sample config file into it: +```yml +version: "3" +services: + plex-bot: + container_name: "PlexBot" + image: jarulsamy/plex-bot:latest + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Denver + # Required dir for configuration files + volumes: + - "./config:/config:ro" + restart: "unless-stopped" +``` + +3. Create a configuration folder: + +Create a new `config` folder and create a config file like this: ``` $ mkdir config -$ cp sample-config.yaml config/config.yaml +$ cd config ``` -3. Create a Discord bot application: +```yml +# Create a file called config.yaml with the following contents - 1. Go to the Discord developer portal, [here](https://discord.com/developers/applications). +root: + log_level: "info" - 2. Log in or create an account +discord: + prefix: "?" + token: "" + log_level: "debug" - 3. Click New App +plex: + base_url: "" + token: "" + library_name: "" + log_level: "debug" +``` - 4. Fill in App Name and anything else you'd like to include +4. Create a Discord bot application: - 5. Click Create App + * Go to the Discord developer portal, [here](https://discord.com/developers/applications). + + * Log in or create an account + + * Click New App + + * Fill in App Name and anything else you'd like to include + + * Click Create App This will provide you with your Client ID and Client Secret - 6. Click Create Bot User + * Click Create Bot User This will provide you with your bot Username and Token - 7. Fill in all the necessary numbers in `config/config.yaml` + * Fill in the bot token in `config/config.yaml` -4. Get your plex token: +5. Get your plex token: - Refer to the official [plex documentation](https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/). + * Refer to the official [plex documentation](https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/). - Add it to `config/config.yaml` in the appropiate spot. + * Add it to `config/config.yaml` in the appropiate spot. -5. Start the service: +6. Customize remaining settings + + Set any remaining settings in the config file that you would like. Such as music library, and base url of the Plex server. + +7. Start the service: ``` -$ docker-compose up --build +$ docker-compose up -d +``` + +## Logs + +You can view the logs with the following command + +``` +$ docker-compose logs -f CONTAINER_NAME_OR_ID + +# For example +$ docker-compose logs -f PlexBot ``` ## Usage diff --git a/assets/screenshot.png b/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd93ccd90243f732f60b66d13047d6d2123b846 GIT binary patch literal 17541 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 literal 0 HcmV?d00001