I'm making a discord bot in python using the discord.py library. I need to know, how I can implement a yes/no confirmation after a command. For example, consider a 'ban' command that bans a user from the server, and can only be used by a moderator. After writing "!ban #user", I want the bot to reply "Ban #user?(y/n)" and if that very moderator replies with anything but a "y", the ban gets cancelled. How can I implement this? Something like this:
#client.command()
#commands.is_owner()
async def ban(ctx, member : discord.Member, *, reason = None):
await ctx.send("Ban #member?(y/n)")
if get_confirmation():
await member.ban(reason = reason)
else:
await ctx.send("Ban Cancelled")
#client.command()
#commands.is_owner()
async def ban(ctx, member : discord.Member, reason = None):
await ctx.send(f"Ban {member.mention}?(yes/no)")
#client.command()
#commands.is_owner()
async def yes(ctx, member : discord.member, reson=None):
await member.ban(reason = reason)
#client.command()
#commands.is_owner()
async def no(ctx):
await ctx.send("Ban Cancelled")
You need to use wait_for.
Below is the revised code:
#client.command()
#commands.is_owner()
async def ban(ctx, member : discord.Member, *, reason = None):
await ctx.send(f"Ban {member.mention}?(y/n)")
msg = await bot.wait_for("message", check=lambda m:m.author==ctx.author and m.channel.id==ctx.channel.id)
if msg.content.lower in ("y", "yes"):
await member.ban(reason = reason)
else:
await ctx.send("Ban Cancelled")
Okay after some digging i found this post. I hope it helps anyone with the same issue
Related
none of my commands are working. the only thing functioning is the ping to respond bot event. asides from that nothing else is working. here is the code. please help me. ive import important dependencies and more but could not include it here
#
#bot.event
async def on_ready():
await bot.change_presence(status=discord.Status.online, activity=discord.Game("waiting for a ping"))
print("Bot is ready!")
#
#bot.event
async def on_member_join(member):
channel = bot.get_channel(956655371634753607)
embedVar = discord.Embed(title="Ariza Bot", color= 1974050)
embedVar.add_field(name="Welcome", value=f"{member} Thank you For joining our discord server!\nEnjoy!", inline=False)
await channel.send(embed=embedVar)
role = member.guild.get_role(956583850975297576)
await member.add_roles(role)
#
#bot.command(name='kick')
#commands.has_role("Administrator")
async def kick(self, ctx, member : commands.MemberConverter, *, reason=None):
await member.kick(reason=reason)
await ctx.send(f"{member} has been kicked, reason: {reason}")
#kick.error
async def kick_error(self, ctx, error):
if isinstance(error, MissingPermissions):
await ctx.send("You don't have permission to kick members.")
#
#bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.MissingPermissions):
await ctx.send("You cant do that!")
#
#bot.command(name='clear')
#commands.has_permissions(manage_messages=True)
async def clear(ctx, amount: int):
authors = {}
async for message in ctx.channel.history(limit=amount + 1):
if message.author not in authors:
authors[message.author] = 1
else:
authors[message.author] += 1
await message.delete()
#
#bot.command(name='warn')
#commands.has_role('Admin')
async def warn(ctx,member: discord.Member,reason: str):
channel = await member.create_dm()
embedVar = discord.Embed(title="Ariza Bot", color= 1974050)
embedVar.add_field(name="Warning", value=f"Warned: You Were Warned by {ctx.author}\nTo: {member}\n Reason: {reason}\nSuggestion: Please Don't Do this Again.", inline=False)
await channel.send(embed=embedVar)
await ctx.channel.send(embed=embedVar)
I will only talk about the kick command for the answer now. But the logic applies to the other commands as well.
Try removing the if statements in the error handlers. Do this:
#kick.error
async def kick_error(ctx, error):
await ctx.send(error)
A response is only sent if commands.MissingPermissions is raised. If some other error is raised, nothing happens. So removing the if conditions will help you know what error is happening in the command. I think it is a TypeError since member is of type discord.Member and not of commands.MemberConverter. Also mention reason is of type str, since it is declared as None which can raise TypeError.
You need add this before your commands or else it wont read them
await bot.process_commands(message)
currently i am using
vouch_channel = client.get_channel(828696942250295316)
#client.command()
async def vouch(message):
async def vouch(ctx,member : discord.Member):
if ctx.author == member:
await ctx.send("You can't vouch yourself")
if message.channel.id == vouch_channel.id:
auth = ctx.author and ctx.author.mention and ctx.author.id
await open_vouches(ctx.author)
await open_vouches(member)
await update_vouches(member,+1,'vouches_gotten')
await update_vouches(ctx.author,+1,'vouches_given')
await ctx.reply(f'<:icon_checkmark:827639277285408829> {ctx.author.mention} You vouched for {member}!')
print('[LOGS] bot was used for vouch')
else:
#command attempted in non command channel - redirect user
await message.channel.send('Write this command in {}'.format(vouch_channel.mention))
to try and do this and i have tried changing the things around but it didnt work.
could i please have some help as i really dont know what to do
i also triad doing
#client.command()
async def vouch(message,ctx,member : discord.member):
instead of doing what i did there and i also tried
#client.command()
async def vouch(message)(ctx,member : discord.member):
but that didn't work either.
please help me
At first glance, it seems that your parameter order is off in your functions. If you're not using a cog, ctx should be the first parameter to be passed.
You might also have issues with multi-word messages, so you can use the * argument to say "Everything after the second argument passed is part of message".
Try out the below code. You'd be able to use the command as follows: !vouch #Kelo This is my message
#client.command()
async def vouch(ctx, member : discord.Member, *, message):
if ctx.author == member:
await ctx.send("You can't vouch yourself")
return
elif ctx.channel.id != 828696942250295316:
await ctx.send("You can't vouch in this channel")
return
#Rest of your code
I want to to make some code that will mention the name of the user that sends the message, this is what I have tried:
Im new to making discord bots, and python so any help would be perfect
#client.command()
async def hello(ctx, member):
await ctx.send(f"hello, {member}")
You can do this with user.name
#client.command()
async def hello(ctx):
await ctx.send(f"hello, {ctx.author.name}")
The above can be called by {prefix}hello, if you want to say "hello, {name}" even when user just send "hello" (without prefix), then use on_message event.
#client.event
async def on_message(message):
if message.author.bot: return
if message.content.lower() == "hello":
await message.channel.send(f"Hello, {message.author.name}")
await client.process_commands(message)
Docs: on_message, user.name
Assuming you want to mention the user who used the command. the ctx argument has a lot of attributes one of them is the author
#client.command()
async def hello(ctx, member):
await ctx.send(f"hello, {ctx.author.mention}")
If you want the user to say hello to another user, he can mention or just type the name.
#client.command()
async def hello(ctx, *, user: discord.Member = None):
if user:
await ctx.send(f"hello, {user.mention}")
else:
await ctx.send('You have to say who do you want to say hello to')
All of the above providing you are using discord.ext.commands
This should work:
str(ctx.message.author)
Or:
str(ctx.author)
I'm pretty new to discord bots so i wondered if someone here could help me, I wrote a code for kicking and i want to add something that DM's the person before he gets kicked but after the !kick command was given.
#bot.command()
async def kick(ctx, member: discord.Member=None):
if not member:
await ctx.send('Please mention a member')
return
await member.kick()
await ctx.send(f'{member.display_name}\'s was kicked from the server')
You just need to create a dm channel and send the message.
Try adding the two lines below:
#bot.command()
async def kick(ctx, member: discord.Member = None):
if member is None:
await ctx.send(f'{ctx.author.mention} Please mention a member')
return
channel = await member.create_dm() # line 1 create channel
await channel.send('You are getting kicked') # line 2 send the message
await member.kick()
await ctx.send(f'{member.display_name}\'s was kicked from the server')
if message.content.upper().startswith('!BAN'):
if "449706643710541824" in [role.id for role in message.author.roles]:
await
I have the base setup so only admins can ban. I want to make the ban command, but I'm not sure how to do it.
Try this:
import discord #Imports the discord module.
from discord.ext import commands #Imports discord extensions.
#The below code verifies the "client".
client = commands.Bot(command_prefix='pb?')
#The below code stores the token.
token = "Your token"
'''
The below code displays if you have any errors publicly. This is useful if you don't want to display them in your output shell.
'''
#client.event
async def on_command_error(ctx, error):
if isinstance(error, commands.MissingRequiredArgument):
await ctx.send('Please pass in all requirements :rolling_eyes:.')
if isinstance(error, commands.MissingPermissions):
await ctx.send("You dont have all the requirements :angry:")
#The below code bans player.
#client.command()
#commands.has_permissions(ban_members = True)
async def ban(ctx, member : discord.Member, *, reason = None):
await member.ban(reason = reason)
#The below code unbans player.
#client.command()
#commands.has_permissions(administrator = True)
async def unban(ctx, *, member):
banned_users = await ctx.guild.bans()
member_name, member_discriminator = member.split("#")
for ban_entry in banned_users:
user = ban_entry.user
if (user.name, user.discriminator) == (member_name, member_discriminator):
await ctx.guild.unban(user)
await ctx.send(f'Unbanned {user.mention}')
return
#The below code runs the bot.
client.run(token)
I hope this helps, good luck on your bot!
My ban command i got for my bot is , obviously dont keep the comment out for the ban part, I just put that there when i didn't know how to lock it to roles
#bans a user with a reason
#client.command()
#commands.has_any_role("Keyblade Master","Foretellers")
async def ban (ctx, member:discord.User=None, reason =None):
if member == None or member == ctx.message.author:
await ctx.channel.send("You cannot ban yourself")
return
if reason == None:
reason = "For being a jerk!"
message = f"You have been banned from {ctx.guild.name} for {reason}"
await member.send(message)
# await ctx.guild.ban(member, reason=reason)
await ctx.channel.send(f"{member} is banned!")
This is the best one
async def ban(ctx, member : discord.Member, reason=None):
"""Bans a user"""
if reason == None:
await ctx.send(f"Woah {ctx.author.mention}, Make sure you provide a reason!")
else:
messageok = f"You have been banned from {ctx.guild.name} for {reason}"
await member.send(messageok)
await member.ban(reason=reason)
I'd recommend to use discord.ext.commands to make commands, it's easier to use. The function to ban is discord.Client.ban(member, delete_message_days = 1). This is an example using discord.ext.commands:
bot = commands.Bot(command_prefix = "!")
#bot.command(pass_context = True)
async def ban(member: discord.Member, days: int = 1):
if "449706643710541824" in [role.id for role in message.author.roles]:
await bot.ban(member, days)
else:
await bot.say("You don't have permission to use this command.")
bot.run("<TOKEN>")
A ban command? It's actually very easy!
#commands.has_permissions(ban_members=True)
#bot.command()
async def ban(ctx, user: discord.Member, *, reason="No reason provided"):
await user.ban(reason=reason)
ban = discord.Embed(title=f":boom: Banned {user.name}!", description=f"Reason: {reason}\nBy: {ctx.author.mention}")
await ctx.message.delete()
await ctx.channel.send(embed=ban)
await user.send(embed=ban)
if you know kick you just need to change the user.kick into a user.ban because user.kick will kick a member so that means user.ban will ban a member.
According to Discord Official Documentation:-
#bot.command(name="ban", help="command to ban user")
#commands.has_permissions(ban_members=True)
async def _ban(ctx, member: discord.Member, *, reason=None):
""" command to ban user. Check !help ban """
try:
await member.ban(reason=reason)
await ctx.message.delete()
await ctx.channel.send(f'{member.name} has been banned from server'
f'Reason: {reason}')
except Exception:
await ctx.channel.send(f"Bot doesn't have enough permission to ban someone. Upgrade the Permissions")
#bot.command(name="unban", help="command to unban user")
#commands.has_permissions(administrator=True)
async def _unban(ctx, *, member_id: int):
""" command to unban user. check !help unban """
await ctx.guild.unban(discord.Object(id=member_id))
await ctx.send(f"Unban {member_id}")
#bot.command()
#commands.has_permissions(ban_members = True)
async def ban(ctx, member : discord.Member, *,reason=None):
if member == None or member == ctx.message.author:
await ctx.channel.send("You cannot ban yourself")
return
if reason == None:
reason = "For being a jerk!"
message = f"You have been banned from {ctx.guild.name} for {reason}"
await member.send(message)
await member.ban(reason=reason)
await ctx.send(f"{member} is banned!")
This is a ban command I use and it works perfectly fine for me. You have full permission to use the whole thing if you'd like.
async def ban(self, ctx, member:discord.Member, *, reason=None):
guild = ctx.guild
author = ctx.message.author
if author.guild_permissions.administrator == False:
embed4=discord.Embed(color=discord.Colour.red(), timestamp=datetime.datetime.utcnow(), title="Missing Permissions!", description="You don't have the required permissions to use this command!")
message1 = await ctx.send(embed=embed4)
sleeper=5
await asyncio.sleep(sleeper)
await message1.delete()
return
if member.guild_permissions.administrator and member != None:
embed=discord.Embed(color=discord.Colour.red(), title="Administrator", description="This user is an administrator and is not allowed to be banned.")
message2 = await ctx.send(embed=embed)
sleeper=5
await asyncio.sleep(sleeper)
await message2.delete()
return
if reason == None:
embed1=discord.Embed(color=discord.Colour.red(), title="Reason Required!", description="You must enter a reason to ban this member.")
message3 = ctx.send(embed=embed1)
sleeper=5
await asyncio.sleep(sleeper)
await message3.delete()
return
else:
guild = ctx.guild
await member.ban()
embed2=discord.Embed(color=discord.Colour.green(), timestamp=datetime.datetime.utcnow(), title="Member Banned", description=f"Banned: {member.mention}\n Moderator: **{author}** \n Reason: **{reason}**")
embed3=discord.Embed(color=discord.Colour.green(), timestamp=datetime.datetime.utcnow(), title=f"You've been banned from **{guild}**!", description=f"Target: {member.mention}\nModerator: **{author.mention}** \n Reason: **{reason}**")
message4 = await ctx.send(embed=embed2)
message5 = await ctx.send("✔ User has been notified.")
sleeper=5
await asyncio.sleep(sleeper)
await message4.delete()
await message5.delete()
await member.send(embed=embed3)