--[[ Название: Hider Версия: 1.0 Автор: Tsd Описание: Внимание! Скрипт работает только на Ptokax 0.5.0.1 mod3 и выше, так как автором мода (http://mydc.ru/topic5423s80.html?start=80) добавлены нужные функции для работы, в оригинальной Ptokax их нет. Скрипт позволяет скрывать ник в списке хаба, скрывать ключ. Доступ по профилям (см. конфиг), меню по профилям. Список спрятанных виден только тем профилям, у которых есть доступ прятать других. Если спрятать свой ник, то будет автоматическое отключение от хаба (необходимо переподключиться) и только вы будете видеть свой ник в списке, в других случаях переподключений не требуется.]] -- CONFIG local FileDB = "Hide_Tsd.tbl" -- Имя файла базы данных, используется папка scripts local sBot = "=HideMe=" -- Имя бота. Пустые кавычки - основной бот хаба. local MenuName = "= Меню хаба =\\X Прятки на хабе\\" -- Путь к меню (обязательно с двойным обратным слешем в конце). local Prefix = "!" -- Префикс команд. tCmd = { --Команды: HideMe = "hideme", UnHideMe = "unhideme", HideMyKey = "hidemykey", UnHideMyKey = "unhidemykey", HideUser = "hideuser", UnHideUser = "unhideuser", HideUserKey = "hideuserkey", UnHideUserKey = "unhideuserkey", ShowHidden = "showhidden", } tControl = { -- Профили, которые могут прятать других: [0] = 1, -- Owner [1] = 0, -- Admin [2] = 0, -- Operator [3] = 0, -- sVIP [4] = 0, -- VIP [5] = 0, -- Reg [-1] = 0, -- UnReg } tHideSelf = { -- Профили, которым разрешено прятаться: [0] = 1, -- Owner [1] = 0, -- Admin [2] = 0, -- Operator [3] = 0, -- sVIP [4] = 0, -- VIP [5] = 0, -- Reg [-1] = 0, -- UnReg } -- END CONFIG tHideNicks = {} tHideKeys = {} Version = "1.0 © Tsd" function OnStartup() if sBot == "" then sBot = SetMan.GetString(21) end ConfigPath = Core.GetPtokaXPath().."scripts/" if loadfile(ConfigPath..FileDB) then dofile(ConfigPath..FileDB) end end function UserConnected(user) local nick = user.sNick if tHideNicks[nick] then Core.HideUser(user, true) end if tHideKeys[nick] then Core.HideUserKey(user, true) end if tHideSelf[user.iProfile] == 1 then Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Спрятать\\Свой ник в списке$<%[mynick]> "..Prefix..tCmd.HideMe.."|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Вернуть\\Свой ник в список$<%[mynick]> "..Prefix..tCmd.UnHideMe.."|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Спрятать\\Свой ключ$<%[mynick]> "..Prefix..tCmd.HideMyKey.."|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Вернуть\\Свой ключ$<%[mynick]> "..Prefix..tCmd.UnHideMyKey.."|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."*** Список ***$<%[mynick]> "..Prefix..tCmd.ShowHidden.."|") end if tControl[user.iProfile] == 1 then Core.SendToNick(user.sNick,"$UserCommand 1 2 "..MenuName.."Спрятать\\Этот ник в списке$<%[mynick]> "..Prefix..tCmd.HideUser.." %[nick]|") Core.SendToNick(user.sNick,"$UserCommand 1 2 "..MenuName.."Спрятать\\Ключ этого ника$<%[mynick]> "..Prefix..tCmd.HideUserKey.." %[nick]|") Core.SendToNick(user.sNick,"$UserCommand 1 2 "..MenuName.."Вернуть\\Этот ник в список$<%[mynick]> "..Prefix..tCmd.UnHideUser.." %[nick]|") Core.SendToNick(user.sNick,"$UserCommand 1 2 "..MenuName.."Вернуть\\Ключ этому нику$<%[mynick]> "..Prefix..tCmd.UnHideUserKey.." %[nick]|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Спрятать\\Ник (ввод)$<%[mynick]> "..Prefix..tCmd.HideUser.." %[line:Ник]|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Спрятать\\Ключ ника (ввод)$<%[mynick]> "..Prefix..tCmd.HideUserKey.." %[line:Ник]|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Вернуть\\Ник в список (ввод)$<%[mynick]> "..Prefix..tCmd.UnHideUser.." %[line:Ник]|") Core.SendToNick(user.sNick,"$UserCommand 1 3 "..MenuName.."Вернуть\\Ключ нику (ввод)$<%[mynick]> "..Prefix..tCmd.UnHideUserKey.." %[line:Ник]|") end end OpConnected,RegConnected = UserConnected,UserConnected function ChatArrival(user, data) data = data:sub(1,-2) if tControl[user.iProfile] == 1 or tHideSelf[user.iProfile] == 1 then local _,_,pre,cmd = data:find("%b<>%s+(%p)(%S+)") if pre and pre == Prefix then if tFuncCmd[cmd] then _,_,data = string.find(data,"%b<>%s+%p%S+%s+(.+)$") tFuncCmd[cmd](user,data) collectgarbage("collect") return true end end end end tFuncCmd = { [tCmd.HideMe] = function(user) if tHideSelf[user.iProfile] == 1 then local nick = user.sNick if tHideNicks[nick] then ToUser(user,"Ошибка: Ваш ник и так спрятан в списке.") else ToUser(user,"Теперь юзеры не будут видеть вас в списке, вы будете принудительно отключены от хаба.") tHideNicks[nick] = {"true",} Save() Core.SendToUser(user, "<"..Core.GetHubSecAlias().."> Переподключитесь к хабу!") Core.Disconnect(user) end else ToUser(user,"Ошибка: Вам недоступна эта команда.") end end, [tCmd.UnHideMe] = function(user) if tHideSelf[user.iProfile] == 1 then local nick = user.sNick if tHideNicks[nick] then tHideNicks[nick] = nil Core.HideUser(user, false) Save() ToUser(user,"Теперь ваш ник виден в списке.") else ToUser(user,"Ошибка: ваш ник не спрятан в списке.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.HideMyKey] = function(user) if tHideSelf[user.iProfile] == 1 then local nick = user.sNick if CheckOp(nick) then if tHideNicks[nick] then ToUser(user,"Ошибка: ваш ник спрятан в списке. Верните свой ник в список и попробуйте снова.") else if tHideKeys[nick] then ToUser(user,"Ошибка: Ключ и так спрятан.") else Core.HideUserKey(user, true) ToUser(user,"Теперь с вас снята видимость ключа.") tHideKeys[nick] = {"true",} Save() end end else ToUser(user,"Ошибка: У вас нет статуса оператора.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.UnHideMyKey] = function(user) if tHideSelf[user.iProfile] == 1 then local nick = user.sNick if CheckOp(nick) then if tHideNicks[nick] then ToUser(user,"Ошибка: ваш ник спрятан в списке. Верните свой ник в список и попробуйте снова.") else if tHideKeys[nick] then Core.HideUserKey(user, false) ToUser(user,"Теперь ваш ключ виден всем.") tHideKeys[nick] = nil Save() else ToUser(user,"Ошибка: ваш ключ не спрятан.") end end else ToUser(user,"Ошибка: У вас нет статуса оператора.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.HideUser] = function(user,data) if tControl[user.iProfile] == 1 then local _,_,nick = data:find("^(%S+)") if nick then if tHideNicks[nick] then ToUser(user,"Ошибка: ник "..nick.." и так спрятан.") else local usr = RegMan.GetReg(nick) if usr then tHideNicks[nick] = {"true",} Save() Core.SendToNick(nick, "<"..Core.GetHubSecAlias().."> Переподключитесь к хабу!") Core.Disconnect(nick) ToUser(user,"Теперь ник "..nick.." спрятан в списке.") else ToUser(user,"Ошибка: ник "..nick.." не зарегистрирован на хабе.") end end else ToUser(user,"Ошибка: не указан ник.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.UnHideUser] = function(user,data) if tControl[user.iProfile] == 1 then local _,_,nick = data:find("^(%S+)") if nick then local usr = RegMan.GetReg(nick) if usr then if tHideNicks[nick] then tHideNicks[nick] = nil Save() if Core.GetUser(nick) then local ni = Core.GetUser(nick) Core.HideUser(ni, false) ToUser(user,"Теперь ник "..nick.." виден в списке.") else ToUser(user,"Теперь ник "..nick.." будет виден в списке.") end else ToUser(user,"Ошибка: ник "..nick.." не спрятан.") end else ToUser(user,"Ошибка: ник "..nick.." не зарегистрирован на хабе.") end else ToUser(user,"Ошибка: не указан ник.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.HideUserKey] = function(user,data) if tControl[user.iProfile] == 1 then local _,_,nick = data:find("^(%S+)") if nick then local usr = RegMan.GetReg(nick) if usr then if tHideNicks[nick] then ToUser(user,"Ошибка: ник "..nick.." спрятан в списке. Верните его ник в список и попробуйте снова.") else if tHideKeys[nick] then ToUser(user,"Ошибка: Ключ ника "..nick.." и так спрятан.") else if CheckOp(nick) then tHideKeys[nick] = {"true",} Save() if Core.GetUser(nick) then local ni = Core.GetUser(nick) Core.HideUserKey(ni, true) ToUser(user,"Теперь с ника "..nick.." снят ключ.") else ToUser(user,"Теперь с ника "..nick.." снят ключ.") end else ToUser(user,"Ошибка: ник "..nick.." не имеет статуса оператора.") end end end else ToUser(user,"Ошибка: ник "..nick.." не зарегистрирован на хабе.") end else ToUser(user,"Ошибка: не указан ник.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.UnHideUserKey] = function(user,data) if tControl[user.iProfile] == 1 then local _,_,nick = data:find("^(%S+)") if nick then local usr = RegMan.GetReg(nick) if usr then if tHideNicks[nick] then ToUser(user,"Ошибка: ник "..nick.." спрятан в списке. Верните его ник в список и попробуйте снова.") else local ni = Core.GetUser(nick) if tHideKeys[nick] then Core.HideUserKey(ni, false) tHideKeys[nick] = nil Save() ToUser(user,"Теперь нику "..nick.." возвращен ключ.") else if CheckOp(nick) then ToUser(user,"Ошибка: Ключ ника "..nick.." не спрятан.") else ToUser(user,"Ошибка: ник "..nick.." не имеет статуса оператора.") end end end else ToUser(user,"Ошибка: ник "..nick.." не зарегистрирован на хабе.") end else ToUser(user,"Ошибка: не указан ник.") end else ToUser(user,"Ошибка: вам недоступна эта команда.") end end, [tCmd.ShowHidden] = function(user) local msg = "\t<<<<<Прятки на хабе v"..Version..">>>>>\n\nСписок спрятанных ников:" if next(tHideNicks) then for i,v in pairs(tHideNicks) do msg = msg.."\n\t"..i end else msg = msg.."\n\tНа данный момент никто не спрятан.\n" end msg = msg.."\nСписок спрятанных ключей:" if next(tHideKeys) then for i,v in pairs(tHideKeys) do msg = msg.."\n\t"..i end else msg = msg.."\n\tНа данный момент нет спрятанных ключей.\n" end Core.SendPmToUser(user, sBot, msg) end } function CheckOp(s) for _, reg in ipairs(RegMan.GetOps()) do if reg.sNick == s then return true end end return false end function ToUser(user,msg) Core.SendToUser(user,"<"..sBot.."> "..msg) end function OnExit() Save() end function Save() local hFile = io.open(ConfigPath..FileDB, "w+") Serialize("tHideNicks", hFile); Serialize("tHideKeys", hFile); hFile:close() end function Serialize(sTableName, hFile, sTab) sTab = sTab or ""; hFile:write(sTab..sTableName.." = {\n"); for key, value in pairs(_G[sTableName]) do local sKey = (type(key) == "string") and string.format("[%q]", key) or string.format("[%d]", key); if(type(value) == "table") then Serialize2(value, sKey, hFile); else local sValue = (type(value) == "string") and string.format("%q", value) or tostring(value); hFile:write(sTab.."\t"..sKey.." = "..sValue); end hFile:write(",\n"); end hFile:write(sTab.."}\n"); end function Serialize2(tTable, sTableName, hFile) sTab = sTab or ""; hFile:write(sTableName.." = {"); for key, value in ipairs(tTable) do local sValue = (type(value) == "string") and string.format("%q", value) or tostring(value); hFile:write(sValue..","); end hFile:write(sTab.."}"); end