AttributeError: 'Message' object has no attribute 'send' when trying to send embeds using discord.py - discord

Trying to use discord.py and learning the beginnings of bot developement, but when I try to send an embed, it gives me the error.
I tried:
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
#client.event
async def on_ready():
print(f'Logged in as {client.user}')
#client.event
async def on_message(message):
if message.content.startswith('!test'):
embed=discord.Embed(title="title", color=0x13fa07)
embed.add_field(name="name1", value="value1", inline=True)
embed.add_field(name="name2", value="value2", inline=True)
embed.set_footer(text="bot test 0.1")
await message.send(embed=embed)
client.run('token here')
(token ofc censored)
but then it returns
AttributeError: 'Message' object has no attribute 'send'

Welcome to discord.py, just as the error says 'Message' object has no attribute 'send' but it does have the attribute channel which has the method send that you are looking for docs
...
await message.channel.send(embed=embed)

Related

Is Discord User Id too big to send dm too?

I'm making a slash command that can send dms to a specific user id that's been determined by a command argument. It works for specific user ids, but not all of them, including mine my alt account. Is it some permission thing or is the user id out of range?
My code
import discord
from discord.ext import commands
import os
from dotenv import load_dotenv
# importing environmental vars
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
GUILD = os.getenv("DISCORD_GUILD")
APP_ID = os.getenv("APP_ID")
PUB_KEY = os.getenv("PUBLIC_KEY")
GUILD_ID = os.getenv("GUILD_ID")
GENERAL_CHAN_ID = os.getenv("CHANNEL_GENERAL_ID")
#finished importing .env vars
intents = discord.Intents.all()
activity = discord.Activity(name="being awesome losers", type = discord.ActivityType.streaming)
bot = discord.Bot(intents=intents, activity=activity)
#bot.event
async def on_ready():
print(f"We have logged in as {bot.user}")
#bot.slash_command(description="sends message to someone still testing",guild_ids=[GUILD_ID])
async def send_message(ctx, user_id: str, message: str):
user = bot.get_user(int(user_id))
await user.send(message)
await ctx.respond("Message sent successfully!", ephemeral = True)
#bot.event
async def on_message(message):
channel = bot.get_channel(956302622170701946)
if message.content.startswith("help"):
await message.author.send('👋')
bot.run(TOKEN)
When I input an ID that doesn't work it gives me this traceback
AttributeError: 'NoneType' object has no attribute 'send'
Traceback (most recent call last):
File "C:\Users\Rayan\source\repos\DBot\DiscordBot\lib\site-packages\discord\commands\core.py", line 124, in wrapped
ret = await coro(arg)
File "C:\Users\Rayan\source\repos\DBot\DiscordBot\lib\site-packages\discord\commands\core.py", line 980, in _invoke
await self.callback(ctx, **kwargs)
File "c:\Users\Rayan\source\repos\DBot\main.py", line 56, in send_message
await user.send(message)
AttributeError: 'NoneType' object has no attribute 'send'
Help is greatly appreciated! Thank you!
I do not think the issue is that the ID is out of range. It's simply that the user is not in the cache.
import discord
from discord.ext import commands
import os
from dotenv import load_dotenv
# importing environmental vars
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
GUILD = os.getenv("DISCORD_GUILD")
APP_ID = os.getenv("APP_ID")
PUB_KEY = os.getenv("PUBLIC_KEY")
GUILD_ID = os.getenv("GUILD_ID")
GENERAL_CHAN_ID = os.getenv("CHANNEL_GENERAL_ID")
#finished importing .env vars
intents = discord.Intents.all()
activity = discord.Activity(name="being awesome losers", type = discord.ActivityType.streaming)
bot = discord.Bot(intents=intents, activity=activity)
#bot.event
async def on_ready():
print(f"We have logged in as {bot.user}")
#bot.slash_command(description="sends message to someone still testing",guild_ids=[GUILD_ID])
async def send_message(ctx, user_id: str, message: str):
user = await bot.fetch_user(int(user_id))
await user.send(message)
await ctx.respond("Message sent successfully!", ephemeral = True)
#bot.event
async def on_message(message):
channel = bot.get_channel(956302622170701946)
if message.content.startswith("help"):
await message.author.send('👋')
bot.run(TOKEN)
This will always fetch the user and therefore will be able to DM everyone, even not in the cache.

Error with discord bot 1.7.3 giving very long error

