Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
259bit
Добрый день. Стоит задача кастомизировать логику работы веб-суппорта. Возможно ли удаленному web-серверу (php) получить список пользователей онлайн?
Аватара пользователя
Алексей Пикуров
Здравствуйте.

Можно, почему нет. Протокол открыт, с php-скрипта вы можете подключиться к серверу и через сокеты залогиниться и достать всё, что нужно.

Опишите подробнее вашу задачу.
259bit
Соединение посетителя сайта только с пользователями mychat, которые онлайн.
Аватара пользователя
Алексей Пикуров
Вы хотите воспользоваться нашим WEB-суппортом или написать свой?
259bit
Собственно хотел немного модифицировать скрип вызова вашего суппорта.
То есть php-скриптом запросить список пользователей онлайн, отфильтровать по своим нуждам и вставить в вызов вашего js скрипта.
Про протокол понял, буду изучать. Спасибо.
Аватара пользователя
Алексей Пикуров
Я думаю, вам будет проще это сделать через Intergation API, чтобы не городить огород с соединением и авторизацией на сервере.

Я напишу простую функцию для вашей задачи и приведу пример. В версии 5.10 будет, ожидайте.
259bit
Спасибо!
Аватара пользователя
Алексей Пикуров
Команда готова. Предварительное описание: http://nsoft-s.com/mcserverhelp/mcserv. ... uslist.htm

Справка неполная, в процессе переделки, как и веб-админка, так что если будут вопросы - задавайте, я поясню.
259bit
Если я правильно понял, чтобы использовать Integration API, мне необходимо подключить к PHP mychat.dll?
Аватара пользователя
Алексей Пикуров
Нет, для этого mychat.dll не нужен.

Последовательность действий для работы с IntegrationAPI сильно упрощена.

  1. Открываете сокет-соединение с сервером MyChat по TCP 2004 (или другим, если у вас сервер настроен не на 2004 порт).
  2. Отправляете строку "mc5.0" и добавляете в конец CRLF (#13#10). Всего 7 байт.
  3. Читаете из сокета то, что шлёт сервер, сообщение заканчивается CRLF (#13#10). Можно это не анализировать, если вам это не нужно.
  4. Отправляете на сервер свой пакет. Пакет сформирован вот так:
    MagicPacket + cs_integration_api + IntToHex(iFlag, 2) + IntToHex(iCmd, 4) + JSONobj.AsJSon + CRLF

    MagicPacket - #23#6 (2 байта);
    cs_integration_api - "0077" (4 байта);
    iFlag - десятичное 48;
    IntToHex(iCmd, 4) - для вашего случая это команда "000F" (4 байта);
    JSONobj.AsJSon - JSON объект, описан в справке;
    CRLF - 2 байта, #13#10.
  5. ожидаете ответа от сервера, читаете сокет и парсите то, что пришло.
    ответ - это MagicPacket + JSON объект + CRLF.
259bit
Расскажите, пожалуйста, подробнее про MagicPacket - #23#6 (2 байта); Как мне его изобразить в php скрипте?
Гугл молчит как партизан.
Аватара пользователя
Андрей Раков
Это 2 символа с кодом 23 и 6, вы их можете заменить юникод представлением, что-то вроде "\u0017\u0006"
Аватара пользователя
Алексей Пикуров
К сожалению, у нас спецов по php нет, так сложилось. Поэтому придётся помучить гугл :)
259bit
Большое спасибо за новый функционал, все получилось!
Аватара пользователя
Алексей Пикуров
Пожалуйста. Может, поделитесь своим кодом для грядущих поколений?
259bit
Код: Выделить всё
<?php  
  $address = 'localhost'; //Адрес сервера
  $port = 2004; //Порт работы сервера
    if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { //Создаем сокет
    //AF_INET - семейство протоколов
    //SOCK_STREAM - тип сокета
    //SOL_TCP - протокол
    echo "Ошибка создания сокета";
  }; 
  $result = socket_connect($socket, $address, $port); //Подключаемся к серверу
  $msg_to_server = "mc5.0\r\n"; //Сообщение приветствия
  socket_write($socket, $msg_to_server, strlen($msg_to_server)); //Отправляем серверу сообщение
  $msg_from_server = socket_read($socket, 1024); //Обязательно читаем сообщение от сервера
 
  //Составляем пакет для запроса
  $unicode_magik_packet = '\u0017\u0006';  //Волшебный пакет
  $magik_packet = json_decode('"'.$unicode_magik_packet.'"'); //Кодируем в json
  $cs_integration_api = "0077";
  $iFlag = "48";
  $iCmd = "000F";
  $CRLF = "\r\n";
  $json_string = ('{"UINS":"8,10","ServerKey":"iddqd"}');
  $msg_to_server = $magik_packet.$cs_integration_api.$iFlag.$iCmd.$json_string.$CRLF;
  socket_write($socket, $msg_to_server, strlen($msg_to_server)); //Отправляем серверу сообщение
  $out_source = socket_read($socket, 1024); //Читаем сообщение от сервера
  $out_replace = str_replace($magik_packet,"",$out_source); //вырезаем магический пакет
  $out_array = json_decode($out_replace,true); //конвертируем json в массив
  print_r($out_array);  //смотрим что получилось
  if (isset($socket)) { //закрываем подключение
    socket_close($socket);
    }
 
?>
Аватара пользователя
Алексей Пикуров
Спасибо. Я обернул ваш текст в phpbb тег code, чтобы читать стало удобнее (с отступами).
Аватара пользователя
Алексей Пикуров
У вас есть опыт создания phpbb модов для форума phpbb?
259bit
Алексей Пикуров писал(а):У вас есть опыт создания phpbb модов для форума phpbb?

В данный момент нет, да и желания его получить в целом тоже.
Аватара пользователя
Алексей Пикуров
:) Просто мы недавно как раз занимались вопросом интеграции с phpbb, решение заработало, но хотелось бы его оформить отдельным модом для простоты, а не заставлять людей вкручивать наши исходники прямо в "боевой" работающий форум.

Ещё раз спасибо за исходник, наверняка он кому-то пригодится.
Аватара пользователя
SV
Наверно лучше сообщение отделить в отдельную тему, что бы потом проще искать.
Аватара пользователя
Алексей Пикуров
SV, какое именно сообщение?
Аватара пользователя
Алексей Пикуров
У нас планируется отдельный раздел на сайте для всевозможных интеграций MyChat с разными технологиями и софтом, там и разместим скрипт для отправки сообщений из php, немного модифицированный.
Аватара пользователя
Алексей Пикуров
Раздел справки для работы с MyChat Integration API: https://nsoft-s.com/mcserverhelp/index. ... ionapi.htm

Вся самая актуальная и свежая информация там.