From e057bf3f9a1d6140a7a40acf069e49b98977159a Mon Sep 17 00:00:00 2001 From: hoangvu5 Date: Wed, 26 Feb 2025 07:43:02 -0500 Subject: [PATCH] Remove Discord lfg tasks --- docs/deployment/configuration.md | 2 +- src/contestsuite/settings.py | 15 +--- src/lfg/tasks.py | 148 ------------------------------- src/lfg/views.py | 19 +--- 4 files changed, 4 insertions(+), 180 deletions(-) delete mode 100644 src/lfg/tasks.py diff --git a/docs/deployment/configuration.md b/docs/deployment/configuration.md index b5a3b69..4de4259 100644 --- a/docs/deployment/configuration.md +++ b/docs/deployment/configuration.md @@ -85,7 +85,7 @@ The following variables, located in the main settings file[^1], map to various C Variable | Default | Description ---|---|--- -CELERY_BEAT_SCHEDULE | `{'cleanup-lfg-rosters': {'task': 'lfg.tasks.cleanup_lfg_rosters', 'schedule': 600.0,}, 'scrape-discord-members': {'task': 'lfg.tasks.scrape_discord_members', 'schedule': 1800.0,}, 'verify-lfg-profiles': { 'task': 'lfg.tasks.verify_lfg_profiles', 'schedule': 600.0,},}` | [Docs](https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-beat_schedule) +CELERY_BEAT_SCHEDULE | `{}` | [Docs](https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-beat_schedule) ## Flower diff --git a/src/contestsuite/settings.py b/src/contestsuite/settings.py index 10fb62f..1b43346 100644 --- a/src/contestsuite/settings.py +++ b/src/contestsuite/settings.py @@ -270,20 +270,7 @@ def get_secret(key, default=None): # Celery Beat # https://celery-safwan.readthedocs.io/en/latest/reference/celery.beat.html -CELERY_BEAT_SCHEDULE = { - 'cleanup-lfg-rosters': { - 'task': 'lfg.tasks.cleanup_lfg_rosters', - 'schedule': 600.0, - }, - 'scrape-discord-members': { - 'task': 'lfg.tasks.scrape_discord_members', - 'schedule': 1800.0, - }, - 'verify-lfg-profiles': { - 'task': 'lfg.tasks.verify_lfg_profiles', - 'schedule': 600.0, - }, -} +CELERY_BEAT_SCHEDULE = {} # Discord diff --git a/src/lfg/tasks.py b/src/lfg/tasks.py deleted file mode 100644 index 0c04a37..0000000 --- a/src/lfg/tasks.py +++ /dev/null @@ -1,148 +0,0 @@ -from celery import shared_task -from celery.utils.log import get_task_logger - -from discord import Webhook, RequestsWebhookAdapter, InvalidArgument - -from django.contrib.auth.models import User -from django.db import transaction -from django.template.loader import render_to_string - -from .models import DiscordMember, LFGProfile -from contestsuite.settings import BOT_CHANNEL_WEBHOOK_URL -from register.models import Team - - -logger = get_task_logger(__name__) - - -@shared_task -@transaction.atomic -def cleanup_lfg_rosters(): - """ - Celery task to deactivate LFG profiles where the user is also on a full team. - """ - - members_upper = [] - members_lower = [] - # max team size is 3 - teams = Team.objects.filter(num_members=3) - - for team in teams: - members = User.objects.filter(profile__team=team) - - for member in members: - if LFGProfile.objects.filter(user=member).exists() and member.lfgprofile.active == True: - # Deactivate profile - member.lfgprofile.active = False - member.lfgprofile.save() - - if member.lfgprofile.division == 1: - members_upper.append(member.lfgprofile.get_discord_username()) - else: - members_lower.append(member.lfgprofile.get_discord_username()) - - # Initializing webhook - if len(members_upper) > 0 or len(members_lower) > 0: - try: - webhook = Webhook.from_url( - BOT_CHANNEL_WEBHOOK_URL, adapter=RequestsWebhookAdapter()) - except InvalidArgument: - logger.error('Failed to connect to bot channel webhook') - else: - if len(members_upper) > 0: - # Upper - members = ','.join([member for member in members_upper]) - message = '$remove_role ' + members + ' LFG_Upper' - # Executing webhook. - webhook.send(content=message) - logger.info(f'Deactivated {len(members_upper)} Upper Division Profiles') - - if len(members_lower) > 0: - # Lower - members = ','.join([member for member in members_lower]) - message = '$remove_role ' + members + ' LFG_Lower' - # Executing webhook. - webhook.send(content=message) - logger.info(f'Deactivated {len(members_lower)} Lower Division Profiles') - - -@shared_task -def manage_discord_lfg_role(username, division, action=None): - """ - Celery task to update an existing LFG profile. - - action: 'add', 'remove', 'swap' - """ - - assert action == 'add' or action == 'remove' or action == 'swap', "Invalid action passed: ['add' | 'remove' | 'swap']" - - try: - webhook = Webhook.from_url(BOT_CHANNEL_WEBHOOK_URL, adapter=RequestsWebhookAdapter()) - except InvalidArgument: - logger.error('Failed to connect to bot channel webhook') - else: - if action == 'add' or action == 'remove': - if division == 1: - message = f'${action}_role ' + username + ' LFG_Upper' - else: - message = f'${action}_role ' + username + ' LFG_Lower' - - # Executing webhook. - webhook.send(content=message) - logger.debug(f'Success - {action} role: {username}') - else: - if division == 1: - message = '$remove_role ' + username + ' LFG_Upper' - webhook.send(content=message) - - message = '$add_role ' + username + ' LFG_Lower' - webhook.send(content=message) - else: - message = '$remove_role ' + username + ' LFG_Lower' - webhook.send(content=message) - - message = '$add_role ' + username + ' LFG_Upper' - webhook.send(content=message) - - logger.debug(f'Success - {action} role: {username}') - - -@shared_task -def scrape_discord_members(): - """ - Celery task to trigger a scrape of the target Discord server member list. - """ - - try: - webhook = Webhook.from_url(BOT_CHANNEL_WEBHOOK_URL, adapter=RequestsWebhookAdapter()) - except InvalidArgument: - logger.error('Failed to connect to bot channel webhook') - else: - message = '!scrape_members' - webhook.send(content=message) - logger.debug('Scrape members call sent') - - -@shared_task -@transaction.atomic -def verify_lfg_profiles(): - """ - Celery task which attempts to verify any unverified LFGProfiles. - """ - - lfg_profiles = LFGProfile.objects.filter(completed=True).filter(verified=False) - count = 0 - - for profile in lfg_profiles: - # verification: provided username + discriminator matches a username scraped from the target Discord server - if DiscordMember.objects.filter(username=profile.discord_username).filter(discriminator=profile.discord_discriminator).exists(): - profile.verified = True - profile.save() - - subject = 'Your LFG Profile is verified!' - message = render_to_string('lfg/lfg_verified_email.html', {'user': profile.user}) - profile.user.email_user(subject, message) - - count += 1 - - logger.info(f'Verified {count} profiles') diff --git a/src/lfg/views.py b/src/lfg/views.py index bfebd60..a84960c 100644 --- a/src/lfg/views.py +++ b/src/lfg/views.py @@ -6,7 +6,7 @@ from django.shortcuts import redirect, render from django.db import transaction -from . import forms, tasks +from . import forms from .models import LFGProfile from .utils import profile_activatable, new_lfg_user, lfg_profile_active, current_lfg_user from contestadmin.models import Contest @@ -64,8 +64,6 @@ def activate_profile(request): request.user.lfgprofile.active = True request.user.lfgprofile.save() - # Schedule Discord profile role change(s) - tasks.manage_discord_lfg_role.delay(request.user.lfgprofile.get_discord_username(), request.user.lfgprofile.division, 'add') messages.success(request, 'Profile scheduled for activation.', fail_silently=True) return redirect('lfg_dashboard') @@ -132,8 +130,6 @@ def deactivate_profile(request): request.user.lfgprofile.active = False request.user.lfgprofile.save() - # Schedule Discord profile role change(s) - tasks.manage_discord_lfg_role.delay(request.user.lfgprofile.get_discord_username(), request.user.lfgprofile.division, 'remove') messages.warning(request, 'Profile scheduled for deactivation.', fail_silently=True) return redirect('lfg_dashboard') @@ -170,15 +166,6 @@ def manage_profile(request): if lfg_profile.active: lfg_profile.active = False - # Get previous username - username = profile_form['discord_username'].initial+'#'+str(profile_form['discord_discriminator'].initial) - - # Remove roles from previous username - if 'division' not in profile_form.changed_data: - tasks.manage_discord_lfg_role.delay(username, lfg_profile.division, 'remove') - else: - tasks.manage_discord_lfg_role.delay(username, profile_form['division'].initial, 'remove') - messages.warning(request, 'Discord username changed. Profile reverification required.', fail_silently=True) # Discord username unchanged else: @@ -186,16 +173,14 @@ def manage_profile(request): if 'division' in profile_form.changed_data: if lfg_profile.active: if profile_form.cleaned_data['division'] is not None: - tasks.manage_discord_lfg_role.delay(lfg_profile.get_discord_username(), profile_form['division'].initial, 'swap') + pass else: lfg_profile.active = False - tasks.manage_discord_lfg_role.delay(lfg_profile.get_discord_username(), profile_form['division'].initial, 'remove') messages.warning(request, 'Profile deactivated because it is incomplete. Complete the blank field(s) to reactivate.', fail_silently=True) # Standing was updated elif 'standing' in profile_form.changed_data and lfg_profile.active: if profile_form.cleaned_data['standing'] is None: - tasks.manage_discord_lfg_role.delay(lfg_profile.get_discord_username(), profile_form['division'].initial, 'remove') messages.warning(request, 'Profile deactivated because it is incomplete. Complete the blank field(s) to reactivate.', fail_silently=True) lfg_profile.completed = lfg_profile.is_completed()