Часто в чате, особенно это касается серверов, куда открыт общий доступ, появляются люди, которые пишут все свои сообщения ВОТ ТАКИМИ БОЛЬШИМИ БУКВАМИ. Этим людям незнаком сетевой этикет, и они не знают, что текст в верхнем регистре означает, что человек ОЧЕНЬ громко говорит или кричит.
Это мешает остальным людям и за такие действия, как правило, наказывают модераторы. Однако, модераторы не роботы, и за всем не уследишь. Было бы неплохо переложить контроль за такими «крикунами» на сервер, чтобы он контролировал это в автоматическом режиме, самостоятельно.
Открываем редактор скриптов.
Находим событие OnChannelMessage в дереве событий слева.
И пишем такой скрипт:
function AntiCAPSFilter(input_st:string;max_percent:byte):string; var i, n, nonspace_count:integer; begin nonspace_count:=0; n:=0; for i:=1 to length(input_st) do begin if input_st[i]<>' ' then inc(nonspace_count); if ((input_st[i]>='A') and (input_st[i]<='Z')) or ((input_st[i]>='А') and (input_st[i]<='Я')) or (input_st[i]='І') or (input_st[i]='Ї') or (input_st[i]='Є') then inc(n); end; if round(n*100/nonspace_count)>=max_percent then result:=LowerCase(input_st) else result:=input_st; end; var s, chname:string; uin, uid:integer; begin s:=mGetLastChannelMessage(uin, uid, chname); // AntiCAPS filter s:=AntiCAPSFilter(s,70); mModifyLastChannelMessage(uin, uid, s); end.
Разберём его подробно. Главная часть скрипта — это самый нижний участок кода
var s, chname:string; uin, uid:integer; begin s:=mGetLastChannelMessage(uin, uid, chname); // AntiCAPS filter s:=AntiCAPSFilter(s,70); mModifyLastChannelMessage(uin, uid, s); end.
Сначала, когда срабатывает событие OnChannelMessage, мы вычитываем в текстовую переменную сообщение, которое только что кто-то отправил в канал:
s:=mGetLastChannelMessage(uin, uid, chname);
mGetLastChannelMessage — это функция языка MSL для получения текста сообщения в канале.
uin — это уникальный идентификатор пользователя, который отправил сообщение,
uid — идентификатор текстового канала, chname – текстовое название канала.
После получения текста сообщения мы вызываем функцию AntiCAPSFilter:
s:=AntiCAPSFilter(s,70);
Эта функция, при необходимости, будет модифицировать наше сообщение. Число 70 — это порог срабатывания фильтра в процентах. Если в исходном сообщении букв, написанных в верхнем регистре будет больше 70 процентов, то сообщение будет приведено к нижнему регистру. Если же нет – то оставлено, как есть.
После этого мы вызываем процедуру mModifyLastChannelMessage, которая модифицирует исходное сообщение.
После того, как отработал скрипт, сервер разошлёт пользователям в канал уже изменённое сообщение.
Теперь обратим внимание на функцию AntiCAPSFilter и прокомментируем исходный код:
function AntiCAPSFilter(input_st:string;max_percent:byte):string; var i, n, nonspace_count:integer; begin nonspace_count:=0; // счётчик для не-пробельных символов n:=0; // количество букв в верхнем регистре for i:=1 to length(input_st) do begin // цикл для прохода по строке if input_st[i]<>' ' then inc(nonspace_count); // увеличиваем счётчик букв if ((input_st[i]>='A') and (input_st[i]<='Z')) // если символ в верхнем регистре и это буква or ((input_st[i]>='А') and (input_st[i]<='Я')) // английского, русского или украинского алфавита or (input_st[i]='І') or (input_st[i]='Ї') or (input_st[i]='Є') then inc(n); // то увеличиваем счётчик end; // обычная пропорция для подсчёта процентного содержания букв в верхнем регистре // относительно всего сообщения // если предел достигнут - то преобразовываем всё сообщение в верхний регистр // с помощью функции LowerCase if round(n*100/nonspace_count)>=max_percent then result:=LowerCase(input_st) else result:=input_st; // иначе возвращаем исходное сообщение без модификаций end;
И не забудьте поставить галочку «включить скрипт» на панели инструментов, иначе он просто не запустится.
Чтобы проверить синтаксическую правильность скрипта — жмём Ctrl+F9. Если всё правильно — мы увидим такое сообщение:
Если есть ошибки — то, например, такое окно:
И курсор автоматически установится на то место в тексте скрипта, где транслятор нашёл ошибку.
Скачать исходный код скрипта можно здесь