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

Часто в чаті, особливо це стосується серверів, куди відкритий загальний доступ, з'являються люди, які пишуть всі свої повідомлення ОСЬ ТАКИМИ ВЕЛИКИМИ БУКВАМИ. Цим людям не знайомий мережевий етикет, і вони не знають, що текст у верхньому регістрі означає, що людина ДУЖЕ голосно говорить або кричить.

Це заважає іншим людям і за такі дії, як правило, карають модератори. Однак, модератори не роботи, і за всім не встежиш. Було б непогано перекласти контроль за такими «крикунами» на сервер, щоб він контролював це в автоматичному режимі, самостійно.

Відкриваємо редактор скриптів.

Редактор скриптів MyChat

находимо подія OnChannelMessage в дереві подій ліворуч.

Дерево скриптів MyChat

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

            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;
        

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

Увімкнення скрипта MyChat

Для перевірки синтаксичну правильність скрипта - тиснемо Ctrl + F9. Якщо все правильно - ми побачимо таке повідомлення:

Результат роботи скрипта

Якщо є помилки - то, наприклад, таке вікно:

Помилка скрипта MyChat

І курсор автоматично встановиться на те місце в тексті скрипта, де транслятор знайшов помилку.

Завантажити вихідний код скрипта можна тут



Служба поддержки