I'm trying to create a multifunctional bot for discord. However I've come to a major stand still as I can't figure out what's wrong with my code, it runs without any errors and mostly everything is fine, however it doesn't seem to run an essential part of my code which involves getting my bot online on discord.
I call the function from "main.py" that is supposed to get my bot running (online) through the other python file "bot.py"
this is main.py:
> import bot
>
> if __name__ == "__main__":
> bot.run_flea()
this is bot.py:
> import discord
> import responses
>
> async def send_message(message, user_message, is_private):
> try:
> response = responses.response_handle(user_message)
> await message.author.send(response) if is_private else await message.channel.send(response)
> except Exception as e:
> print(e)
>
> def run_flea():
> TOKEN = 'my token'
> client = discord.Client(intents=discord.Intents.default())
>
> #client.event # this is what I suspect is the problem
> async def on_ready(): # bot gets started, calls "on_ready" function
> print("Flea is now running") # this tells us that our bot is up and ready
> client.run(TOKEN)
Your client.run(TOKEN) is on the wrong level of indentation. Change your run_flea method to look like this:
def run_flea():
TOKEN = 'my token'
client = discord.Client(intents=discord.Intents.default())
#client.event # this is what I suspect is the problem
async def on_ready(): # bot gets started, calls "on_ready" function
print("Flea is now running") # this tells us that our bot is up and ready
client.run(TOKEN)
Related
My bot has fully functioning /slash commands and I would also like them to be text commands and add other functionality when users send messages in chat. However, I cannot seem to get the bot to listen for messages.
import interactions
# Create the bot
Bot = interactions.Client(
token = BotToken,
scope = ServerID
)
#Bot.event
async def on_message(message):
await HandleMessage(message)
return
Bot.start()
The code never enters the on_message method.
I had a working version with the discord.py module and they are very similar. I am not sure why it does not work with Interactions.py.
Working code with discord.py:
intents = discord.Intents.default()
intents.messages = True
intents.message_content = True
client = discord.Client(intents = intents)
#client.event
async def on_message(message):
await HandleMessage(message)
client.run(Token)
I'm trying to make a discord bot that will provide the current price of crypto currencies when a command (!price) is used, below is my code i have taken out my bots token for obvious reasons
import requests
from discord import Client, Intents
intents = Intents.default()
intents.members = True
client = 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.author == client.user:
return
if message.content.startswith('!price'):
symbol = message.content[6:].upper()
url = f'https://api.coingecko.com/api/v3/simple/price?ids={symbol}&vs_currencies=usd'
print(f'Fetching price for symbol: {symbol}')
response = requests.get(url)
print(f'API response: {response.json()}')
print(f'response.status_code: {response.status_code}')
try:
price = response.json()[symbol]['usd']
await message.channel.send(f'The price of {symbol} is ${price}')
except KeyError:
print(f'Error: Symbol {symbol} not found')
await message.channel.send(f'Error: Symbol {symbol} not found')
client.run('TOKEN GOES HERE')
i have tried literally everything, Ive added so many debugging tools and I'm fairly certain that the problem lies with my bot picking up my commands in the discord server,
i need a help with a python code. All I need is to get if user selected (by myself) ID is currently online. How can I do that?
The code for now looks like this, but its dosnt print anserw
import discord
from discord.ext import commands
from discord import Member
TOKEN = "token"
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
client = commands.Bot(command_prefix=".", intents=intents)
#client.event
async def on_ready():
return
#client.event
async def on_message(message, member : discord.Member=None):
if member == MyID:
print("draziv online")
if message.author == client.user:
return
if "hello" in message.content or "hi" in message.content:
return
# await message.channel.send(f'Hello there {message.author.mention}. I hope you have a fantastic day so far. ')
client.run(TOKEN)
I was trying all the methods I found over the internet, but almost all of them are outdated
I was trying to change my version from 1.7.3 to 2.0+ using pip install -U git+https://github.com/Rapptz/discord.py. Usually when I did this there would be an error about intents that would pop up, but instead there were no errors but it said:
discord.client logging in using static token
2022-12-20 12:34:14 INFO
discord.gateway Shard ID None has connected to Gateway (Session ID:6837cbf3ad28b9040ceb5e044dffe90f).
After that, any commands that I used didnt get responded to, as it worked perfectly fine in 1.7.3.
My code:
import discord, os, requests, json, random, time, datetime
from discord.ext import commands
from replit import db
import urllib
import asyncio
from discord import Member
from discord.ui import Select,Button,View
intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(command_prefix="e!",
intents=intents)
client = discord.Client(intents=intents)
#client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('whats the meaning of life'):
await message.channel.send(
'The meaning of life is "freedom from suffering" through apatheia (Gr: απαθεια), that is, being objective and having "clear judgement", not indifference. - Wikipedia.'
)
time.sleep(2)
await message.channel.send(
'There, someone just explained your life. Kind of depressing, isnt it?'
)
basically you don't have the correct intents to be able to send message with the bot
you need to have the discord.Intents.all()
and please don't use the time.sleep in an asynchronous function use asycio.sleep()
import asyncio
bot = commands.Bot('e!',intents=discord.Intents.all())
#bot.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('whats the meaning of life'):
await message.channel.send(
'The meaning of life is "freedom from suffering" through apatheia (Gr: απαθεια), that is, being objective and having "clear judgement", not indifference. - Wikipedia.'
)
await asyncio.sleep(2)
await message.channel.send(
'There, someone just explained your life. Kind of depressing, isnt it?'
)
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.