No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
src
tests
.gitignore
ChangeLog.md
LICENSE
Readme.markdown
Setup.hs
cabal.project.freeze
irc-simple.cabal

Readme.markdown

Простой tcp сервер для показа, как можно писать такие сервера на Haskell. Делать только сам транспортный уровень не очень интересно, и, хотя он и достаточно простой, без более высокоуровневой логики пример не показательный.

Конечно, за один вечер сделать нормальный irc сервер тяжело, если это конечно, не задача, на основе которой вы изучаете языки, как некоторые делают. Поэтому был реализован достаточно маленький сабсет, и подключить сервер к реальной irc сети будет нельзя. К тому же при реализации я решил продемонстрировать некоторые интересные моменты, которые могут быть бесполезны, или даже скорее вредны в реальном irc сервере.

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

  1. Service/Handle pattern - паттерн для разделения отвественности и инъекции зависимостей.

  2. Использование расширяемых исключений - расширяемые исключения достаточно старый и успешно используемый framework, но в данном случае я предпочел его переизобрести и сделать код, который явно отражает возможные ошибки в типе функций.

  3. Не использованы unliftio/safeexceptions и т.п. которые весьма спорные, хотя и могут уменьшить количество бойлерплейта

В целом я попытался сделать достаточно простой учебный проект, по которому, с одной стороны, можно рассказать, что и как работает, а с другой его можно рефакторить изменять и улучшать.

Я постараюсь добавить комментарии ко всему, что происходит, но рекомендованный порядок просмотра - сверху-вниз:

  1. app/server.hs - описание исполняемого файла разбор опций/
  2. src/Server.hs - описание серверной части, собственно на этом месте можно и закончить просмотр для тех, кому интересно только это
  3. src/Server/Handler.hs - описание пользовательских обработчиков
  4. src/Server/{Channel,User}.hs - серверная логика для работы с каналами и пользователями.
  5. src/Server/Internal.hs - внутренняя серверная логика и разговор об MTL
  6. src/Protocol{/Wire}.hs - разбор протоколов, парсеры и все дела
  7. src/Protocol/{Replies,Errors}.hs - специальные сообщения
  8. src/Protocol/Types.hs - типы в irc
  9. src/Uni.hs - просто файл ^_^

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

Так же я поздно заметил, что в irc text oriented протокол, чтобы приятно было работать в plain c, это можно было использовать и убрать часть вещей, например, можно было бы исключить Protocol.Message в виде большой ADT.

Ещё я не описал работу Uni, там есть интересные вещи, как типы генерируют код, если вопросы будут, то я добавлю ответы в следующих коммитах

Что и Как контрибьютить:

  1. Код написан за 1 вечер + часть дня на комментарии и не идеален, так что все исправления стиля и т.п. допускаются, и я буду рад.

  2. Более хорошее использование либ или другие либы: stm-conduit, streaming, megaparsec, len

  3. Если вдруг что-то непонятно, или есть вопросы, то issues и комментарии приветствуются

Спасибо, и успешного программирования, проектирования и тестированя!