Автор: THE STRELOK 18.3.2009, 7:51
Есть вопрос... Недавно я писал скрипт про бан ботом хаба(спасибо Setuper за помощь в доработке). При временном бане заметил, что время бана задаётся только в минутах. Я этого не знал, и поэтому писал стандартно время бана(например: 1h), но вместо времени 1h бан ставился на 1 мин. Попытался сделать таблицу времени:
Код
sTime = {
m=1,
h=60,
d=1440,
w=10080,
}
Т.е. чтобы например при вводе 1h , бан сразу автоматически ставился на 60 мин(по таблице). К сожелению таблица времени не работает, помогите доработать...
Вот отрывок временного бана ботом из скрипта:
Код
if cmd == "!bottempban" then
if tProfile[tUser.iProfile] == 1 then
local _,_,sNick = string.find(sData, "%b<>%s+%S+%s+(%S+)")
local _,_,sTime = string.find(sData, "%b<>%s+%S+%s+%S+%s+(%S+)")
local _,_,sReason = string.find(sData, "%b<>%s+%S+%s+%S+%s+%S+%s+(.*)")
if not sNick then
Core.SendToUser(tUser,"<"..sBot.."> Вы не ввели ник!")
return true
end
if not sTime then
Core.SendToUser(tUser,"<"..sBot.."> Вы не ввели время бана!")
return true
end
sUser = Core.GetOnlineUsers()
for i,v in pairs(sUser) do
if sNick == v.sNick then
sIP = v.sIP
end
end
if not sIP then
sIP = "не известен"
end
if not sReason then
sReason = "не указанна"
end
Core.SendToNick(sNick,"<"..sBot.."> Вы были временно забанены на следующие "..sTime.." потому, что: "..sReason)
Core.SendToAll("<"..sBot.."> забанил "..sNick.." (IP: "..sIP..") следующие "..sTime.." потому, что: "..sReason)
BanMan.TempBanNick(sNick,tonumber(sTime) or 1,sReason,sBot)
end
return true
end
Автор: Wariner 18.3.2009, 8:16
Таблица была не правильно написана - это раз!
Код
tTime = {
["m"]=1,
["h"]=60,
["d"]=1440,
["w"]=10080,
}
как ты хочешь чтоб работала таблица если ты просто кинул её в файл - это два!
Код
if not sTime then
Core.SendToUser(tUser,"<"..sBot.."> Вы не ввели время бана!")
else
local _,_,iTime, sArg = string.find(sTime, "(%d+)(%a)")
if iTime and sArg then -- Здесь можно прикрутить ещё несколько проверок на то есть ли аргумент в таблице tTime и т.д.
sTime = tonumber(iTime)*tTime[sArg]
else
Core.SendToUser(tUser,"<"..sBot.."> Вы неправильно ввели время бана!")
end
end
sUser = Core.GetOnlineUsers()
Автор: THE STRELOK 18.3.2009, 9:17
Спасибо 
А как сделать так, чтобы писало не 60m:
Цитата
[10:44:40] <Security> забанил test (IP: 10.2.136.203) следующие 60m потому, что: test
А 1h. Вот так:
Цитата
[10:44:40] <Security> забанил test (IP: 10.2.136.203) следующие 1h потому, что: test
???
и есть ещё проблема....
После бана ботом хаба, бот банит ник и айпи юзера, после того, как PtokaX стоит перезапустить, бан становится по нику, а не по айпи, как такой недочёт исправить?
я подозреваю это:
Код
BanMan.TempBanNick
BanMan.BanNick
исправляю на:
Код
BanMan.TempBan
BanMan.Ban
бан не работает, команда выводится в чат, сообщения о бане выводятся...
Автор: Wariner 18.3.2009, 17:22
если ты исправил скрипт из посты выше в чат должно выводится число без букв а потом всё приводится в нормальный вид функцией
Код
function GetNormalTime(s)
s=tonumber(s)*60 or 0
local r=""
if s>=31104000 then r=math.floor(s/31104000).." г. " s=math.fmod(s,31104000) end
if s>=2592000 then r=r..math.floor(s/2592000).." мес. " s=math.fmod(s,2592000) end
if s>=86400 then r=r..math.floor(s/86400).." д. " s=math.fmod(s,86400) end
if s>=3600 then r=r..math.floor(s/3600).." ч. " s=math.fmod(s,3600) end
if s>=60 then r=r..math.floor(s/60).." мин. " s=math.fmod(s,60) end
return r
end
если хочешь чтоб банилось и по нику и по ип тебе надо писать совершенно другую функцию которая будет смотреть по вводимым данным есть ли юзер на хабе, если есть брать его ник ип и банить. Естественно работать при отсутствии юзера она не будет
Автор: THE STRELOK 18.3.2009, 18:07
знал бы я ещё как эту функцию написать :(
Автор: Wariner 18.3.2009, 18:16
посмотри как работают функции в любых языках!
а если по быстрому то кидаешь функцию в конец скрипта и изменяешь
Код
Core.SendToNick(sNick,"<"..sBot.."> Вы были временно забанены на следующие "..GetNormalTime(sTime).." потому, что: "..sReason)
Core.SendToAll("<"..sBot.."> забанил "..sNick.." (IP: "..sIP..") следующие "..GetNormalTime(sTime).." потому, что: "..sReason)
Автор: Setuper 18.3.2009, 18:47
хехе не будет работать эта функция, так как в аргумент этой функции нужно подставлять число, а будет подставляться строка, которую даже нельзя преобразовать функцией tonumber в число!
Автор: Wariner 18.3.2009, 19:15
Илюх, ну ведь
Код
sTime = tonumber(iTime)*tTime[sArg]
почему же не будет?