Привет! Пишу бота на Aiogram, у меня он работает с СУБД pgAdmin4.
Есть команда для получение какого-то количества монет:
Код@dp.message_handler(text=['/get', '/get@bot'])
async def command_vine(message: types.Message):
user = await commands.select_user(message.from_user.id)
vine = await commands.select_vine(message.from_user.id)
gen_count = random.randint(1, 6)
new_count = vine.count + int(gen_count)
if user.user_id != 11111111111:
if user.status == 'active':
await commands.update_vine(user_id=message.from_user.id,
new_count=int(new_count))
await message.answer(
f"@{user.name} получил {gen_count} монет.\n\n<b>Всего монет:</b> {new_count}")
else:
await message.reply(f"Извини, но тебе запрещено выполнять данную команду")
Также имеются функции:
select_userasync def select_user(user_id):
user = await User.query.where(User.user_id == user_id).gino.first()
return user
select_vineasync def select_vine(user_id):
user = await Vine.query.where(Vine.user_id == user_id).gino.first()
return user
Мне нужно, чтобы на команду, например: "/stats", отправлялась таблица лидеров (топ 7 человек, например)
Предположительная функцияasync def get_top_users():
users = await Vine.select('user_id', 'count').where(Vine.count != 0).gino.all()
И вот как-то нужно отсортировать count, вернуть user_id совместно с count, расположив по убыванию и вывести через команду
Вот преположительный вывод@dp.message_handler(text=['/stats', '/stats@bot'])
async def command_stats(message: types.Message):
top_users = await commands.get_top_users()
msg = ''
count = 10
id = 0
for user_id, count in top_users:
id += 1
if id <= count:
user = await commands.select_user(user_id)
if user:
mention = f'<a href="tg://user?id={user.user_id}">{user.name}</a>'
msg += f'{id}. {mention} - {count}\n'
else:
id -= 1
else:
break
await message.answer(f'Статистика:\n {msg}')
И вот как-то надо сделать, чтобы функция "get_top_users()" ворщала отсортированные значение count вместе с их user_id. Как это реализовать?