Решил сделать Git в Telegram и вот что вышло
Как всё начиналось
В телеграм-канале подписчики выбрали новый челлендж: сделать Git в Telegram. Чтобы можно было через бота инитить проекты, пушить файлы, коммитить — и всё это в публичном канале с тредами.
Хранение данных
Сначала хотел всё в JSON пихать. Два дня подергал — понял, что это пиздец. Конкурентный доступ, целостность данных, версионность — JSON для такого не приспособлен.
Перешёл на SQLite. Просто, надёжно, транзакции есть, всё в одном файле.
Сущности расписал:
users — кто юзает
projects — проекты (привязаны к треду в канале)
files — файлы внутри проекта
file_versions — все версии файлов (чтоб откатываться можно было)
commits — коммиты
commit_files — связка коммитов с версиями файлов
В коде завёл датаклассы, чтоб не таскать кортежи из SQL. Теперь из базы возвращаются нормальные объекты, IDE подсвечивает, типы контролируются.
Я возненавидел маркДАУНА
Казалось бы, что может быть проще: обернул код в тройные апострофы, указал язык — и Telegram сам подсветит.
В теории.
На практике Telegram использует свой диалект Markdown, где куча служебных символов: _, *, [, ], (, ), ~, >, #, +, -, =, |, {, }, ., ! — и их надо экранировать.
В коде эти символы встречаются на каждом шагу.
Перепробовал кучу вариантов экранирования:
экранировать всё подряд — код превращается в кашу
не экранировать — Telegram шлёт нахуй
экранировать только проблемные места — всё равно вылезали ошибки
В какой-то момент просто забил на Markdown и перешёл на HTML. Telegram умеет принимать HTML. Да, он не такой красивый, но зато предсказуемый.
Всё. Никаких точек, подчеркиваний, обратных слешей. Три символа — и код летит как надо.
Права доступа, которые работали сами
Когда бот начал обрастать функциями, задумался о безопасности. Начал писать проверки в каждую команду:
Добавил в /commit, потом в /rm, потом в /branch... И тут до меня дошло.
Они уже работали. С самого начала.
Я просто забыл, как спроектировал базу данных. В таблице projects есть поле owner_id, и все запросы фильтруются по нему. Показать проекты — только свои. Найти файл — только в своих. Выбрать проект — только из своих.
Команды
Думал будет команд 5-6. Щас уже под два десятка:
/start, /init, /use, /list, /ls, /commit, /log, /status, /rm, /rmproject, /rmproject_confirm, /ignore, /ignored, /unignore, /branch, /branches, /checkout, /diff, /cat
И это не предел. Хочется ещё /tree добавить, коллаборацию, приватные проекты... А там может и до безумных идей дойдём — типа кодспейса прямо в боте, чтоб код редактировать не выходя из Telegram.
Что в итоге
GitGram живёт и работает. Бот принимает файлы, коммиты ходят, ветки переключаются, диффы показываются. Всё в тредах, каждый проект отдельно.
Все файлы падают в канал-репозиторий: @Git_Gram
Бот: t.me/Git_GramBOT
Вся разработка ведется ТУТ!
Да, на практике GitGram нахуй не нужен. Есть GitHub, GitLab, куча нормальных инструментов. Но сама задумка прикольная.


ИТ-проекты пикабушников
735 постов3.5K подписчиков
Правила сообщества
0. Запрещены посты вне тематики сообщества
1. Уважайте труд людей, пишите только конструктивную критику,
2. Не выкладывайте информацию по своему проекту чаще 2ух раз в месяц