Skip to content

Commit 6e4eec3

Browse files
authored
Merge pull request #120 from KoalaBotUK/verifyfix
[Verify] Improvements and new features
2 parents 9150cd8 + 24c8a5c commit 6e4eec3

File tree

11 files changed

+777
-135
lines changed

11 files changed

+777
-135
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ All notable changes to KoalaBot will be documented in this file. A lot of these
33
administrators
44

55
## [Unreleased]
6+
### Verify
7+
- Added new commands `verifyBlacklist` and `verifyBlacklistRemove` for blacklisting a given user from being verified
8+
- Updated look of verify emails
9+
- made email verification case insensitive
10+
- Added optimisations for verified roles
611

712
## [0.6.0] - 01-01-2023
813
- Upgraded to discord.py 2.1.0

koala/cogs/verification/cog.py

Lines changed: 81 additions & 129 deletions
Large diffs are not rendered by default.

koala/cogs/verification/core.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#!/usr/bin/env python
2+
3+
# Futures
4+
# Built-in/Generic Imports
5+
# Libs
6+
import discord
7+
from discord.ext.commands import Bot
8+
from sqlalchemy import select, text
9+
10+
# Own modules
11+
from koala.cogs.verification import db, errors
12+
from koala.cogs.verification.log import logger
13+
from koala.cogs.verification.models import VerifiedEmails, ToReVerify, VerifyBlacklist, Roles
14+
from koala.db import assign_session
15+
16+
# Constants
17+
# Variables
18+
from koala.errors import InvalidArgumentError
19+
20+
21+
@assign_session
22+
async def blacklist_member(user_id, guild_id, role_id, suffix, bot: Bot, **kwargs):
23+
guild: discord.Guild = bot.get_guild(guild_id)
24+
role = guild.get_role(role_id)
25+
26+
if not role:
27+
raise InvalidArgumentError("Please mention a role in this guild")
28+
29+
db.add_to_blacklist(user_id, role.id, suffix, **kwargs)
30+
await remove_roles_for_user(user_id, suffix, bot, **kwargs)
31+
32+
33+
@assign_session
34+
async def remove_blacklist_member(user_id, guild_id, role_id, suffix, bot: Bot, **kwargs):
35+
guild: discord.Guild = bot.get_guild(guild_id)
36+
role = guild.get_role(role_id)
37+
38+
if not role:
39+
raise InvalidArgumentError("Please mention a role in this guild")
40+
41+
db.remove_from_blacklist(user_id, role.id, suffix, **kwargs)
42+
await assign_roles_for_user(user_id, suffix, bot, **kwargs)
43+
44+
45+
@assign_session
46+
async def assign_role_to_guild(guild, role, suffix, session):
47+
results = session.execute(select(VerifiedEmails.u_id).where(VerifiedEmails.email.endswith(suffix),
48+
VerifiedEmails.u_id.in_(
49+
[member.id for member in guild.members]
50+
))).scalars().all()
51+
for user_id in results:
52+
try:
53+
should_re_verify = session.execute(select(ToReVerify)
54+
.filter_by(r_id=role.id, u_id=user_id)).all()
55+
56+
blacklisted = session.execute(select(VerifyBlacklist)
57+
.filter_by(user_id=user_id, role_id=role.id, email_suffix=suffix)).all()
58+
if blacklisted or should_re_verify:
59+
continue
60+
61+
member = guild.get_member(user_id)
62+
await member.add_roles(role)
63+
except AttributeError as e:
64+
# bot not in guild
65+
logger.error(exc_info=e)
66+
except discord.errors.NotFound as e:
67+
logger.error(f"user with id {user_id} not found in {guild}", exc_info=e)
68+
except discord.errors.Forbidden:
69+
raise errors.VerifyException(f"I do not have permission to assign {role}. "
70+
f"Make sure I have permission to give roles and {role} is lower than the "
71+
"KoalaBot role in the hierarchy, then try again.")
72+
73+
74+
@assign_session
75+
async def assign_roles_for_user(user_id, email, bot, session):
76+
results = session.execute(select(Roles.s_id, Roles.r_id, Roles.email_suffix)
77+
.where(text(":email like ('%' || email_suffix)")), {"email": email}).all()
78+
79+
for g_id, r_id, suffix in results:
80+
should_re_verify = session.execute(select(ToReVerify).filter_by(r_id=r_id, u_id=user_id)).all()
81+
82+
blacklisted = session.execute(select(VerifyBlacklist).filter_by(user_id=user_id, role_id=r_id)
83+
.where(text(":email like ('%' || email_suffix)")), {"email": email}).all()
84+
85+
if blacklisted or should_re_verify:
86+
continue
87+
try:
88+
guild = bot.get_guild(g_id)
89+
role = discord.utils.get(guild.roles, id=r_id)
90+
member = guild.get_member(user_id)
91+
if not member:
92+
member = await guild.fetch_member(user_id)
93+
if not member:
94+
raise discord.errors.NotFound
95+
await member.add_roles(role)
96+
except AttributeError as e:
97+
# bot not in guild
98+
logger.error(e)
99+
except discord.errors.NotFound:
100+
logger.error(f"user with id {user_id} not found")
101+
except discord.errors.Forbidden:
102+
raise errors.VerifyException(
103+
"I do not have permission to assign a role. Make sure I have permission to give roles and "
104+
"that is lower than the KoalaBot role in the hierarchy, then try again.")
105+
106+
107+
@assign_session
108+
async def remove_roles_for_user(user_id, email, bot, session):
109+
results = session.execute(select(Roles.s_id, Roles.r_id, Roles.email_suffix)
110+
.where(text(":email like ('%' || email_suffix)")), {"email": email}).all()
111+
112+
for g_id, r_id, suffix in results:
113+
try:
114+
guild = bot.get_guild(g_id)
115+
role = discord.utils.get(guild.roles, id=r_id)
116+
member = guild.get_member(user_id)
117+
if not member:
118+
member = await guild.fetch_member(user_id)
119+
await member.remove_roles(role)
120+
except AttributeError as e:
121+
# bot not in guild
122+
logger.error(e)
123+
except discord.errors.NotFound:
124+
logger.error(f"user with id {user_id} not found in {g_id}")

