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
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}")