AntiCAPS скрипт для публичных каналов MyChat Server

AntiCAPS скрипт для публичных каналов MyChat Server

Все статьи

Часто в чате, особенно это касается серверов, куда открыт общий доступ, появляются люди, которые пишут все свои сообщения ВОТ ТАКИМИ БОЛЬШИМИ БУКВАМИ. Этим людям незнаком сетевой этикет, и они не знают, что текст в верхнем регистре означает, что человек ОЧЕНЬ громко говорит или кричит.

Это мешает остальным людям и за такие действия, как правило, наказывают модераторы. Однако, модераторы не роботы, и за всем не уследишь. Было бы неплохо переложить контроль за такими «крикунами» на сервер, чтобы он контролировал это в автоматическом режиме, самостоятельно.

Открываем редактор скриптов.

Находим событие OnChannelMessage в дереве событий слева.

И пишем такой скрипт:

  1. function AntiCAPSFilter(input_st:string;max_percent:byte):string;
  2. var
  3. i, n, nonspace_count:integer;
  4.  
  5. begin
  6. nonspace_count:=0;
  7. n:=0;
  8.  
  9. for i:=1 to length(input_st) do begin
  10. if input_st[i]<>' ' then inc(nonspace_count);
  11.  
  12. if ((input_st[i]>='A') and (input_st[i]<='Z'))
  13. or ((input_st[i]>='А') and (input_st[i]<='Я'))
  14. or (input_st[i]='І') or (input_st[i]='Ї')
  15. or (input_st[i]='Є') then inc(n);
  16. end;
  17.  
  18. if round(n*100/nonspace_count)>=max_percent then result:=LowerCase(input_st)
  19. else result:=input_st;
  20. end;
  21.  
  22. var
  23. s, chname:string;
  24. uin, uid:integer;
  25. begin
  26. s:=mGetLastChannelMessage(uin, uid, chname);
  27.  
  28. // AntiCAPS filter
  29. s:=AntiCAPSFilter(s,70);
  30.  
  31. mModifyLastChannelMessage(uin, uid, s);
  32. end.
 

Разберём его подробно. Головная часть скрипта - это самый нижний участок кода

  1. var
  2. s, chname:string;
  3. uin, uid:integer;
  4. begin
  5. s:=mGetLastChannelMessage(uin, uid, chname);
  6.  
  7. // AntiCAPS filter
  8. s:=AntiCAPSFilter(s,70);
  9.  
  10. mModifyLastChannelMessage(uin, uid, s);
  11. end.
 

Сначала, когда срабатывает событие OnChannelMessage, мы вычитываем в текстовую переменную сообщение, которое только что кто-то отправил в канал:

  1. s:=mGetLastChannelMessage(uin, uid, chname);
 

mGetLastChannelMessage – это функция языка MSL для получения текста сообщения в канале. uin – это уникальный идентификатор пользователя, который отправил сообщение, uid – идентификатор текстового канала, chname – текстовое название канала.

После получения текста сообщения мы вызываем функцию AntiCAPSFilter:

  1. s:=AntiCAPSFilter(s,70);
 

Эта функция, при необходимости, будет модифицировать наше сообщение. Число 70 – это порог срабатывания фильтра в процентах. Если в исходном сообщении букв, написанных в верхнем регистре будет больше 70 процентов, то сообщение будет приведено к нижнему регистру. Если же нет – то оставлено, как есть.

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

После того, как отработал скрипт, сервер разошлёт пользователям в канал уже изменённое сообщение.

Теперь обратим внимание на функцию AntiCAPSFilter и прокомментируем исходный код:

  1. function AntiCAPSFilter(input_st:string;max_percent:byte):string;
  2. var
  3. i, n, nonspace_count:integer;
  4. begin
  5. nonspace_count:=0; // счётчик для не-пробельных символов
  6. n:=0; // количество букв в верхнем регистре
  7.  
  8. for i:=1 to length(input_st) do begin // цикл для прохода по строке
  9. if input_st[i]<>' ' then inc(nonspace_count); // увеличиваем счётчик букв
  10.  
  11. if ((input_st[i]>='A') and (input_st[i]<='Z')) // если символ в верхнем регистре и это буква
  12. or ((input_st[i]>='А') and (input_st[i]<='Я')) // английского, русского или украинского алфавита
  13. or (input_st[i]='І') or (input_st[i]='Ї')
  14. or (input_st[i]='Є') then inc(n); // то увеличиваем счётчик
  15. end;
  16.  
  17. // обычная пропорция для подсчёта процентного содержания букв в верхнем регистре
  18. // относительно всего сообщения
  19. // если предел достигнут - то преобразовываем всё сообщение в верхний регистр
  20. // с помощью функции LowerCase
  21.  
  22. if round(n*100/nonspace_count)>=max_percent then result:=LowerCase(input_st)
  23. else result:=input_st; // иначе возвращаем исходное сообщение без модификаций
  24. end;
 

И не забудьте поставить галочку «включить скрипт» на панели инструментов, иначе он просто не запустится.

Чтобы проверить синтаксическую правильность скрипта – жмём Ctrl+F9. Если всё правильно – мы увидим такое сообщение:

Если есть ошибки – то, например, такое окно:

И курсор автоматически установится на то место в тексте скрипта, где транслятор нашёл ошибку.

Скачать исходный код скрипта можно здесь

Еще почитать:

Пример простого скрипта на MSL
Что такое UIN и зачем он нужен?
Как установить чат в локальной сети?

Все статьи  

 




Наши клиенты