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. 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. if round(n*100/nonspace_count)>=max_percent then result:=LowerCase(input_st)
  18. else result:=input_st;
  19. end;
  20.  
  21. var
  22. s, chname:string;
  23. uin, uid:integer;
  24. begin
  25. s:=mGetLastChannelMessage(uin, uid, chname);
  26.  
  27. // AntiCAPS filter
  28. s:=AntiCAPSFilter(s,70);
  29.  
  30. mModifyLastChannelMessage(uin, uid, s);
  31. 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.  // цикл для проходу по рядку
  9.   for i:=1 to length(input_st) do begin 
  10.  // збільшуємо лічильник букв
  11.   if input_st[i]<>' ' then inc(nonspace_count); 
  12.  // якщо символ у верхньому регістрі і це буква
  13.   if ((input_st[i]>='A') and (input_st[i]<='Z'))
  14.  // англійського, російського чи українського алфавіту
  15.   or ((input_st[i]>='А') and (input_st[i]<='Я')) 
  16. or (input_st[i]='І') or (input_st[i]='Ї')
  17.   or (input_st[i]='Є') then inc(n); // то збільшуємо лічильник 
  18. end;
  19.  
  20.   // звичайна пропорція для підрахунку процентного вмісту букв у верхньому 
  21.   // регістрі щодо всього повідомлення
  22.   // якщо межа досягнута - то перетворюємо все повідомлення у нижній регістр
  23.   // за допомогою функції LowerCase
  24.  
  25. if round(n*100/nonspace_count)>=max_percent then result:=LowerCase(input_st)
  26.  // інакше повертаємо вихідне повідомлення без модифікацій
  27.   else result:=input_st; 
  28. end;
 

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

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

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

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

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

Ще почитати:

Приклад простого скрипта на MSL
Що таке UIN і навіщо він потрібен?
Як встановити чат в локальній мережі?

Всі статті  

 

 

Rambler's Top100