Дневник разработки ICQ сервиса. Часть III

Продолжение истории разработки ICQ-совместимого сервиса, CLSID и то, как я чинила одну возможность, а получилось две.

Дневник разработки ICQ сервиса. Часть III

Мне всё же не давало покоя желание понять каким образом происходит обмен расширенными статусами у того же QIP («Дома», «На работе» и тд), поскольку при их выборе всегда приходила назначенный на группу этих статусов дефолтный статус («Онлайн», «Отошёл и тд»).

Какое-то время понаблюдав за дампами запросов поняла что изменение статусов провоцирует отправку запроса с CLSIDs клиента, и для каждого статуса некоторые его поля изменяются, и что же я решила? Правильно! — просто пересылать тем, у кого данный пользователь в списке контактов всю эту пачку CLSID, одновременно с этим прикопав Capabilities у клиента (пока лишь в локальной сессии, без записи в сессионную распределённую БД.

После этого я увидела что статусы начали отображаться, но одновременно с этим меня шокировало то, что и mood стали приходить, правда лишь идентификаторы иконок без текста статуса

Так я поняла что эти статусы передаются посредством кастомных CLSID, но далее я увидела то, чего не ожидала увидеть: с клиента начали прилетать уведомления о наборе сообщения и ещё множество новых событий

0070: 00 01 00 01 00 00 4F 00 3B 60 B3 EF D8 2A 6C 45  |......O.;`...*lE|
0080: A4 E0 9C 5A 5E 67 E8 65 08 00 2A 00 00 00 53 63  |...Z^g.e..*...Sc|
0090: 72 69 70 74 20 50 6C 75 67 2D 69 6E 3A 20 52 65  |ript Plug-in: Re|
00A0: 6D 6F 74 65 20 4E 6F 74 69 66 69 63 61 74 69 6F  |mote Notificatio|
00B0: 6E 20 41 72 72 69 76 65 00 00 01 00 00 00 00 00  |n Arrive........|
00C0: 00 00 00 00 00 00 00 14 01 00 00 10 01 00 00 3C  |...............<|
00D0: 4E 3E 3C 51 55 45 52 59 3E 26 6C 74 3B 51 26 67  |N><QUERY>&lt;Q&g|
00E0: 74 3B 26 6C 74 3B 50 6C 75 67 69 6E 49 44 26 67  |t;&lt;PluginID&g|
00F0: 74 3B 73 72 76 4D 6E 67 26 6C 74 3B 2F 50 6C 75  |t;srvMng&lt;/Plu|
0100: 67 69 6E 49 44 26 67 74 3B 26 6C 74 3B 2F 51 26  |ginID&gt;&lt;/Q&|
0110: 67 74 3B 3C 2F 51 55 45 52 59 3E 3C 4E 4F 54 49  |gt;</QUERY><NOTI|
0120: 46 59 3E 26 6C 74 3B 73 72 76 26 67 74 3B 26 6C  |FY>&lt;srv&gt;&l|
0130: 74 3B 69 64 26 67 74 3B 63 41 77 61 79 53 72 76  |t;id&gt;cAwaySrv|
0140: 26 6C 74 3B 2F 69 64 26 67 74 3B 26 6C 74 3B 72  |&lt;/id&gt;&lt;r|
0150: 65 71 26 67 74 3B 26 6C 74 3B 69 64 26 67 74 3B  |eq&gt;&lt;id&gt;|
0160: 41 77 61 79 53 74 61 74 26 6C 74 3B 2F 69 64 26  |AwayStat&lt;/id&|
0170: 67 74 3B 26 6C 74 3B 74 72 61 6E 73 26 67 74 3B  |gt;&lt;trans&gt;|
0180: 33 32 26 6C 74 3B 2F 74 72 61 6E 73 26 67 74 3B  |32&lt;/trans&gt;|
0190: 26 6C 74 3B 73 65 6E 64 65 72 49 64 26 67 74 3B  |&lt;senderId&gt;|

К сожалению каким образом обмениваться текстом статусов я не особо пока поняла, скорее всего нужно будет слать XML с title и desc блоками, судя по libpurple, может когда-нибудь до этого дойдут руки.

Между делом давно обращаю внимание на то, что при выборе «настроения» отправляется SNAC пакет со статусом, но содержащий текст настроения и идентификатор его иконки (icqmood18 например).

Пробовала его пересылать как статус, но ничего с этого не вышло, а в исходниках libpurle фигурирует несколько логик обработки статусов — одна через title и desc поля в XML, а другая как раз ожидающая mood, я так понимаю что вторая логика нечто вроде old-style, но доказать я этого пока не могу

Заодно прикрутила пересылку уведомлений о наборе текста, теперь сразу +50 к вайбу

Подруга активно помогает в тестировании

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

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

Также заодно решила выкатить сборку с уже давно закоммиченным переходом на джавовый virtual threads, что сразу же снизило нагрузку в простое со 110% до 1%, также было отмечено повышение скорости отклика системы!

Авторизация проходит быстрее, обмен статусами и сообщениями стали мгновенными.

Часть кода хочется переписать, но ресурсов на это сейчас нет и неизвестно когда появятся (и появятся ли вообще), поскольку в конце года я планировала переписать сервис на golang, даже хендлер накидала, но дальше дело не пошло.

P.S. Оказалось, что всё-таки QIP 2005 отлично работает с моей реализацией, достаточно было лишь поставить галочку «Enable security-что-то там», даже старые известные протоколы поиска работают (simple search), и даже mood тексты приходили!

P.S. 2: Благодаря исходникам miranda-ng я нашла type для определения вместимости группы, отсутствие которого не позволяло добавлять контакты через приложения – 0x0C в 0x0013 0x0002 запросе (SERVER_SIDE_INFORMATION SSI_REQUEST_PARAMS)