guild.mod: refactor guild prune list in pure sql

close #54
This commit is contained in:
Luna 2022-08-14 15:35:50 -03:00
parent 6608db7bf1
commit d44541748e
1 changed files with 13 additions and 20 deletions

View File

@ -133,36 +133,29 @@ async def get_prune(guild_id: int, days: int) -> list:
- did not login in ``days`` days.
- don't have any roles.
"""
# a good solution would be in pure sql.
# @everyone role is always counted as a role in the db
# (its not implicit to every member as one would think)
# (that is probably the best solution in the future)
# (but we live with what we got)
member_ids = await app.db.fetch(
f"""
SELECT id
FROM users
JOIN members
ON members.guild_id = $1 AND members.user_id = users.id
WHERE users.last_session < (now() - (interval '{days} days'))
""",
guild_id,
)
member_ids = [r["id"] for r in member_ids]
members = []
for member_id in member_ids:
role_count = await app.db.fetchval(
"""
SELECT COUNT(*)
WHERE
users.last_session < (now() - (interval '{days} days'))
AND (
SELECT COUNT(member_roles.role_id)
FROM member_roles
WHERE guild_id = $1 AND user_id = $2
WHERE member_roles.user_id = members.user_id
) <= 1
""",
guild_id,
member_id,
)
if role_count == 1: # only the @everyone role
members.append(member_id)
return members
return [r["id"] for r in member_ids]
@bp.route("/<int:guild_id>/prune", methods=["GET"])