Вывод таблицы в телеграм бот aiogram sqlite3
Есть таблица, из которой нужно вывести столбцы 'username' и 'kol после сообщения от пользователя <Топ> в формате:
- name - kol
- name2 - kol
- name3 - kol
и выполнить сортировку по столбцу 'kol' (сверху самый высокий результат, снизу самый низкий).
Главная проблема в том, что у некоторых людей нет тг-username и надо это как-то решить.
Вывести нужно, допустим, первые 10 строк.
Ответы (2 шт):
Автор решения: Gh0st0fPast
→ Ссылка
Могу предложить такой набросок на Google Таблицах, с использованием numpy, который вам может понадобиться, когда наберётся большое количество пользователей
import numpy as np
from aiogram import Bot, Dispatcher, executor, types
import gspread
API_TOKEN = '<bot_token>'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
gs = gspread.service_account(filename='<service_account_info>')
sh = gs.open_by_key('<gdocs_access_key>')
@dp.message_handler(commands='top')
async def top10(message: types.Message):
text = ''
# Берём страницу с результатами из Google Таблиц
topspr = sh.get_worksheet('<int>')
# Берём значения из 3-ёх столбцов: userID, username, kol
top = np.array(topspr.get_all_values()[1:])[:, 1:4]
# Сортируем массив по очкам, потом username по алфавиту
top = np.flip(top[np.lexsort((top[:, 1], np.int64(top[:,2])))], axis=0)
# Проходим по первой 10-ке лидеров
for x in top[:10]:
if x[1] != '': # Если username есть выводим
text += f'{x[1]} - {x[2]}\n'
else: # Если его нет, используем ID
text += f'ID{x[0]} - {x[2]}\n'
await message.answer(text=text)
executor.start_polling(dp, skip_updates=True)
Если можно как-то пройтись по массиву без for'а, прошу не ругать, я не особо хорошо знаком с numpy
Автор решения: Creeper Hack
→ Ссылка
можно же упомянуть пользователя с помощью его id вместо юзернейма
top = ... # список топ 10 человек в таком формате: ((user_id, user_firstname, kol), ...)
# Думаю вы сами можете вывести из бд 10 человек
text = ''
numeration = 0
for i in top:
user_id = i[0]
user_name = i[1] # Имя человека, а не юзернейм
kol = i[2]
numeration += 1
text += f'\n{numeration}. <a href="tg://user?id={user_id}">{user_name}</a> - {kol}'
await send_message(msg.from_user.id, text, 'html')
# /\
# Нада указать parse_mode как html так как я использовал форматирования html чтобы упомянуть
