myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Тема закрытаНачать новую тему

> Словить 3ий аргумент в lua..., Помогите дописать...

Теги
Нет тегов для показа
Win32
сообщение 5.8.2009, 17:19
Сообщение #1


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




Всем привет!
Пытаюсь словить данные из ячейки меню:
Код
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
Go to the top of the page
+Quote Post
Setuper
сообщение 5.8.2009, 17:53
Сообщение #2


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Код
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


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 5.8.2009, 19:12
Сообщение #3


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




Спасибо, но теперь новая трабла.
Теперь сообщение кидается в чат нормально, но при этом НЕ выполняется команда.
Т.е. стандартная !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)
Go to the top of the page
+Quote Post
Setuper
сообщение 5.8.2009, 20:18
Сообщение #4


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




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


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 6.8.2009, 0:53
Сообщение #5


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




Спасибо большое! Пока все получается, только вот одна мелочь....
Извините пожалуйста, а не подскажите как узнать ip юзера, если есть его ник и подразумивается, что он в данный момент на хабе?
Т.е. Мне надо создать переменныую с ip адресом определенного ника...
Заранее спасибо!
Go to the top of the page
+Quote Post
Jaska
сообщение 6.8.2009, 1:07
Сообщение #6


Освоившийся участник
*****

Группа: Администраторы
Сообщений: 344
Регистрация: 2.6.2008
Из: RB,Ufa
Пользователь №: 8
Спасибо сказали: 106 раз




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

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


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 6.8.2009, 1:30
Сообщение #7


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




Блин... Скажите мне пожалуйста вот последнее и я от вас отстану!
Так я ловлю 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+(.+)"
Go to the top of the page
+Quote Post
district
сообщение 6.8.2009, 2:03
Сообщение #8


Постоялец
******

Группа: Пользователи
Сообщений: 454
Регистрация: 17.10.2008
Из: Новосибирск
Пользователь №: 825
Спасибо сказали: 90 раз




Цитата
как узнать 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 может передаваться, а может и нет) - то, если его не будет, вся последующая структура захватов будет порушена, тут нужна более тонкая работа с захватами.


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 6.8.2009, 10:45
Сообщение #9


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




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


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 8.8.2009, 0:51
Сообщение #10


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




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

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

Заранее спасибо )
Go to the top of the page
+Quote Post
Setuper
сообщение 8.8.2009, 10:15
Сообщение #11


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Ты всё правильно написал.
Код
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+(.+)


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 8.8.2009, 16:19
Сообщение #12


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




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

Код
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 должен быть как не строкой?



Извините за кодировку.
Go to the top of the page
+Quote Post
Setuper
сообщение 8.8.2009, 16:41
Сообщение #13


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




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

Выдержка из файла 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' ожидается таблица, а туда подставляется строка.


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 8.8.2009, 17:20
Сообщение #14


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




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

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

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

Заранее спасибо.
Go to the top of the page
+Quote Post
Jaska
сообщение 8.8.2009, 18:40
Сообщение #15


Освоившийся участник
*****

Группа: Администраторы
Сообщений: 344
Регистрация: 2.6.2008
Из: RB,Ufa
Пользователь №: 8
Спасибо сказали: 106 раз




Если бы была ошибка, 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 все на доступном английском.


Спасибо сказали:
Go to the top of the page
+Quote Post
Win32
сообщение 8.8.2009, 19:16
Сообщение #16


Начинающий
*

Группа: Пользователи
Сообщений: 11
Регистрация: 3.7.2009
Пользователь №: 3 771
Спасибо сказали: 0 раз




Всё. Спасибо большое. Разобрался во всём!
Еще раз спасибо!
Go to the top of the page
+Quote Post

Тема закрытаНачать новую тему
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 



RSS Сейчас: 26.11.2024, 22:47