-
-
Save Vexs/79b46d087939b68efd31722e7e5ae236 to your computer and use it in GitHub Desktop.
A Cogs Example for the rewrite version of - discord.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import discord | |
from discord.ext import commands | |
import sys, traceback | |
"""This is a multi file example showcasing many features of the command extension and the use of cogs. | |
These are examples only and are not intended to be used as a fully functioning bot. Rather they should give you a basic | |
understanding and platform for creating your own bot. | |
These examples make use of Python 3.6.2 and the rewrite version on the lib. | |
For examples on cogs for the async version: | |
https://gist.github.com/leovoel/46cd89ed6a8f41fd09c5 | |
Rewrite Documentation: | |
http://discordpy.readthedocs.io/en/latest/api.html | |
Rewrite Commands Documentation: | |
http://discordpy.readthedocs.io/en/latest/ext/commands/api.html | |
Rewrite Cogs Documentation: | |
https://discordpy.readthedocs.io/en/latest/ext/commands/cogs.html | |
Rewrite Extensions Documentation: | |
https://discordpy.readthedocs.io/en/latest/ext/commands/extensions.html | |
Familiarising yourself with the documentation will greatly help you in creating your bot and using cogs. | |
""" | |
def get_prefix(bot, message): | |
"""A callable Prefix for our bot. This could be edited to allow per server prefixes.""" | |
# Notice how you can use spaces in prefixes. Try to keep them simple though. | |
prefixes = ['>?', 'lol ', '!?'] | |
# Check to see if we are outside of a guild. e.g DM's etc. | |
if not message.guild: | |
# Only allow ? to be used in DMs | |
return '?' | |
# If we are in a guild, we allow for the user to mention us or use any of the prefixes in our list. | |
return commands.when_mentioned_or(*prefixes)(bot, message) | |
# Below cogs represents our folder our cogs are in. Following is the file name. So 'meme.py' in cogs, would be cogs.meme | |
# Think of it like a dot path import | |
initial_extensions = ['cogs.simple', | |
'cogs.members', | |
'cogs.owner'] | |
bot = commands.Bot(command_prefix=get_prefix, description='A Rewrite Cog Example') | |
# Here we load our extensions(cogs) listed above in [initial_extensions]. | |
if __name__ == '__main__': | |
for extension in initial_extensions: | |
try: | |
bot.load_extension(extension) | |
except Exception as e: | |
print(f'Failed to load extension {extension}.', file=sys.stderr) | |
traceback.print_exc() | |
@bot.event | |
async def on_ready(): | |
"""http://discordpy.readthedocs.io/en/latest/api.html#discord.on_ready""" | |
print(f'\n\nLogged in as: {bot.user.name} - {bot.user.id}\nVersion: {discord.__version__}\n') | |
# Changes our bots Playing Status. type=1(streaming) for a standard game you could remove type and url. | |
await bot.change_presence(game=discord.Game(name='Cogs Example', type=1, url='https://twitch.tv/kraken')) | |
print(f'Successfully logged in and booted...!') | |
bot.run('TOKEN', bot=True, reconnect=True) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import discord | |
from discord.ext import commands | |
# All cog classes must subclass commands.Cog | |
class MembersCog(commands.Cog): | |
def __init__(self, bot): | |
self.bot = bot | |
@commands.command() | |
@commands.guild_only() | |
async def joined(self, ctx, *, member: discord.Member): | |
"""Says when a member joined.""" | |
await ctx.send(f'{member.display_name} joined on {member.joined_at}') | |
@commands.command(name='coolbot') | |
async def cool_bot(self, ctx): | |
"""Is the bot cool?""" | |
await ctx.send('This bot is cool. :)') | |
@commands.command(name='top_role', aliases=['toprole']) | |
@commands.guild_only() | |
async def show_toprole(self, ctx, *, member: discord.Member=None): | |
"""Simple command which shows the members Top Role.""" | |
if member is None: | |
member = ctx.author | |
await ctx.send(f'The top role for {member.display_name} is {member.top_role.name}') | |
@commands.command(name='perms', aliases=['perms_for', 'permissions']) | |
@commands.guild_only() | |
async def check_permissions(self, ctx, *, member: discord.Member=None): | |
"""A simple command which checks a members Guild Permissions. | |
If member is not provided, the author will be checked.""" | |
if not member: | |
member = ctx.author | |
# Here we check if the value of each permission is True. | |
perms = '\n'.join(perm for perm, value in member.guild_permissions if value) | |
# And to make it look nice, we wrap it in an Embed. | |
embed = discord.Embed(title='Permissions for:', description=ctx.guild.name, colour=member.colour) | |
embed.set_author(icon_url=member.avatar_url, name=str(member)) | |
# \uFEFF is a Zero-Width Space, which basically allows us to have an empty field name. | |
embed.add_field(name='\uFEFF', value=perms) | |
await ctx.send(content=None, embed=embed) | |
# Thanks to Gio for the Command. | |
# The setup fucntion below is neccesarry. Remember we give bot.add_cog() the name of the class in this case MembersCog. | |
# When we load the extension, the setup function is called, which adds the cog, it's listeners, commands, and other special methods. | |
# See the Cog documentation for more details https://discordpy.readthedocs.io/en/latest/ext/commands/cogs.html | |
def setup(bot): | |
bot.add_cog(MembersCog(bot)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from discord.ext import commands | |
# The Cog metaclass allows you to pass two kwargs, name and command_attrs. | |
# Name changes the name of the Cog when shown in help, and command_attrs sets an attribute of every command in the cog. | |
# In this case, we're setting the name to "Owner Commands" and setting each command's hidden attribute to be True. | |
# Hidden prevents it from showing up on the default help. | |
# See https://discordpy.readthedocs.io/en/latest/ext/commands/api.html#discord.ext.commands.CogMeta For more detail | |
command_attrs = {'hidden':True} | |
class OwnerCog(commands.Cog, name='Owner Commands', command_attrs=command_attrs): | |
def __init__(self, bot): | |
self.bot = bot | |
# This is how you would manually set hidden on a per-command basis. | |
# However, we've done that on our cog definition with command_attrs, so this is redundant. | |
@commands.command(name='load', hidden=True) | |
async def load_cog(self, ctx, *, cog: str): | |
"""Command which Loads a Module. | |
Remember to use dot path. e.g: cogs.owner""" | |
try: | |
self.bot.load_extension(cog) | |
except Exception as e: | |
await ctx.send(f'**`ERROR:`** {type(e).__name__} - {e}') | |
else: | |
await ctx.send('**`SUCCESS`**') | |
@commands.command(name='unload') | |
async def unload_cog(self, ctx, *, cog: str): | |
"""Command which Unloads a Module. | |
Remember to use dot path. e.g: cogs.owner""" | |
try: | |
self.bot.unload_extension(cog) | |
except Exception as e: | |
await ctx.send(f'**`ERROR:`** {type(e).__name__} - {e}') | |
else: | |
await ctx.send('**`SUCCESS`**') | |
@commands.command(name='reload') | |
async def reload_cog(self, ctx, *, cog: str): | |
"""Command which Reloads a Module. | |
Remember to use dot path. e.g: cogs.owner""" | |
try: | |
self.bot.unload_extension(cog) | |
self.bot.load_extension(cog) | |
except Exception as e: | |
await ctx.send(f'**`ERROR:`** {type(e).__name__} - {e}') | |
else: | |
await ctx.send('**`SUCCESS`**') | |
# As we want every command defined in our owner cog to be owner-only, we don't have to apply the owner-check to each command | |
# and can instead use the special method, cog_check, which will add a check to each command in the cog. | |
# See https://discordpy.readthedocs.io/en/rewrite/ext/commands/api.html#discord.ext.commands.Cog.cog_check for details | |
async def cog_check(self, ctx): | |
if not await ctx.bot.is_owner(ctx.author): | |
raise commands.NotOwner('You do not own this bot.') | |
return True | |
def setup(bot): | |
bot.add_cog(OwnerCog(bot)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import discord | |
from discord.ext import commands | |
"""A simple cog example with simple commands. Showcased here are some check decorators, and the use of events in cogs. | |
For a list of inbuilt checks: | |
http://dischttp://discordpy.readthedocs.io/en/latest/ext/commands/api.html#checksordpy.readthedocs.io/en/latest/ext/commands/api.html#checks | |
You could also create your own custom checks. Check out: | |
https://github.com/Rapptz/discord.py/blob/master/discord/ext/commands/core.py#L689 | |
For a list of events: | |
http://discordpy.readthedocs.io/en/latest/api.html#event-reference | |
http://discordpy.readthedocs.io/en/latest/ext/commands/api.html#event-reference | |
""" | |
class SimpleCog(commands.Cog): | |
"""SimpleCog""" | |
def __init__(self, bot): | |
self.bot = bot | |
@commands.command(name='repeat', aliases=['copy', 'mimic']) | |
async def do_repeat(self, ctx, *, our_input: str): | |
"""A simple command which repeats our input. | |
In rewrite Context is automatically passed to our commands as the first argument after self.""" | |
await ctx.send(our_input) | |
@commands.command(name='add', aliases=['plus']) | |
@commands.guild_only() | |
async def do_addition(self, ctx, first: int, second: int): | |
"""A simple command which does addition on two integer values.""" | |
total = first + second | |
await ctx.send(f'The sum of **{first}** and **{second}** is **{total}**') | |
@commands.command(name='me') | |
@commands.is_owner() | |
async def only_me(self, ctx): | |
"""A simple command which only responds to the owner of the bot.""" | |
await ctx.send(f'Hello {ctx.author.mention}. This command can only be used by you!!') | |
@commands.command(name='embeds') | |
@commands.guild_only() | |
async def example_embed(self, ctx): | |
"""A simple command which showcases the use of embeds. | |
Have a play around and visit the Visualizer.""" | |
embed = discord.Embed(title='Example Embed', | |
description='Showcasing the use of Embeds...\nSee the visualizer for more info.', | |
colour=0x98FB98) | |
embed.set_author(name='MysterialPy', | |
url='https://gist.github.com/MysterialPy/public', | |
icon_url='http://i.imgur.com/ko5A30P.png') | |
embed.set_image(url='https://cdn.discordapp.com/attachments/84319995256905728/252292324967710721/embed.png') | |
embed.add_field(name='Embed Visualizer', value='[Click Here!](https://leovoel.github.io/embed-visualizer/)') | |
embed.add_field(name='Command Invoker', value=ctx.author.mention) | |
embed.set_footer(text='Made in Python with discord.py@rewrite', icon_url='http://i.imgur.com/5BFecvA.png') | |
await ctx.send(content='**A simple Embed for discord.py@rewrite in cogs.**', embed=embed) | |
# All listeners in cogs must be decorated with @commands.Cog.listener() | |
@commands.Cog.listener() | |
async def on_member_ban(self, guild, user): | |
"""Event Listener which is called when a user is banned from the guild. | |
For this example I will keep things simple and just print some info. | |
Notice how because we are in a cog class we do not need to use @bot.event | |
For more information: | |
http://discordpy.readthedocs.io/en/rewrite/api.html#discord.on_member_ban | |
Check above for a list of events. | |
""" | |
print(f'{user.name}-{user.id} was banned from {guild.name}-{guild.id}') | |
def setup(bot): | |
bot.add_cog(SimpleCog(bot)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In the first file,
await bot.change_presence(game=discord.Game(name='Cogs Example', type=1, url='https://twitch.tv/kraken'))
should instead be
await bot.change_presence(activity=discord.Game(name='Cogs Example', type=1, url='https://twitch.tv/kraken'))