Skip to content

tux.handlers.activity

Classes:

Name Description
ActivityHandler

Functions:

Name Description
setup

Adds the cog to the bot.

Classes

ActivityHandler(bot: Tux, delay: int = 30)

Bases: Cog

Methods:

Name Description
build_activity_list

Parses Config.ACTIVITIES as JSON and returns a list of activity objects

run

Loops through activities and updates bot presence periodically.

Source code in tux/handlers/activity.py
Python
def __init__(self, bot: Tux, delay: int = 30) -> None:
    self.bot = bot
    self.delay = delay
    self.activities = self.build_activity_list()
    self._activity_task = None

Functions

build_activity_list() -> list[discord.Activity | discord.Streaming] staticmethod

Parses Config.ACTIVITIES as JSON and returns a list of activity objects

Returns:

Type Description
list[Activity | Streaming]

A list of activity objects.

Source code in tux/handlers/activity.py
Python
@staticmethod
def build_activity_list() -> list[discord.Activity | discord.Streaming]:
    """
    Parses Config.ACTIVITIES as JSON and returns a list of activity objects

    Returns
    -------
    list[discord.Activity | discord.Streaming]
        A list of activity objects.
    """

    if not Config.ACTIVITIES or not Config.ACTIVITIES.strip():
        logger.warning("Config.ACTIVITIES is empty or None. Returning an empty list.")
        return []

    try:
        activity_data = json.loads(Config.ACTIVITIES)  # Safely parse JSON
    except json.JSONDecodeError:
        logger.error(f"Failed to parse ACTIVITIES JSON: {Config.ACTIVITIES!r}")
        raise  # Re-raise after logging

    activities: list[discord.Activity | discord.Streaming] = []

    for data in activity_data:
        activity_type_str = data.get("type", "").lower()
        if activity_type_str == "streaming":
            activities.append(discord.Streaming(name=str(data["name"]), url=str(data["url"])))
        else:
            # Map the string to the discord.ActivityType enum; default to "playing" if not found.
            activity_type = ACTIVITY_TYPE_MAP.get(activity_type_str, discord.ActivityType.playing)
            activities.append(discord.Activity(type=activity_type, name=data["name"]))

    return activities
run() -> NoReturn async

Loops through activities and updates bot presence periodically.

Parameters:

Name Type Description Default
self ActivityHandler

The ActivityHandler instance.

required

Returns:

Type Description
NoReturn
Source code in tux/handlers/activity.py
Python
async def run(self) -> NoReturn:
    """
    Loops through activities and updates bot presence periodically.

    Parameters
    ----------
    self : ActivityHandler
        The ActivityHandler instance.

    Returns
    -------
    NoReturn
    """

    while True:
        for activity in self.activities:
            try:
                if activity.name is None:
                    logger.warning("Activity name is None, skipping this activity.")
                    continue
                activity.name = await handle_substitution(self.bot, activity.name)
                await self.bot.change_presence(activity=activity)
            except Exception as e:
                logger.error(f"Error updating activity: {e}")
                # Continue the loop even if an error occurs

            await asyncio.sleep(self.delay)

Functions

setup(bot: Tux) -> None async

Adds the cog to the bot.

Source code in tux/handlers/activity.py
Python
async def setup(bot: Tux) -> None:
    """Adds the cog to the bot."""
    await bot.add_cog(ActivityHandler(bot))