Use env vars, fixes #62

pull/72/head
Stijn De Clercq 2021-06-19 20:11:55 +02:00
parent a08bfca4c7
commit 418dc41126
10 changed files with 96 additions and 106 deletions

4
.gitignore vendored
View File

@ -1,13 +1,9 @@
files/status.txt
files/readyMessage.txt
files/client.txt
files/lastTasks.json files/lastTasks.json
files/c4.json files/c4.json
files/hangman.json files/hangman.json
files/stats.json files/stats.json
files/lost.json files/lost.json
files/locked.json files/locked.json
files/database.json
files/ufora_notifications.json files/ufora_notifications.json
.idea/ .idea/
__pycache__ __pycache__

View File

@ -5,6 +5,7 @@ from discord.ext import commands
from functions import checks, easterEggResponses from functions import checks, easterEggResponses
from functions.database import stats, muttn, custom_commands from functions.database import stats, muttn, custom_commands
import pytz import pytz
from settings import READY_MESSAGE, SANDBOX, STATUS_MESSAGE
import time import time
import traceback import traceback
@ -30,20 +31,13 @@ class Events(commands.Cog):
""" """
Function called when the bot is ready & done leading. Function called when the bot is ready & done leading.
""" """
# Change status # Set status
with open("files/status.txt", "r") as statusFile: await self.client.change_presence(status=discord.Status.online, activity=discord.Game(STATUS_MESSAGE))
status = statusFile.readline()
await self.client.change_presence(status=discord.Status.online, activity=discord.Game(str(status))) print(READY_MESSAGE)
# Print a message in the terminal to show that he's ready
with open("files/readyMessage.txt", "r") as readyFile:
readyMessage = readyFile.readline()
print(readyMessage)
# Add constants to the client as a botvar # Add constants to the client as a botvar
self.client.constants = constants.Live if "zandbak" not in readyMessage else constants.Zandbak self.client.constants = constants.Live if SANDBOX else constants.Zandbak
@commands.Cog.listener() @commands.Cog.listener()
async def on_message(self, message): async def on_message(self, message):

View File

@ -246,7 +246,7 @@ class Tasks(commands.Cog):
Task that checks for new Ufora announcements every few minutes Task that checks for new Ufora announcements every few minutes
""" """
# Don't run this when testing # Don't run this when testing
if self.client.user.id == int(constants.coolerDidierId): if self.client.user.id != int(constants.didierId):
return return
# Get new notifications # Get new notifications

View File

