Задать вопрос
@cheems_crying

Как исправить то что не работает await и код выполняется дальше без данных с DB?

qq all, есть проблема, при выполнении кода, не работает await и код выполняется дальше без данных с ДБ, кто подскажет как пофиксить?

Сам код:
import asyncio
import os
import threading
import discord
from allauth.socialaccount.models import SocialAccount
from asgiref.sync import sync_to_async
from channels.db import database_sync_to_async

from main.models import Game, Purchase, Key


def start():
thread = threading.Timer(0, ds)
thread.daemon = True
thread.start()


def ds():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
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'):
game = await sync_to_async(lambda: Game.objects.all()[0], thread_sensitive=True)()
await message.channel.send(game.name)

@client.event
async def on_member_join(member):
allAccounts = await sync_to_async(lambda: SocialAccount.objects.all(), thread_sensitive=True)()
for acc in allAccounts:
if acc.extra_data['id'] == str(member.id):
account_id = acc.extra_data['id']
purchases = await sync_to_async(lambda: Key.objects.filter(user__id=account_id), thread_sensitive=True)()
keys = [await sync_to_async(lambda: Key.objects.filter(purchase__id=purchase.id), thread_sensitive=True)() for purchase in purchases]
for key in keys:
role = discord.utils.get(member.guild.roles, id=key.cheat.ds_role_id)
print(str(key.cheat.ds_role_id))
await member.add_roles(role)
break


@client.event
async def on_error(event, *args, **kwargs):
client.run(os.environ.get('DS_BOT_TOKEN'))

client.run(os.environ.get('DS_BOT_TOKEN'))
  • Вопрос задан
  • 244 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Выполнение синхронного кода в пулах треда или процесса

Как говорит import this:
Simple is better than complex.

Я чисто не вижу смысла во всех этих sync_to_asyncи прочих.
database_sync_to_async вовсе не используется в данном коде.

Используйте расширение discord.py называемое "commands". Оно идёт вместе с библиотекой и значительно упрощает жизнь при написании команд.
Errors should never pass silently.
Unless explicitly silenced.


Переподключать бота при любой ошибке - смахивает на ОЧЕНЬ плохую идею.

import asyncio
import os
from functools import partial

import discord
from discord.ext import commands
from allauth.socialaccount.models import SocialAccount

from main.models import Game, Purchase, Key


bot = commands.Bot()


@bot.event
async def on_ready():
    print('We have logged in as {0.user}'.format(bot))

@commands.command()
async def hello(ctx):
    game = (await bot.loop.run_in_executor(None, Game.objects.all))[0]
    await ctx.send(game.name)

@bot.event
async def on_member_join(member):
    allAccounts = await bot.loop.run_in_executor(None, SocialAccount.objects.all)
    for acc in allAccounts:
        if acc.extra_data['id'] == str(member.id):
            account_id = acc.extra_data['id']
            purchases = await bot.loop.run_in_executor(None, partial(Key.objects.filter, user__id=account_id))
            keys = [await bot.loop.run_in_executor(None, partial(Key.objects.filter, purchase__id=purchase.id)) for purchase in purchases]
    for key in keys:
        role = discord.utils.get(member.guild.roles, id=key.cheat.ds_role_id)
        print(str(key.cheat.ds_role_id))
        await member.add_roles(role)
        break


bot.run(os.environ.get('DS_BOT_TOKEN'))

Возможно данный код вам чем-то поможет. Написано без учёта содержимого SocialAccount и main.models, поэтому код затрагивающий их остался примерно неизменным.
Отступы так же были угаданы чисто по коду.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы