'Discord bot stopped working through Heroku, works fine offline
Solved! Answer below.
EDIT: Cleaned up this post to keep it all clear.
Here's the code for a simple GIF bot. The important thing is: this bot works offline, gives a gif when I send a !command. This bot comes online with Heroku, so that is also good. What doesn't work is sending commands to receive gifs when the bot is online. So the code works, but I'm having trouble getting it in a working state with the commands in online mode.
Code
import random
import discord
import giphy_client
from discord.ext.commands import Bot
from giphy_client.rest import ApiException
discord_token = *hidden for stackoverflow*
giphy_token = *hidden for stackoverflow*
api_instance = giphy_client.DefaultApi()
def search_gifs(query):
try:
return api_instance.gifs_search_get(giphy_token, query, limit=100, rating = 'PG13')
except ApiException as e:
return "Exception when calling DefaultApi->gifs_search_get: %s\n" % e
def gif_response(emotion):
gifs = search_gifs(emotion)
lst = list(gifs.data)
gif = random.choices(lst)
return gif[0].url
class DiscordClient(discord.Client):
async def on_ready(self):
print("Login as")
print(self.user)
print("-------")
async def on_message(self, message):
if message.author != self.user:
if message.content == '!vibe':
await message.channel.send(gif_response('vibing'))
if message.content == '!dragony':
await message.channel.send(gif_response('dragon'))
if message.content == '!gm':
await message.channel.send(gif_response('gm'))
intents = discord.Intents(messages=True, guilds=True, guild_messages=True)
client = DiscordClient(intents=intents)
# client = DiscordClient()
client.run(discord_token)
Requirements file (requirements.txt)
git+https://github.com/Rapptz/discord.py
PyNaCl==1.3.0
dnspython==1.16.0
async-timeout==3.0.1
pandas
giphy_client==1.0.0
Procfile
worker: python gif_bot.py
Logs while deploying
2022-04-21T11:46:39.000000+00:00 app[api]: Build started by user
2022-04-21T11:47:14.667290+00:00 app[api]: Deploy x by user
2022-04-21T11:47:14.667290+00:00 app[api]: Release v11 created by user
2022-04-21T11:47:15.800842+00:00 heroku[worker.1]: State changed from crashed to starting
2022-04-21T11:47:21.019690+00:00 heroku[worker.1]: Starting process with command `python gif_bot.py`
2022-04-21T11:47:21.640978+00:00 heroku[worker.1]: State changed from starting to up
2022-04-21T11:47:25.392719+00:00 app[worker.1]: Login as
2022-04-21T11:47:25.392731+00:00 app[worker.1]: Gif Bot#8552
2022-04-21T11:47:25.392732+00:00 app[worker.1]: -------
2022-04-21T11:47:29.000000+00:00 app[api]: Build succeeded
Solution 1:[1]
@smerkd has helped me with the answer!
Adding "message_content = True" to the intents made it work.
Code
intents = discord.Intents(messages=True, message_content=True, guilds=True, guild_messages=True)
Solution 2:[2]
With newer versions of discord you need to pass your intents. Essentially telling discord what events you're going to be using and some cache stuff. A simple way to think of it is like what you're intending to do or permissions.
For your example try the following
intents = discord.Intents.default()
intents.message_content = True
Then fix your client to include the specified intents
client = DiscordClient(intents=intents)
Read up more about them here: https://discordpy.readthedocs.io/en/stable/intents.html
Note: you will have to add more intents if you're planning on doing anything more complicated.
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 | |
| Solution 2 |
