When I try to run my cog it gives an error "No value for argument 'arg' in function call'. Can someone help please?
from discord.ext import commands
from discord.ext.commands import Bot
import asyncio
import os
import datetime
import random
import wikipedia
class wiki(commands.Cog):
def __init__(self, bot):
self.bot = bot
#commands.Cog.listener()
async def on_ready(self):
print("Wikipedia Cog has been loaded\n-----")
#commands.command()
async def wiki(self,ctx,word):
def viki_sum(self,arg):
definition = wikipedia.summary(arg,sentences=3,chars=1000)
return definition
embed = discord.Embed(title="***Wiki'de Bulduklarım:***",description=viki_sum(word))
await ctx.send(embed=embed)
def setup(bot):
bot.add_cog(wiki(bot))```
Hello and welcome to Stack Overflow!
It seems that the error you are getting comes from this section of the code:
#commands.command()
async def wiki(self, ctx, word):
def viki_sum(self, arg):
definition = wikipedia.summary(arg, sentences=3, chars=1000)
return definition
The viki_sum function is a nested function. Even though its enclosing function is a class method and requires using self as the first argument, any nested functions do not require that argument.
So, to overcome the error, you need to remove the self argument from the viki_sum function.
Best of luck!
Related
import discord.ext
import discord
from discord.ext import commands
from discord.ext import tasks
from keep_alive import keep_alive
import os
import schedule
client = discord.Client()
client = commands.Bot(command_prefix="")
channel_id = 927272717227528262
channel = client.get_channel(channel_id)
#tasks.loop(seconds=1.0)
#client.event
async def on_message(message):
if message.author == client.user:
return
def job2():
await message.channel.send("message")
schedule.every(10).seconds.do(job2)
while True:
schedule.run_pending()
time.sleep(0)
keep_alive()
client.run(os.getenv('TOKEN'))
Every time I run it I get :
SyntaxError: 'await' outside async function
I am also having the issue where message is undefined the definition of job2 even though it was just defined in the line above.
You should probably be using discord.ext.tasks. Async functions aren't really supported by schedule.
In fact, your bot can never run because your schedule.run_pending() in the infinite loop will never end.
In order to keep your message there you'll need to put it in a global of some type.
the_message = None
#tasks.loop(seconds=1.0)
#client.event
async def on_message(message):
global the_message
if message.author == client.user:
return
the_message = message
async def job2():
if the_message is None:
return
await the_message.channel.send("message")
#tasks.loop(seconds=10.0) # you can do other things like `minutes=5` or `hours=1.75`
async def my_task():
await client.wait_until_ready()
await job2()
my_task.start()
# then the bot runs fine after
keep_alive()
client.run(os.getenv('TOKEN'))
Be careful that this might run before your client is not ready and initializing. You may also want to check wait_until_ready if you're going to do anything with the API, like in your case. You can also find other examples here.
await is used in asynchronous functions to wait for the function to do its thing. However, you have used it in a synchronous function (def job2)
message is not a variable. message is the parameter of the on_message function. A parameter can only be used in the function it is provided to.
Hope this answered your question.
So, I'm new to python and even more to coding bots on discord. At the moment I'm using discord.py and red-bot (https://docs.discord.red/en/stable/index.html).
At the moment I'm trying to make the bot listen to a new message and print something in response to it, but I just can't figure it out. Since I'm using red-bot I didn't go through the steps of using client = discord.Client() and setting a token on the code itself so using #client.event() doesn't seem to work, nor #bot.event(), and I can't really find any other way to make the bot listen for an on_message() event.
Edit with part of my code:
import discord
from discord.ext import commands
from redbot.core import commands
class MyCog(commands.Cog):
client = discord.Client()
def __init__(self, bot):
self.bot = bot
#bot.event()
async def on_message(self, message):
if 'test' in message.content:
await self.send_message(message.channel, 'it works!')
Console returns that bot in #bot.event() is not defined.
Also a separate initialization file, it's done this way to follow Red's guide of how to make a cog.
from .remind import MyCog
def setup(bot):
bot.add_cog(MyCog(bot))
Here is an example of a cog that replies to a specific word mentioned. It also has a cooldown to prevent the bot spamming which I find absolutely neccesary to include.
from curses.panel import bottom_panel
import discord
from discord.ext import commands
class brilliant(commands.Cog):
def __init__(self, bot):
self.bot = bot
self._cd = commands.CooldownMapping.from_cooldown(1, 60.0, commands.BucketType.member) # Change accordingly
# rate, per, BucketType
def ratelimit_check(self, message):
"""Returns the ratelimit left"""
bucket = self._cd.get_bucket(message)
return bucket.update_rate_limit()
#commands.Cog.listener()
async def on_message(self, message):
if message.author == self.bot.user:
return
msg = message.content.lower()
brilliant = ['brilliant', 'Brilliant', 'brilliant!', 'Brilliant!']
if any(word in msg for word in brilliant):
retry_after = self.ratelimit_check(message)
if retry_after is None:
await message.channel.send("Brilliant!")
await self.bot.process_commands(message)
else:
return
async def setup(bot):
await bot.add_cog(brilliant(bot))
If you want it in the main file, you can put something a lot simpler:
brilliant = ['brilliant', 'Brilliant', 'brilliant!', 'Brilliant!']
#bot.event
async def on_message(message):
if message.author == bot.user:
return
msg = message.content.lower()
if any(word in msg for word in brilliant):
await message.channel.send("Brilliant!")
await bot.process_commands(message)
Hope it helps.
I am trying to get export my troll commands in a discord bot i run to a new file, using cogs and extensions. However, the commands do not register, and I'm not sure why. I'll send the code here. (just ignore the weird function launch, it makes more sense when you look at the bot entirely but its spread thought 2k lines. )
#bot.py
import os
import sys
import time
import datetime
import discord
from discord.ext.commands import Bot
from discord import Intents
import assets
import role_counter
from discord.ext import commands
import discord.ext.commands
from dotenv import load_dotenv
import git_push
import merit_config
import trolls
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
TOKEN_TEST = os.getenv('DISCORD_TOKEN_TEST')
GUILD = os.getenv('DISCORD_GUILD')
cogs = ['cogs.trolls']
def startup(START):
global LAUNCH
global bot
if START == TOKEN:
intents = Intents.all()
bot = commands.Bot(intents=intents, command_prefix='.')
bot.remove_command('help')
LAUNCH = TOKEN
startup(TOKEN)
initial_extensions = ['cogs.trolls']
if __name__ == '__main__':
for extension in initial_extensions:
bot.load_extension(extension)
def main():
while True:
bot.run(LAUNCH)
#trolls.py
import assets
from discord.ext import commands
class troll_commands(commands.Cog):
def __init__(self, bot):
self.bot = bot
#commands.command()
async def troll(self, ctx):
if ctx.channel.id == '936902313589764146' or '939028644175699968':
await ctx.send(f"```{assets.troll_command()}```")
await self.bot.process_commands()
def setup(bot):
bot.add_cog(troll_commands(bot))
I've mirrored every example i can find, it just isn't working and idk why. If I'm missing some code to reporodce please just tell me, ill edit this post.
It depends on the version you're currently using but as you're having issues, you need to clarify what sort of error you're getting.
If you're using V2 then you do need to use async for the majority of your code now, here's a migration guide if you would like to take a look: https://discordpy.readthedocs.io/en/stable/migrating.html.
The main areas that you need to fix are:
if __name__ == '__main__':
for extension in initial_extensions:
bot.load_extension(extension) # you need to await this
def main(): # you aren't ever calling main
while True:
bot.run(LAUNCH)
and
def setup(bot): # needs to be async
bot.add_cog(troll_commands(bot)) # needs to be awaited
There are some other things you should reconsider like global vars but this should work for now.
You have to use async and await to be able to add a cog.
You have to async and await the extension loading and running the bot
await bot.load_extension(extension)
async def setup(bot):
await bot.add_cog(Command(bot))
Basically, everything appears to work fine and start up, but for some reason I can't call any of the commands. I've been looking around for easily an hour now and looking at examples/watching videos and I can't for the life of me figure out what is wrong. Code below:
import discord
import asyncio
from discord.ext import commands
bot = commands.Bot(command_prefix = '-')
#bot.event
async def on_ready():
print('Logged in as')
print(bot.user.name)
print(bot.user.id)
print('------')
#bot.event
async def on_message(message):
if message.content.startswith('-debug'):
await message.channel.send('d')
#bot.command(pass_context=True)
async def ping(ctx):
await ctx.channel.send('Pong!')
#bot.command(pass_context=True)
async def add(ctx, *, arg):
await ctx.send(arg)
The debug output I have in on_message actually does work and responds, and the whole bot runs wihout any exceptions, but it just won't call the commands.
From the documentation:
Overriding the default provided on_message forbids any extra commands from running. To fix this, add a bot.process_commands(message) line at the end of your on_message. For example:
#bot.event
async def on_message(message):
# do some extra stuff here
await bot.process_commands(message)
The default on_message contains a call to this coroutine, but when you override it with your own on_message, you need to call it yourself.
Ascertained that the problem stems from your definition of on_message, you could actually just implement debug as a command, since it appears to have the same prefix as your bot:
#bot.command()
async def debug(ctx):
await ctx.send("d")
I have a webhook cog for a discord bot I'm making. I want to make the embarrass command (in the webhook cog) trigger a webhook to be created with a user's name and pfp, which is working just fine. however, I also want this command to be able to be set onto a specific user, and that is where the problem arises. When I try to add a member parameter into the embarrass function, so it looks like: async def embarrass(self, ctx, member: discord.Member
it doesn't work. every time I execute the command after that I get a "command embarrass not found" error. this holds true regardless of if I pass through the paramter, and if I add member: discord.Member = None to it to make it not required; nothing I've done works. I would greatly appreciate any help on this topic.
Here is my main.py:
import random
import asyncio
import aiohttp
import json
import keep_alive
from discord import Game
from discord.ext.commands import Bot
import datetime
import re
import time
from subprocess import call
import discord
from discord.ext import commands
from discord.utils import get
import text
import os
TOKEN = os.environ['token']
bot = commands.Bot(command_prefix=".")
startup_extensions = ["Cog.Cog_Template", "Cog.webhooks"]
#bot.event
async def on_ready():
# On read, after startup
print(f"Connecting...\nConnected {bot.user}\n") # Send message on connected
if __name__ == "__main__": # When script is loaded, this will run
for extension in startup_extensions:
try:
bot.load_extension(extension) # Loads cogs successfully
except Exception as e:
exc = '{}: {}'.format(type(e).__name__, e)
print('Failed to load extension {}\n{}'.format(extension, exc))
keep_alive.keep_alive()
bot.run(TOKEN)
And here is my cog file (its called webhook.py and its in a folder called Cog:
from discord import Webhook, RequestsWebhookAdapter
from discord.ext import commands
import random
embarrasslist = ["I use and throughly like airpods","I respond with \"^\" to everything because I'm too dumb to have an original thought of my own","The only time I ever go outside is for school","I made a discord server where exactly 3 people joined, and they were were my alt accounts.","I get legitimately scared when I play five nights at freddy's","I play PC Games with a steam controller","I unironically use 69 in my usernames","I cried myself to sleep when I found out that my favourite chair had a dent in it","My parent's gave me a PS Move instead of a Wii for christmas","I unironically watch Ali-A","I spam .embarrass because I am very narcissistic and want to see my face on a bot", "I couldn't teach my son how to ride a bike cause I can't ride one myself","I own a sonic pillow and I kiss it every night before I go to sleep","I set my favorite 3ds game to system settings because I thought I was being clever","I set my favorite 3ds game to system settings because I can't buy any more games","Paul Blart: Maul Cop is my favorite movie","I thought shrek 3 wasn't bad","I have a gameinformer subscription","It took me a full day to beat the first level of super mario bros","My favorite emote is :joy:","I spent 2 hours learning how to make a new folder on my computer","I torrented fortnite"]
class WebHooks(commands.Cog, name="WebHooks"):
global embarrasslist
def __init__(self, bot):
self.bot = bot
#commands.command(name="embarrass")
async def embarrass(self, ctx, member: discord.Member = None):
"""Send a message as a webhook"""
if member != None:
user = member
elif member = None:
user = ctx.message.author
embarrassnumber = random.randint(0,21)
embarrassment = embarrasslist[embarrassnumber]
looking_webhooks = await ctx.channel.webhooks()
if looking_webhooks:
for webhook in looking_webhooks:
if webhook.name == "NexInfinite-GitHub":
await send_webhook(webhook, embarrassment, ctx, user)
return
else:
pass
webhook = await ctx.channel.create_webhook(name="NexInfinite-GitHub")
await send_webhook(webhook, embarrassment, ctx, user)
return
#commands.command(name="embaras", aliases = ["embarras","embarass"])
async def embarras(self, ctx):
"""Send a message as a webhook"""
cantspell = "I don't know how to spell *embarrass* properly"
looking_webhooks = await ctx.channel.webhooks()
if looking_webhooks:
for webhook in looking_webhooks:
if webhook.name == "NexInfinite-GitHub":
await send_webhook(webhook, cantspell, ctx)
return
else:
pass
webhook = await ctx.channel.create_webhook(name="NexInfinite-GitHub")
await send_webhook(webhook, cantspell, ctx)
return
def setup(bot):
bot.add_cog(WebHooks(bot))
async def send_webhook(webhook, message, ctx, uservar):
webhook_id = webhook.id
webhook_token = webhook.token
webhook = Webhook.partial(int(webhook_id),
f"{webhook_token}",
adapter=RequestsWebhookAdapter())
webhook.send(f'{message}', username=f"{ctx.uservar.display_name}",
avatar_url=ctx.uservar.avatar_url) # Sends the message as the author
I am running this on repl.it so thats why I import keep_alive, and I have another cog that I added with other commands but that doesn’t seem to be the issue either. I can add it if you request it however.
Thanks for the help!
I forgot to import discord at the top, so I couldn't successfully use discord.Member. Importing discord solved this issue.