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

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

MyDC.ru _ Kорзина _ Словить 3ий аргумент в lua...

Автор: Win32 5.8.2009, 17:19

Всем привет!
Пытаюсь словить данные из ячейки меню:

Код
Core.SendToNick(tUser.sNick, "$UserCommand 1 2 "..MenuWay..""..OpMenuW..""..OpMenuB.."Банить$<%[mynick]> !ban %[nick] %[line: причина бана:]|")

Ловлю так:
Код
function ChatArrival(tUser,sData)
sData = string.sub(sData,1,-2)
local _,_,cmd =string.find(sData, "%b<>%s+(%S+)")
local user = tUser.sNick
local _,_,CursorUser = string.find(sData, "%b<>%s+%S+%s+(%S+)")
local _,_,CursorReason = string.find(sData, ??????????????????????????????)

if ( cmd == "!ban" ) then
Core.SendToAll("<"..BotName.."> Пользователь "..CursorUser.." навсегда лишен права доступа на хаб по причине: "..CursorReason..". Наказал: "..user.."")
end
end


Вот там где вопросики что надо? Не могу словить причину бана. Не подскажете?
Заранее спасибо...

Пишу по идее на API2 для PtokaX 0.4.1. big_smile1.gif

Автор: Setuper 5.8.2009, 17:53

Код
function ChatArrival(tUser, sData)
  sData = sData:sub(1, -2)
  local sCmd, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(.+)"
  if sCmd and sCmd == "!ban" then
    Core.SendToAll("<"..BotName.."> Пользователь "..sNick.." навсегда лишен права доступа на хаб по причине: "..sReason..". Наказал: "..tUser.sNick)
  end
end

Автор: Win32 5.8.2009, 19:12

Спасибо, но теперь новая трабла.
Теперь сообщение кидается в чат нормально, но при этом НЕ выполняется команда.
Т.е. стандартная !ban <nick> <reason>
Что делать?

Хотя спасибо большое - я бан функциями напишу Ыыыыыы......... ))))

вот опять проблема...
Что не так?
Пишет что не знает такой функции как бан...
Что делать?

Код
function ChatArrival(tUser, sData)
  sData = sData:sub(1,-2)
  local sCmd, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(.+)"
  if sCmd and sCmd == "!ban" then
    Core.SendToAll("<"..BotName.."> Ïîëüçîâàòåëü "..sNick.." íàâñåãäà ëèøåí ïðàâà äîñòóïà íà õàá ïî ïðè÷èíå: "..sReason..". Íàêàçàë: "..tUser.sNick)
    Core.Ban(sNick,sReason,tUser.sNick,1)
    return true
  end
end


ошибка: [19:05] Синтаксис E:\Server\hub\scripts\Романтик хаб меню.lua:50: attempt to call field 'Ban' (a nil value)

Автор: Setuper 5.8.2009, 20:18

Код
BanMan.Ban(sNick, sReason, tUser.sNick, true)

Автор: Win32 6.8.2009, 0:53

Спасибо большое! Пока все получается, только вот одна мелочь....
Извините пожалуйста, а не подскажите как узнать ip юзера, если есть его ник и подразумивается, что он в данный момент на хабе?
Т.е. Мне надо создать переменныую с ip адресом определенного ника...
Заранее спасибо!

Автор: Jaska 6.8.2009, 1:07

local tUser = Core.GetUser(sNick)
local sIP = tUser.sIP

а вообще с птокой идет scripting-interface.txt почитай много полезного найдешь.

Автор: Win32 6.8.2009, 1:30

Блин... Скажите мне пожалуйста вот последнее и я от вас отстану!
Так я ловлю 3 параметра
local sCmd, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(.+)"
А если после ника еще ip будет передаваться, то как тогда?
Заранее спасибо.

Не так случайно?
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(%S+)%s+(.+)"

Автор: district 6.8.2009, 2:03

Цитата
как узнать ip юзера, если есть его ник и подразумивается, что он в данный момент на хабе?

вот с чем-чем, а с этим никаких проблем. способов тысяча и один.
Нужно получить табличного юзера и его tUser.sIP ( поле sIP таблицы tUser)
Онлайн юзера-таблицу можно получить например так :
Код
local tUser = Core.GetUser(tUser.sNick,true)


Цитата
Не так случайно?
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(%S+)%s+(.+)

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

Автор: Setuper 6.8.2009, 10:45

2Win32: Почитай тему: http://mydc.ru/topic266.html

Автор: Win32 8.8.2009, 0:51

Ребят, извините пожалуйста, но ничего не могу в той теме понять, хотя не настолько далёк от этого, знаю PHP...
Я хочу сказать, что я не ламер, которому просто надо скрипт поставить.
Хочу обучить Lua!
Без вашей помощи никак ;)

Объясните пожалуйста, как на моём примере словить 4 переменных.

Заранее спасибо )

Автор: Setuper 8.8.2009, 10:15

Ты всё правильно написал.

Код
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%S+)%s+(%S+)%s+(.+)


