Версия для печати темы
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.
Автор: 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 не читаешь! Там ведь все есть все на доступном английском.
Автор: Win32 8.8.2009, 19:16
Всё. Спасибо большое. Разобрался во всём!
Еще раз спасибо!