diff options
| author | 2020-09-12 02:38:43 +0100 | |
|---|---|---|
| committer | 2020-09-12 02:38:43 +0100 | |
| commit | 83869109fe2a1a2405289263c85286368ba1ba3a (patch) | |
| tree | 954ff0ffbd3489fe415c9dc167abce5e31579ef4 | |
| parent | Add some new staff categories (diff) | |
Store user verification date
| -rw-r--r-- | alembic/versions/aa3517f1b1bd_add_verified_at_column.py | 28 | ||||
| -rw-r--r-- | metricity/bot.py | 16 | ||||
| -rw-r--r-- | metricity/models.py | 3 |
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( |