Решил сделать 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, куча нормальных инструментов. Но сама задумка прикольная.








