Перейти к содержимому

Высокая работоспособность
Геодата, классы и способности, подземелья и рейды:
всё, как было на официальных серверах!
Без малого 15 лет работы
29 июня нашему проекту исполняется 15 лет,
старейший сервер рунета,
ни одного вайпа за этот срок!
Бесплатно и без доната
Наш проект является полностью бесплатным,
на нём отсутствует покупка игровых ценностей, влияющих на баланс.
Отсутствие лагов
Благодаря 4 мощным серверам и надежному провайдеру
в игре полностью отсутствуют лаги!
Трансфер с других серверов
Приходите к нам со своим персонажем,
воспользуйтесь БЕСПЛАТНОЙ
услугой по переносу персонажа на наш проект!
Высокий онлайн
Онлайн на всех наших мирах РЕАЛЬНЫЙ,
ежесуточно наши миры посещает более
12000 игроков!
Хорошая техподдержка
Четыре сотрудника, отвечающих за решение ваших вопросов,
всегда выслушают и обязательно помогут.
Мы предоставляем действительно качественный сервис!
Начать играть

Помогите дописать аддон


  • Авторизуйтесь для ответа в теме

Сообщений в теме: 17

#1 Pony1990

Отправлено 08 января 2018 - 17:02

Суть аддона в том, что если в моём чате найдено указанное слово, то сообщение не отображается.

Аддон не должен выводить в мой чат сообщения о получении кем то мута, о начале поля боя, и информативные сообщения от администрации.

Но почему то не работает.

Почему? Что не так?

(Я в луа коде не понимаю, это чей то изменённый аддон)

function Filter_System(self, event, ...)
local msg = ...
if string.find(msg, 'Персонаж') and string.find(msg, 'получил мут на') and string.find(msg, 'от представителя администрации') then return true, ... else return false, ... end
if string.find(msg, 'Ущелье') and string.find(msg, 'Песни Войны') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Альтеракская') and string.find(msg, 'долина') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Берег') and string.find(msg, 'древних') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Низина') and string.find(msg, 'Арати') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Око') and string.find(msg, 'Бури') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Уважаемые') and string.find(msg, 'игроки') then return true, ... else return false, ... end
end
ChatFrame_AddMessageEventFilter('CHAT_MSG_SYSTEM', Filter_System)

  • 1

Начать играть на Isengard?
Присоединяйтесь к нашему сообществу!
Играйте на самом работоспособном и стабильном русскоязычном WoW сервере без доната игровых ценностей!

#2 Osirisatte

Отправлено 08 января 2018 - 17:27

О! Старое благородное дело блокировки спама от администрации, пвп-объявлений и всякого, выкидывающего из атмосферы игры!

Дело хорошее.

Ознакомьтесь с понятием "регулярные выражения" и будет вам счастье.


  • 0

#3 loTEDve

loTEDve

Отправлено 08 января 2018 - 17:47

 

Суть аддона в том, что если в моём чате найдено указанное слово, то сообщение не отображается.

Аддон не должен выводить в мой чат сообщения о получении кем то мута, о начале поля боя, и информативные сообщения от администрации.

Но почему то не работает.

Почему? Что не так?

(Я в луа коде не понимаю, это чей то изменённый аддон)

function Filter_System(self, event, ...)
local msg = ...
if string.find(msg, 'Персонаж') and string.find(msg, 'получил мут на') and string.find(msg, 'от представителя администрации') then return true, ... else return false, ... end
if string.find(msg, 'Ущелье') and string.find(msg, 'Песни Войны') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Альтеракская') and string.find(msg, 'долина') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Берег') and string.find(msg, 'древних') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Низина') and string.find(msg, 'Арати') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Око') and string.find(msg, 'Бури') and string.find(msg, 'Начинается!') then return true, ... else return false, ... end
if string.find(msg, 'Уважаемые') and string.find(msg, 'игроки') then return true, ... else return false, ... end
end
ChatFrame_AddMessageEventFilter('CHAT_MSG_SYSTEM', Filter_System)

 

Нужно просто прочитать то, что скопипащено:

 

Добавили функцию фильтрации системных сообщений - отлично.

 

Получили системное сообщение "Ущелье Песни войны начинается" - выполняем фильтрацию по функции.

 

Первое условие фильтрующей функции: если в системном сообщении содержится "Персонаж" и содержится "получил мут на" и содержится "от представителя администрации"... условие не выполнено для сообщения "Ущелье Песни войны начинается", выполняем секцию "else" условия.

 

Секция else условия - вернуть значение "false, ..." и прекратить дальнейшее выполнение функции.


  • 3

#4 Shadowlike

Отправлено 08 января 2018 - 17:56

Сделайте аддон, чтобы когда я перемещаю поиск спутников в отдельное окно, то в общем сообщения поиск спутников не отображались.  

 

