Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Lex_Liven
Доброе время суток всем.
Есть такая задача - нужно запретить пользователям закрывать определенный автосоздаваемый канал. Я не нашел такой возможности в настройках и решил написать скрипт, который при закрытии канала снова загонял бы туда пользователя. Проблема в том, что такой функции я тоже не нашел.
Можно ли реализовать такую задачу?
===========================================
Вторая задача - обратная. Нужен "автокик" пользователя из определенного канала при входе, если пользователь не является членом группы "Продвинутые"...
===========================================
P.S.: Шикарное описание скриптовых функций... Неплохо было бы еще увидеть описание событий раздела EventScripts с указанием системных переменных... например так:
Код: Выделить всё
OnUserLeaveTextChannel (uin:integer;ChannelID:integer);
uin - UIN пользователя, покинувшего канал
ChannelID - ID канала, из которого вышел пользователь.
Аватара пользователя
Алексей Пикуров
Спасибо за пожелание, сделаем, я отпишу здесь, как это можно будет реализовать и приложу пример скрипта с комментариями.

P.S. Тему я перенёс в соответствующий раздел, думаю, это будет логичнее.
Аватара пользователя
Алексей Пикуров
Так, "допилили" скриптовый движок по вашей просьбе. Сможете пощупать в новой версии.

Итак, по порядку.

1. В MSL нет понятия "функция-событие", как в Delphi, например. Пока нет, мы над этим работаем и они появятся. Соответственно, в разделе скриптового движка на сервере не будет разделов OnChannelMassage и т.п., будут только разные скрипты, в которых внутри уже создатель скрипта сам решит, нужны ему какие-то события или нет.

2. Пока сия технология не реализована, схема работы такая: как только в чате что-то происходит, автоматически вызывается тот скрипт, какого рода событие произошло. Например, если сервер возбудил событие OnChannelMessage, то в скрипте, чтобы узнать, а где же было сказано сообщение, кто его сказал и в каком канале, нужно вызвать функцию mGetLastChannelMessage(var iUIN, iUID: integer;var sChannelName: string): string

Неудобно, в некотором роде, конечно, но работает.

Пример:
Код: Выделить всё
// логгирование всех сообщений каналов в текстовый файл
var
  sMsg, sChannelName: string;
  iUIN, iUID: integer;
begin
  sMsg := mGetLastChannelMessage(iUIN, iUID, sChannelName);
  AddLineToFile('c:\log_'+inttostr(iUID)+'.txt', sMsg);
end.


3. Как запретить всем пользователям выходить из какого-то канала?
Выйти они конечно смогут, но система должна бодро их загнать назад. Всё просто. Сначала смотрим, какой канал нам интересен. В MyChat клиенте или на сервере. Нам нужен UID канала. UID не изменяется, и если послезавтра будет создан такой же канал, он получит тот же самый UID. Итак, UID знаем. Допустим, нас интересует канал "main" и у него UID 1. Скрипт на событие OnUserLeaveTextChannel:
Код: Выделить всё
var
  iUIN, iUID: integer;
begin
  mGetCurrentTextChannelUID(iUIN, iUID);
 
    if iUID=1 then mJoinUserToTextChannel(iUIN, iUID);
end.

Что делает скрипт? Как только кто угодно покидает канал с UID=1, сервер сразу же загоняет юзера обратно в этот же канал.

4. Как запретить юзерам входить в какой-то канал? Вообще говоря, лучше сделать канал с паролем и автоматически туда загонять нужных пользователей. Но, если такого сделать по каким-то причинам нельзя, пишем вот такой скрипт:
Код: Выделить всё
var
  sGroupName: string;
  iUIN, iUID: integer;
begin
  mGetCurrentTextChannelUID(iUIN, iUID);
 
  sGroupName := mGetUserRoleName(iUIN);
 
  if (sGroupName='Администраторы') and (iUID=2) then mDeleteUserFromTextChannel(iUIN, iUID);
end.

Что делает скрипт? Как только юзер заходит в канал, скрипт проверяет, в какой группе находится юзер. Если это "Администраторы" и канал с UID=2 (пусть это будет "Секретные разговоры Начальства"), то сервер сразу же пинает пользователя из этого канала (обычный kick).

Ну и напоследок, насчёт хелпов. Да, они не идеальны, но доводить "до кондиции" их сейчас нельзя, потому что меняется архитектура и внешний вид редактора. В версии 4.10 будет то, что я здесь описал, а в более поздней я постараюсь реализовать события прямо в коде скрипта. Так будет правильнее и удобнее. К тому же, это позволит загружать на сервер несколько скриптов, обрабатывающих одни и те же события - без перемешивания их кода.
Аватара пользователя
Алексей Пикуров
В 4.10.2 реализована блокировка закрытия автосоздаваемого канала на сервере - viewtopic.php?p=5694#p5694

Скриптом, конечно, гибче - но функция не помешает. Легче галку в настройках поставить, чем править текст скрипта.
Lex_Liven
Спасибо, скрипт работает, но с интересным глюком.
Пользователя загоняет мгновенно, но аватар и ник в списке отображаются странно.
На скриншоте результат просмотра профиля этой "пустой" строки.

Проблема не так актуальна с появлением функции запрета, но, может быть, это укажет на какие-то проблемы со скриптовым движком?
Вложения
gluuuk.JPG
Аватара пользователя
Алексей Пикуров
В новых версиях проблемы решены. Обновитесь, пожалуйста.