C-Python Asyncio: Running Discord.py In A Thread
Solution 1:
Answering my own question:
I should thank this source asyncio-you-are-a-complex-beast where I finally found a solution.
The final working code looks like this:
import discord
import asyncio
from threading import Thread
client = discord.Client()
def init():
loop = asyncio.get_event_loop()
loop.create_task(client.start(TOKEN))
Thread(target=loop.run_forever).start()
@client.event
async def on_message(message):
if message.author == client.user:
return
print("on_message content: %s, channel: %s" % (message.content, message.channel))
await message.channel.send('Hello!')
@client.event
async def on_ready():
print("Discord bot logged in as: %s, %s" % (client.user.name, client.user.id))
My main mistake was that for the game I compiled and used the latest rewrite
version while inside the system over the pip I got 0.16.12
and read the documentation for 0.16.12 while I had to look at discord.py.rewrite (for example inside on_message
I used wrong client.send_message
while I had to use message.channel.send
)
Solution 2:
I had a similar edge case (not really the intended use of asyncio
but what the hell) where I needed to Thread the discord.py
instance.
I ended up modifying your solution with the following:
class discordHost(discord.Client):
async def on_ready(self):
print(f'{DThread.discord_client.user} has connected.')
class Threader(Thread):
def __init__(self):
Thread.__init__(self)
self.loop = asyncio.get_event_loop()
self.start()
async def starter(self):
self.discord_client = discordHost()
await self.discord_client.start(DISCORD_TOKEN)
def run(self):
self.name = 'Discord.py'
self.loop.create_task(self.starter())
self.loop.run_forever()
if not 'Discord.py' in [t.name for t in tenumerate()]:
DThread = Threader()
This does more or less the same thing, but I've subclassed Thread
and subclassed discord.Client
to more easily work with the outcome of the two.
The only caveat here, is that asyncio.get_event_loop()
has to be called before Thread.start()
, otherwise it gets confused and losses it's context of the main thread.
Post a Comment for "C-Python Asyncio: Running Discord.py In A Thread"