From 4a5541d0cadd3b051f419c6e80a10e7a52b9bc9e Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Fri, 9 Aug 2024 01:32:21 +0100 Subject: [PATCH] update readme --- README.md | 89 +++++++++++++++++-- apps/static/images/installation_contexts.png | Bin 0 -> 17294 bytes 2 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 apps/static/images/installation_contexts.png diff --git a/README.md b/README.md index 7a84fb8..850cabe 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,85 @@ -# PYRSS-Website +# PYRSS Website -Required Discord OAuth2 Scopes -- Identify - Get user data +## Setup -- Guilds - Get user guilds +### Discord Application + +A Discord Application is required for PYRSS to work, as it will provide the Discord Bot used to send RSS content. + +Save the key and secret as these environment variables: +- `DISCORD_KEY` +- `DISCORD_SECRET` + +#### Create the Application + +1. Navigate to the Discord Developer Portal, on the applications page: https://discord.com/developers/applications. +2. Create an App using the "New Application" button. + +#### Installation + +Now that you've created an Application, there are some required settings that you need to configure, navigate to the "Installation" tab from the sidebar. + +Under "Installation Contexts", ensure that only the `Guild Install` checkbox is checked. + +![An example image showing the "Guild Install" checkbox as checked.](apps/static/images/installation_contexts.png) + +This application is designed to be used in Guilds, so this setting is important. + +#### OAuth2 + +Navigate to the "OAuth2" tab from the sidebar. + +1. Head to the "Redirects" section and select "Add Redirect" +2. Add a redirect with this format: `PROTOCOL://HOST_ENDPOINT/oauth2/login/redirect` where `PROTOCOL` is either `http` or `https`, and the `HOST_ENDPOINT` is either an IP:PORT combination or web domain. + +Now you need to generate an Invite URL that you can use to add the Bot to your Discord Server. Navigate to the "OAuth2 URL Generator" section. + +1. Check the checkboxes for these scopes: + - identify + - guilds + - applications.commands + - bot +2. There should be a select box below the "scopes" section. Select the redirect URL that you created earlier. +3. Check the checkboxes for these bot permissions: + - View Channels + - Send Messages + - Embed Links + - Attach Files > TODO: verifiy? + - Use Slash Commands +4. "Integration Type" select `Guild Install` +5. Copy and save the generated URL + +You need to create an environment variable for the generated url, `DISCORD_OAUTH2_URL`. + +> TODO: write for `DISCORD_INVITE_URL` env var + +#### Bot + +Navigate to the "Bot" tab from the sidebar. + +Take note of the Token, you may need to use the "Reset Token" button to get one. +You will need to create an environment variable `BOT_TOKEN` for PYRSS. + +Navigate to the "Privilaged Gateway Intents" and ensure these intents are enabled: + +- > TODO + +### Database + +Use environment variables to specify a database, otherwise an sqlite database file will be created and used by default. + +#### Environment Variables + +`DB_ENGINE` - [Supported database engines](https://docs.djangoproject.com/en/5.0/ref/settings/#engine) +`DB_NAME` - Name of the database +`DB_USER` - Name of the database user +`DB_PASSWORD` - Password of the database user +`DB_HOST` - Host IP of the database +`DB_PORT` - Host Port of the database + +> **Note** +> If `DB_ENGINE` is not specified, the other database related environment variables will be ignored, and the default sqlite database will be used with a generated `db.sqlite3` file. + +### Admin Account + +Create an environment variable `SUPERUSER_IDS` and add comma separated Discord snowflake User IDs. When logged-in, these users will be able to access the admin panel. diff --git a/apps/static/images/installation_contexts.png b/apps/static/images/installation_contexts.png new file mode 100644 index 0000000000000000000000000000000000000000..a5058913da3979ad5b3789bb29e1da875d82956c GIT binary patch literal 17294 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

h83V`@t2TYRA~=Rf3*-z>@JcxS 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