Материал из Tkabber Wiki.
В этой статье изложеные общее, а местами и детальные, описание функции удаленного управления клиентом через командную строку, которую я хотел сделать, да все времени не хватало ... может и не хватит никогда. А так хоть мысли не потеряются :)
— 20:20, 21 сентября 2007 (MSD)
Содержание
Зачем это нужно
Для двух вещей:
- Выполнение XMPP-URI нужно, чтобы в браузеры можно было вписать tkabber -uri xmpp:<uri-команда> и все ссылки вида xmpp:tkabber@conference.jabber.ru?join заработали.
- Управление PEP состояниями нужно чтобы можно было указывать в плеерах что-то типа tkabber -pep "user-tune;artist=%a,album=%A" и будет автоматическое счастье для любителей сообщать что они слушает и нелюбителей смотреть на этот спам.
Межпроцессное взаимодействие
Для работы такой функции есстесственно нужно межпроцессное взаимодействие (IPC). Тикль предоставляет такую функцию: команда send. С помощью этой функции можно вызвать любую tcl-функцию в другом tcl-процессе и получить результат.
В файле xmppmime.tcl уже реализована похожая функциональност. Это реализация обработки xmpp-mime файлов.
Суть такого IPC в следующем. Есть принимающая и передающая сторона. Стандартно-запущенный ткаббер — принимающая сторона. Когда ткаббер запускается с параметром -mime, активизируется передающая функция, которая пытается найти запущенный ткаббер и вызвать в нем обработку файла с помощью send. Если удается то передающий процесс завершается. В случае ошибок или отсутствия принимающего процесса, выполняется обычный запуск ткаббера и обработка mime-файла.
Несколько соединений, несколько клиентов
Трудность заключается в том, что если запущенно несколько ткабберов и в каждом несколько соединений, то неизвестно от чьего имени выполнять команду.
Предлагаю следующее решение: Перед выполнением команды, передающая сторона собирает со всех запущенных экземпляров Ткаббера списки установленных соединений (JID-ы) и потом на основе правил изложенных ниже самостоятельно определяет какое соединение надо использовать и вызывает обработку только там, где надо. Т.е. эта логика на передающей стороне.
Алгоритмы
Алгоритмы выполнения команд и установки PEP-состояний, как я их представляю, очень отличаются и поэтому они будут освещены в разных разделах. Для каждой из этих двух частей будут затронуты вопросы кодировок, обработки и экранирования параметров командной строки, что делать если запущенно несколько ткабберов, и в каждом по несколько соединений.
Выполнение XMPP-URI команд
Примеры URI:
- xmpp:romeo@montague.net?message;subject=Test%20Message;body=Here%27s%20a%20test%20message — отправить сообщение
- xmpp:tkabber@conference.jabber.ru?join — присоединиться к конференции
- xmpp:romeo@montague.net?roster;name=Romeo%20Montague;group=Friends — диалог добавления пользователя в ростер
Полный список: http://www.xmpp.org/registrar/querytypes.html
Отличительные особенности алгоритма:
- команда должна быть выполнена только с одного соединения, если их несколько
- так как команда скорее всего будет инициирована самим пользователем, то возможны интерактивные диалоги с вопросами, например, с выбором JID-а
Экранирование
Экранирование в URI уже есть. Так как экранируются и пробелы, то URI скорее всего будет в одном параметре командной строки. Точнее должен быть. Если пробелы не экранировались, то это проблемы на вызывающей стороне — пусть берут в кавычки.
Кодировки
Заэкранированный текст (например поле subject=....) может содержать текст в любой кодировке, и зависит это, получается, от сайта, на котором была размещена ссылка. Это проблема, которую пока не знаю как решить. Возможно браузер может автоматом все перекодировать в utf-8? Сделать: проверить
Несколько соединений
Так как команда должна быть выполнена только с одного соединения, то предлагаю следующие варианты:
- Выбор соединения. Передающая сторона собирает список соединений со всех экземпляров ткаббера, затем предлагает пользователю выбрать.
- Список приоритетности. В параметрах командной строки пользователь указывает список JID-ов в порядке убывания приоритетности. Команда выполняется от имени первого JID-а из списка, который будет найден. Если не найден, то или выход с ошибкой или первый вариант с диалогом. Скорее всего выход с ошибкой, так как, если пользователь решил использовать список приоритетности, он явно не хотел никаких диалогов.
- По-умолчанию — первый вариант с диалогом.
Управление PEP-статусами
Отличительные особенности:
- несколько исполнителей — поменять PEP статус могут несколько соединений сразу
- так как изменение PEP статуса будет происходить автоматически, то важно отсутствие вопросов, диалогов и вообще какой либо деятельности требующей внимания пользователя.
Экранирование
Кодировки
Несколько соединений
См. также
- http://wiki.jabber.org/index.php/XMPP_URIs — регистрация протокола xmpp в браузере.
- http://www.jabber.org/jeps/jep-0147.html http://www.ietf.org/rfc/rfc4622.txt — стандарты на URI.
- http://www.jabber.org/registrar/querytypes.html зарегистрированные команды.