@ -1,45 +1,8 @@
import discord import discord
from discord.ext import commands, ipc
from dotenv import load_dotenv from dotenv import load_dotenv
from functions.prefixes import get_prefix from functions.prefixes import get_prefix
import os from settings import TOKEN
from startup.didier import Didier
class Didier(commands.Bot):
"""
Main Bot class for Didier
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# IPC Server
# TODO secret key
self.ipc = ipc.Server(self, secret_key="SOME_SECRET_KEY")
# Cogs that should be loaded before the others
self.preload = ("ipc", "utils", "failedchecks", "events",)
# Remove default help command
self.remove_command("help")
self.init_extensions()
def init_extensions(self):
# Load initial extensions
for ext in self.preload:
self.load_extension(f"cogs.{ext}")
# Load all remaining cogs
for file in os.listdir("./cogs"):
if file.endswith(".py") and not (file.startswith(self.preload)):
self.load_extension("cogs.{}".format(file[:-3]))
async def on_ipc_ready(self):
print("IPC server is ready.")
async def on_ipc_error(self, endpoint, error):
print(endpoint, "raised", error)
if __name__ == "__main__": if __name__ == "__main__":
load_dotenv(verbose=True) load_dotenv(verbose=True)
@ -50,9 +13,7 @@ if __name__ == "__main__":
client = Didier(command_prefix=get_prefix, case_insensitive=True, intents=intents) client = Didier(command_prefix=get_prefix, case_insensitive=True, intents=intents)
# Get the token out of the file & run the bot if client.ipc is not None:
with open("files/client.txt", "r") as fp: client.ipc.start()
token = fp.readline()
client.ipc.start() client.run(TOKEN)
client.run(token)

View File

@ -1,6 +1,5 @@
import psycopg2 import psycopg2
import json from settings import DB_HOST, DB_NAME, DB_USERNAME, DB_PASSWORD
import os
connection = None connection = None
@ -17,15 +16,11 @@ def connect():
def create_connection(): def create_connection():
global connection global connection
dir_path = os.path.dirname(os.path.realpath(__file__))
with open(os.path.join(dir_path, "../../files/database.json"), "r") as fp:
db = json.load(fp)
connection = psycopg2.connect( connection = psycopg2.connect(
host=db["host"], host=DB_HOST,
database=db["database"], database=DB_NAME,
user=db["username"], user=DB_USERNAME,
password=db["password"] password=DB_PASSWORD
) )

View File

@ -2,28 +2,7 @@
A list of all ignored files with copy-pastable templates. Useful for when you want to work on commands that use these, for obvious reasons. Every file has a copy-pastable template to make it easy for you to use. A list of all ignored files with copy-pastable templates. Useful for when you want to work on commands that use these, for obvious reasons. Every file has a copy-pastable template to make it easy for you to use.
These are usually files which would be overkill to make a PSQL table for. Other possibilities are files that are never edited, but should be different on every machine (Discord token, status message, ...). These are usually files which would be overkill to make a PSQL table for. Other possibilities are files that are never edited, but should be different on every machine.
### files/client.txt
Contains the application's token to connect to Discord. You can create your own bot & put it's token in this file to run & test Didier code.
token_goes_here
### files/database.json
Contains the credentials needed to connect to the PSQL database. This is ignored so that I don't have to leak my IP address, but also so that you can set up a local database to mess around without affecting the Live one or having to change any code.
```json
{
"username": "username",
"password": "password",
"host": "host_address",
"database": "database_name"
}
```
When connecting to a local PSQL database, `host` should be `"localhost"`.
### files/hangman.json ### files/hangman.json
@ -64,14 +43,6 @@ Contains a boolean indicating whether or not the server is currently locked, and
} }
``` ```
### files/readyMessage.txt
Contains the message printed in your terminal when Didier is ready.
I'M READY I'M READY I'M READY I'M READY
In case you were wondering: yes, this is a Spongebob reference.
### files/stats.json ### files/stats.json
Contains the stats to track for gambling games. Weren't made as a PSQL table because they would be too long (and every game is different). Contains the stats to track for gambling games. Weren't made as a PSQL table because they would be too long (and every game is different).
@ -98,12 +69,6 @@ Contains the stats to track for gambling games. Weren't made as a PSQL table bec
} }
``` ```
### files/status.txt
Contains Didier's status message for when he logs in. Keep in mind that his activity is set to `Playing `. This was first used in Didier V1 to show whether or not he was in sandbox mode.
with your Didier Dinks.
### files/ufora_notifications.json ### files/ufora_notifications.json
Stores ID's of all received Ufora notifications. Stores ID's of all received Ufora notifications.

33
settings.py 100644
View File

@ -0,0 +1,33 @@
from dotenv import load_dotenv
import os
load_dotenv()
def _to_bool(value: str) -> bool:
"""
Env variables are strings so this converts them to booleans
"""
return value.lower() in ["true", "1", "y", "yes"]
# Sandbox or live
SANDBOX = _to_bool(os.getenv("SANDBOX", "true"))
# Tokens & API keys
URBANDICTIONARY = os.getenv("URBANDICTIONARY", "")
IMGFLIP_NAME = os.getenv("IMGFLIPNAME", "")
IMGFLIP_PASSWORD = os.getenv("IMGFLIPPASSWORD", "")
# Database credentials
DB_USERNAME = os.getenv("DBUSERNAME", "")
DB_PASSWORD = os.getenv("DBPASSWORD", "")
DB_HOST = os.getenv("DBHOST", "")
DB_NAME = os.getenv("DBNAME", "")
# Discord-related
TOKEN = os.getenv("TOKEN", "")
HOST_IPC = _to_bool(os.getenv("HOSTIPC", "false"))
READY_MESSAGE = os.getenv("READYMESSAGE", "I'M READY I'M READY I'M READY I'M READY") # Yes, this is a Spongebob reference
STATUS_MESSAGE = os.getenv("STATUSMESSAGE", "with your Didier Dinks.")

View File

41
startup/didier.py 100644
View File

@ -0,0 +1,41 @@
from discord.ext import commands, ipc
from settings import HOST_IPC
import os
class Didier(commands.Bot):
"""
Main Bot class for Didier
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._host_ipc = HOST_IPC
# IPC Server
# TODO secret key
self.ipc = ipc.Server(self, secret_key="SOME_SECRET_KEY") if self._host_ipc else None
# Cogs that should be loaded before the others
self._preload = ("ipc", "utils", "failedchecks", "events",)
# Remove default help command
self.remove_command("help")
self.init_extensions()
def init_extensions(self):
# Load initial extensions
for ext in self._preload:
self.load_extension(f"cogs.{ext}")
# Load all remaining cogs
for file in os.listdir("./cogs"):
if file.endswith(".py") and not (file.startswith(self._preload)):
self.load_extension("cogs.{}".format(file[:-3]))
async def on_ipc_ready(self):
print("IPC server is ready.")
async def on_ipc_error(self, endpoint, error):
print(endpoint, "raised", error)

View File

@ -0,0 +1,5 @@
from os import path
def check_all():
pass