nerevar / jmc

JMC - Jaba Mud Client
25 stars 15 forks source link

Поддержка GMCP #63

Open konelav opened 8 years ago

konelav commented 8 years ago

Весьма полезно для мало-мальски современных мадов. Думаю, более чем достаточно всю обработку оставить скриптам, т.е. надо просто сделать объекту jmc событие получения GMCP-данных и метод отправки оных серверу.

Возможно, сюда же добавить поддержку MSDP: суть схожая, но потребуется больше работы в самой жабе.

Muderru commented 8 years ago

В русскоязычных мадах нет GMCP, в Былинах есть MSDP: http://muder.ru/blog/40.html. Может стоит рыть в его сторону?

konelav commented 8 years ago

Ну так не русскоязычными мадами едиными. Я вот в Aardwolf немного поигрываю. MSDP и GMCP братья-близнецы, из первого во второй (JSON) конверсия тривиальна. Я пока не веду речи о работе с самими данными в ядре жабы. Только инструменты для их получения скриптами. Идея в том, что на все про все (на все серверы и всех юзеров) всё равно не напасёшься, тем более в жабской парадигме минимализма. Но "ручки" и "рычажки" надо дать если не все, то все основные.

Muderru commented 8 years ago

На западе жаба никому не нужна, у них есть куча более лучших клиентов. Ну, если чисто для себя делаешь, то дело твое. Не буду больше ни в чем убеждать.

konelav commented 8 years ago

Пока вырисовалось так (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).