Skip to main content

Globally accessable context for discord.py events.

Project description

discord.ext.context

A globally accessible context object for discord.py events.

Able to be used in both base clients and the commands extension.

Installation

pip install discord.ext.context

Requirements

Register a Discord bot/client

Subclass the context.ContextClient base class, ensuring that it's first in inheritance order.

import discord
from discord.ext import context

class Client(context.ContextClient, discord.Client):
    ...

Using EventContext

Import context.ctx from anywhere, and it'll have its attributes set based on the event that your call stack originates from.

import discord
from discord.ext.context import ctx

async def log_reaction():
    await ctx.channel.send(f"{ctx.user} reacted with {ctx.emoji}")

client = discord.Client()
    
@client.event
async def on_raw_reaction_add():
    await log_reaction()

Exceptions

ContextNotSet

Accessing a context value before it's set will have this exception raised. To have a fallback value used instead, use the contextmanager with ctx.default():.

Attributes

ctx.message: discord.PartialMessage

Should always be a PartialMessage. If a Message instance is needed, an up to date copy can be retrieved with PartialMessage.fetch().

ctx.emoji: discord.Emoji or discord.PartialEmoji

Often representing a reaction interacted with by a user; useful for user interactions that use reaction-based sessions.

ctx.channel: discord.abc.Messageable

Will always be a text channel or user-type object that's possible to send messages to. Does not include voice channels.

ctx.user: discord.Member or discord.User

If setting a discord.User instance and the user shares only a single guild with the client, it'll replace it with the discord.Member instance.

ctx.guild: discord.Guild

Will only be set on guild-specific events.

ctx.cmd_ctx: discord.ext.commands.Context

Will only be set on the command event, with other EventContext values being set using it.

ctx.event: str

The name of the event type this context originates from.

ctx.client: discord.Client

The instance of the discord.py client being hooked into.

ctx.bot: discord.Client

Alias for ctx.client.

Methods

ctx.set(*, message=None, emoji=None, user=None, channel=None, guild=None)

Sets the values for the current context to be used across future call stacks. Won't impact asynchronous calls from other events.

@ctx.register_hook(event)

Decorator for registering an event to be handled by the decorated function. Will override existing hooks if a duplicate exists.

ctx.default(all_default, *, message=_NoValue, emoji=_NoValue, user=_NoValue, channel=_NoValue, guild=_NoValue, cmd_ext=_NoValue)

Context manager for registering default values to be used if a value isn't set. On leaving the context manager's scope, ctx will revert to original state.

Use all_default to set all the available ctx.values to the one value. This can be useful for allowing None to be returned for nonset contexts.

Examples

with ctx.default(None):
    if ctx.channel:
        await ctx.channel.send("Yes")
with ctx.default(channel=fallback_channel, user=None):
    if ctx.user:
        await ctx.channel.send(f"{ctx.user.display_name}")

If ctx.channel or ctx.user is not yet set, it'll be assigned the fallback arguments. This includes being able to set a value to None instead of raising ContextNotSet.

It can also be used as a decorator for a function.

@ctx.default(channel=fallback_channel, user=None)
async def show_name():
    if ctx.user:
        await ctx.channel.send(f"{ctx.user.display_name}")

ctx.ephemeral(*, message=_NoValue, emoji=_NoValue, user=_NoValue, channel=_NoValue, guild=_NoValue, cmd_ext=_NoValue)

Context manager for overriding context values. On leaving the context manager's scope, ctx will revert to original state.

Examples

with ctx.ephemeral(channel=log_channel, user=None):
    if ctx.user:
        await ctx.channel.send(f"{ctx.user.display_name} did a thing.")

If ctx.channel or ctx.user is not yet set, it'll be assigned the fallback arguments. This includes being able to set a value to None instead of raising ContextNotSet.

It can also be used as a decorator for a function.

@ctx.ephemeral(channel=log_channel, user=None)
async def show_name():
    if ctx.user:
        await ctx.channel.send(f"{ctx.user.display_name} did a thing.")

Events

By default, the following events are hooked by EventContext:

Messages

  • message
  • message_delete
  • message_edit
  • raw_message_delete
  • raw_message_edit

Reactions

  • reaction_add
  • reaction_remove
  • raw_reaction_add
  • raw_reaction_remove
  • reaction_clear
  • reaction_clear_emoji
  • raw_reaction_clear
  • raw_reaction_clear_emoji

Channels

  • typing
  • guild_channel_update
  • guild_channel_create
  • guild_channel_delete
  • guild_channel_pins_update
  • webhooks_update

Guilds

  • guild_update
  • guild_join
  • guild_remove
  • guild_integrations_update
  • guild_emojis_update
  • guild_available
  • guild_unavailable

Members

  • member_update
  • member_join
  • member_remove
  • member_ban_hook
  • member_unban_hook

Roles

  • guild_role_update_hook
  • guild_role_create_hook
  • guild_role_delete_hook

Commands

  • command

You can add more event hooks or replace the default ones with the decorator:

@EventContext.register_hook(event_name)
def event_hook(*args, **kwargs):
    ...

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

discord.ext.context-0.1.8.tar.gz (10.0 kB view details)

Uploaded Source

Built Distribution

discord.ext.context-0.1.8-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file discord.ext.context-0.1.8.tar.gz.

File metadata

  • Download URL: discord.ext.context-0.1.8.tar.gz
  • Upload date:
  • Size: 10.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.7 CPython/3.9.7 Linux/5.14.2-arch1-2

File hashes

Hashes for discord.ext.context-0.1.8.tar.gz
Algorithm Hash digest
SHA256 515b5a7b292f336651e202e6baabc462698daedbe547a3f404fa256f9b38d7fe
MD5 eab4296eb41ad4eda7199c3e9add8063
BLAKE2b-256 cbf89c1648215971bf96227688a2174a93679247bd47c7d3a6e5369386272b99

See more details on using hashes here.

File details

Details for the file discord.ext.context-0.1.8-py3-none-any.whl.

File metadata

File hashes

Hashes for discord.ext.context-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 e2c2243be868466d43381161d54b3a01aea3c9fe4dc4df27b67457ac51574063
MD5 4a0b00e7ade941cdbda80d81cc3b1b1f
BLAKE2b-256 75a5801b212dbed5e34886d4f2f016bde97b915eee1f2ffc18fe55bd8990d05b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page