Skip to content

Commit cded5b0

Browse files
committed
finally reasonable file structure
1 parent 8a95b0c commit cded5b0

13 files changed

+243
-137
lines changed

main.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src import Hermes
1+
from src import HermesBot
22

3-
bot = Hermes.Hermes()
3+
bot = HermesBot.Hermes()
44
bot.run()

src/Hermes.py

-125
This file was deleted.

src/Hermes/__init__.py

Whitespace-only changes.

src/Hermes/cogs.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import os
2+
import asyncio
3+
def load_cogs(self):
4+
cogs = os.listdir(self.cog_prefix.replace('.', '/'))
5+
cogs = map(self.cog_prefix.replace('.', '/').__add__, cogs)
6+
cogs = filter(os.path.isfile, list(cogs))
7+
for cog in cogs:
8+
cog = cog[:-3].replace('/', '.')
9+
try:
10+
asyncio.run(self.load_extension(cog))
11+
self.logger.info(f"Cog {cog} loaded.")
12+
print("cog loaded")
13+
14+
except Exception as e:
15+
self.logger.warning(f"Cog {cog} can not be loaded!")
16+
raise e

src/Hermes/database.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import os
2+
from src.backend.sqlite import with_commit, scriptexec
3+
from sqlite3 import connect
4+
async def build_database(self):
5+
if os.path.isfile(self.DB_WIREGUARD_SCHEMA):
6+
7+
scriptexec(self.cursor, self.DB_WIREGUARD_SCHEMA)
8+
9+
async def ready_database(self):
10+
try:
11+
self.db_conn = connect(self.DB_PATH, check_same_thread=False) if self.db_conn is None else None
12+
self.cursor = self.db_conn.cursor() if self.cursor is None else None
13+
self.logger.info("Database initialized")
14+
except Exception as e:
15+
self.logger.warn(f"Database could not be initialized!\n{e}")

src/Hermes/logging.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import logging
2+
def start_logging(self):
3+
self.logger = logging.getLogger('discord') # annother loggger for hermes?
4+
self.logger.setLevel(logging.DEBUG)
5+
logging.getLogger('discord.http').setLevel(logging.INFO) # is this enother logger?
6+
7+
handler = logging.handlers.RotatingFileHandler(
8+
filename='discord.log',
9+
encoding='utf-8',
10+
maxBytes=32 * 1024 * 1024, # 32 MiB
11+
backupCount=5, # Rotate through 5 files
12+
)
13+
14+
dt_fmt = '%Y-%m-%d %H:%M:%S'
15+
formatter = logging.Formatter('[{asctime}] [{levelname:<8}] {name}: {message}', dt_fmt, style='{')
16+
handler.setFormatter(formatter)
17+
self.logger.addHandler(handler)

src/Hermes/on_.py

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
async def on_connect(self):
2+
self.logger.info("Connected")
3+
4+
async def on_disconnect(self):
5+
self.logger.info("Disconnected")
6+
7+
async def on_ready(self):
8+
9+
if not self.ready:
10+
self.ready = True
11+
self.logger.info("Hermes ready")
12+
self.stdout = self.get_channel(810599224718262304)
13+
self.guild = self.get_guild(716803899440234506)
14+
await self.ready_database()
15+
await self.build_database()
16+
await self.insert_wireguard_user(1, "pub", 2)
17+
await self.read_wireguard_users()
18+
try:
19+
await self.tree.sync(guild=self.guild)
20+
except Exception as e:
21+
print(e)
22+
else:
23+
self.logger.info("Reconnected")
24+
25+
async def on_message(self, message):
26+
if not message.author.bot:#and message.author == self.get_user(309723713857650688)
27+
await self.process_commands(message)
28+
29+
# await message.interaction.response.send_modal(WireguardModal())
30+
31+
32+
async def on_error(self, err, *args, **kwargs):
33+
34+
if err == "on_command_error":
35+
self.logger.debug("on_command_error Something went wrong.")
36+
else:
37+
raise exc.original
38+
39+
async def on_command_error(self, context, exception):
40+
41+
if isinstance(exception, CommandNotFound):
42+
pass
43+
elif hassattr(exception, "original"):
44+
self.logger.debug(exception.original)
45+
raise exception.original
46+
else:
47+
self.logger.debug(exception)
48+
raise exception

src/Hermes/wireguard.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import jinja2
2+
# maybe put to extension or module?
3+
async def insert_wireguard_user(self, user_id:int, pub_key:str, date:int):
4+
statement = '''INSERT INTO WIREGUARD_USERS VALUES(?, ?, ?)'''
5+
try:
6+
self.db_conn.execute(statement, (user_id, pub_key, date))
7+
self.logger.info(f"{(user_id, pub_key, date)} inserted into database.")
8+
except Exception as e:
9+
self.logger.warn(f"Could not insert to database!\n{e}")
10+
11+
async def read_wireguard_users(self):
12+
statement = '''SELECT * FROM WIREGUARD_USERS'''
13+
try:
14+
temp = self.db_conn.execute(statement)
15+
return temp
16+
for row in self.cursor.fetchall():
17+
pass # parse
18+
except Exception as e:
19+
self.logger.warn(f"Could not read from database!\n{e}")
20+
21+
def generate_wg_conf(self, db_select_outpout):
22+
env = jinja2.Environment()
23+
template = env.get_template("Wireguard.conf")
24+
return template.render(HOST={}, PEERS={})
25+
26+
#atomicity..?
27+
async def update_wireguard_conf(self):
28+
with self.SSH_CLIENT.connect():
29+
with self.SSH_CLIENT.open_sftp() as SFTP_conn:
30+
with SFTP_conn.file(self.wireguard_conf_path, mode='w') as wg_conf:
31+
entries = read_wireguard_users()
32+
wg_conf_string = generate_wg_conf(entries)
33+
wg_conf.write(wg_conf_string)

