AntiCAPS скрипт для публічних каналів MyChat Server | Всі статті |
Часто в чаті, особливо це стосується серверів, куди відкритий загальний доступ, з'являються люди, які пишуть всі свої повідомлення ОСЬ ТАКИМИ ВЕЛИКИМИ БУКВАМИ. Цим людям не знайомий мережевий етикет, і вони не знають, що текст у верхньому регістрі означає, що людина ДУЖЕ голосно говорить або кричить.
Це заважає іншим людям і за такі дії, як правило, карають модератори. Однак, модератори не роботи, і за всім не встежиш. Було б непогано перекласти контроль за такими «крикунами» на сервер, щоб він контролював це в автоматичному режимі, самостійно.
Відкриваємо редактор скриптів.
находимо подія 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. Якщо все правильно - ми побачимо таке повідомлення:
Якщо є помилки - то, наприклад, таке вікно:

І курсор автоматично встановиться на те місце в тексті скрипта, де транслятор знайшов помилку.
Завантажити вихідний код скрипта можна тут
Ще почитати: Приклад простого скрипта на MSL |


