Я использую World of Warcraft API. И я хочу найти EventMessageFilter. Я могу сделать это, позвонив

ChatFrame_GetMessageEventFilters("event")

И для этого мне нужно передать событие чата, в моем случае CHAT_MSG_WHISPER_INFORM.

Итак, согласно API, расположенному по адресу

http://wowprogramming.com/docs/api/ChatFrame_GetMessageEventFilters

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

local myNewTable = filterTable = ChatFrame_GetMessageEventFilters("CHAT_MSG_WHISPER_INFORM")
for i in pairs(myNewTable) do
    print(asd[i])
end

И это затем распечатывает что-то вроде

function: 00000312498vn27842934c4

Я проверил с

type(asd[i])

И это действительно функция. Но как я могу получить его содержимое? Как мне с этим справиться?

0
Thomja 12 Авг 2015 в 21:52

2 ответа

Я хочу найти EventMessageFilter

Можете ли вы уточнить? Чей фильтр вы ищете и что собираетесь с ним делать?

это действительно функция.

Это то, что делает этот API: возвращает список функций, которые зарегистрированы как фильтры для определенного типа сообщения (через ChatFrame_AddMessageEventFilter).

Но как я могу получить его содержимое?

Вы не можете. WoW API не предлагает никаких средств для декомпиляции функций.

Если вы намерены самостоятельно фильтровать сообщения чата, вам вообще не нужно вызывать эту функцию. Просто вызовите ChatFrame_AddMessageEventFilter, чтобы добавить свой фильтр.

1
Mud 12 Авг 2015 в 22:44
Я хочу создать аддон, который будет шептать моим товарищам по гильдии и говорить им, какую цель вызывать. Но я хочу скрыть от себя эти шепотки, чтобы не получать кучу спама в своем чате. В настоящее время популярный аддон RP под названием TRP3 отключает мою возможность добавлять фильтр событий сообщений, чтобы отфильтровывать мои исходящие шепоты. Что я хочу сделать, так это найти событие фильтра чата TRP3, которое блокирует мое событие, чтобы временно отключить его. Я просто читал, что API вернуло таблицу фильтров, но тип их.
 – 
Thomja
12 Авг 2015 в 22:58
Итак, это классическая проблема XY. Ваша реальная проблема заключается в том, что «TRP3 отключает мою возможность добавлять фильтр событий сообщений». Как так? Что мешает вам вызвать ChatFrame_AddMessageEventFilter?
 – 
Mud
12 Авг 2015 в 23:02
Это просто не работает. Только если аддон отключен. Никаких ошибок lua ​​или ничего. Как будто фильтра событий нет.
 – 
Thomja
12 Авг 2015 в 23:07
Вы правильно вызываете ChatFrame_AddMessageEventFilter (имя события, функция)? Вы вызывали ChatFrame_GetMessageEventFilters до и после добавления фильтра, чтобы увидеть, что список фильтров увеличился на один? Можете ли вы найти свой фильтр в списке фильтров? Если он есть, проверили ли вы, что он вызывается (например, print('xxx'))? Пробовали ли вы всегда возвращать true, чтобы вообще можно было фильтровать сообщения? Вы зарегистрировались, чтобы получить это событие в первую очередь (через RegisterEvent)? Так далее и тому подобное. Это проблема, которую вам нужно решить.
 – 
Mud
12 Авг 2015 в 23:24
Да, использовался пример кода, который был ChatFrame_AddMessageEventFilter("CHAT_MSG_WHISPER_INFORM", function() print(1) return true end) Да, вызывал его до и после, он увеличивается на единицу. Как я должен найти его. Я просто вижу, что была добавлена ​​новая функция. Я не думаю, что это называется. Не получить ни одного в чате с кодом выше. Да, пытался всегда возвращать true с кодом выше.
 – 
Thomja
12 Авг 2015 в 23:40

Поэтому мне удалось решить мою проблему, удалив текущие фильтры, которые были установлены другим дополнением, а затем просто добавив свой собственный фильтр. Как заметил Мад. GMEF должен был возвращать функции. Теперь я вижу, как это имеет смысл. Но теперь я сделал код для удаления функций. Если вы хотите повторно добавить их позже, просто сохраните их в переменной, пока не закончите, но я не буду включать это в свой ответ. Я также чувствую, что мой ответ наполовину не по теме. Но чтобы ответить на мой собственный вопрос. Предполагается, что он возвращает функции, и вы не можете видеть содержимое этих функций. Это код, который я использовал для удаления функций, добавленных другим дополнением.

function rekkFilters()
local myFilters = ChatFrame_GetMessageEventFilters("CHAT_MSG_WHISPER_INFORM")
  for i in pairs(myFilters) do
    ChatFrame_RemoveMessageEventFilter("CHAT_MSG_WHISPER_INFORM", myFilters[i])
  end
end
local myFilters = ChatFrame_GetMessageEventFilters("CHAT_MSG_WHISPER_INFORM")
rekkFilters()
local myFilters = ChatFrame_GetMessageEventFilters("CHAT_MSG_WHISPER_INFORM")
if myFilters[1] ~= nil then
  rekkFilters()
end
0
Thomja 13 Авг 2015 в 00:02