I was trying to make a discord chat bot but I got this error I am not sure what to do by the way I am using discord 1.7.3 here is the code by the way the DISCORD KEY and OPENAI-KEY are not the problem those are to hide my openai key and discord bot key:
import discord
import asyncio
import openai
import os
openai.api_key = os.environ.get('OPENAI-KEY')
client = discord.Client()
#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
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
elif message.content.startswith('$chat'):
response = openai.Completion.create(
engine="davinci",
prompt=message.content[5:],
max_tokens=100,
temperature=0.9,
top_p=1,
n=1,
stream=False,
logprobs=None,
stop=["\n"],
)
await message.channel.send(response['choices'][0]['text'])
client.run(os.environ.get('DISCORD-TOKEN'))
Here is the error I am getting:
import discord
import asyncio
import openai
import os
openai.api_key = os.environ.get('OPENAI-KEY')
client = discord.Client()
#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
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
elif message.content.startswith('$chat'):
response = openai.Completion.create(
engine="davinci",
prompt=message.content[5:],
max_tokens=100,
temperature=0.9,
top_p=1,
n=1,
stream=False,
logprobs=None,
stop=["\n"],
)
await message.channel.send(response['choices'][0]['text'])
client.run(os.environ.get('DISCORD-TOKEN'))
Here is the error I am getting
Traceback (most recent call last):
File "c:\Users\Private\OneDrive\Desktop\Pro\GitHub Repo\Discord_chat_bot\Bot.py", line 35, in <module>
client.run(os.environ.get('DISCORD-TOKEN'))
File "C:\Users\Private\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\client.py", line 723, in run
return future.result()
File "C:\Users\Private\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\client.py", line 702, in runner
await self.start(*args, **kwargs)
File "C:\Users\Private\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\client.py", line 665, in start
await self.login(*args, bot=bot)
File "C:\Users\Private\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\discord\client.py", line 511, in login
await self.http.static_login(token.strip(), bot=bot)
AttributeError: 'NoneType' object has no attribute 'strip'
I was expecting for it to work if I try this code in 2.0.0 discord it give a different error
The reason I am using 1.7.3 not 2.0.0 is because I had a different error and to fix it I had to switch to 1.7.3
Error on this line:
client.run(os.environ.get('DISCORD-TOKEN'))
The token you are passing in is None because os.environ.get('DISCORD-TOKEN') returns None.
You could have forgot to set your environment variable or you had it in a .env file. If you have it in a .env file, please load it:
from dotenv import load_dotenv
load_dotenv()

Created a code to greet the user and made an embed, no errors except one

Created a code to greet the user and made an embed, no errors except one:
My code:
#client.command()
async def on_member_join(ctx):
await client.fetch_channel(id)(869212882968145992)
embed=discord.Embed(title="new member", description="oook", color=0xFFFF00)
embed.add_field(name="Command1", value="What it does", inline= True)
embed.add_field(name="Command2", value="What it does", inline= True)
await ctx.send( embed = embed)
Error:
'NoneType' object has no attribute 'id'
You already specified the id parameter, put this:
await client.fetch_channel(869212882968145992)
Instead of:
await client.fetch_channel(id)(869212882968145992)

How to get a bot to save the message after a trigger word (discord.py)

I'm trying to get my bot to respond to a message sent after a trigger word, but all it does is send me the following error: AttributeError: 'generator' object has no attribute 'content'. Here is my code:
#client.event
async def on_message(message):
if message.content == "report":
await message.author.send("Type your report below")
def check(m):
return m.guild == None and m.author == message.author
try:
response = client.wait_for("message", check=check)
except asyncio.TimeoutError:
await message.author.send("Uh-oh, the request timed out! Try again.")
else:
content = response.content
Thanks in advance!
client.wait_for is a coroutine function. That means, in order to use it, you have to await it.
You just have to do:
response = await client.wait_for("message", check=check)

Improving upon discord MassDM bot

import discord
from discord.ext import commands
import platform
import random
import time
bot = commands.Bot(command_prefix='+', case_insensitive=True)
#bot.event
async def on_ready():
print(f'Logged in as {bot.user.name}(ID: +{bot.user.id}) |'
f'Connected to {str(len(bot.guilds))} servers |'
f'Connected to {str(len(set(bot.get_all_members())))} users')
print('--------')
print('CREATED AND HOSTED BY Fataldagod | Fixed Version')
#bot.event
async def on_command_error(ctx, error):
# Ignore these errors:
ignored = (
commands.CommandNotFound, commands.UserInputError, commands.BotMissingPermissions,
commands.MissingPermissions, discord.errors.Forbidden, commands.CommandInvokeError,
commands.MissingRequiredArgument)
if isinstance(error, ignored):
return
#bot.command(pass_context=True)
#commands.has_permissions(kick_members=True)
async def userinfo(ctx, user: discord.Member):
try:
embed = discord.Embed(title="{}'s info".format(user.name),
description="Here's what I could find.",
color=discord.Colour.dark_red())
embed.add_field(name="Name", value=user.name, inline=True)
embed.add_field(name="ID", value=user.id, inline=True)
embed.add_field(name="Status", value=user.status, inline=True)
embed.add_field(name="Highest role", value=user.top_role)
embed.add_field(name="Joined", value=user.joined_at)
embed.set_thumbnail(url=user.avatar_url)
await ctx.send(embed=embed)
except:
await ctx.send("Missing Requrired Args")
#commands.has_permissions(administrator=True)
#bot.command(pass_context=True)
async def send(ctx, *, content: str):
for member in ctx.guild.members:
c = await member.create_dm()
try:
await c.send(content)
await ctx.send("MassDM message sent to: {} ".format(member))
except Exception:
await ctx.send("MassDM message blocked by: {} ".format(member))
Was wondering what I can change to make it so the bot DMs specific roles rather than the entire server?
For example instead of me typing +send (message) I'd like to type +send #role1 #role2 role3 #role4 (message) or something along these lines.
Any help is much appreciated.

Resources