Open konelav opened 8 years ago
В русскоязычных мадах нет GMCP, в Былинах есть MSDP: http://muder.ru/blog/40.html. Может стоит рыть в его сторону?
Ну так не русскоязычными мадами едиными. Я вот в Aardwolf немного поигрываю. MSDP и GMCP братья-близнецы, из первого во второй (JSON) конверсия тривиальна. Я пока не веду речи о работе с самими данными в ядре жабы. Только инструменты для их получения скриптами. Идея в том, что на все про все (на все серверы и всех юзеров) всё равно не напасёшься, тем более в жабской парадигме минимализма. Но "ручки" и "рычажки" надо дать если не все, то все основные.
На западе жаба никому не нужна, у них есть куча более лучших клиентов. Ну, если чисто для себя делаешь, то дело твое. Не буду больше ни в чем убеждать.
Пока вырисовалось так (oob == out-of-band):
#oob [gmcp|msdp]
отобразить текущие включенные модули протоколов
#oob gmcp|msdp add|del <module>
добавить/удалить модуль протокола, для GMCP идёт управление списком core.supports.set, для MSDP списком запрашиваемых (REPORT) значений (только если они буду в REPORTABLE_VARIABLES).
#oob gmcp|msdp enable|disable
disable очищает список модулей, enable добавляет все известные основные (GMCP: core, char, group, comm; MSDP: ROOM, HEALTH и т.д.)
Доступ к данным осуществляется через псевдопеременные (значения сбрасываются при переподключении и не сохраняются в файлы, но доступны из TinTin и из скриптов jmc.GetVar()). В условиях очевидной необходимости жестко обеспечивать обратную совместимость, в именах переменных не может быть символов "." и "_", потому подход к именованию такой (на примере): 1) (GMCP) core.char.base.hp => $GmcpCoreCharBaseHp 2) (MSDP) ROOM VNUM => $MsdpRoomVnum и т.д., в том числе неполные идентификаторы $GmcpCoreCharBase, $MsdpRoom, $Msdp и т.п. принимающие значение JSON-представления соответствующих данныхю
Доступ к событиям получения новых данных осуществляется через триггерящееся сообщение, например:
#act {/^#oob GMCP char.*/} {#status 1 {$GmcpCharBaseHp/$GmcpCharMaxstatsMaxhp Hp};#drop}
Для скрипта отпарсить GMCP проблем нет никаких; доступ через событие jmc.RegisterHandler('Telnet' , ...'), при вызове обработчика в jmc.Event(0) и jmc.Event(1) лежит код телнет-команды и опция (250 и 201 для GMCP соответственно), а в jmc.Event(2) декодированные в соответствии с выбранной кодовой страницей данные. Остается только сделать что-то вроде
char = {};
eval(jmc.Event(2).replace(/ /,'='));
if (char.base.stats.hp < 100) {...}
Для того чтобы с MSDP было работать так же удобно, добавлен метод jmc.MSDP2GMCP(msdpdata), осуществляющий соответствующее преобразование, после которого можно делать всё то же самое. Ну и для симметрии jmc.GMCP2MSDP(gmcpdata).
Весьма полезно для мало-мальски современных мадов. Думаю, более чем достаточно всю обработку оставить скриптам, т.е. надо просто сделать объекту jmc событие получения GMCP-данных и метод отправки оных серверу.
Возможно, сюда же добавить поддержку MSDP: суть схожая, но потребуется больше работы в самой жабе.