Skip to content

Commit c61b704

Browse files
committed
Merge branch 'hotfix/0.5.8.H'
2 parents cc08f61 + c397452 commit c61b704

File tree

3 files changed

+45
-16
lines changed

3 files changed

+45
-16
lines changed

koala/cogs/verification/cog.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -306,29 +306,22 @@ async def check_verifications(self, ctx):
306306
@commands.check(koalabot.is_admin)
307307
@commands.command(name="reVerify")
308308
@commands.check(verify_is_enabled)
309-
async def re_verify(self, ctx, role):
309+
async def re_verify(self, ctx, role: discord.Role):
310310
"""
311311
Removes a role from all users who have it and marks them as needing to re-verify before giving it back
312312
:param ctx: the context of the discord message
313313
:param role: the role to be removed and re-verified (e.g. @students)
314314
:return:
315315
"""
316316
with session_manager() as session:
317-
try:
318-
role_id = int(role[3:-1])
319-
except ValueError:
320-
raise self.InvalidArgumentError("Please give a role by @mentioning it")
321-
except TypeError:
322-
raise self.InvalidArgumentError("Please give a role by @mentioning it")
323-
324-
exists = session.execute(select(Roles).filter_by(s_id=ctx.guild.id, r_id=role_id)).all()
317+
exists = session.execute(select(Roles).filter_by(s_id=ctx.guild.id, r_id=role.id)).all()
325318

326319
if not exists:
327320
raise self.VerifyError("Verification is not enabled for that role")
328-
role = discord.utils.get(ctx.guild.roles, id=role_id)
329-
for member in ctx.guild.members:
330-
if role in member.roles:
331-
await member.remove_roles(role)
321+
existing_reverify = session.execute(select(ToReVerify.u_id).filter_by(r_id=role.id)).scalars().all()
322+
for member in role.members:
323+
await member.remove_roles(role)
324+
if member.id not in existing_reverify:
332325
session.add(ToReVerify(u_id=member.id, r_id=role.id))
333326

334327
session.commit()
@@ -373,7 +366,7 @@ async def assign_roles_for_user(self, user_id, email):
373366
# bot not in guild
374367
logger.error(e)
375368
except discord.errors.NotFound:
376-
logger.error(f"user with id {user_id} not found")
369+
logger.warn(f"user with id {user_id} not found")
377370

378371
async def remove_roles_for_user(self, user_id, email):
379372
with session_manager() as session:

koalabot.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ def check_guild_has_ext(ctx, extension_id):
143143

144144
@bot.event
145145
async def on_command_error(ctx, error: Exception):
146+
if ctx.guild is None:
147+
guild_id = "UNKNOWN"
148+
logger.warn("Unknown guild ID threw exception", exc_info=error)
149+
else:
150+
guild_id = ctx.guild.id
151+
146152
if error.__class__ in [commands.MissingRequiredArgument,
147153
commands.CommandNotFound]:
148154
await ctx.send(embed=error_embed(description=error))
@@ -156,10 +162,10 @@ async def on_command_error(ctx, error: Exception):
156162
elif isinstance(error, commands.errors.ChannelNotFound):
157163
await ctx.send(embed=error_embed(description=f"The channel ID provided is either invalid, or not in this server."))
158164
elif isinstance(error, commands.CommandInvokeError):
159-
# logger.warning("CommandInvokeError(%s), guild_id: %s, message: %s", error.original, ctx.guild.id, ctx.message)
165+
logger.error("CommandInvokeError(%s), guild_id: %s, message: %s", error.original, guild_id, ctx.message, exc_info=error)
160166
await ctx.send(embed=error_embed(description=error.original))
161167
else:
162-
logger.error(f"Unexpected Error in guild %s : %s", ctx.guild.name, error, exc_info=error)
168+
logger.error(f"Unexpected Error in guild %s : %s", guild_id, error, exc_info=error)
163169
await ctx.send(embed=error_embed(
164170
description=f"An unexpected error occurred, please contact an administrator Timestamp: {time.time()}")) # FIXME: better timestamp
165171
raise error

tests/cogs/verification/test_cog.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import asyncio
1111

1212
# Libs
13+
import discord
1314
import discord.ext.test as dpytest
1415
import pytest
16+
import sqlalchemy.orm
1517
from discord.ext import commands
1618
from sqlalchemy import select, delete
1719

@@ -226,3 +228,31 @@ async def test_re_verify():
226228
session.delete(test_role)
227229
session.execute(delete(ToReVerify).filter_by(u_id=member.id))
228230
session.commit()
231+
232+
@pytest.mark.asyncio
233+
async def test_re_verify_duplicate():
234+
with session_manager() as session:
235+
test_config = dpytest.get_config()
236+
guild = test_config.guilds[0]
237+
role = dpytest.back.make_role("testRole", guild, id_num=555)
238+
member = test_config.members[0]
239+
await dpytest.add_role(member, role)
240+
test_verified_email = VerifiedEmails(u_id=member.id, email='test@egg.com')
241+
test_role = Roles(s_id=guild.id, r_id=role.id, email_suffix='egg.com')
242+
test_re_verify = ToReVerify(u_id=member.id, r_id=role.id)
243+
session.add(test_verified_email)
244+
session.add(test_role)
245+
session.add(test_re_verify)
246+
session.commit()
247+
248+
await dpytest.message(koalabot.COMMAND_PREFIX + "reVerify <@&555>")
249+
assert role not in member.roles
250+
blacklisted = session.execute(select(ToReVerify).filter_by(u_id=member.id)).all()
251+
assert blacklisted
252+
assert dpytest.verify().message().content(
253+
"That role has now been removed from all users and they will need to re-verify the associated email.")
254+
session.delete(test_verified_email)
255+
session.delete(test_role)
256+
session.execute(delete(ToReVerify).filter_by(u_id=member.id))
257+
session.commit()
258+

0 commit comments

Comments
 (0)