------------------------------------------------------------------------------------------------ -- ShowStatus version 1.1 by LEDOKOL-STALKER -- Specially for #Пластмасса -- Developed and tested in PtokaX 0.4.1.0 -- Lua 5.1.3 -- OS Windows ------------------------------------------------------------------------------------------------ -- Все жалобы и предложения принимаю в аську: 366796696 ------------------------------------------------------------------------------------------------ -- Возможности скрипта: -- Вывод статус-сообщений в главном чате - сообщения в формате "[Time] [Status Message] Message" или "[Time] * Nick [Status Message] Message" (Ограничение стауса по длине - nStatSymbLimit). -- Хранение последних nStatHistLimit статус-сообщений. Доступ к ним через меню (Отображаются Ваши последние статусы на момент доступа на хаб в порядке их использования сверху-вниз). -- Поддержка общих статусов хаба, доступных всем через меню (tCommonStatus). -- Частичная отключаемая (bPMStatusMessage) поддержка статус-сообщений в ЛС (Собеседник видит Ваш статус, Вы - нет. /me сообщения в ЛС не обрабатываются скриптом). -- Возможность присваивать статус другому юзеру (Смотрим настройки профилей - tProfiles). -- Возможность присваивать принудительный (он сам не сменит) статус другому юзеру (Смотрим настройки профилей - tProfiles). -- Поддержка паттернов сообщений, который скрипт обрабатывать не будет (tHubCommands). -- Все команды доступны через меню. -- Привязка статусов идет по нику. Если надо по адресу, - обращайтесь в аську. ------------------------------------------------------------------------------------------------ -- Если вы будете вносить изменения в код скрипта, убедительная просьба сообщить мне. ------------------------------------------------------------------------------------------------ -- Команды по умолчанию: -- !setstat - Установить статус. Команда !setstat string установит Вам статус string, !setstat - удалит Ваш статус. -- !setustat - Установить статус юзера. Команда !setustat nick string установит юзеру nick статус string, !setustat удалит статус юзера nick. -- !setfustat - Установить принудительный статус юзера. Команда !setfustat nick string установит юзеру nick принудительный статус string, !setfustat удалит принудительный статус юзера nick. -- !clrmyastat - Очистить Вашу статус-историю. Команда удалит ваши последние статусы и обнулит текущий, если он не принудительный. -- !setstat - Отображение помощи по статус-скрипту. ------------------------------------------------------------------------------------------------ tSettings = { sBot = SetMan.GetString(21), -- имя бота (по умолчанию имя бота хаба) sMenu = "Статус", -- название менюшки sPath = Core.GetPtokaXPath():gsub("/","\\").."scripts\\", sFolder = "Status", bPMStatusMessage = false, -- отображать / не отображать статус в ЛС (true / false) 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 3 "..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 3 "..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 3 "..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(FromNick,cmd,param,str,ToNick) if tSettings.tUserStatus[FromNick][param] ~= "" then if cmd == "!me" or cmd == "+me" or cmd == "/me" then if ToNick then -- сообщения в ЛС без статуса return false else Core.SendToAll("* "..FromNick.." ["..tSettings.tUserStatus[FromNick][param].."] "..str) end else if ToNick then Core.SendPmToNick(ToNick,FromNick,"["..tSettings.tUserStatus[FromNick][param].."] "..str) else Core.SendToAll("<"..FromNick..">".." ["..tSettings.tUserStatus[FromNick][param].."] "..cmd.." "..str) end 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 ToArrival(user,data) local data = string.sub(data, 1, -2) local s,e,ToNick,FromNick,Msg = string.find(data, "$To:%s*(%S+)%s*From:%s*(%S+)%s*%S+%s*(.*)") local s,e,cmd = string.find(Msg, "(%S+)") if tSettings.bPMStatusMessage then if tSettings.tUserStatus[user.sNick] then if tSettings.tUserStatus[user.sNick]["Forced"] ~= "" then return ShowMessageWithStatus(user.sNick,cmd,"Forced",Msg,ToNick) else return ShowMessageWithStatus(user.sNick,cmd,"Active",Msg,ToNick) end end end 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