koala/cogs/verification/db.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python
2+
3+
# Futures
4+
# Built-in/Generic Imports
5+
# Libs
6+
import sqlalchemy.orm
7+
from sqlalchemy import select
8+
from sqlalchemy.exc import IntegrityError
9+
10+
# Own modules
11+
from koala.cogs.verification import errors
12+
from koala.cogs.verification.models import VerifyBlacklist
13+
from koala.db import assign_session
14+
15+
# Constants
16+
# Variables
17+
18+
19+
@assign_session
20+
def add_to_blacklist(user_id, role_id, suffix, session: sqlalchemy.orm.Session):
21+
blacklisted = VerifyBlacklist(user_id=user_id, role_id=role_id, email_suffix=suffix)
22+
try:
23+
session.add(blacklisted)
24+
session.commit()
25+
except IntegrityError:
26+
raise errors.VerifyException("This user verification is already blacklisted.")
27+
return blacklisted
28+
29+
30+
@assign_session
31+
def remove_from_blacklist(user_id, role_id, suffix, session: sqlalchemy.orm.Session):
32+
blacklisted = session.execute(select(VerifyBlacklist)
33+
.filter_by(user_id=user_id, role_id=role_id, email_suffix=suffix)).scalar()
34+
if not blacklisted:
35+
raise errors.VerifyException("This user verification blacklist doesn't exist.")
36+
session.delete(blacklisted)
37+
session.commit()
38+
return blacklisted

koala/cogs/verification/errors.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from koala.errors import KoalaException
2+
3+
4+
class VerifyException(KoalaException):
5+
"""
6+
Unspecified error within the 'verify' extension
7+
"""
8+
pass
9+

koala/cogs/verification/models.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,16 @@ def __repr__(self):
5050
(self.u_id, self.r_id)
5151

5252

53+
@mapper_registry.mapped
54+
class VerifyBlacklist:
55+
__tablename__ = 'VerifyBlacklist'
56+
user_id = Column(Integer, primary_key=True)
57+
role_id = Column(Integer, primary_key=True)
58+
email_suffix = Column(String, primary_key=True)
59+
60+
def __repr__(self):
61+
return "<VerifyBlacklist(%s, %s, %s)>" % \
62+
(self.user_id, self.role_id, self.email_suffix)
63+
64+
5365
setup()

0 commit comments

Comments
 (0)