diff --git a/README.md b/README.md index d48348c..5ae4b93 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,9 @@ python --version - Install the required dependencies: ```bash -pip install discord +pip install discord python-dotenv ``` +(`python-dotenv` is optional, it only lets you keep your token in a `.env` file instead of a system environment variable.) ## Discord Application Deployment @@ -98,6 +99,12 @@ pip install discord 8. You may use the Generated URL to invite your bot into your servers. +9. Go to the `Bot` section and scroll down to `Privileged Gateway Intents`, then turn **all three** of them on: + `Presence Intent`, `Server Members Intent` and `Message Content Intent`. + + EconBot reads normal chat messages to catch its `!` commands, and Discord keeps that behind a switch you have to flip yourself. + If you skip this step the bot will crash on startup with `PrivilegedIntentsRequired`. + --- Token Setup & Environment Variable Setup @@ -122,6 +129,14 @@ pip install discord [Linux (Ubuntu)](https://www.youtube.com/watch?v=Y6_7xaxkPik) +_Alternatively_, if you installed `python-dotenv`, you can create a file named `.env` next to `main.py` containing: + +``` +econtoken=YOUR TOKEN HERE +``` + +`.env` is already in `.gitignore`, so your token won't be committed by accident. + _Alternatively_ you can just directly paste the bot token into the code; however, this is __not recommended__. - To do this, go to the file `main.py` and on the last line you should see diff --git a/main.py b/main.py index 2351e7f..8e7fd88 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,13 @@ # Libraries import discord import os +import sys + +try: + from dotenv import load_dotenv + load_dotenv() # Loads a local .env file if one exists, system env vars still take priority. +except ImportError: + pass # python-dotenv is optional, a system environment variable works just as well. import singletons import constants @@ -208,4 +215,11 @@ async def InvokeEcon(message : discord.Message) -> None: await message.reply(embed=embed) -singletons.client.run(os.getenv("econtoken")) +token = os.getenv("econtoken") + +if not token: + singletons.print_colored("[ NO TOKEN FOUND ! ]", "red") + print("Set an environment variable named 'econtoken', or put econtoken= in a .env file next to main.py.") + sys.exit(1) + +singletons.client.run(token) diff --git a/saveload/saveload.py b/saveload/saveload.py index 81fb9bf..4b80141 100644 --- a/saveload/saveload.py +++ b/saveload/saveload.py @@ -52,8 +52,9 @@ async def SaveUserDict() -> None: print(f"Error: {err}") def LoadUserDict() -> bool: - if not os.path.exists(save_path): - os.mknod(save_path) + if not os.path.exists(save_path) or os.path.getsize(save_path) == 0: + singletons.user_dict = {} # Fresh install, nothing saved yet. SaveUserDict creates the file later. + return True with open(save_path,'rb') as file: singletons.user_dict = pickle.load(file=file) return True diff --git a/singletons.py b/singletons.py index db348ae..0e9ff6c 100644 --- a/singletons.py +++ b/singletons.py @@ -27,8 +27,6 @@ async def Save(self): print_colored("--- Client disconnected ---", "red") - exit(0) - async def close(self): # Perform cleanup before closing await self.async_cleanup()