Source code for sni.discord.jobs

"""
Discord jobs.

These jobs run on a dedicated asyncio scheduler.
"""

from discord import Member

from sni.user.models import Group, User
import sni.utils as utils

from .bot import get_member, scheduler
from .discord import ensure_role_for_group


[docs]async def update_discord_user(usr: User): """ Updates a discord user. Doesn't modify their roles. """ member: Member = get_member(usr.discord_user_id) await member.edit( nick=usr.tickered_name, reason="SeAT Navy Issue", )
[docs]@scheduler.scheduled_job("interval", hours=1) async def update_discord_users(): """ Updates all discord users. """ for usr in User.objects(discord_user_id__ne=None): await utils.catch_all_async( update_discord_user, f"Could not update Discord properties of user {usr.character_name}", args=[usr], )
[docs]async def update_discord_role(grp: Group): """ Updates a discord role. Makes sure all members of the group have that role, and demotes members that should not have it. """ if not grp.map_to_discord: return role = await ensure_role_for_group(grp) authorized_members = [ get_member(usr.discord_user_id) for usr in grp.members if usr.discord_user_id ] current_members = role.members for member in current_members: if role in member.roles: continue await member.edit(roles=list(set(member.roles) - set([role]))) for member in authorized_members: if member in current_members: continue await member.edit(roles=member.roles + [role])
[docs]@scheduler.scheduled_job("interval", minutes=10) async def update_discord_roles(): """ Updates discord role. A SNI group is mapped to a discord role unless that group's ``map_to_discord`` if ``False`` """ for grp in Group.objects(map_to_discord=True): await utils.catch_all_async( update_discord_role, f"Could not update Discord role {grp.group_name}", args=[grp], )