Skip to content

Commit 2f1c81c

Browse files
committed
Better database getter and cleanup
1 parent 6751793 commit 2f1c81c

File tree

10 files changed

+104
-52
lines changed

10 files changed

+104
-52
lines changed

launcher.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,14 @@ async def on_command_error(ctx: Interaction, exc) -> None:
7373
else:
7474
raise exc
7575

76-
async def exit_handler():
76+
def exit_handler():
7777
bot.db.commit()
78-
await bot.close()
78+
# try:
79+
# loop = asyncio.get_running_loop()
80+
# except RuntimeError:
81+
# loop = asyncio.new_event_loop()
82+
# loop.run_until_complete(bot.close())
83+
# asyncio.run(bot.close())
7984

8085
atexit.register(exit_handler)
8186
await bot.start(bot.config.token)

lib/bot/__init__.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,22 @@
22
import json
33
import os
44
from datetime import datetime
5-
from http.client import HTTPException
65
import random
76
from typing import Any
87

98
import discord
109
import psutil
1110
import tzlocal
1211
from apscheduler.schedulers.asyncio import AsyncIOScheduler
13-
from discord import Guild, app_commands, Interaction, VoiceChannel, TextChannel, Message
14-
from discord.app_commands import errors, Command
12+
from discord import Guild, Interaction, VoiceChannel
13+
from discord.app_commands import Command
1514
from discord.embeds import Embed
1615
from discord.errors import NotFound
17-
from discord.ext.commands import AutoShardedBot, Context
18-
from discord import AutoShardedClient
19-
from discord.ext.commands._types import BotT
20-
from discord.ext.commands.errors import CommandNotFound, BadArgument, MissingRequiredArgument, CommandOnCooldown, \
21-
MissingPermissions, BotMissingPermissions
16+
from discord.ext.commands import AutoShardedBot
17+
from discord.ext.commands.errors import CommandNotFound, BadArgument
2218

2319
from lib.config import Config
2420
from lib.db import DB
25-
from lib.errors import BotNotReady
2621
from lib.progress import Progress, Timer
2722
from lib.urban import UrbanDictionary
2823