1) Потому что в общем окне инфа о луте и т.п.

2) в поиске спутников постоянно куча сообщений в секунду  и даже рола не видно


А ну да, это же баг серва


  • 0

#5 Solvestram

Отправлено 08 января 2018 - 18:02

Сделайте аддон, чтобы когда я перемещаю поиск спутников в отдельное окно, то в общем сообщения поиск спутников не отображались.  

 

1) Потому что в общем окне инфа о луте и т.п.

2) в поиске спутников постоянно куча сообщений в секунду  и даже рола не видно


А ну да, это же баг серва

 

Для этого аддон не нужен, это можно отключить в настройках окна чата


  • 1

#6 Shadowlike

Отправлено 08 января 2018 - 19:17

Для этого аддон не нужен, это можно отключить в настройках окна чата

Просвети. Сколько играл на пиратках - у меня по умолчанию такого небыло. А тут я и тип чата менял "класический" и "мгновенные сообщения" - чего не изменилось


Ну нашел я в настройках отдельных окон отображение ролла и т.п. Но мне нужно не это. Я просто хочу, чтобы после нажатия "Переместить в новое окно", то чтоб оно ПЕРЕМЕЩАЛО, а не КОПИРОВАЛО


  • 0

#7 Solvestram

Отправлено 08 января 2018 - 19:40

Просвети. Сколько играл на пиратках - у меня по умолчанию такого небыло. А тут я и тип чата менял "класический" и "мгновенные сообщения" - чего не изменилось


Ну нашел я в настройках отдельных окон отображение ролла и т.п. Но мне нужно не это. Я просто хочу, чтобы после нажатия "Переместить в новое окно", то чтоб оно ПЕРЕМЕЩАЛО, а не КОПИРОВАЛО

Нажимаешь правой кнопкой на вкладку "Общий" -> Параметры  -> Глобальные каналы -> снимаешь галочку с Поиск Спутников


  • 0

#8 Pony1990

Отправлено 08 января 2018 - 20:23

Нужно просто прочитать то, что скопипащено:

 

Добавили функцию фильтрации системных сообщений - отлично.

 

Получили системное сообщение "Ущелье Песни войны начинается" - выполняем фильтрацию по функции.

 

Первое условие фильтрующей функции: если в системном сообщении содержится "Персонаж" и содержится "получил мут на" и содержится "от представителя администрации"... условие не выполнено для сообщения "Ущелье Песни войны начинается", выполняем секцию "else" условия.

 

Секция else условия - вернуть значение "false, ..." и прекратить дальнейшее выполнение функции.

 

Эх... без перебродившего яблочного сока не разобраться. Нас в ТурбоПаскале учили..

А многоточия это что такое? Просто перменная так названа? Её можно заменить, например, на Х? Или это синтаксис луа-кода?


  • 0

#9 Shadowlike

Отправлено 08 января 2018 - 20:33

Нажимаешь правой кнопкой на вкладку "Общий" -> Параметры  -> Глобальные каналы -> снимаешь галочку с Поиск Спутников

А если я закрою вкладку? Обратно ставить галочку? Я такие операции делаю по несколько раз в день в зависимости от удобства и ситуации. Всегда. Понимаешь? Всегда на других пиратках я нажимал переместить в новое окно - чат появлялся в другом окне, а в общем оно автоматически отключало его.

Если тут не так, значит проблема в сервере. Может флаги какие в опкоде не реализованы....


  • 0

#10 loTEDve

loTEDve

Отправлено 08 января 2018 - 20:34

Эх... без перебродившего яблочного сока не разобраться. Нас в ТурбоПаскале учили..

А многоточия это что такое? Просто перменная так названа? Её можно заменить, например, на Х? Или это синтаксис луа-кода?

Многоточия - вариативное количество аргументов, например:

function one(a, b, c)
    print(a, b, c) --выведет this is test
end

function two(...) 
    one(...)
end

two("this", "is", "test")

То есть, это обыкновенные аргументы функции, просто они не указаны явно. Превратить их в явные можно, например, так:

function two(...)
    local a, b, c = ...
end

В случае с фильтрацией это используется потому, что в фильтр передается множество параметров (там около 13-14 штук - print(...) откроет тайну), но интересуют только два: фильтровать-ли и само сообщение (правильно - три, еще и счетчик сообщения, чтобы не фильтровать одни и то же по 2-3 раза на каждую вкладку чата), поэтому функция и принимает параметры в виде "..." обрабатывает нужные ей и возвращает тоже в виде "...".

 

Если бы такое не использовалось, пришлось бы явно указывать все 15 аргументов.


  • 1

#11 AsynS

Отправлено 08 января 2018 - 22:35

