Определение профиля получателя сообщения |
Здравствуйте, гость ( Вход | Регистрация )
Определение профиля получателя сообщения |
16.8.2010, 14:56
Сообщение
#1
|
|
Освоившийся участник Группа: Пользователи Сообщений: 260 Регистрация: 1.6.2010 Пользователь №: 6 968 Спасибо сказали: 83 раза |
Хотел улучшить свой Скрипт антирекламы.
Задумка была следующая. При отсылки сообщения админу хаба сообщение оно не должно было фильтроваться. Профили, которым можно безбоязненно писать, должны были браться из таблицы: Код local tProfiles = { -- Профили пользователей, которым разрешена реклама (0 - нет; 1 - да) [0] = 1, -- Мастер [1] = 1, -- Оператор [2] = 1, -- VIP [3] = 0, -- Зарегистрированный пользователь [-1] = 0, -- Незарегистрированный пользователь } То есть проверить соответствие профиля получателя сообщения одной из групп, здесь 1. Пытался использовать в роли получателя "to" из: Код local s,e,to,from,sNick,message = string.find(data, "%$To:%s(%S+)%sFrom:%s(%S+)%s$<(%S+)%>%s(.*)$") Но результата не добился. Может, использовал не те функции. Максимум, что получилось, - это вручную задать порядковые номера "избранных" в операторе "if", в этом примере 0,1,2. Но это очень неудобно, т.к. каждому нужно редактировать внутри кода, в зависимости от профилей и разрешений. Нужно сделать, чтобы получатель проверялся по таблице tProfiles. Так и не смог связать "to" и "tProfiles" в рабочую конструкцию. Пробовал полазить по другим скриптам, но тоже не нашёл. Вот тут я и завис, как это реализовать не знаю. Должна же быть какая-то конструкция, чтобы воплотить эту задумку в реальность. Причём универсальная, чтобы работала и в модифицированном скрипте, вроде: Код local tProfiles = { [0] = 1, -- Мастер [1] = 1, -- Оператор [2] = 2, -- VIP [3] = 2, -- Зарегистрированный пользователь [-1] = 0, -- Незарегистрированный пользователь } |
|
|
16.8.2010, 15:20
Сообщение
#2
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код local tToUser = Core.GetUser(to)
if tToUser then local iProfile = tProfiles[tToUser.iProfile] if iProfile and iProfile == 1 then ... end end |
|
|
16.8.2010, 15:58
Сообщение
#3
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Цитата Но результата не добился. - можно это поподробнее? В чём это выражалось?Если ты не смог выцепить To, From - одно дело, если ты не смог их использовать удачно - другое...Уточни. А то совет Сетапера может пойти насмарку при первом варианте неудачи, что я описал.. |
|
|
16.8.2010, 17:02
Сообщение
#4
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Он же написал строку, которая даёт to и from.
Достаточно применить код, написанный мною, вместе с написанной строкой. |
|
|
16.8.2010, 17:37
Сообщение
#5
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Он написал код, но он не написал, работает код или нет...он вообще не писал, где и какая проблема у него.
|
|
|
16.8.2010, 19:31
Сообщение
#6
|
|
Освоившийся участник Группа: Пользователи Сообщений: 260 Регистрация: 1.6.2010 Пользователь №: 6 968 Спасибо сказали: 83 раза |
Спасибо, получилось, проверял как мог, ошибок не обнаружил.
Дело было в том, что я не вводил локальную переменную, а пытался выкрутиться через tProfiles[to.iProfile]. А до этого ещё function get_profile_id(username). В результате получилось так (из упрощённого варианта скрипта для тестов): Код function ToArrival(user,data) local message = data:match('%b<>%s*(.+)|$') local s,e,to,from,sNick,message = string.find(data, "%$To:%s(%S+)%sFrom:%s(%S+)%s$<(%S+)%>%s(.*)$") local tToUser = Core.GetUser(to) if tToUser and message and tProfiles[user.iProfile]==0 and tProfiles[tToUser.iProfile]==0 then if is_forbidden(message, forbidden_patterns, allowed_patterns) then Core.SendToAll(botmyinfo) Core.SendPmToUser(user, sBot," *** "..block_message[1]) return true end end return false end Если позволите, ещё два небольших вопроса. 1) Для быстродействия что предпочтительнее, один оператор IF с несколькими AND (как в примере сверху) или лучше будет разделить его на отдельные вложенные операторы IF? Думал, что разницы нет, кроме экономии места, но хотелось бы услышать от людей более сведущих. 2) Описание бота, посылаемое при подключении, сбрасывалось при срабатывании скрипта или обновления списка пользователей. Поэтому пришлось после каждого заблокированного сообщения посылать инфу всем пользователям (Core.SendToAll(botmyinfo)). Но мне эта функция не очень нравится, не рационально каждый раз отсылать всем, хоть и не часто бывает. Есть ли более простая альтернатива? Спасибо.
Причина редактирования: ай ай ай просмотр чужих личных сообщений!
|
|
|
16.8.2010, 19:45
Сообщение
#7
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
1) Действительно, разницы для интерпретатора нету, однако лишние нагромождения if-ами ухудшает читаемость кода, поэтому, если возможно, то лучше написать один if.
2) В птохе такой альтернативы нету. |
|
|
16.8.2010, 20:46
Сообщение
#8
|
|
Освоившийся участник Группа: Пользователи Сообщений: 260 Регистрация: 1.6.2010 Пользователь №: 6 968 Спасибо сказали: 83 раза |
Спасибо за помощь, скрипты перезалил: Скрипт антирекламы для PtokaX
|
|
|
Похожие темы
|
Сейчас: 3.12.2024, 6:13 |