src/HermesBot.py

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import asyncio, os
2+
from discord.ext.commands import Bot as BotBase
3+
from discord import Intents, ui, app_commands
4+
from logging.handlers import RotatingFileHandler
5+
from discord.ext.commands import CommandNotFound, command
6+
7+
from src.Embeds.Wireguard import WireguardMenu
8+
9+
from apscheduler.schedulers.asyncio import AsyncIOScheduler
10+
from datetime import datetime
11+
#https://www.youtube.com/watch?v=4EIy0bw7s-s&list=PLYeOw6sTSy6ZGyygcbta7GcpI8a5-Cooc&index=5
12+
13+
from sqlite3 import connect
14+
from src.backend.sqlite import with_commit, scriptexec
15+
16+
17+
class Hermes(BotBase):
18+
19+
def __init__(self, *args, **kwargs):
20+
21+
self.prefix = "+"
22+
self.guild = None
23+
self.scheduler = AsyncIOScheduler()
24+
self.ready = False
25+
self.cog_prefix = "src.cogs."
26+
27+
self.DB_PATH = "data/database.db"
28+
self.DB_WIREGUARD_SCHEMA = "data/build.sql"
29+
self.db_conn = None
30+
self.cursor = None
31+
# intents = Intents.default()
32+
# intents.message_content = True
33+
super().__init__(command_prefix=self.prefix,
34+
intents=Intents.all(),
35+
*args,
36+
**kwargs)
37+
38+
async def sync_tree(self):
39+
try:
40+
synced = await self.tree.sync()
41+
if synced:
42+
self.logger.info("Tree synced")
43+
else:
44+
self.logger.warning("Tree not synced!")
45+
except Exception as e:
46+
self.logger.warning(f"Could not sync tree!\n{e}")
47+
raise e
48+
49+
def run(self):
50+
with open("token", "r") as token_fh:
51+
self.token = token_fh.read()
52+
self.start_logging()
53+
self.load_cogs()
54+
self.logger.info("Hermess run")
55+
super().run(self.token, reconnect=True)
56+
57+
from src.Hermes.cogs import load_cogs
58+
from src.Hermes.logging import start_logging
59+
from src.Hermes.on_ import on_connect, on_disconnect, on_ready, on_message, on_error, on_command_error
60+
from src.Hermes.database import build_database \
61+
,ready_database
62+
63+
from src.Hermes.wireguard import insert_wireguard_user \
64+
,read_wireguard_users
65+
66+
67+

src/Modals/Wireguard.py

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
from discord import ui, app_commands, TextStyle
22

3-
class WireguardModal(ui.Modal, title = "Wireguard Modal"):
4-
name = ui.TextInput(label = "name")
5-
# def __init__(self):
6-
# self.name = ui.TextInput(label = "name")
7-
# super().__init__()
8-
# self.add_item()
3+
class WireguardModal(ui.Modal, title = "Wireguard Configuration"):
4+
wg_pub_key = ui.TextInput(label = "Wireguard public key:")
95

106
async def on_submit(self, interaction):
11-
pass
7+
print("WG MODAL INPUT: " + str(self.wg_pub_key))
8+
await interaction.response.defer()
9+
10+
def insert_wireguard_user(db_conn, user_id:int, pub_key:str, date:int):
11+
statement = '''INSERT INTO WIREGUARD_USERS VALUES(?, ?, ?)'''
12+
try:
13+
self.db_conn.execute((user_id, pub_key, date))
14+
self.logger.info(f"{(user_id, pub_key, date)} is inserted into wireguard users db.")
15+
except:
16+
self.logger.warn("Error when inserting into wg db!")

src/__init__.py

Whitespace-only changes.

src/backend/sqlite.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from os.path import isfile
2+
from sqlite3 import connect
3+
4+
def with_commit(func):
5+
def inner(*args, **kwargs):
6+
func(*args, **kwargs)
7+
commit()
8+
return inner
9+
10+
@with_commit
11+
def build():
12+
if isfile(BUILD_PATH):
13+
scriptexec(SQL_PATH)
14+
15+
def commit():
16+
db_conn.commit()
17+
18+
def close():
19+
db_conn.close()
20+
21+
def scriptexec(cursor, path):
22+
with open(path, 'r', encoding="utf-8") as script:
23+
cursor.executescript(script.read())

0 commit comments

Comments
 (0)