Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Помощь по скриптам для PtokaX _ Определение профиля получателя сообщения

Автор: Damaks 16.8.2010, 14:56

Хотел улучшить свой http://mydc.ru/topic3516.html.

Задумка была следующая. При отсылки сообщения админу хаба сообщение оно не должно было фильтроваться. Профили, которым можно безбоязненно писать, должны были браться из таблицы:

Код
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,      -- Незарегистрированный пользователь
}



Автор: Setuper 16.8.2010, 15:20

Код
local tToUser = Core.GetUser(to)
if tToUser then
  local iProfile = tProfiles[tToUser.iProfile]
  if iProfile and iProfile == 1 then
    ...
  end
end

Автор: Ksan 16.8.2010, 15:58

Цитата
Но результата не добился.
- можно это поподробнее? В чём это выражалось?
Если ты не смог выцепить To, From - одно дело, если ты не смог их использовать удачно - другое...Уточни. А то совет Сетапера может пойти насмарку при первом варианте неудачи, что я описал..

Автор: Setuper 16.8.2010, 17:02

Он же написал строку, которая даёт to и from.
Достаточно применить код, написанный мною, вместе с написанной строкой.

Автор: Ksan 16.8.2010, 17:37

Он написал код, но он не написал, работает код или нет...он вообще не писал, где и какая проблема у него.

Автор: Damaks 16.8.2010, 19:31

Спасибо, получилось, проверял как мог, ошибок не обнаружил.
Дело было в том, что я не вводил локальную переменную, а пытался выкрутиться через 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)). Но мне эта функция не очень нравится, не рационально каждый раз отсылать всем, хоть и не часто бывает. Есть ли более простая альтернатива?

Спасибо.

Автор: Setuper 16.8.2010, 19:45

1) Действительно, разницы для интерпретатора нету, однако лишние нагромождения if-ами ухудшает читаемость кода, поэтому, если возможно, то лучше написать один if.
2) В птохе такой альтернативы нету.

Автор: Damaks 16.8.2010, 20:46

Спасибо за помощь, скрипты перезалил: http://mydc.ru/topic3516.html