----------------------------------------------------------------------------- -- ShowStatus version 1.0 by LEDOKOL-STALKER -- Specially for #Пластмасса -- Developed and tested in PtokaX 0.4.1.0 -- Lua 5.1.3 -- OS Windows ----------------------------------------------------------------------------- -- Все жалобы и предложения принимаю в аську: 366796696 ----------------------------------------------------------------------------- tSettings = { sBot = SetMan.GetString(21), -- имя бота (по умолчанию имя бота хаба) sMenu = "Статус", -- название менюшки sPath = Core.GetPtokaXPath():gsub("/","\\").."scripts\\", sFolder = "Status", nStatHistLimit = 10, -- ограничение хранимых в истории статусов nStatSymbLimit = 30, -- максимальное количество символов в статусе fUserStatus = "\\UserStatus.txt", -- файл со статусами юзверей tUserStatus = {}, tCommonStatus = { -- Статусы хаба [1] = "Злой", [2] = "Добрый", [3] = "Влюбленный", [4] = "Сонный (Сплю, бля)", [5] = "Радостный", }, tUserNicks = {"#Пластмасса", "[‰]LEDOKOL-STALKER"}, -- список тех, кому нельзя навязать принудительный статус tHubCommands = { -- встроенные команды хаба (эксепшн лист) "!help","!passwd", "!ban", "!banip", "!fullban", "!fullbanip", "!nickban", "!tempban", "!tempbanip", "!fulltempban", "!fulltempbanip", "!nicktempban", "!unban", "!permunban", "!tempunban", "!getbans", "!getpermbans", "!gettempbans", "!clrpermbans", "!clrtempbans", "!rangeban", "!fullrangeban", "!rangetempban", "!fullrangetempban", "!rangeunban", "!rangepermunban", "!rangetempunban", "!getrangebans", "!getrangepermbans", "!getrangetempbans", "!clrrangepermbans", "!clrrangetempbans", "!checknickban", "!checkipban", "!checkrangeban", "!drop", "!getinfo", "!op", "!gag", "!ungag", "!restart", "!startscrip", "!stopscript", "!restartscript", "!restartscripts", "!getscripts", "!reloadtxt", "!addreguser", "!delreguser", "!topic", "!massmsg", "!opmassmsg", "!myip", }, tProfiles = { -- Профили скрипта(номер профиля - доступные ему команды). [0] = { ["Commands"] = {"!setstat","!setustat", "!setfustat", "!clrmystat","!stathelp"}, }, [1] = { ["Commands"] = {"!setstat","!setustat","!clrmystat","!stathelp"}, }, [2] = { ["Commands"] = {"!setstat","!clrmystat","!stathelp"}, }, [3] = { ["Commands"] = {"!setstat","!clrmystat","!stathelp"}, }, [-1] ={ ["Commands"] = {"!setstat","!clrmystat","!stathelp"}, }, }, tCommands = { -- команды скрипта: функция обработки, описание ["!setstat"] = { ["Function"] = function(user,str1,str2) str1 = str1 or "" str2 = str2 or "" if str2 ~= "" then SetStatus(user.sNick,str1.." "..str2,true) else SetStatus(user.sNick,str1,true) end end, ["Description"] = "Установить статус. Команда !setstat string установит Вам статус string, !setstat - удалит Ваш статус.", ["UserCommands"] = function(user) Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Установить мой статус$<%[mynick]> !setstat %[line: Ограничение: "..tSettings.nStatSymbLimit.." символов]|") end, }, ["!setustat"] = { ["Function"] = function(user,nick,str) if nick ~= "" and Core.GetUser(nick) then str = str or "" SetStatus(nick,str,true,user.sNick) else Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> Ошибка! Ник юзера не указан или юзер оффлайн!") end end, ["Description"] = "Установить статус юзера. Команда !setustat nick string установит юзеру nick статус string, !setustat удалит статус юзера nick.", ["UserCommands"] = function(user) Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Установить статус юзера$<%[mynick]> !setustat %[line: Введите ник юзера] %[line: Ограничение: "..tSettings.nStatSymbLimit.." символов]|") Core.SendToNick(user.sNick,"$UserCommand 1 2 "..tSettings.sMenu.."\\Установить статус юзера$<%[mynick]> !setustat %[nick] %[line: Ограничение: "..tSettings.nStatSymbLimit.." символов]|") end, }, ["!setfustat"] = { ["Function"] = function(user,nick,str) if nick ~= "" and Core.GetUser(nick) then if not IsInTable(tSettings.tUserNicks,nick,user.sNick) then str = str or "" SetStatus(nick,str,false,user.sNick) else Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> Вы не можете установить принудительный статус данному юзеру!") end else Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> Ошибка! Ник юзера не указан или юзер оффлайн!") end end, ["Description"] = "Установить принудительный статус юзера. Команда !setfustat nick string установит юзеру nick принудительный статус string, !setfustat удалит принудительный статус юзера nick.", ["UserCommands"] = function(user) Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Принудительный статус юзера$<%[mynick]> !setfustat %[line: Введите ник юзера] %[line: Ограничение: "..tSettings.nStatSymbLimit.." символов]|") Core.SendToNick(user.sNick,"$UserCommand 1 2 "..tSettings.sMenu.."\\Принудительный статус юзера$<%[mynick]> !setfustat %[nick] %[line: Ограничение: "..tSettings.nStatSymbLimit.." символов]|") end, }, ["!clrmystat"] = { ["Function"] = function(user) local buffer = "" if tSettings.tUserStatus[user.sNick] then buffer = tSettings.tUserStatus[user.sNick]["Forced"] or buffer tSettings.tUserStatus[user.sNick] = {} tSettings.tUserStatus[user.sNick]["Active"] = "" tSettings.tUserStatus[user.sNick]["Forced"] = buffer Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> История статусов очищена!") else Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> Ошибка! Вы не зарегистрированы в статус-системе!") end end, ["Description"] = "Очистить Вашу статус-историю. Команда удалит ваши последние статусы и обнулит текущий, если он не принудительный.", ["UserCommands"] = function(user) Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Очистить историю статусов$<%[mynick]> !clrmystat|") end, }, ["!stathelp"] = { ["Function"] = function(user) local Msg = ShowHelp(user) Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> "..Msg) end, ["Description"] = "Помощь по статус-скрипту.", ["UserCommands"] = function(user) Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Помощь$<%[mynick]> !stathelp|") end, }, }, } function OnStartup() os.execute("mkdir \""..tSettings.sPath..tSettings.sFolder.."\"") -- создание папки if loadfile(tSettings.sPath..tSettings.sFolder..tSettings.fUserStatus) then dofile(tSettings.sPath..tSettings.sFolder..tSettings.fUserStatus) else SaveToFile(tSettings.sPath..tSettings.sFolder..tSettings.fUserStatus, tSettings.tUserStatus, "tSettings.tUserStatus") end collectgarbage() end function SaveToFile(file, table, tablename) local hFile = io.open (file , "w") SaveSerialize(table, tablename, hFile); hFile:close() end function SaveSerialize(tTable, sTableName, hFile, sTab) sTab = sTab or ""; hFile:write(sTab..sTableName.." = {\n" ); for key, value in pairs(tTable) do local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key); if(type(value) == "table") then SaveSerialize(value, sKey, hFile, sTab.."\t"); 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.."}"); end function SetStatus(nick,str,forced,who) if string.len(str) <= tSettings.nStatSymbLimit then local counter,check,key = GetStatCounter(nick),CheckStatusInUserStat(nick,str) if forced then if tSettings.tUserStatus[nick]["Forced"] == "" then tSettings.tUserStatus[nick]["Active"] = str if str ~= "" then if not check then table.insert(tSettings.tUserStatus[nick],str) if counter == tSettings.nStatHistLimit then table.remove(tSettings.tUserStatus[nick],1) end else table.remove(tSettings.tUserStatus[nick],key) table.insert(tSettings.tUserStatus[nick],str) end if who then Core.SendToOps("<"..tSettings.sBot.."> "..who.." изменил статус "..nick.." на "..str.."!") else Core.SendToNick(nick, "<"..tSettings.sBot.."> Ваш статус был изменен на "..str.."!") end else Core.SendToNick(nick, "<"..tSettings.sBot.."> Ваш статус удален!") end else if who then Core.SendToNick(who, "<"..tSettings.sBot.."> Удалите принудительный статус!") else Core.SendToNick(nick, "<"..tSettings.sBot.."> Вы не можете изменить ваш статус!") end end else tSettings.tUserStatus[nick]["Forced"] = str if str ~= "" then Core.SendToOps("<"..tSettings.sBot.."> "..who.." установил "..nick.." принудительный статус "..str.."!") Core.SendToNick(nick, "<"..tSettings.sBot.."> Вам установили принудительный статус!") else Core.SendToOps("<"..tSettings.sBot.."> "..who.." снял принудительный статус с "..nick.."!") Core.SendToNick(nick, "<"..tSettings.sBot.."> С Вас сняли принудительный статус!") end end else Core.SendToNick(nick, "<"..tSettings.sBot.."> Ошибка! Максимальное количество символов в статусе - "..tSettings.nStatSymbLimit.."!") end collectgarbage() end function GetStatCounter(nick) local counter = 0 if tSettings.tUserStatus[nick] then counter = table.maxn(tSettings.tUserStatus[nick]) else tSettings.tUserStatus[nick] = {} tSettings.tUserStatus[nick]["Forced"] = "" end collectgarbage() return counter end function CheckStatusInUserStat(nick,str) local check,n,pos = false, table.maxn(tSettings.tUserStatus[nick]) for key = 1,n do if str == tSettings.tUserStatus[nick][key] then check = true pos = key end end collectgarbage() return check,pos end function ShowHelp(user) -- Отображение помощи по регистрации local Msg = "Помощь по Статус-скрипту:\r\r" for key,value in pairs(tSettings.tProfiles[user.iProfile]["Commands"]) do Msg = Msg.."\t\t"..value.." - "..tSettings.tCommands[value]["Description"].."\r\r" end collectgarbage() return Msg end function IsInTable(tablename,str) local check = false for key,value in pairs(tablename) do if str == value then check = true end end collectgarbage() return check end function ShowMessageWithStatus(nick,cmd,param,str) if tSettings.tUserStatus[nick][param] ~= "" then if cmd == "!me" or cmd == "+me" or cmd == "/me" then Core.SendToAll("* "..nick.." ["..tSettings.tUserStatus[nick][param].."] "..str) else Core.SendToAll("<"..nick..">".." ["..tSettings.tUserStatus[nick][param].."] "..cmd.." "..str) end return true else return false end collectgarbage() end function ChatArrival(user,data) local data = string.sub(data, 1, -2) local s,e,cmd,value1,value2 = string.find(data, "^%b<>%s*(%S*)%s*(%S*)%s*(.*)") if tSettings.tCommands[string.lower(cmd)] then if IsInTable(tSettings.tProfiles[user.iProfile]["Commands"],string.lower(cmd)) then pcall(tSettings.tCommands[string.lower(cmd)]["Function"],user,value1,value2) return true else Core.SendToNick(user.sNick, "<"..tSettings.sBot.."> Вы не имеете доступа к данной команде!") return true end else if tSettings.tUserStatus[user.sNick] then if not IsInTable(tSettings.tHubCommands,cmd) then if tSettings.tUserStatus[user.sNick]["Forced"] ~= "" then return ShowMessageWithStatus(user.sNick,cmd,"Forced",value1.." "..value2) else return ShowMessageWithStatus(user.sNick,cmd,"Active",value1.." "..value2) end end end end collectgarbage() end function UserConnected(user) if tSettings.tUserStatus[user.sNick] then local key = table.maxn(tSettings.tUserStatus[user.sNick]) while key > 1 do Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Последние статусы\\"..tSettings.tUserStatus[user.sNick][key].."$<%[mynick]> !setstat "..tSettings.tUserStatus[user.sNick][key].."|") key = key - 1 end end for key,value in pairs(tSettings.tCommonStatus) do Core.SendToNick(user.sNick,"$UserCommand 1 1 "..tSettings.sMenu.."\\Статусы хаба\\"..tSettings.tCommonStatus[key].."$<%[mynick]> !setstat "..tSettings.tCommonStatus[key].."|") end for key,value in pairs(tSettings.tProfiles[user.iProfile]["Commands"]) do pcall(tSettings.tCommands[value]["UserCommands"],user) end collectgarbage() end RegConnected = UserConnected OpConnected = UserConnected function OnExit() SaveToFile(tSettings.sPath..tSettings.sFolder..tSettings.fUserStatus, tSettings.tUserStatus, "tSettings.tUserStatus") end