Участники: Артур Галеев
Сделать мессенджер для терминала. Переписка будет осуществляться посредством коммитов в Git репозиторий, соответственно пользоваться чатом можно будет подключившись к репозиторию по ключу. Также будут реализованы беседы из N участников, личная переписка и другие функции (см. функционал).
Конечно, проект имеет скорее обучающие предпосылки, нежели практические. Но всё же любителям пользоваться компьютером исключительно при помощи терминала может прийтись по душе. К тому же, если вы, например, запустили какую-то новую виртуалку и нужно срочно приступить к проекту, то у вас из коробки (при подключении к репозиторию) будет доступна возможность быстрой коммуникации между участниками (хотя бы для быстрого взаимного copy/pastе обмена кодом).
- отправлять сообщение - коммит
- создавать чат на N
$\ge$ 2 человек - отдельная ветка - добавлять/исключать участников из чата
- выдавать N последних сообщений чата
- отвечать на конкретное сообщение
- TBD
- Изучить вопрос в целом, выбрать средства для реализации
- был выбран язык c, а именно использование библиотеки libgit2 (возможно для удобства перейду на аналог cppgit2 для c++)
- изучены необходимые функции, например:
git_commit_create, git_revwalk, git_commit_message - первые представление о классе пользователя: имя, группы, права (tba)
- Сделать коммит сообщения, полученного его вводом в терминал
- Получать записанные коммиты, выводить их в терминале
- Добавить пользователей
- Добавить возможность писать сообщения (коммитить) в разные чаты (ветки)
- Решить проблему с приватностью чатов (предоставлять доступ определённым пользователям)
- Сделать дополнительные фичи
Легче всего оказалось работать с исходной версией библиотеки libgit2, написанной на C (легче установка и меньше проблем при сборке, т.к. надстройки на ней для C++ оказались немного проблемными). Установить можно на Ubuntu следующим образом:
sudo apt-get install libgit2-dev
У меня по всей видимости уже была библиотека, связанная с libgit2 - git2. Поэтому всё притянулось туда.Также для сборки нужно добавить в Cmake расположение заголовочных файлов, директорию, где содержатся необходимые библиотеки, и связь текущего проекта с этим git2 (на разных системах могут быть разные директории):
include_directories(/usr/lib/git2)
link_directories(/usr/lib/x86_64-linux-gnu)
target_link_libraries(GitHubMessenger git2)
Пока что удалось собрать commit для исходного репозитория и текущего пользователя: расставить указатель на коммит, указатель на index файл репозитория, указать сигнатуру (имя и почта авотра и того, кто делает коммит) и само сообщение коммита.
git_commit_create_v(&commit_id, repo, "HEAD", *signature, *signature, "utf-8", message.c_str(), tree, 1, parent)
В коде выше в commit_id запишется oid (object id) выполненного коммита; repo - передаем сам репозиторий; "HEAD" говорит о том, что будет обновлён HEAD и сдвинут на новый коммит; и автор и коммитер в данном случае один и тот же, поэтому в обооих местах signature; кодировка сообщение - utf-8 (вообще она по умолчанию такая, можно было просто NULL написать); сообщение коммита; некое дерево комиита (пока не до конца понятно что это); кол-во родителей.
- Комнаты создаются локально, но так и не удалось решить проблему с пушем их в remote репозиторий.
Комната создаётся через commit_create и требует только имени комнаты от пользователя, который присоединяется к существующей комнате или создает свою (в случае отсутствия комнаты с введенным именем). 2. После присоединения к комнате пользователь имеет две команды: отправить сообщение, показать историю сообщений.
Они реализованы при помощи соответствующих функций: add_message (требует ввести сообщение), get_history.