Так, "допилили" скриптовый движок по вашей просьбе. Сможете пощупать в новой версии.
Итак, по порядку.
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 будет то, что я здесь описал, а в более поздней я постараюсь реализовать события прямо в коде скрипта. Так будет правильнее и удобнее. К тому же, это позволит загружать на сервер несколько скриптов, обрабатывающих одни и те же события - без перемешивания их кода.
Team lead
Чат со мной