Comment exécuter du code Python supplémentaire dans un projet de bot Discord
J'essaie d'exécuter mon robot discord, de quitter () ou de me déconnecter (), d'exécuter un autre code python, puis de me reconnecter. Je n'ai pas d'expérience avec les fonctions asynchrones, donc je n'ai aucune idée de l'erreur dit des messages.
import discord
dToken = "xxxxx"
client = discord.Client()
@client.event
async def on_ready():
print('Logged in as')
print(client.user.name)
print(client.user.id)
guilds = client.guilds
for i in range(len(guilds)):
if str(guilds[i]) == server:
gld = guilds[i]
for channel in gld.text_channels:
if str(channel) == "channelname":
print(str(message)+" sent to channel id "+str(channel.id))
await client.get_channel(channel.id).send(message)
await client.logout()
#run bot
client.run(dToken)
#change message and server name depending on extra code I put here
message = "hello!"
server = "servername"
#run bot again with changes
client.run(dToken)
Je dois me déconnecter () car c'est le seul moyen que j'ai trouvé pour faire fonctionner le code supplémentaire. Mais le code que j'ai donne l'erreur suivante:
Traceback (most recent call last):
File "C:/Users/mmh/PycharmProjects/pythonProject/test.py", line 21, in <module>
client.run(dToken)
File "C:\Users\mmh\PycharmProjects\pythonProject\venv\lib\site-packages\discord\client.py", line 665, in run
future = asyncio.ensure_future(runner(), loop=loop)
File "C:\Users\mmh\AppData\Local\Programs\Python\Python37\lib\asyncio\tasks.py", line 608, in ensure_future
task = loop.create_task(coro_or_future)
File "C:\Users\mmh\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 402, in create_task
self._check_closed()
File "C:\Users\mmh\AppData\Local\Programs\Python\Python37\lib\asyncio\base_events.py", line 479, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
sys:1: RuntimeWarning: coroutine 'Client.run.<locals>.runner' was never awaited
Process finished with exit code 1
Est-ce que quelqu'un sait ce que je devrais faire?
Réponses
Autant que je sache, vous ne pouvez pas courir client.rundeux fois de suite (j'ai essayé moi-même, j'ai eu la même chose RuntimeError). Cependant, dans ce cas, il semble que vous souhaitiez envoyer un message à deux canaux sur deux serveurs différents. Si tel est le cas, vous pouvez simplement créer une fonction à l'intérieur on_readypour envoyer un message à un canal donné, puis vous pouvez appeler cette fonction deux fois:
@client.event
async def on_ready():
async def send_message(server_name, channel_name, message):
# Instead of looping through indices for client.guilds,
# you should iterate over client.guilds itself
# (as you did for gld.text_channels)
for guild in client.guilds:
if guild.name != server_name:
continue
for channel in guild.text_channels:
if channel.name == channel_name:
await channel.send(message)
print(message, 'sent to channel id', channel.id)
return
else:
raise ValueError('could not find channel')
else:
raise ValueError('could not find server')
await send_message('server1', 'textchannel1', 'hello!')
await send_message('server2', 'textchannel2', 'hello!')