'AttributeError: 'tuple' object has no attribute 'add_cog'
I'm trying to make a discord music bot, but I'm getting this error:
Traceback (most recent call last):
File "main.py", line 11, in <module>
cogs[i].setup(client)
File "/home/runner/MOMOSNACK-BOT/music.py", line 48, in setup
client.add_cog(music(client))
AttributeError: 'tuple' object has no attribute 'add_cog'`
I am following this tutorial: https://www.youtube.com/watch?v=jHZlvRr9KxM&ab_channel=MaxA
I have tried replacing client.add_cog(music(client)) with:
client.add.cog(music(client))
bot.add_cog(music(client))
bot.add_cog(music(bot))
Along with all the variations of capitalization, but none of these seemed to have fixed my problem. Thanks in advance for any help!
This is my music.py:
import discord
from discord.ext import commands
import youtube_dl
class music(commands.Cog):
def __init__(self, client):
self.client = client
@commands.command()
async def join(self,ctx):
if ctx.author.voice is None:
await ctx.send("PLEASE JOIN A VC FIRST")
voice_channel = ctx.author.voice.channel
if ctx.voice_channel is None:
await voice_channel.connect()
else:
await ctx.voice_client.move_to(voice_channel)
@commands.command()
async def disconnect(self,ctx):
await ctx.voice_client.disconnect()
@commands.command()
async def play(self,ctx,url):
ctx.voice_client.stop()
FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
YDL_OPTIONS = {'format':"bestaudio"}
vc = ctx.voice_client
with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
info = ydl.extract_info(url, download=False)
url2 = info['formats'][0]['url']
source = await discord.FFmpegOpusAudio.from_probe(url2, **FFMPEG_OPTIONS)
vc.play(source)
@commands.command()
async def pause(self,ctx):
await ctx.voice_client.pause()
await ctx.send("PAUSED")
@commands.command()
async def resume(self,ctx):
await ctx.voice_client.resume()
await ctx.send("RESUMED")
def setup(client):
client.add_cog(music(client))
This is my main.py minus the bot's token. The bot also does some other things in the main.py but I don't think that was what messed it up:
import discord
from discord.ext import commands
import os
import music
cogs = [music]
client = discord.Client(), commands.Bot(command_prefix='please ', intents = discord.Intents.all())
for i in range(len(cogs)):
cogs[i].setup(client)
thankWords = ["Thank You", "Thank you", "thank you", "THANK YOU", "Thanks", "thanks", "THANKS", "Thx", "thx", "THX", "Tysm", "tysm", "TYSM"]
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
msg = message.content
if any(word in msg for word in thankWords):
user = discord.utils.get(message.mentions)
await message.channel.send(user.mention + ' has received a **momosnack**!')
client.run('[BOT TOKEN]')
Solution 1:[1]
Explanation
In python, when you assign two comma-separated values to a variable, the variable will hold a tuple with those two values.
In your case, you are setting client to a tuple of discord.Client and commands.Bot. Judging by the fact that you are using commands, I would assume you would want to use only commands.Bot.
Code
Replace
client = discord.Client(), commands.Bot(command_prefix='please ', intents = discord.Intents.all())
with
client = commands.Bot(command_prefix='please ', intents = discord.Intents.all())
Reference
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | TheFungusAmongUs |
