Api обмена

Сайт

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

Схема параметров

Для обмена сообщениями в серверах ii используется понятие схемы параметров. Она представляет из себя строку, которая передаётся серверу через GET запрос, состоящую из слешей и того, что находится между ними. Пример: /u/e/echoname.100. Разные параметры этой схемы отвечают за разную выдачу или принятие информации сервером.

В настоящее время у нас используется схема /u/ (универсальная), поэтому обычно адрес сервера в клиенте должен прописываться в формате http://server-adress/u/ (для php ноды http://server-adress/ii-script.php?q=/u/).

обработчики /u/

/u/ - это запросы для обмена сообщениями, на которых и строится вся синхронизация.

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

/u/e/эха.номер/эха.номер/эха.номер...

Список сообщений из заданных эхоконференций, в формате:
эха
msgid
msgid
msgid
эха
msgid

Отличить эху от сообщения очень просто - в имени эхи есть точка, а в номере сообщения - нет.

/u/m/msgid/msgid/msgid...

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

GET /u/point/pauth/tmsg или POST /u/point

Передаёт пользовательское сообщение на ноду в виде запакованного текста base64 определённого формата (если сообщение передавать через get-запрос, то оно там уже обязано быть base64_urlsafe). pauth здесь - поинтовая строка авторизации, tmsg - закодированное base64 сообщение. В случае POST параметры называются так же: pauth и tmsg.

/u/push - push-ноды

Кроме отправки данных, ноды могут (но не обязаны) реализовывать формат push, который принимает нодовые сообщения. push - это бандл наоборот. если фетчинг скачивает бандлы, то push их проталкивает на другой узел (нодовый или пойнтовый).

Ноды, которые поддерживают /u/push, называются push-ноды. Сначала у них запрашивается список сообщений, которые уже есть в эхе, а затем через /u/push загружаются недостающие. Формат засылки можно найти на странице Расширения.

В настоящее время существует очень простая реализация транзитной push-ноды на php. Полноценная php нода также поддерживает push.

Простейший скрипт для push

# -*- coding: utf-8 -*-

import urllib,base64
cfg = [
    "http://ii-server.ru/u/",
    "echoarea.1",
    "echoarea.2"
]
NODECODE=cfg[0]

def get_echoarea(name):
    try: return open('echo/%s' % name).read().splitlines()
    except: return  []

def raw_msg(h):
    try: return open('msg/%s' % h).read()
    except: return ''

def mk_jt(mh,mb):
    return mh + ':' + base64.b64encode(mb)

def getl(l):
    print 'fetch %s' % l
    return urllib.urlopen(cfg[1][:-2] + l).read()

def postf(s,e):
    data = urllib.urlencode({'upush': s,'nauth': NODECODE, 'echoarea': e })
    u = urllib.urlopen(cfg[1] + 'push', data)
    return u.read()

for ea in cfg[2:]:
    oecho = set(getl('e/%s' % ea).splitlines())
    pushlist = [x for x in myecho if x not in oecho]
    sendlist = [mk_jt(x,raw_msg(x)) for x in pushlist]
    if sendlist:
        postf('\n'.join(sendlist),ea)

Другие схемы

/e/эха.номер

Выдаёт файл определённой эхоконференции для просмотра вручную. В обмене не применяется.

/m/msgid

Выдаёт сообщение из msg/, в обмене также не используется, служит для отладки.