Стандарт и его реализация

Эхи и сообщения

Имя эхи - от 3 до 120 символов: маленькие латинские буквы, цифры, символы подчёркивания, минуса и точки. Название должно содержать минимум одну точку. В старых версиях обязано заканчиваться на точку и число.

Примеры правильных названий эх: 1.1 ii.14 ii.about.14 to.ivan.15, my.beseda

Id сообщения (msgid) - уникальный номер, который генерируется станцией, как 20 первых символов base64 sha256-bin хэша сообщения.

Примечание: production-реализации нод заменяют в полученной base64-строке плюс (+) и слэш (/) либо их аналоги (- и _) на буквы "A" и "Z" соответственно, дабы убрать из msgid спецсимволы.

Сама эха представляет собой изнутри всего лишь список (массив) msgid, расположенных в определённом порядке. После каждого написанного/принятого сообщения его msgid добавляется в конец этого списка.

База данных

Простейшая база данных реализации IDEC и ii состоит из двух каталогов: echo/ и msg/. В msg/ хранятся сами сообщения (имя файла = msgid). В echo/ хранятся индексы сообщений, т.е. файлы эхоконференций (имя файла = название эхи).

Файл в echo/<эха> состоит из списка имён файлов сообщений, находящихся в msg/, по порядку, в конце пустая строка. Из-за простой структуры базы данных сообщения можно передавать даже оффлайн, на флешке: достаточно лишь положить сообщение в msg/ и в файле эхоконференции прописать его хэш (вручную или простейшим скриптом).

Хранить файлы на самом деле можно и в json, и в sqlite, и в любом другом формате на ваше усмотрение.

Получение данных

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

бандл (нод2нод)

Бандл - это полное, сформированное сообщение, уже имеющее идентификатор. Возможно, не одно.

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

Бандлу не нужен онлайн. Можно создать бандл со всеми нужными сообщениями и передать его любым способом - после его распаковки в базе создадутся все сообщения.

Формат кодирования:

msgid:text
msgid:text
msgid:text
и так далее

где text - это просто текстовый файл самого сообщения, кодированный base64 (все серверы обязаны принимать как обычный, так и urlsafe-словарь, генерируются же бандлы в формате обычного base64). Разделитель для бандла - новая линия (LF, код 10).

Формат текста в бандле

СтрокаПолеОписание
1tagsтеги (используются только для `repto` и для идентификатора `ii/ok`)
2echoareaосновная эхоконференция, в которую помещается сообщение
3dateчисло секунд от эпохи unix, в utc
4msgfromотправитель
5addrадрес отправителя (практического смысла не имеет, служит для того, чтобы узнавать, с какой станции пришло сообщение)
6msgtoпользователь, которому предназначено сообщение (либо All)
7subjтема сообщения
8-пустая строка
9 и далееmsgтекст сообщения
Формат тегов

Строки, разделённые слешами. Сначала ключ, потом значение и так далее.

Образец: ii/ok/repto/fjLkfrmjNvO4fjzlUs5U

Тег ii/ok проставляется обязательно. Требуется для совместимости с ii.

Пример текста
ii/ok/repto/IZXhLBKJx0rhx0lXYu3L
im.16
1455789357
Vasya
Lunar, 2
Pupkin
Re: Мое первое сообщение в эху

текст сообщения

Сообщения, которые отправляют поинты (msgline)

Перед отправкой этот файл кодируется base64.

СтрокаПолеОписание
1echoareaэхоконференция, в которую помещается сообщение
2msgtoпользователь, которому вы пишете (либо All, если обращаетесь ко всем)
3subjтема сообщения
4-пустая строка
5reptoесли начинается с @Repto:, то нода проставляет тэг repto (указывает id письма, на которое отвечаем). Иначе строка относится к тексту сообщения
6 и далееmsgтекст сообщения

Внимание!

Пример
im.16
All
Тестируем

@repto:2hEUbMAxKSA83vcmgU4s
И вот я пишу своё первое письмо в нашу секту.
Меня видно?