А чем аддон Prat то не устраивает? Там какие хочешь фильтры ставь.


  • 0

#12 Pony1990

Отправлено 08 января 2018 - 23:36

Вот так, вроде, работает:

function Filter_System(self, event, ...)
local msg = ...
if string.find(msg, 'Персонаж') and string.find(msg, 'получил мут на') and string.find(msg, 'от представителя администрации') then return true, ... end
if string.find(msg, '[80-80]') and string.find(msg, 'Начинается!') then return true, ... end
if string.find(msg, 'Уважаемые') and string.find(msg, 'игроки') then return true, ... else return false, ... end
end
ChatFrame_AddMessageEventFilter('CHAT_MSG_SYSTEM', Filter_System)

Но, почему, если добавить строки

if string.find(msg, 'получает добычу:') then return true, ... end
if string.find(msg, 'Ваша добыча:') then return true, ... end

if string.find(msg, 'цлк') then return true, ... end

то эти сообщения не фильтруются?


Сообщение отредактировал Pony1990: 08 января 2018 - 23:37

  • 0

#13 loTEDve

loTEDve

Отправлено 09 января 2018 - 01:05

Но, почему, если добавить строки
if string.find(msg, 'получает добычу:') then return true, ... end
if string.find(msg, 'Ваша добыча:') then return true, ... end
if string.find(msg, 'цлк') then return true, ... end
то эти сообщения не фильтруются?


Скорее всего потому, что это не системные сообщения... Проще всего дописать вывод сообщения через print и проверить - попадает ли оно в фильтр.


  • 1

#14 defusioner

Отправлено 09 января 2018 - 03:16

Сколько геморроя ради убрать три строки раз в час :р и то если в час
  • 0

eefd857c267b877567cd0073a1c4291c.png


#15 Pony1990

Отправлено 09 января 2018 - 11:40

Скорее всего потому, что это не системные сообщения... Проще всего дописать вывод сообщения через print и проверить - попадает ли оно в фильтр.

 

А если в строке function Filter_System(self, event, ...) заменить System на что то другое, отвечающее за фильтрацию не системных сообщений, а обычных сообщений от игроков? Или нет такого фильтра? Или это так не работает? Я знаю, что сообщения  о сборе добычи можно отключить в настройках чата. Мне просто было интересно почему блокируются не все слова...

И да, спасибо, сахарок.

 

 

Сколько геморроя ради убрать три строки раз в час :р и то если в час

 

Я хочу что бы в моём окне чата не было никаких ненужных мне сообщений. Чем меньше всяких раздражающих элементов на экране, тем лучше.


  • 0

#16 loTEDve

loTEDve

Отправлено 09 января 2018 - 12:02

А если в строке function Filter_System(self, event, ...) заменить System на что то другое, отвечающее за фильтрацию не системных сообщений, а обычных сообщений от игроков?

Это всего-лишь название функции и оно может быть любым удобным (лишь бы функция с таким именем существовала). Сам хук (привязку фильтра) организует вызов:

ChatFrame_AddMessageEventFilter('CHAT_MSG_SYSTEM', Filter_System)

... и "CHAT_MSG_SYSTEM" указывает что именно этой функцией (Filter_System) будет фильтроваться. Значение первой переменной указывает на фильтруемое событие (системное сообщение, сообщение в канале, сообщение о добыче), во второй переменной передается функция, которая выполнит фильтрацию. Кстати, можно и так:

ChatFrame_AddMessageEventFilter('CHAT_MSG_SYSTEM', function(self, event, ...)
    print(...);
end)

Или нет такого фильтра? Или это так не работает? Я знаю, что сообщения  о сборе добычи можно отключить в настройках чата. Мне просто было интересно почему блокируются не все слова...

Как это работает подробно указано в документации: http://wowprogrammin...sageEventFilter там же есть ссылки на поддерживаемые события: http://wowprogramming.com/docs/events

Из всего списка событий этим методом поддерживаются только начинающиеся с "CHAT_MSG_" (о чем, собственно, и сказано в документации). Очевидно, что для добычи нужен "CHAT_MSG_LOOT", для денег - "CHAT_MSG_MONEY".

 

Полезным вариантом была бы реализация фильтра предметов добычи, который бы отображал только предметы выше определенного уровня экипировки (или качества). Правда, все уже давно написано, хотя порой проще написать самостоятельно (там пару строчек добавить к имеющемуся на вовпрограмминге примеру), чем искать готовое...

 

Да, и функции лучше делать в данном случае локальными, потому что если какой-то другой аддон тоже использует такое же имя функции - Filter_System и разработчик того аддона тоже забыл про области видимости, то в итоге будет только одна функция с именем Filter_System: та, которая была загружена последней, т.е. возможна ситуация, когда будет работать чужая функция вместо своей.


  • 1

