--[[
MuteWarn 1.0d LUA 5.1 [Strict]
By Mutor 04/08/07
Перевод на русский: Артём , 17 августа 2009 год, 7:43
Requested by speedX
Yet another mute script with slight variation.
-Warn a user a preset number of times before auto-muting them
-Option to mute/unmute/check mute on command
-Data saved to file for script/hub restarts [mute is maintained]
-Provides context menu [right click]
-Commands/menus permissions by profile
+Changes from 1.0 04/12/07
+Added adjustable 'MuteTime' for auto-mute Requested by speedX
+Added 'MuteTime' argument to +mute command Requested by speedX
+Added command protection levels [set in Profiles tab]
+Changes from 1.0b 04/13/07
~Fixed bug in warn w/o reason
+Added missing reason prompt to context menu command
+Added List Users/Help Commands Requested by achiever
+Added mute time in reply Requested by achiever
~Changed 'Is User Mute?' reply
+Changes from 1.0c 07/14/09
~Converted to new API strict.
Listing Warned / Muted Users
Ник Нарушения
~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[OP]Enforcer Has been warned: 1 x
Rizzo Mute for another 11 из 12 минут(а). x
MuteWarn 1.0d Помощь по командам
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!check Заглушен или нет этот Юзер?
!warn Дать предупреждение Юзеру
!mute Заглушить Юзера
!list Список заглушеных
!mutekhelp Команда помощи (This Info)
!unmute Снять заглушку с Юзера
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
]]
T = {
-- Botname pulled from the hub or use "CustomName"
Bot = SetMan.GetString(21),
--Context Menu Title
Menu = SetMan.GetString(1),
--Контекстное меню
SubMenu = "Кляп-меню",
-- Path/Filename to save user data to
File = "Mute.txt",
-- Ник Админа /которому будут ошибки отсылатся
OpNick = "Артём",
-- Максимальное кол-во предупреждений до заглушки
MaxWarns = 3,
-- Время наказания [ в минутах ] юзер будет заглушен
MuteTime = 10,
--Ниже профили которым доступны команды
--[profile_idx] = {command enabled [0=no 1=yes], "Profile Name",Protection Level},
Profiles = {
[-1] = {0,"Незарегестрированный",0},
[0] = {1,"Мастер",5},
[1] = {1,"Оператор",4},
[2] = {0,"Vip",2},
[3] = {0,"Зарегестрированный",1},
--[4] = {0,"Модератор",5},
},
}
OnStartup = function()
T.Pfxs,T.Hub,T.Path = SetMan.GetString(29),SetMan.GetString(0),Core.GetPtokaXPath().."scripts/"
T.Scp,T.Auth,T.Pfx = "MuteWarn 1.0d","Mutor",T.Pfxs:sub(1,1)
if not T.File:find(T.Path,1,true) then T.File = T.Path..T.File end
local msg = T.File.." были найдены и казнены."
if loadfile(T.File) then
dofile(T.File)
else
T.Muted = {}
Save(T.File , T.Muted , "T.Muted")
msg = msg:gsub("найдены и казнены "," создан для вас")
end
Timer = TmrMan.AddTimer(1000)
OnError(T.Scp.." автор "..T.Auth.." была начата. Использование: "..
string.format("%-.2f Kb. памяти. ",collectgarbage("count"))..msg)
end
OnError = function(msg)
local user = Core.GetUser(T.OpNick)
if msg and user then
Core.SendToUser(user,"<"..T.Bot.."> "..msg.."|")
end
end
OnExit = function()
OnError(T.Scp.." автор "..T.Auth.." был остановлен, освобождая: "..
string.format("%-.2f Kb. памяти",collectgarbage("count")))
end
OnTimer = function(Id)
if Id == Timer then
if #T.Muted >= 1 then
local change
for i,v in ipairs(T.Muted) do
user = Core.GetUser(v[1])
if os.difftime((os.clock()- v[3])/60) >= v[4] then
table.remove(T.Muted,i)
change = true
if user then
Core.SendToUser(user,"<"..T.Bot.."> Вы теперь разглушены.Чат "..
"и личные сообщения вам доступны.")
end
end
end
if change then
table.sort(T.Muted, function(a,b)return a[3] > b[3] end)
Save(T.File , T.Muted , "T.Muted")
collectgarbage("collect")
end
else
TmrMan.RemoveTimer(Timer)
Timer = nil
end
end
end
UserConnected = function(user)
if T.Profiles[user.iProfile] and T.Profiles[user.iProfile][1] == 1 then
SendCmds(user)
end
local _,c,s,e = CheckTab(user.sNick)
if c and s and e then
if c == 0 then
local diff = e - os.difftime((os.clock()- s)/60)
local msg = user.sNick..", Вам по-прежнему отключен. Чат "..
"и личные сообщения "..diff.." минут(ы)."
Core.SendToUser(user,T.Bot,msg)
end
end
end
OpConnected = UserConnected
ChatArrival = function(user,data)
local idx,cnt = CheckTab(user.sNick)
if idx and cnt then
if cnt == 0 then
local reply = "Извените "..user.sNick..", Вы были заглушены."
local _,_,to,from = data:find("^$To: (%S+) От: (%S+)")
if to and from then
return Core.SendPmToUser(user,to,"<"..T.Bot.."> "..reply),true
else
return Core.SendToUser(user,"<"..T.Bot.."> "..reply),true
end
end
end
if T.Profiles[user.iProfile] and T.Profiles[user.iProfile][1] == 1 then
local _,_,cmd = data:find("%b<> ["..T.Pfxs.."](%w+)")
if cmd then
cmd = cmd:lower()
if cmd and MuteCmds[cmd] then
return Core.SendToUser(user,"<"..T.Bot.."> "..MuteCmds[cmd](user,data)),true
end
end
end
end
ToArrival = ChatArrival
CheckTab = function(nick)
if nick then
for i,v in ipairs(T.Muted) do
if v[1]:lower() == nick:lower() then
return i,v[2],v[3],v[4]
end
end
end
end
SendCmds = function(user)
local m,s,p = T.Menu,T.SubMenu,T.Pfx
for i,v in pairs(MuteCmds) do
local desc,arg1,arg2 = MuteCmds[i]()
Core.SendToUser(user,"$UserCommand 1 1 "..m.."\\"..s.."\\"..desc.."$<%[mynick]> "..p..i..arg1.."|")
Core.SendToUser(user,"$UserCommand 1 2 "..m.."\\"..s.."\\"..desc.."$<%[mynick]> "..p..i..arg2.."|")
end
Core.SendToUser(user,"<"..T.Bot.."> "..T.Scp.." "..T.Profiles[user.iProfile][2]..
"'у команды включены, см. на вкладку хаба или список юзеров")
collectgarbage("collect")
end
function Serialize(tTable, sTableName, sTab)
assert(tTable, "tTable equals nil")
assert(sTableName, "sTableName equals nil")
assert(type(tTable) == "table", "tTable must be a table!")
assert(type(sTableName) == "string", "sTableName must be a string!")
sTab = sTab or ""
sTmp = ""
sTmp = sTmp..sTab..sTableName.." = {\n"
for key, value in ipairs(tTable) do
local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key)
if(type(value) == "table") then
sTmp = sTmp..Serialize(value, sKey, sTab.."\t")
else
local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value)
sTmp = sTmp..sTab.."\t"..sKey.." = "..sValue
end
sTmp = sTmp..",\n"
end
sTmp = sTmp..sTab.."}"
return sTmp
end
function Save(file , table , tablename)
local handle = io.open(file,"wb")
handle:write(Serialize(table, tablename))
handle:flush()
handle:close()
end
GetProf = function(nick)
local Prof,Reg = -1,RegMan.GetReg(nick)
if Reg then Prof = Reg.iProfile end
return Prof
end
MuteCmds = {
warn = function(user,data)
if user then
local _,_,nick = data:find("%b<> %p%w+ (%S+)|*")
local _,_,reason = data:find("%b<> %p%w+ %S+ (.+)|$")
local t1 = T.Profiles[user.iProfile]
if t1 then
local t2 = T.Profiles[GetProf(nick)]
if t1 and t2 then
if t1[3] <= t2[3] then
return "Извините "..user.sNick..", "..t1[2]..
"'s не может предупредить "..t2[2].."'s."
end
end
local idx,cnt = CheckTab(nick)
local usr,chg = Core.GetUser(nick),nil
if idx and cnt then
T.Muted[idx][2] = cnt + 1
local msg = nick.."'s вход был отредоктирован и "..
"предупреждены "..T.Muted[idx][2].." раз(а). "
local wmsg = " Вы предупреждены. Если вы "..
"будите предупреждены более # раз (а) вы будете заглушены."
local bmsg = "Вы были предупреждены. "..T.MaxWarns..
" раз. Вам в настоящее время отключен. Общий чат и личка "..
"сообщения блокруются."
if T.Muted[idx][2] >= T.MaxWarns then
T.Muted[idx][2] = 0
T.Muted[idx][4] = T.MuteTime
msg = msg..nick.." В настоящее время заглушены."
if usr then
if not reason then
reason = bmsg
else
reason = bmsg.." Ваше предупреждение: "..reason
end
Save(T.File , T.Muted , "T.Muted")
Core.SendToUser(usr,"<"..T.Bot.."> "..reason)
return msg
end
end
if usr then
if not reason then
reason = wmsg:gsub("#",T.MaxWarns - T.Muted[idx][2])
else
reason = wmsg:gsub("#",T.MaxWarns - T.Muted[idx][2]).." "..reason
end
Core.SendToUser(usr,"<"..T.Bot.."> "..reason)
end
Save(T.File , T.Muted , "T.Muted")
return msg
else
local wmsg = "Вы предупреждены. Если вы "..
"ещё получите # предупреждений ."
if usr then
if not reason then
reason = wmsg:gsub("#",T.MaxWarns - 1)
else
reason = wmsg:gsub("#",T.MaxWarns - 1).." "..reason
end
Core.SendToUser(usr,"<"..T.Bot.."> "..reason)
end
table.insert(T.Muted,{nick,1,os.clock(),T.MuteTime})
Save(T.File , T.Muted , "T.Muted")
return nick.." был предупрежден и добавлен в таблицу наказаных."
end
else
Core.SendToUser(user,"<"..T.Bot.."> Error!, Использовано: "..T.Pfx.." предупреждение <nick>")
end
else
return "Предупредить Юзера"," %[line:Кого предупреждаем?] %[line:Причина (пожеланию)]",
" %[nick] %[line:Причина (пожеланию)]"
end
end,
mute = function(user,data)
if user then
local _,_,nick = data:find("%b<> %p%w+ (%S+)")
local _,_,time = data:find("%b<> %p%w+ %S+ (%d+)|$")
local t1 = T.Profiles[user.iProfile]
if nick then
local t2 = T.Profiles[GetProf(nick)]
if t1 and t2 then
if t1[3] <= t2[3] then
return "Извените "..user.sNick..", "..t1[2]..
"'s немогу глушануть "..t2[2].."'s."
end
end
if not time then time = T.MuteTime else time = tonumber(time) end
local idx,cnt = CheckTab(nick)
local usr = Core.GetUser(nick)
if idx and cnt then
T.Muted[idx][2] = 0
T.Muted[idx][4] = T.MuteTime
else
table.insert(T.Muted,{nick,0,os.clock(),time})
end
if usr then
Core.SendToUser(usr,"<"..T.Bot.."> Вы заглушены.Чат и приват "..
" будет вам запрещена на этом хабе.|")
end
Save(T.File , T.Muted , "T.Muted")
return "По вашему запросу "..user.sNick..", "..nick..
" был гагнут "..time.." minutes."
else
Core.SendToUser(user,"<"..T.Bot.."> Error!, Использование: "..T.Pfx.."mute <nick>|")
end
else
return "Глушим Юзера"," %[line:Кого глушим?] %[line:Время (None = "..T.MuteTime..")]",
" %[nick] %[line:Время (None = "..T.MuteTime..")]"
end
end,
unmute = function(user,data)
if user then
local _,_,nick = data:find("%b<> %p%w+ (%S+)|$")
if nick then
local t1 = T.Profiles[user.iProfile]
local t2 = T.Profiles[GetProf(nick)]
if t1 and t2 then
if t1[3] <= t2[3] then
return "Извените "..user.sNick..", "..t1[2]..
"'s немогу разглушить "..t2[2].."'s."
end
end
local idx,cnt = CheckTab(nick)
local usr = Core.GetUser(nick)
if idx and cnt then
T.Muted[idx] = nil
else
return nick.." в настоящее время не гагнут"
end
if usr then
Core.SendToUser(usr,"<"..T.Bot.."> Вы теперь разглушены.Чат и приват "..
"вам доступны.|")
end
Save(T.File , T.Muted , "T.Muted")
return "По вашему запросу "..user.sNick..", "..nick.." был разглушен."
else
Core.SendToUser(user,"<"..T.Bot.."> Error!, Usage: "..T.Pfx.."unmute <nick>|")
end
else
return "Разглушить юзера"," %[line:Кого разглушить?]"," %[nick]"
end
end,
check = function(user,data)
if user then
local _,_,nick = data:find("%b<> %p%w+ (%S+)|$")
if nick then
local t1 = T.Profiles[user.iProfile]
local t2 = T.Profiles[GetProf(nick)]
if t1 and t2 then
if t1[3] <= t2[3] then
return "Sorry "..user.sNick..", "..t1[2]..
"'s не может проверить если "..t2[2].."'s является гагнутым."
end
end
local msg = nick.." не гагнут."
local idx,cnt = CheckTab(nick)
if idx and cnt and cnt == 0 then
msg = "После "..T.MaxWarns.." предупреждение или непосредственным командованием, "..
nick.." в настоящее время гагнут."
end
return msg
else
Core.SendToUser(user,"<"..T.Bot.."> Error!, Usage: "..T.Pfx.."check <nick>|")
end
else
return "Гагнут этот Юзер или нет?"," %[line:Кого проверяем?]"," %[nick]"
end
end,
list = function(user,data)
if user then
if next(T.Muted) then
local msg = "\r\n\r\n\tПеречень Предупреждённых / Гагнутые Юзеры\r\n\r\n"..
"\tNick\t\t\t\tНарушения\r\n\t"..string.rep("Ї",4)..
"\t\t\t\t"..string.rep("Ї",7).."\r\n"
for i,v in ipairs(T.Muted) do
local offense = "Имеет придупреждений: "..v[2].." x"
if v[2] == 0 then
offense = "Заглушка продлится ещё "..
v[4] - os.difftime((os.clock()- v[3])/60)..
" из "..v[4].." минут(ы)."
end
msg = msg.."\t"..string.format("%-55.45s",v[1]).."\t"..offense.."\r\n"
end
return msg.."\r\n\r\n"
else
return "Список чист,Наказанных нету."
end
else
return "Список Юзеров","",""
end
end,
mutehelp = function(user)
if user then
local reply = "\n\n\t "..T.Scp.." Команды Помощи\n\t"..string.rep("Ї",35).."\n"
for i,v in pairs(MuteCmds) do
local desc,args = MuteCmds[i]()
reply = reply.."\t"..T.Pfx..string.format("%-15s",i).."\t"..desc.."\n"
end
return reply.."\n\t"..string.rep("Ї",35).."\n\n"
else
return "Команды Помощи (This Info)","",""
end
end,
}