mirror of
				https://github.com/Rapptz/discord.py.git
				synced 2025-11-04 07:22:50 +00:00 
			
		
		
		
	Add "Secret" channel/emoji example
This commit is contained in:
		
							
								
								
									
										96
									
								
								examples/secret.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								examples/secret.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
				
			|||||||
 | 
					import typing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import discord
 | 
				
			||||||
 | 
					from discord.ext import commands
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bot = commands.Bot(command_prefix=commands.when_mentioned, description="Nothing to see here!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# the `hidden` keyword argument hides it from the help command. 
 | 
				
			||||||
 | 
					@bot.group(hidden=True)
 | 
				
			||||||
 | 
					async def secret(ctx: commands.Context):
 | 
				
			||||||
 | 
					    """What is this "secret" you speak of?"""
 | 
				
			||||||
 | 
					    if ctx.invoked_subcommand is None:
 | 
				
			||||||
 | 
					        await ctx.send('Shh!', delete_after=5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def create_overwrites(ctx, *objects):
 | 
				
			||||||
 | 
					    """This is just a helper function that creates the overwrites for the 
 | 
				
			||||||
 | 
					    voice/text channels.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    A `discord.PermissionOverwrite` allows you to determine the permissions
 | 
				
			||||||
 | 
					    of an object, whether it be a `discord.Role` or a `discord.Member`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    In this case, the `view_channel` permission is being used to hide the channel
 | 
				
			||||||
 | 
					    from being viewed by whoever does not meet the criteria, thus creating a
 | 
				
			||||||
 | 
					    secret channel.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # a dict comprehension is being utilised here to set the same permission overwrites
 | 
				
			||||||
 | 
					    # for each `discord.Role` or `discord.Member`.
 | 
				
			||||||
 | 
					    overwrites = {
 | 
				
			||||||
 | 
					        obj: discord.PermissionOverwrite(view_channel=True)
 | 
				
			||||||
 | 
					        for obj in objects
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # prevents the default role (@everyone) from viewing the channel
 | 
				
			||||||
 | 
					    # if it isn't already allowed to view the channel.
 | 
				
			||||||
 | 
					    overwrites.setdefault(ctx.guild.default_role, discord.PermissionOverwrite(view_channel=False))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # makes sure the client is always allowed to view the channel.
 | 
				
			||||||
 | 
					    overwrites[ctx.guild.me] = discord.PermissionOverwrite(view_channel=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return overwrites
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# since these commands rely on guild related features,
 | 
				
			||||||
 | 
					# it is best to lock it to be guild-only.
 | 
				
			||||||
 | 
					@secret.command()
 | 
				
			||||||
 | 
					@commands.guild_only()
 | 
				
			||||||
 | 
					async def text(ctx: commands.Context, name: str, *objects: typing.Union[discord.Role, discord.Member]):
 | 
				
			||||||
 | 
					    """This makes a text channel with a specified name 
 | 
				
			||||||
 | 
					    that is only visible to roles or members that are specified.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    overwrites = create_overwrites(ctx, *objects)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await ctx.guild.create_text_channel(
 | 
				
			||||||
 | 
					        name,
 | 
				
			||||||
 | 
					        overwrites=overwrites,
 | 
				
			||||||
 | 
					        topic='Top secret text channel. Any leakage of this channel may result in serious trouble.',
 | 
				
			||||||
 | 
					        reason='Very secret business.',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@secret.command()
 | 
				
			||||||
 | 
					@commands.guild_only()
 | 
				
			||||||
 | 
					async def voice(ctx: commands.Context, name: str, *objects: typing.Union[discord.Role, discord.Member]):
 | 
				
			||||||
 | 
					    """This does the same thing as the `text` subcommand
 | 
				
			||||||
 | 
					    but instead creates a voice channel.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    overwrites = create_overwrites(ctx, *objects)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await ctx.guild.create_voice_channel(
 | 
				
			||||||
 | 
					        name,
 | 
				
			||||||
 | 
					        overwrites=overwrites,
 | 
				
			||||||
 | 
					        reason='Very secret business.'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@secret.command()
 | 
				
			||||||
 | 
					@commands.guild_only()
 | 
				
			||||||
 | 
					async def emoji(ctx: commands.Context, emoji: discord.PartialEmoji, *roles: discord.Role):
 | 
				
			||||||
 | 
					    """This clones a specified emoji that only specified roles
 | 
				
			||||||
 | 
					    are allowed to use.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # fetch the emoji asset and read it as bytes.
 | 
				
			||||||
 | 
					    emoji_bytes = await emoji.url.read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # the key parameter here is `roles`, which controls
 | 
				
			||||||
 | 
					    # what roles are able to use the emoji.
 | 
				
			||||||
 | 
					    await ctx.guild.create_custom_emoji(
 | 
				
			||||||
 | 
					        name=emoji.name,
 | 
				
			||||||
 | 
					        image=emoji_bytes,
 | 
				
			||||||
 | 
					        roles=roles,
 | 
				
			||||||
 | 
					        reason='Very secret business.'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bot.run('token')
 | 
				
			||||||
		Reference in New Issue
	
	Block a user