aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--alembic/versions/aa3517f1b1bd_add_verified_at_column.py28
-rw-r--r--metricity/bot.py16
-rw-r--r--metricity/models.py3
3 files changed, 44 insertions, 3 deletions
diff --git a/alembic/versions/aa3517f1b1bd_add_verified_at_column.py b/alembic/versions/aa3517f1b1bd_add_verified_at_column.py
new file mode 100644
index 0000000..f7ea257
--- /dev/null
+++ b/alembic/versions/aa3517f1b1bd_add_verified_at_column.py
@@ -0,0 +1,28 @@
+"""Add verified_at column
+
+Revision ID: aa3517f1b1bd
+Revises: 45973dacf7da
+Create Date: 2020-09-12 02:34:11.722267
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'aa3517f1b1bd'
+down_revision = '45973dacf7da'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.add_column('users', sa.Column('verified_at', sa.DateTime(), nullable=True))
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column('users', 'verified_at')
+ # ### end Alembic commands ###
diff --git a/metricity/bot.py b/metricity/bot.py
index 65a5e19..bcd003c 100644
--- a/metricity/bot.py
+++ b/metricity/bot.py
@@ -1,6 +1,7 @@
"""Creating and configuring a Discord client for Metricity."""
import asyncio
+from datetime import datetime
import logging
from typing import Any, Generator, List
@@ -212,7 +213,7 @@ async def on_member_remove(member: Member) -> None:
@bot.event
-async def on_member_update(_before: Member, member: Member) -> None:
+async def on_member_update(before: Member, member: Member) -> None:
"""When a member updates their profile, update the DB record."""
await sync_process_complete.wait()
@@ -223,6 +224,16 @@ async def on_member_update(_before: Member, member: Member) -> None:
if not member.joined_at:
return
+ before_roles = set([r.id for r in before.roles])
+ after_roles = set([r.id for r in member.roles])
+
+ diff = after_roles - before_roles
+
+ verified_at = None
+
+ if BotConfig.role_gate_id in diff:
+ verified_at = datetime.now()
+
roles = set([role.id for role in member.roles])
if db_user := await User.get(str(member.id)):
@@ -240,7 +251,8 @@ async def on_member_update(_before: Member, member: Member) -> None:
created_at=member.created_at,
is_staff=BotConfig.staff_role_id in roles,
is_verified=BotConfig.role_gate_id in roles,
- public_flags=dict(member.public_flags)
+ public_flags=dict(member.public_flags),
+ verified_at=verified_at or db_user.verified_at
).apply()
else:
try:
diff --git a/metricity/models.py b/metricity/models.py
index cf6b9c9..79c3cfd 100644
--- a/metricity/models.py
+++ b/metricity/models.py
@@ -48,6 +48,7 @@ class User(db.Model):
in_guild = db.Column(db.Boolean, default=True)
is_verified = db.Column(db.Boolean, default=False)
public_flags = db.Column(db.JSON, default={})
+ verified_at = db.Column(db.DateTime, nullable=True)
@classmethod
def bulk_upsert(cls: type, users: List[Dict[str, Any]]) -> Any:
@@ -62,7 +63,7 @@ class User(db.Model):
"bot",
"in_guild",
"is_verified",
- "public_flags",
+ "public_flags"
]
return qs.on_conflict_do_update(