#17 Pony1990

Отправлено 09 января 2018 - 21:45

Это всего-лишь название функции и оно может быть любым удобным (лишь бы функция с таким именем существовала). Сам хук (привязку фильтра) организует вызов:

ChatFrame_AddMessageEventFilter('CHAT_MSG_SYSTEM', Filter_System)

... и "CHAT_MSG_SYSTEM" указывает что именно этой функцией (Filter_System) будет фильтроваться. Значение первой переменной указывает на фильтруемое событие (системное сообщение, сообщение в канале, сообщение о добыче), во второй переменной передается функция, которая выполнит фильтрацию.

 Теперь немного понятно что есть что. Спасибо.

 

 

Как это работает подробно указано в документации: http://wowprogrammin...sageEventFilter там же есть ссылки на поддерживаемые события: http://wowprogramming.com/docs/events
 

Там же есть пример фильтра, который скрывает сообщения, написанные в крик, если в них содержатся добавленные в фильтр слова о продаже золота:

function noGoldSpam(self,event,msg)
  local badWords = {"gold","%$","www","%.com","%.net","%.org"}
  local matchCount = 0;
  for _, word in ipairs(badWords) do
    if (string.match(msg, word)) then
      matchCount = matchCount + 1;
    end
  end
  if (matchCount > 1) then
    return true;
  else
    return false;
  end
end
ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL",noGoldSpam)

Я изменяю его (для проверки, что чаще всего кричат):

function noGoldSpam21(self,event,msg)
  local badWords = {"ЦЛК","цлк","Цлк"}
  local matchCount = 0;
  for _, word in ipairs(badWords) do
    if (string.match(msg, word)) then
      matchCount = matchCount + 1;
    end
  end
  if (matchCount > 1) then
    return true;
  else
    return false;
  end
end
ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL",noGoldSpam21)

Но почему то он не работает..

И имеет ли значение регистр букв? И если изменить CHAT_MSG_YELL на CHAT_MSG_SAY , то по идеи должны фильтроваться сообщения сказанные в /сказать?

Я не разбираюсь в программировании, просто логически додумываю. Читаю, но там всё равно надо знать основы.

И можно ли как то проверять работоспособность аддона после изменения строк в коде, не перезаходя в игру?


  • 0

#18 loTEDve

loTEDve

Отправлено 09 января 2018 - 21:55

Но почему то он не работает..
И имеет ли значение регистр букв?

Если используются русские символы, кодировка файла с кодом аддона должна быть UTF-8. Регистр букв значение, разумеется, имеет.

 

И если изменить CHAT_MSG_YELL на CHAT_MSG_SAY , то по идеи должны фильтроваться сообщения сказанные в /сказать?

Да.
 

И можно ли как то проверять работоспособность аддона после изменения строк в коде, не перезаходя в игру?

Команда "/reload" (без кавычек) - перезагрузит все, кроме изменений в TOC-файлах. В большинстве случаев куски можно проверить при помощи макросов, например:

/run print(string.match("мама мыла раму", "раму"))

  • 1


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей

UCaller Visa Mastercard Paypal Qiwi Robokassa Yookassa
Договор-оферта Условия возврата
Подробности - о сервере?
Играй на нашем сервере!
Бесплатный сервер WoW 3.3.5 Wrath of the Lich King - уже 16 лет мы радуем наших игроков, присоединяйся к ним!
Без доната! Всё работает!
Нет - продаже предметов, влияющих на игровой процесс. Да - высокой работоспособности - проверь!

Система лояльности

За внутриигровую активность Вы будете получать Сферы Лояльности, которые автоматически конвертируются в бонусы для покупок в магазине сервера:

  • Победа в матче на Арене: 15% от текущего рейтинга;
    (т.е. примерно 300 при рейтинге в 2000)
  • Победа в сражении на Полях Боя: 12.5% от текущего рейтинга;
    (т.е. примерно 500 при рейтинге в 4000)

(только при использовании системы Поиска Подземелий)

(только актуальные рейдовые подземелья - ЦЛК, РС и ИВК)

За каждые 100 Сфер Лояльности Вы получаете 1 бонусный рубль, который можете использовать для полной или частичной оплаты чего-нибудь нужного из магазина.


Участие в особом событии - Цареубийстве!

Кажд (для игроков Альянса) и кажд (для игроков Орды) с 16:00 до 22:00 (по московскому времени) проводится особое событие - Цареубийство!


Достаточно убить одного из предводителей противоположной фракции и получить награду: 2000 Сфер Лояльности! Следите за уведомлениями в чате...


Еженедельно можно получить 15000 Сфер Лояльности, после достижения данного значения бонусы за вышеперечисленные действия начисляться не будут.