Данное регулярное выражение в методе будет действовать следующим образом:

%b<> - поиск в строке символов <> (не обязательно подряд идущих) - обрезание ника
%s+ - 1 или более пробельных символов
(%S+) - захват одного или более не пробельных символа и запись в переменную sCmd
%s+ - опять 1 или более пробельных символов
(%S+) - захват одного или более не пробельных символа и запись в переменную sIP
%s+ - опять 1 или более пробельных символов
(%S+) - захват одного или более не пробельных символа и запись в переменную sNick
%s+ - опять 1 или более пробельных символов
(.+) - захват всего оставшегося, то есть захват любого символа или символов (минимум 1 символ)


Однако, чтобы пользователь наверняка вводил ip адрес, лучше написать так:
Код
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%d+%.%d+%.%d+%.%d+)%s+(%S+)%s+(.+)

Автор: Win32 8.8.2009, 16:19

Ээээ.... Ну да. Только проблема вот в чем:

Код
local sCmd, sIP, sNick, sReason = sData:match"%b<>%s+(%S+)%s+(%d+%.%d+%.%d+%.%d+)%s+(%S+)%s+(.+)"
  if sCmd and sCmd == "!banip" then
    if ( tUser.iProfile == 0 or tUser.iProfile == 1 ) then
        if Core.GetUser(sNick) == nil then
            Core.SendToNick(tUser.sNick,"<"..BotName.."> Ïîëüçîâàòåëÿ ñ òàêèì íèêîì íåò â ñïèñêå þçåðîâ... ×òîáû çàáëîêèðîâàòü äàííûé íèê âîñïîëüçóéòåñü ìåíþ \"Âðåìåííî áàíèòü îïðåäåëåííûé ip àäðåñ ïîëüçîâàòåëÿ\"")
        else
            Core.SendToAll("<"..BotName.."> Ïîëüçîâàòåëü "..sNick.." ñ ip: "..sIP.." íàâñåãäà ëèøåí ïðàâà äîñòóïà íà õàá ïî ïðè÷èíå: "..sReason..". Íàêàçàë: "..tUser.sNick)
            Core.SendPmToNick(sNick,BotName,"Âû áûëè íàâñåãäà ëèøåíû ïðàâà äîñòóïà íà \"Ðîìàíòèê\" õàá ïî ïðè÷èíå: "..sReason..". Íàêàçàë: "..tUser.sNick)
            Core.SendPmToOps(BotName, "Ïîëüçîâàòåëü "..sNick.." ñ ip: "..sIP.." íàâñåãäà ëèøåí ïðàâà äîñòóïà íà õàá ïî ïðè÷èíå: "..sReason..". Íàêàçàë: "..tUser.sNick)
            BanMan.Ban(sIP, sReason, tUser.sNick, 0)
        end
    else
        Core.SendToNick(tUser.sNick,"<"..BotName.."> Íå äîñòàòî÷íî ïðàâ äëÿ èñïîëüçîâàíèÿ ýòîé êîìàíäû...")
    end
    return true
  end



получаю следующую ошибку:

[16:16] Синтаксис E:\Server\hub\scripts\Романтик хаб меню.lua:79: bad argument #1 to 'Ban' (table expected, got string)

IP, а чем ip должен быть как не строкой?



Извините за кодировку.

Автор: Setuper 8.8.2009, 16:41

Учись работать с описаниями функций.

Выдержка из файла scripting-interface.txt:

Цитата
Ban(tUser, sReason, sBy, bFull) - Perm ban user. Return nil when failed, true if success.
BanIP(sIP, sReason, sBy, bFull) - Perm ban given ip. Return nil when failed, true if success.


Поэтому должно быть так:
Код
BanMan.BanIP(sIP, sReason, tUser.sNick, 0)


В случае же использования функции Ban нужно ставить не ip, а таблицу пользователя!


P.S.
bad argument #1 to 'Ban' (table expected, got string) - переводится так: в первом аргументе функции 'Ban' ожидается таблица, а туда подставляется строка.

Автор: Win32 8.8.2009, 17:20

Ой. Извините. У меня в описаниях функций нет функции. BanIP :(

Спасибо большое )

А вот еще аопросик. Функиця BanIP() банит, но не отключает рользователя. Это ошибка или это так задумано?
И как осуществить отключение?

Заранее спасибо.

Автор: Jaska 8.8.2009, 18:40

Если бы была ошибка, PtokaX тебе бы об этом сообщила это первое, и второе, обратимся опять таки к scripting-interface: Return nil when failed, true if success. Если у нас забанило значит функция вернула true. Тоесть все верно. Чтобы отключить пользователя нужно воспользоваться:

Core.Disconnect(sNick) - Disconnect user with given nick. Return nil when failed, true when success.
Core.Disconnect(tUser) - Disconnect user. Return nil when failed, true when success.

Опять таки scripting-interface не читаешь! Там ведь все есть big_smile.gif все на доступном английском.

Автор: Win32 8.8.2009, 19:16

Всё. Спасибо большое. Разобрался во всём!
Еще раз спасибо!