Skip to content

tux.cogs.services.tty_roles

Classes:

Name Description
TtyRoles

Classes

TtyRoles(bot: Tux)

Bases: Cog

Methods:

Name Description
on_member_join

Assign a role to a user based on the number of users in the guild.

try_create_role

Create a role in the guild.

try_assign_role

Assign a role to a member.

Source code in tux/cogs/services/tty_roles.py
Python
def __init__(self, bot: Tux):
    self.bot = bot
    self.base_role_name = "/dev/tty"

Functions

on_member_join(member: discord.Member) -> None async

Assign a role to a user based on the number of users in the guild.

Parameters:

Name Type Description Default
member Member

The member that joined the guild.

required
Source code in tux/cogs/services/tty_roles.py
Python
@commands.Cog.listener()
async def on_member_join(self, member: discord.Member) -> None:
    """
    Assign a role to a user based on the number of users in the guild.

    Parameters
    ----------
    member : discord.Member
        The member that joined the guild.
    """

    user_count = member.guild.member_count
    role_name = self._compute_role_name(user_count)

    role = discord.utils.get(member.guild.roles, name=role_name) or await self.try_create_role(member, role_name)

    if role:
        await self.try_assign_role(member, role)
_compute_role_name(user_count: int | None) -> str

Compute the role name based on the number of users in the guild.

Parameters:

Name Type Description Default
user_count int | None

The number of users in the guild.

required

Returns:

Type Description
str

The name of the role to assign to the user.

Source code in tux/cogs/services/tty_roles.py
Python
def _compute_role_name(self, user_count: int | None) -> str:
    """
    Compute the role name based on the number of users in the guild.

    Parameters
    ----------
    user_count : int | None
        The number of users in the guild.

    Returns
    -------
    str
        The name of the role to assign to the user.
    """

    if user_count is None:
        return ""

    if 1 <= user_count <= 128:
        return f"{self.base_role_name}0"

    exponent = math.floor(math.log2(user_count))

    return f"{self.base_role_name}{2**exponent}"
try_create_role(member: discord.Member, role_name: str) -> discord.Role | None async staticmethod

Create a role in the guild.

Parameters:

Name Type Description Default
member Member

The member whose guild to create the role in.

required
role_name str

The name of the role to create.

required

Returns:

Type Description
Role | None

The created role if successful, otherwise None.

Source code in tux/cogs/services/tty_roles.py
Python
@staticmethod
async def try_create_role(member: discord.Member, role_name: str) -> discord.Role | None:
    """
    Create a role in the guild.

    Parameters
    ----------
    member : discord.Member
        The member whose guild to create the role in.
    role_name : str
        The name of the role to create.

    Returns
    -------
    discord.Role | None
        The created role if successful, otherwise None.
    """

    try:
        return await member.guild.create_role(name=role_name)

    except Exception as error:
        logger.error(f"Failed to create role {role_name}: {error}")

    return None
try_assign_role(member: discord.Member, role: discord.Role) -> None async staticmethod

Assign a role to a member.

Parameters:

Name Type Description Default
member Member

The member to assign the role to.

required
role Role

The role to assign.

required
Source code in tux/cogs/services/tty_roles.py
Python
@staticmethod
async def try_assign_role(member: discord.Member, role: discord.Role) -> None:
    """
    Assign a role to a member.

    Parameters
    ----------
    member : discord.Member
        The member to assign the role to.
    role : discord.Role
        The role to assign.
    """

    try:
        await discord.utils.sleep_until(datetime.datetime.now(datetime.UTC) + datetime.timedelta(seconds=5))
        await member.add_roles(role)

    except Exception as error:
        logger.error(f"Failed to assign role {role.name} to {member}: {error}")