Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion activitylog/activitylog.py
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,8 @@ def process_audit(
force_new_id: Optional[bool] = False,
):
audit_data = {
"id": audit.id if audit and not force_new_id else generate_unique_id(),
# always generate a new id because of issues with duplicate audit ids from discord
"id": generate_unique_id(), # audit.id if audit and not force_new_id else generate_unique_id(),
"datetime": audit.created_at if audit else discord.utils.utcnow(),
"action": action,
"category": category,
Expand Down
45 changes: 38 additions & 7 deletions activitylog/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
select,
and_,
or_,
exc,
)
from sqlalchemy.dialects.mysql import LONGTEXT
from sqlalchemy.orm import sessionmaker, scoped_session

import os, asyncio
import os, asyncio, re
from typing import List, Dict, Any, Optional, Union
from contextlib import contextmanager
from .utils import generate_unique_id


class DatabaseHandler:
Expand Down Expand Up @@ -263,14 +265,43 @@ def _flush_table(self, table_name: str):
except Exception as e:
buffer_session.rollback()
print(f"Error during buffered {buffer} to '{table_name}': {e}")
if "UNIQUE constraint failed" in str(e) and buffer == "insert":
# try saving buffer with safe insert
for row in working_buffer[table_name]:
self.safe_insert(table_name, row)
print("Buffer saved using safe insert.")
if "buffer" == "insert":
if "Duplicate entry" in str(e) or "UNIQUE constraint failed" in str(e):
# pymysql:
if "Duplicate entry" in str(e):
m = re.search(r"Duplicate entry '([^']+)' for key '([^']+)'", str(e))
if m:
duplicate_value, key_name = m.groups()
else:
duplicate_value, key_name = None, None
else: # sqlite3
m = re.search(r"UNIQUE constraint failed: (.+)", str(e))
if m:
key_name = m.group(1).split(", ")[0]
duplicate_value = None
else:
duplicate_value, key_name = None, None

if key_name is not None:
if duplicate_value is not None:
for i in range(len(working_buffer[table_name])):
if str(working_buffer[table_name][i].get(key_name, None)) == str(duplicate_value):
working_buffer[table_name][i][key_name] = generate_unique_id()
break
else:
# have to update all keys
for i in range(len(working_buffer[table_name])):
working_buffer[table_name][i][key_name] = generate_unique_id()
print("Modified IDs to save buffer.")
else:
print("Unable to save buffer, deleting buffer.")
working_buffer[table_name] = []
else:
print("Deleting buffer.")
working_buffer[table_name] = []
else:
print("Deleting buffer.")
working_buffer[table_name] = []
working_buffer[table_name] = []
finally:
buffer_session.close()

Expand Down
4 changes: 2 additions & 2 deletions chatbotassistant/chatbot.py
Original file line number Diff line number Diff line change
Expand Up @@ -1181,15 +1181,15 @@ async def ai_settings(self, ctx: commands.Context):
embed.add_field(
name="Revive Channels",
value=humanize_list(
[c.mention for c in guild_settings["dead_channels"]]
[ctx.guild.get_channel(c).mention for c in guild_settings["dead_channels"]]
if guild_settings["dead_channels"]
else ["None"]
),
)
embed.add_field(
name="User Learning Blacklist",
value=humanize_list(
[c.mention for c in guild_settings["learning_blacklist"]]
[ctx.guild.get_channel(c).mention for c in guild_settings["learning_blacklist"]]
if guild_settings["learning_blacklist"]
else ["None"]
),
Expand Down
16 changes: 8 additions & 8 deletions imagemagic/imagemagic.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ async def _command_body(self, ctx, args: Tuple):
await ctx.reply("That image is too large.", mention_author=False)
return

@commands.hybrid_command()
@commands.hybrid_group()
@commands.bot_has_permissions(attach_files=True)
async def distort(self, ctx):
"""
Expand All @@ -315,7 +315,7 @@ async def distort(self, ctx):
pass

@distort.command()
async def jpeg(self, ctx, intensity: Optional[float] = 10, *, link: Optional[str] = None):
async def jpeg(self, ctx, intensity: Optional[int] = 10, *, link: Optional[str] = None):
"""
Applies JPEG compression to image
"""
Expand All @@ -330,7 +330,7 @@ async def jpeg(self, ctx, intensity: Optional[float] = 10, *, link: Optional[str
await self._command_body(ctx, args=(self._jpeg_compress, img, quality))

@distort.command()
async def barrel(self, ctx, intensity: Optional[float] = 10, *, link: Optional[str] = None):
async def barrel(self, ctx, intensity: Optional[int] = 10, *, link: Optional[str] = None):
"""
Bulges the center of the image outward
"""
Expand All @@ -356,7 +356,7 @@ async def barrel(self, ctx, intensity: Optional[float] = 10, *, link: Optional[s
)

@distort.command()
async def implode(self, ctx, intensity: Optional[float] = 10, *, link: Optional[str] = None):
async def implode(self, ctx, intensity: Optional[int] = 10, *, link: Optional[str] = None):
"""
Pinches in the center of the image
"""
Expand All @@ -371,7 +371,7 @@ async def implode(self, ctx, intensity: Optional[float] = 10, *, link: Optional[
await self._command_body(ctx, args=(self._distortion, img, "implode", (amount * intensity,)))

@distort.command()
async def swirl(self, ctx, intensity: Optional[float] = 10, *, link: Optional[str] = None):
async def swirl(self, ctx, intensity: Optional[int] = 10, *, link: Optional[str] = None):
"""
Swirls the center of the image
"""
Expand Down Expand Up @@ -400,7 +400,7 @@ async def swirl(self, ctx, intensity: Optional[float] = 10, *, link: Optional[st
await self._command_body(ctx, args=(self._distortion, img, "swirl", (intensity,)))

@distort.command()
async def charcoal(self, ctx, intensity: Optional[float], *, link: Optional[str] = None):
async def charcoal(self, ctx, intensity: Optional[int], *, link: Optional[str] = None):
"""
Makes the image look somewhat like it was drawn with charcoal
"""
Expand All @@ -414,7 +414,7 @@ async def charcoal(self, ctx, intensity: Optional[float], *, link: Optional[str]
await self._command_body(ctx, args=(self._distortion, img, "charcoal", (1.5, 0.5)))

@distort.command()
async def sketch(self, ctx, intensity: Optional[float], *, link: Optional[str] = None):
async def sketch(self, ctx, intensity: Optional[int], *, link: Optional[str] = None):
"""
Makes the image look like it is a sketch
"""
Expand All @@ -428,7 +428,7 @@ async def sketch(self, ctx, intensity: Optional[float], *, link: Optional[str] =
await self._command_body(ctx, args=(self._distortion, img, "sketch", (0.5, 0.0, 98.0)))

@distort.command()
async def zoom(self, ctx, intensity: Optional[float], *, link: Optional[str] = None):
async def zoom(self, ctx, intensity: Optional[int], *, link: Optional[str] = None):
"""
Zooms in on the center of an image
"""
Expand Down