aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2020-08-25 19:57:57 +0100
committerGravatar Joe Banks <[email protected]>2020-08-25 19:57:57 +0100
commitc4ea4f0f5474a3e28e47adb7b306fb40cc68157a (patch)
tree0c65994f78eda3e92eeb3d642b5f0b229d9d0af7
parentLinting (diff)
Add in_guild column to represent membership
-rw-r--r--alembic/versions/5683123ff89a_add_in_guild_column.py28
-rw-r--r--metricity/bot.py20
-rw-r--r--metricity/models.py4
3 files changed, 50 insertions, 2 deletions
diff --git a/alembic/versions/5683123ff89a_add_in_guild_column.py b/alembic/versions/5683123ff89a_add_in_guild_column.py
new file mode 100644
index 0000000..12d67a1
--- /dev/null
+++ b/alembic/versions/5683123ff89a_add_in_guild_column.py
@@ -0,0 +1,28 @@
+"""add in_guild column
+
+Revision ID: 5683123ff89a
+Revises: 2743389eb63e
+Create Date: 2020-08-25 19:57:41.958297
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '5683123ff89a'
+down_revision = '2743389eb63e'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.add_column('users', sa.Column('in_guild', sa.Boolean(), nullable=True))
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column('users', 'in_guild')
+ # ### end Alembic commands ###
diff --git a/metricity/bot.py b/metricity/bot.py
index 5b5b961..09eda54 100644
--- a/metricity/bot.py
+++ b/metricity/bot.py
@@ -121,6 +121,8 @@ async def on_guild_available(guild: Guild) -> None:
log.info("Beginning user synchronisation process")
+ await User.update.values(in_guild=False)
+
users = []
for user in guild.members:
@@ -131,7 +133,8 @@ async def on_guild_available(guild: Guild) -> None:
"joined_at": user.joined_at,
"created_at": user.created_at,
"is_staff": BotConfig.staff_role_id in [role.id for role in user.roles],
- "bot": user.bot
+ "bot": user.bot,
+ "in_guild": True
})
log.info(f"Performing bulk upsert of {len(users)} rows")
@@ -179,6 +182,20 @@ async def on_member_join(member: Member) -> None:
@bot.event
+async def on_member_remove(member: Member) -> None:
+ """On a user leaving the server mark in_guild as False."""
+ await sync_process_complete.wait()
+
+ if member.guild.id != BotConfig.guild_id:
+ return
+
+ if db_user := await User.get(str(member.id)):
+ await db_user.update(
+ in_guild=False
+ ).apply()
+
+
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()
@@ -231,6 +248,7 @@ async def on_message(message: DiscordMessage) -> None:
if message.guild.id != BotConfig.guild_id:
return
+ await sync_process_complete.wait()
await channel_sync_in_progress.wait()
if author := await User.get(str(message.author.id)):
diff --git a/metricity/models.py b/metricity/models.py
index 0489e8c..a2be73d 100644
--- a/metricity/models.py
+++ b/metricity/models.py
@@ -45,6 +45,7 @@ class User(db.Model):
is_staff = db.Column(db.Boolean, nullable=False)
opt_out = db.Column(db.Boolean, default=False)
bot = db.Column(db.Boolean, default=False)
+ in_guild = db.Column(db.Boolean, default=True)
@classmethod
def bulk_upsert(cls: type, users: List[Dict[str, Any]]) -> Any:
@@ -57,7 +58,8 @@ class User(db.Model):
"joined_at",
"is_staff",
"opt_out",
- "bot"
+ "bot",
+ "in_guild"
]
return qs.on_conflict_do_update(