@@ -56,6 +51,7 @@ def __init__(self, shards: list[int], version: str):
5651
async def on_connect(self):
5752
await self.tree.sync()
5853
while not self.shards_ready:
54+
print('Shards Not Ready')
5955
await asyncio.sleep(.5)
6056
self.register_guilds()
6157
print(f"Signed into {self.user.display_name}#{self.user.discriminator}")
@@ -73,7 +69,7 @@ async def on_interaction(self, ctx: Interaction):
7369
if isinstance(ctx.command, Command):
7470
name_list, options = self.get_name(ctx.data, [])
7571
name = " ".join(name_list)
76-
self.db.execute(f"""INSERT INTO commands VALUES (?,?,?,?,?)""", name, ctx.guild_id,
72+
self.db.run(f"""INSERT INTO commands VALUES (?,?,?,?,?)""", name, ctx.guild_id,
7773
ctx.user.id, json.dumps(options), datetime.now().timestamp())
7874

7975
@staticmethod
@@ -100,21 +96,22 @@ async def send(ctx: Interaction, *args, **kwargs):
10096
def register_guilds(self):
10197
progress = Progress('Registering guilds', len(self.guilds))
10298
for guild in self.guilds:
103-
self.db.execute("""INSERT OR IGNORE INTO guilds VALUES (?,?,?)""", guild.id, None, None)
99+
self.db.run("""INSERT OR IGNORE INTO guilds VALUES (?,?,?)""", guild.id, None, None)
104100
progress.next()
105101

106-
for guild in self.db.records("""SELECT * FROM guilds"""):
102+
for guild in self.db.get.guilds():
107103
if not self.get_guild(guild.id):
108-
self.db.execute("""DELETE FROM guilds WHERE id=?""", guild.id)
104+
self.db.run("""DELETE FROM guilds WHERE id=?""", guild.id)
109105
self.db.commit()
110106
self.ready = True
107+
print('End')
111108
self.tasks.start()
112109

113110
async def on_guild_join(self, guild: Guild):
114-
self.db.execute("""INSERT OR IGNORE INTO guilds VALUES (?,?,?)""", guild.id, None, None)
111+
self.db.run("""INSERT OR IGNORE INTO guilds VALUES (?,?,?)""", guild.id, None, None)
115112

116113
async def on_guild_remove(self, guild: Guild):
117-
self.db.execute("""DELETE FROM guilds WHERE id=?""", guild.id)
114+
self.db.run("""DELETE FROM guilds WHERE id=?""", guild.id)
118115

119116
def get_name(self, data: Any, groups: list[str]):
120117
if isinstance(data, dict):

lib/cache/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from lib.levels import Player
2+
3+
class Cache:
4+
levels: dict[str, Player]

lib/cogs/Announcment.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ async def announce_enable(self, ctx: Interaction, channel: Optional[discord.Text
3333
if not channel.permissions_for(await ctx.guild.fetch_member(self.bot.user.id)).send_messages:
3434
return await ctx.response.send_message(
3535
Embed(title=f">>> I can't send messages in channel: {channel.name} ({channel.id})", colour=0xff0000))
36-
self.bot.db.execute("""UPDATE guilds SET a_id=? WHERE id=?""", channel.id, ctx.guild.id)
36+
self.bot.db.run("""UPDATE guilds SET a_id=? WHERE id=?""", channel.id, ctx.guild.id)
3737
print('here at send')
3838
await self.bot.send(ctx, embed=Embed(
3939
title=f">>> Successfully Enabled Announcements in {channel.mention} ({channel.id})"))
4040

4141
@announce.command(name='disable', description='Disable bot announcements')
4242
@has_guild_permissions(manage_guild=True)
4343
async def announce_disable(self, ctx: Interaction):
44-
self.bot.db.execute("""UPDATE guilds SET a_id=?""")
44+
self.bot.db.run("""UPDATE guilds SET a_id=?""")
4545
await self.bot.send(ctx,
4646
embed=Embed(title=f">>> Successfully Disabled Announcements"))
4747

lib/cogs/Handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(self, bot):
2020
# if isinstance(ctx.command, discord.app_commands.Command):
2121
# name_list, options = self.bot.get_name(ctx.data, [])
2222
# name = " ".join(name_list)
23-
# self.bot.db.execute(f"""INSERT INTO commands VALUES (?,?,?,?,?)""", name, ctx.guild_id,
23+
# self.bot.db.run(f"""INSERT INTO commands VALUES (?,?,?,?,?)""", name, ctx.guild_id,
2424
# ctx.user.id, json.dumps(options), datetime.now().timestamp())
2525

2626

lib/cogs/Mod.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,11 @@ async def ban_add(self, ctx: Interaction, member: discord.Member, delete_message
8181
if isinstance(member, Member):
8282
await member.ban(delete_message_days=self.days[delete_messages] if delete_messages else 0,
8383
reason=f"{reason} | {ctx.user.display_name}#{ctx.user.discriminator}")
84-
print('Banned Member')
8584
# Member is not a part of the guild
8685
elif isinstance(member, User):
8786
await ctx.guild.ban(user=member, delete_message_days=self.days[delete_messages] if delete_messages else 0,
8887
reason=f"{reason} | {ctx.user.display_name}#{ctx.user.discriminator}")
89-
print('Banned User')
90-
self.bot.db.execute("""INSERT INTO bans VALUES (?,?,?,?,?)""", ctx.guild_id, member.id, ctx.user.id, reason,
88+
self.bot.db.run("""INSERT INTO bans VALUES (?,?,?,?,?)""", ctx.guild_id, member.id, ctx.user.id, reason,
9189
datetime.now().timestamp())
9290
embed = Embed(title=f"✅ | {member.display_name}#{member.discriminator} ({member.id}) has been banned")
9391
await ctx.response.send_message(embed=embed)
@@ -109,7 +107,7 @@ async def ban_remove(self, ctx: Interaction, member: discord.Member, reason: Opt
109107
# Member is not part of the guild
110108
elif isinstance(member, User):
111109
await ctx.guild.unban(user=member, reason=reason)
112-
self.bot.db.execute("""DELETE FROM bans WHERE guild_id=? AND user_id=? """, ctx.guild_id, member.id)
110+
self.bot.db.run("""DELETE FROM bans WHERE guild_id=? AND user_id=? """, ctx.guild_id, member.id)
113111
await ctx.response.send_message(
114112
embed=Embed(title=f"✅ | {member.display_name}#{member.discriminator} ({member.id}) has been unbanned"))
115113

@@ -143,7 +141,7 @@ async def massban_add(self, ctx: Interaction, str_members: str, delete_messages:
143141
continue
144142
await member.ban(delete_message_days=self.days[delete_messages],
145143
reason=f"{reason} | {ctx.user.display_name}#{ctx.user.discriminator}")
146-
self.bot.db.execute("""INSERT INTO bans VALUES (?,?,?,?,?)""", ctx.guild_id, member.id, ctx.user.id, reason,
144+
self.bot.db.run("""INSERT INTO bans VALUES (?,?,?,?,?)""", ctx.guild_id, member.id, ctx.user.id, reason,
147145
datetime.now().timestamp())
148146
success.append(f"{member.display_name}#{member.discriminator} ({id})")
149147
embed = Embed()
@@ -179,7 +177,7 @@ async def massban_remove(self, ctx: Interaction, str_members: str, reason: Optio
179177
continue
180178

181179
await member.unban(reason=f"{reason} | {ctx.user.display_name}#{ctx.user.discriminator}")
182-
self.bot.db.execute("""DELETE FROM bans WHERE guild_id=? AND user_id=? """, ctx.guild_id, member.id)
180+
self.bot.db.run("""DELETE FROM bans WHERE guild_id=? AND user_id=? """, ctx.guild_id, member.id)
183181
success.append(f"{member.display_name}#{member.discriminator} ({id})")
184182
embed = Embed()
185183
s_users = "\n".join(success)

lib/cogs/Youtube.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ async def youtube_notify(self, ctx: Interaction, handle: str, message: Optional[
3636
elif res.status not in range(200, 300):
3737
return await ctx.response.send_message(embed=Embed(title=':x: | Something went wrong', colour=0xff0000))
3838

39-
user = self.bot.db.record("""SELECT * FROM youtube WHERE handle = ? AND guild_id = ?""", handle,
40-
ctx.guild_id)
39+
user = self.bot.db.get.youtube(handle=handle, guild_id=ctx.guild_id)
4140
if user:
4241
return await ctx.response.send_message(embed=Embed(title=':x: | Already watching for new videos', colour=0xff0000))
4342

@@ -48,7 +47,7 @@ async def youtube_notify(self, ctx: Interaction, handle: str, message: Optional[
4847
latest_video_url = "https://www.youtube.com/watch?v=" + re.search('(?<="videoId":").*?(?=")', html).group()
4948
except AttributeError:
5049
latest_video_url = ""
51-
self.bot.db.execute("""INSERT INTO youtube VALUES (?,?,?,?)""", handle, ctx.guild_id,
50+
self.bot.db.run("""INSERT INTO youtube VALUES (?,?,?,?)""", handle, ctx.guild_id,
5251
message if message else f"@{handle} has uploaded a video", latest_video_url)
5352
await ctx.response.send_message(embed=Embed(title=f'✅ | Waiting for @{handle} to post more videos'))
5453
self.bot.tasks.add_job(id=f"{handle}|{ctx.guild_id}", args=(handle, message, ctx.guild_id,), trigger='interval',

lib/db/__init__.py

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,52 @@
11
import re
2-
import sys
3-
import time
42
from sqlite3 import Connection, Cursor, connect, Error
3+
from typing import List, Dict, Optional
54

65
from lib.progress import Progress
76

7+
8+
class Get:
9+
def __init__(self, parent):
10+
self.parent = parent
11+
self._table_names = [list(table["table"].keys())[0] for table in parent.table_info]
12+
13+
def __getattribute__(self, name):
14+
table_names = super().__getattribute__('_table_names')
15+
if name in table_names:
16+
_get_rows = super().__getattribute__('_get_rows')
17+
return lambda **kwargs: _get_rows(name, **kwargs)
18+
return super().__getattribute__(name)
19+
20+
def _get_rows(self, table_name: str, count: Optional[int] = None, **kwargs: Dict) -> List[object]:
21+
if not kwargs:
22+
query = f"SELECT * FROM {table_name}"
23+
else:
24+
query = f"SELECT * FROM {table_name} WHERE "
25+
query += " AND ".join([f"{key}='{value}'" for key, value in kwargs.items()])
26+
if count:
27+
query += f" LIMIT {count}"
28+
self.parent.cur.execute(query)
29+
rows = self.parent.cur.fetchall()
30+
for table in self.parent.table_info:
31+
if list(table["table"].keys())[0] == table_name:
32+
keys = list(table["table"][table_name].keys())
33+
class_name = table_name
34+
row_class = type(class_name, (object,), {})
35+
return [self._create_row(row_class, keys, row) for row in rows]
36+
37+
def _create_row(self, row_class, keys, row):
38+
new_row = row_class()
39+
for i in range(len(keys)):
40+
setattr(new_row, keys[i], row[i])
41+
return new_row
42+
43+
844
class DB:
945
DB_PATH = "./data/database.db"
1046
cxn: Connection
1147
cur: Cursor
48+
table_info: List[Dict[str, Dict[str, Dict[str, str | List[str]]]]]
49+
table_names: List[str]
1250

1351
table_info: list[dict[str, dict[str, dict[str, str | list[str]]]]] = [
1452
{
@@ -81,9 +119,12 @@ class DB:
81119
}
82120
]
83121

122+
table_names: list[str] = []
123+
84124
def __init__(self):
85125
self.cxn = connect(self.DB_PATH, check_same_thread=False)
86126
self.cur = self.cxn.cursor()
127+
self.get: Get = Get(self)
87128

88129
def update_table(self, table: str, data: str):
89130
try:
@@ -102,6 +143,7 @@ def build(self) -> None:
102143
for table in self.table_info:
103144
table_data = table['table']
104145
for table_name, columns in table_data.items():
146+
self.table_names.append(table_name)
105147
create_table_query = f"CREATE TABLE IF NOT EXISTS {table_name}("
106148
constraints = table.get('constraints')
107149
for column_name, data_type in columns.items():
@@ -145,24 +187,5 @@ def commit(self) -> None:
145187
def close(self) -> None:
146188
self.cxn.close()
147189

148-
def field(self, command, *values):
149-
self.cur.execute(command, tuple(values))
150-
151-
if (fetch := self.cur.fetchone()) is not None:
152-
return fetch[0]
153-
154-
def record(self, command, *values):
155-
self.cur.execute(command, tuple(values))
156-
157-
return self.cur.fetchone()
158-
159-
def records(self, command, *values) -> list:
160-
self.cur.execute(command, tuple(values))
161-
162-
return self.cur.fetchall()
163-
164-
def execute(self, command, *values) -> None:
165-
self.cur.execute(command, tuple(values))
166-
167-
def multiexec(self, command, valueset) -> None:
168-
self.cur.execute(command, valueset)
190+
def run(self, command, *values) -> None:
191+
self.cur.execute(command, tuple(values))

lib/levels/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Player:
2+
xp: int = 0
3+
guild_id: str
4+
user_id: str
5+
level: int = 0
6+
7+
def __init__(self, guild_id: str, user_id: str, xp: int = 0):
8+
self.xp = xp
9+
self.guild_id = guild_id
10+
self.user_id = user_id
11+
self.level = 0

template.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,18 @@ class Class(Cog):
1616

1717
async def setup(bot):
1818
await bot.add_cog(Class(bot))
19+
20+
21+
commands = self.all().get('commands')
22+
print(commands)
23+
24+
def all(self):
25+
def bans():
26+
self.cur.execute("""SELECT * FROM bans""")
27+
return self.cur.fetchall()
28+
29+
def commands():
30+
query = """SELECT * FROM commands"""
31+
self.cur.execute(query)
32+
return self.cur.fetchall()
33+
return {'bans': bans(), 'commands': commands()}

0 commit comments

Comments
 (0)