Pull to refresh

Самые гибкие todo в Телеграме в две строчки кода

Reading time3 min
Views18K

Недавно Boomburum писал о своих лайфхаках в Телеграме. Вместо "Избранного" он использует несколько приватных каналов с самим собой — для разделения на категории. И делаю точно так же.

Так это выглядит у Бумбурума
Так это выглядит у Бумбурума

Это удобно: в Телеграме всегда можно что-то быстро записать или переслать из других чатов. Получается такой простой способ вести повседневные заметки "на бегу".

Но повседневный список задач так вести не получится. Или всё-таки?

Вообще списки todo — это такая полезная штука, которая легко реализуется. Если вы введёте слово "todo" в поиск в Google Play или AppStore, то увидите ооочень много приложений.

Неудивительно, что в Телеграме уже есть аналогичные боты. Но вот проблема: в Телеграме нету чекбоксов. Вы в принципе не можете сделать кнопку-галочку рядом с текстом. Ну нельзя так сделать.

Поэтому все выкручиваются, как могут.

Один из юзабельных вариантов, которые я нашёл — ставить галочку при клике на команду.

На скрине — @FroggyTodoBot. Чтобы удалить задачу, нужно переключиться в режим "удаление задач" и нажать на команду.
На скрине — @FroggyTodoBot. Чтобы удалить задачу, нужно переключиться в режим "удаление задач" и нажать на команду.

В некоторых ботах задачи сделаны в виде кнопок.

Это @do2bot
Это @do2bot

В принципе — да, таких ботов можно использовать каждый день на ходу. Хотя и переключаться между списками не так удобно, как в приложениях (тут для этого придётся скроллить сообщения вверх-вниз).

Но проблема заключается в том, что это совсем не гибко. Всё, что есть у задачи — это короткое название. Не получится добавить даты, большое описание или картиночку для красоты.

И вот однажды я подумал: а что, если сделать задачу одним сообщением? А снизу поместить кнопку. Вот так:

Ведь технически боты могут добавлять кнопки к сообщениям пользователя: если это сообщения в канале. Например, так работают лайки в каналах: авторы публикуют сообщения, а боты редактируют, добавляя кнопки.

Итак, мы можем совместить идею с личными каналами для заметок и идею бота.

  1. Создаём приватный канал и добавляем туда только бота.

  2. Каждое сообщение в канале — это пункт todo.

Всё, что будет делать бот — это добавлять кнопки, а по нажатию на них изменять сообщения. Полторы строчки кода.

Код

Я привык писать ботов на Telethon, так что у меня получилось что-то такое:

import logging

from telethon import TelegramClient, Button, events
from telethon.errors import ChatAdminRequiredError, MessageIdInvalidError, InlineBotRequiredError


bot = TelegramClient('bot', config.API_ID, config.API_HASH)
logging.basicConfig(level=logging.INFO)

bot.parse_mode = 'html'


@bot.on(events.NewMessage(func=lambda e: e.is_channel))
async def new_channel_message(event: Message):
    try:
        await bot.edit_message(event.chat, event.id, buttons=Button.inline('✔️ Выполнить', '0_done'))
    except (ChatAdminRequiredError, MessageIdInvalidError, InlineBotRequiredError):
        # Если бот не админ в чате, или если сообщение невозможно изменить (например, это стикер или сообщение через инлайн-бота)
        pass


@bot.on(events.CallbackQuery(pattern='(done|undone)'))
async def done_callback_query(event):
    source = (await event.get_message()).text.replace('~~', '')
    if event.data == b'done':
        text = f'✅ {source}' if source else '✅'
        buttons = Button.inline('Выполнено', 'undone')
        await event.edit(text, buttons=buttons, parse_mode=parse_mode)
    else:
        if source.startswith('<del>') and source.endswith('</del>'):
          source = source[5:-6]
        text = None if not source else source[1:] if source.startswith('✅') else source
        buttons = Button.inline('✔️ Выполнить', 'done')
        await event.edit(text, buttons=buttons)
      

if __name__ == '__main__':
    bot.start(bot_token=BOT_TOKEN)
    bot.run_until_disconnected()

Казалось бы — этот способ вести todo ничем не лучше предыдущих. Но неожиданно встроенные фичи Телеграма открывают множество возможностей:

Задачей в списке может быть всё, что угодно, — что позволил Дуров. Можно добавлять картинки и описания. Можно вообще вместо текста оставлять голосовые сообщения. Или стикеры О_о

Создать несколько каналов. Каждый канал может быть отдельным списком. Можно дать им любые названия. А ещё поставить аватарки, чтобы их было легко различать. Можно закреплять каналы в списке чатов или создавать папки с этими каналами.

Добавить участников в канал. В этот "список задач" можно добавлять участников — и это не баг, а фича. А если включите подписи к сообщениям, то будете видеть, кто именно отправил каждое сообщение.

Привязать канал к рабочему чату. Если привязать канал к чату, то все сообщения из него будут пересылаться в этот чат.

Использовать хештеги. Можно структурировать задачи внутри канала и искать их по хештегам.

В итоге: мы написали полторы строчки кода, и за счёт встроенных средств Телеграма получили супергибкие todo-списки. Почти что нативные.

И ведь могут найтись ещё какие-нибудь интересные трюки с этим ботом, до которых я не додумался.

Кстати, можно ещё чуть-чуть дополнить код и сделать проверку на администратора: пусть админы каналов смогут ставить галочки, а подписчики — только читать.

Если что, бота, который у меня получился, вы можете потыкать здесь.

Only registered users can participate in poll. Log in, please.
Пользуетесь «Избранным» в Телеграме?
51.21% Да127
26.21% Да, и использую личные каналы65
20.16% Не веду заметки в Телеграме50
2.42% Не использую Телеграм6
248 users voted. 12 users abstained.
Tags:
Hubs:
Total votes 8: ↑7 and ↓1+7
Comments20

Articles