Link Bot to PtokaX 0.4.0.0
 

Link Bot to PtokaX 0.4.0.0

Started by Spatz, 07 May, 2008, 05:42:25

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Spatz


Spatz

on Russian

-- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
--||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\||  |
--|| |											      |[ Перевод: by NRJ ]||  |
--|| |			               ]N&                                                              	  ||  |
--|| |			   0Q           M!              ]D1                 gNO9MM,              R&		  ||  |
--|| | 			   MK        _gg,u     ymw_,,   "Bg  ,p,            M#   06    ,pag    ,q0&_,s		  ||  |
--|| |			   ##        ``"0&    =MQ``TAz  j&$  ]#&            0N   &0  =qA``#pc   ^MA^^`		  ||  |
--|| |			   M&           &f    ]09  i&2  =NA q#t             l30Ng&   jZp  #E5    0Q		  ||  |
--|| |			   #M          4#6    ]MX  lN9  *&D00               &B   &0  ]06  4NH    0@		  ||  |
--|| |			   MB          ]#8    ]0!  4Q8  WNT ~0L             NN   ##  ]0!  420    #8		  ||  |
--|| |			   &M&gppg   pqjW&pg  ]M&  ]0F  ]0[  *NS            ##gyx0~  ^"&pg#!"    ~#ggp		  ||  |
--|| |			   ``    _   _    ``    _   _         `  _           _ ```_    _      __  _  _            ||  |
--|| |			"N@M@0N#**FF+479*~M#O"9#0M!*7M8N0**N*MMNN#*78MFM8"*#0@@N~*M!7*7!M**#4F***F0@MF*!          ||  |
--|| |                                                                                            ________________||  |
--|| |                                                                                           |[ By. St0ne db ]||  |
--||//////////////////////////////////////////////////////////////////////////////////////////////////////////////||  |
--||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
--
----[v1.01 Что же интересненького? ]---------------------------------------------
--
--	by NRJ:
--	• Поддержка LUA 5.x
--	• Русский интерфейс
--	• Исправление ошибки с доступом к командам
--
--	• Добавление ссылок на веб-сайты, с возможностью просмотра юзерами.
--	• Контроль доступа по профилям.
--	• Команда поиска по базе.
--	• Возможность показывать ссылки по таймеру.
--	• 2 вида визуального оформления бота уже включено
--
----[FAQ]-----------------------------------------------------------------------
--
--  • Как создать свой собсвенный стиль?
--
--      Собственный стиль состоит из 6 переменных, названных sSep0 - sSep5.
--      Каждая переменная для удобства подписана.
--
--      В тексте можно использовать некоторые "волшебные" знаки:
--          \t - табуляция
--          \n - новая линия
--
--      Вот так выглядит стиль по умолчанию:
--
--			<< Стиль A >>
--			sSep0	= " -=-  ",		    		---/ Заголовок
--			sSep1	= "\t",             			--/  То, что между ID и описанием ссылки
--			sSep2	= "  -=>  ",				--   То, что между описанием и самой ссылкой
--			sSep3   = "\r\n\t\t   Добавил: ",		--   То, что между ссылкой и информацией о том, кто ее добавил
--			sSep4	= " - Добавлено: ",			--\  То, что между ником того, кто добавил ссылку и датой добавления [Расширенная информация]
--			sSep5	= "\r\n",				---\ Окончание
--
--      Как же это будет выглядеть в Птоке:
--                                                    			      sSep2
--                                                      			|
--                                                      			|
--                                                     			       \|/
-- 			-=-  ID: 5			UK LUA Language Board  -=>  http://lua.uknnet.com
--			/T\ 	    /T\	 		Добавил: st0ne_db - Добавлено: 30/05/06
--           		 |           |        	 	   /T\                  /T\                 /T\
--           		 |           |         	  	    |                    |                   |
--           		 |           |         	  	    |                    |                   |
--         	       sSep0       sSep1     		  sSep3                sSep4               sSep5
--
--
--  • Как показать нужную категорию по таймеру?
--
--      Данный скрипт позволяет Вам выводить информацию с веб-ссылками в выбранное Вами время.
--      Время обязательно должно быть в 24-часовом формате! Можно выводить все ссылки в случайном порядке
--	или же в заданное время выводить нужные вам линки.
--
--          например:     ["04:20"] 	= "Выводим случайным образом не важно что",
--
--      Также по названиям категорий можно организовать поиск. Здесь можно задавать  поиск, как все слово, так и его часть
--
--			например: 	["04:20"] 	= "PtokaX",
--					["16:20"] 	= "toka",       <-- часть слова
--
-- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Credit •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
--
--  - Serialize и SaveToFile функции из: 'Entry Bot v1.1e' (от jiten)
--  - Функция pairsByKeys из: http://www.lua.org/pil/19.3.html
--  - Бета-тестинг: Спасибо Stormbringer 
--  - Весь остальной код написал St0ne db
--  		-[ Обновления, Сообщения о багах..и другие LUA скрипты для PtokaX.. http://the-westside.no-ip.info ]-
--
--  - Поддержите сообщество LUA-
--  	Х LUA Language Board:  		http://forum.ptokax.org
--  	Х UK LUA Language Board : 	http://lua.uknnet.com
--  	Х PtokaX Resources' Site:	http://ptxscriptdb.psycho-chihuahua.net
--      Х PtokaX Wiki:             	http://ptxwiki.psycho-chihuahua.net/doku.php
--
--
-- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Script Variables •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
tVar = {
	--*************************************************************************************************************
	--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Конфигурация !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	--*************************************************************************************************************  
	sPrefix	= "!",   					---- Префикс команд
	------------------------------------------------------------------------------------------
	sBot	= "Ссылки",  				---/ Имя бота
	sBotD	= "Архив ссылок хаба",			--/  Описание бота
	sBotE	= "linkbot@ptokax.net",			--\  Email адрес бота
	sIsOP	= 1,					---\ Бот ОП? (1=да,0=нет)
	sResp   = "main",                   		---- Куда будет отвечать бот? <main=общий чат, pm=личка>
	------------------------------------------------------------------------------------------ 
	sFolder	= "LinkBot",    			---/ Папка скрипта
	sFile	= "links.tbl",      			---\ База данных скрипта
	sSendRC = "on",                     		---/ Посылать менюшку? <on=да, off=нет>
	sMenu   = "Ссылки",				---\ Название меню
	sUser   = "off",                    		---- Только админ может добавлять ссылки
	sNew    = "main",                   		---- Сообщать о добавлении новых ссылок <main=в главный чат/pm=в личку/off=отключить>
	sSpam   = "off",	                	---- Показывать базу данных линков при входе <main=в главный чат/pm=в личку/off=отключить>
	
	--*************************************************************************************************************
	--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Оформление !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	--*************************************************************************************************************
	sHdStr	= "-- ",				---/ Заголовок
	iHdSize = 55,					---\ Сколько раз будет повторяться
	sExtNfo = "on",					---/ Показывать дополнительную информацию (кто и когда добавил ссылку) <on=показывать, off=не показывать>
	sETime 	= "dmy",				---\ Формат даты (d=день, m=месяц, y=год)
	----<<[ Стиль A ]>>-----------------------------------------------------------------------                                    
	sSep0	= " -=-  ",		    		---/ Заголовок
	sSep1	= "\t",             			--/  То, что между ID и описанием ссылки
	sSep2	= "  -=>  ",				--   То, что между описанием и самой ссылкой
	sSep3   = "\r\n\t\t   Добавил: ",		--   То, что между ссылкой и информацией о том, кто ее добавил
	sSep4	= " - Добавлено: ",			--\  То, что между ником того, кто добавил ссылку и датой добавления [Расширенная информация]
	sSep5	= "\r\n",				---\ Окончание	  
	----<<[ Стиль B ]>>-----------------------------------------------------------------------
	--sSep0	= "",		    			---/ Заголовок
	--sSep1	= "  -=+=-  ",             		--/  То, что между ID и описанием ссылки
	--sSep2	= "  -=+=-  ",				--   То, что между описанием и самой ссылкой
	--sSep3 = "  -=+=-  Добавил: ",			--   То, что между ссылкой и информацией о том, кто ее добавил
	--sSep4	= " Добавлено: ",			--\  То, что между ником того, кто добавил ссылку и датой добавления [Расширенная информация]
	--sSep5	= "  -=+=-",				---\ Окончание  

   	--*************************************************************************************************************
	--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Таймер !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	--*************************************************************************************************************
	sTimedShow		= "on",  		---- Показывать категории по таймеру <on=да, off=нет>
	sTimed			= "pm",	     		---- Показывать <main/pm>
	iTime 			= 50,			---- Интервал таймера (в секундах)
	sRTime 			= "off",		---- Показ случайных категорий <on=включить, off=выключить>
	tTime = {                           		---- Время и название категории для показа (если не используется случайный показ)
		["04:20"] 	= "PtokaX",
		["16:20"] 	= "PtokaX",
	},
}

-- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Команды •||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
tCmd = {
	sAddCat = "addlcat",		-- Добавить новую категорию		[Админ]
	sDel    = "dellink",		-- Удалить линк				[Админ]
	sDelCat = "dellcat",		-- Удалить категорию			[Админ]
	sFixID  = "fixids",		-- Перенумеровать ID ссылок		[Админ]
	sAdd	= "addlink",		-- Добавить новую ссылку       		[Юзер/Админ]
	sShow   = "lshow",      	-- Показать категории и ссылки          [Юзер]
	sCShow  = "lshowcat",		-- Показать категории        		[Юзер]
	sSearch = "searchl",		-- Поиск по базе     			[Юзер]
}

-- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Профили •||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
-- Доступ для юзера [Показывать и добавлять ссылки] (1=доступ/0=запрет) -- **Дополнительные профили 1 и 2 созданы для поддержки Robocop'ом**
pUser = {    
	[0] = 1,    -- =[Master]=
	[1] = 1,    -- =[OP]=
	[2] = 1,    -- =[ViP]=
	[3] = 1,    -- =[Reg]=
	[4] = 1,    -- =[Custom Profile 1]=
	[5] = 1,    -- =[Custom Profile 2]=
   [-1] = 1,	    -- =[UnReg]=
}
-- Админ-доступ [Удаление категорий и линков, добавление категорий] (1=доступ/0=запрет)
pAdmin = {
	[0] = 1,    -- =[Master]=
	[1] = 0,    -- =[OP]=
	[2] = 0,    -- =[ViP]=
	[3] = 0,    -- =[Reg]=
	[4] = 0,    -- =[Custom Profile 1]=
	[5] = 0,    -- =[Custom Profile 2]=
   [-1] = 0,   	    -- =[UnReg]=
}

-- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////\
--|• Основной код •|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  |
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
function Main()

	-- ПОДДЕРЖКА LUA 5.X 
	if (_VERSION == "Lua 5.1.1") or (_VERSION == "Lua 5.1") then
		TableMaxSize = table.maxn
		StringMatch = string.gmatch
	elseif (_VERSION == "Lua 5.0.2") then
		TableMaxSize = table.getn
		StringMatch = string.gfind
	end

  	local tempt = "";
	for t in StringMatch(tVar.sETime,"%S") do 
		tempt = tempt.."\%"..t.."/"; 
	end
	tempt = string.sub(tempt,1,string.len(tempt)-1);
	tVar.sETime = tempt;
	frmHub:RegBot(tVar.sBot,tVar.sIsOP,tVar.sBotD,tVar.sBotE);
	if tVar.sTimedShow == "on" then
  SetTimer(tVar.iTime*1000);
		StartTimer();
	end
	doLoadData();
end

function ChatArrival(user,data)
	local data = string.sub(data,1,-2) 
	local s,e,sTrig,sCmd = string.find(data,"%b<>%s*(%S)(%S+)")
	if sTrig == tVar.sPrefix then		
		local tScriptCmds = {

			[tCmd.sAdd] = function(user,data)
				if tVar.sUser == "on" then
					if pAdmin[user.iProfile] ~= 1 then SendCmdErr(user); return 1; end
				else
				    if not pUser[user.iProfile] == 1 then return 1; end
				end
				local _,_,sCatName,sURL,sDesc = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(%S+)%s+(.*)");
				if sCatName and sURL and sDesc then
					local found = false;
					for catname in pairs(LinkData) do
						if string.find(string.lower(catname),string.lower(sCatName)) then
							found = catname;
                    	    for cats,v in pairsByKeys(LinkData[catname]) do
								if string.lower(cats) == string.lower(sDesc) then
									toUser(user,"*** Ошибка: Повторный ввод, "..sDesc)
									return 1;
								end 
							end
							local IDNum = doIDNum("set",1); local current = os.date(tVar.sETime)
							LinkData[catname][sDesc] = {};	LinkData[catname][sDesc]["URL"] = sURL; LinkData[catname][sDesc]["ID"] = IDNum;
							LinkData[catname][sDesc]["User"] = user.sName;	LinkData[catname][sDesc]["Date"] = current;												
							doSaveData();				
						end
      				end
					if found == false then
                    	toUser(user,"*** Ошибка: Категория "..sCatName.." не существует.");
					else
						toUser(user,"*** Ссылка добавлена: "..found..", ID: "..LinkData[found][sDesc]["ID"].." - "..sDesc.." - "..sURL);
					    if tVar.sNew == "main" then
                    		SendToAll(tVar.sBot,"*** Ссылка добавлена: "..found..", - "..sDesc.." - "..sURL);
						elseif tVar.sNew == "pm" then
                    		SendPmToAll(tVar.sBot,"*** Ссылка добавлена: "..found..", - "..sDesc.." - "..sURL);
						end						
					end			
				else
					toUser(user,"\r\n"..showCatInfo().."\r\n*** Ошибка: Попробуйте - "..tVar.sPrefix..tCmd.sAdd.." <категория> <URL> <описание>");
				end
				return 1;
			end,
			
			[tCmd.sAddCat] = function(user,data)
				if pAdmin[user.iProfile] ~= 1 then SendCmdErr(user); return 1; end
				local _,_,sCatName = string.find(data,"%b<>%s+%S+%s+(%S+)");
				if sCatName then
					if not LinkData[sCatName] then
						LinkData[sCatName] = {};
						doSaveData();
						toUser(user,"*** Категория: "..sCatName.." добавлена.");
				    else
				    	toUser(user,"*** Ошибка! Категория "..sCatName.." уже существует!");	
				    end
				else	
					toUser(user,"\r\n"..showCatInfo().."*** Ошибка: Попробуйте - "..tVar.sPrefix..tCmd.sAddCat.." <категория>");
				end
				return 1;
			end,
			
			[tCmd.sDel] = function(user,data)
                if pAdmin[user.iProfile] ~= 1 then SendCmdErr(user); return 1; end
				local _,_,sIDNum = string.find(data,"%b<>%s+%S+%s+(.*)");
				if sIDNum then					
					local sMsg = "\r\n"; local idChk = 0;
					for ID in StringMatch(sIDNum, "%S+") do
						idChk = doIDNum("check",ID);
						if idChk == 0 then
							sMsg = sMsg.."*** ID: "..tostring(ID).." удален.\r\n"   
						else
							sMsg = sMsg.."*** ID: "..tostring(ID).." не найден.\r\n"	
						end
					end
					toUser(user,sMsg);									
				else
					toUser(user,"*** Error: Enter ID to delete, Multiple ID's may be entered on one line.");
				end
				return 1;
			end,
			
			[tCmd.sDelCat] = function(user,data)
                if pAdmin[user.iProfile] ~= 1 then SendCmdErr(user); return 1; end
				local _,_,sCatName = string.find(data,"%b<>%s+%S+%s+(%S+)");
				if LinkData[sCatName] then
					LinkData[sCatName] = nil;
					doSaveData();
					toUser(user,"*** Категория: "..sCatName.." и все ссылки внутри нее были удалены");
				else
					toUser(user,"\r\n"..showCatInfo().."\r\n*** Ошибка: Введите название категории, которая подлежит удалению (все ссылки внутри категории будут удалены)");
				end
				return 1;
			end,
			
			[tCmd.sShow] = function(user,data)
                if not pUser[user.iProfile] == 1 then return 1; end
				local _,_,sCatName = string.find(data,"%b<>%s+%S+%s+(%S+)");
				local sMsg = "";
				if sCatName then -- show by cat
					local found = false;
					for cats in pairs(LinkData) do
						if string.find(string.lower(cats),string.lower(sCatName)) then
							found = true;
							sMsg = sMsg.."\r\n\r\n"
				    		.."\r\n\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n\t\t\t\t• "..cats.." •\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n";
							for desc,v in pairsByKeys(LinkData[cats]) do
								sMsg = sMsg..tVar.sSep0.."ID: "..LinkData[cats][desc]["ID"]..tVar.sSep1..desc..tVar.sSep2..LinkData[cats][desc]["URL"].." ";
								if string.lower(tVar.sExtNfo) == "on" and LinkData[cats][desc]["User"] then
									sMsg = sMsg..tVar.sSep3..LinkData[cats][desc]["User"]..tVar.sSep4..LinkData[cats][desc]["Date"]..tVar.sSep5.."\r\n";
								elseif string.lower(tVar.sExtNfo) == "on" then
									sMsg = sMsg..tVar.sSep3.."Неизвестно"..tVar.sSep4.."Неизвестно"..tVar.sSep5.."\r\n";
								else
									sMsg = sMsg..tVar.sSep5.."\r\n";
								end
							end
						end
      				end
					if found == true then
					    toUser(user,"Displaying by category.... "..sMsg);
					else
						toUser(user,"*** Error: Category "..sCatName.." does not exist.");
					end
				else -- show all
				    sMsg = sMsg.."Все ссылки.... \r\n\r\n"
					for cats,v in pairsByKeys(LinkData) do
				    	sMsg = sMsg.."\r\n\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n\t\t\t\t• "..cats.." •\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n";
						if LinkData[cats] then
							for desc,v in pairsByKeys(LinkData[cats]) do
								sMsg = sMsg..tVar.sSep0.."ID: "..LinkData[cats][desc]["ID"]..tVar.sSep1..desc..tVar.sSep2..LinkData[cats][desc]["URL"].." ";
								if string.lower(tVar.sExtNfo) == "on" and LinkData[cats][desc]["User"] then
									sMsg = sMsg..tVar.sSep3..LinkData[cats][desc]["User"]..tVar.sSep4..LinkData[cats][desc]["Date"]..tVar.sSep5.."\r\n";	
								elseif string.lower(tVar.sExtNfo) == "on" then
									sMsg = sMsg..tVar.sSep3.."Неизвестно"..tVar.sSep4.."Неизвестно"..tVar.sSep5.."\r\n";
								else 
									sMsg = sMsg..tVar.sSep5.."\r\n";
								end
							end
				    	end
					end
					toUser(user,sMsg);
				end
				return 1;
			end,

			[tCmd.sFixID] = function(user,data)
                if pAdmin[user.iProfile] ~= 1 then SendCmdErr(user); return 1; end
				doIDNum("fix",1)
				toUser(user,"*** ID ссылок перенумерованы.");
				return 1;
			end,

			[tCmd.sSearch] = function(user,data)
                if not pUser[user.iProfile] == 1 then return 1; end
                local _,_,sType,sTxt = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(.*)");
				local sMsg = ""
				if sType and sTxt then
				    if string.lower(sType) == "cat" then
						for cats in pairs(LinkData) do
							if string.find(string.lower(cats),string.lower(sTxt)) then
						        sMsg = sMsg.."- "..cats.."\r\n"
							end
						end
						toUser(user,"*** Результат поиска: по категории\r\n\r\n"..sMsg)
				    elseif sType == "link" then
						for cats in pairs(LinkData) do
							for desc in pairs(LinkData[cats]) do
								local url = LinkData[cats][desc]["URL"];
								if string.find(string.lower(desc),string.lower(sTxt)) or string.find(string.lower(url),string.lower(sTxt)) then
						        	sMsg = sMsg.."- "..cats.." : "..desc.." [ "..url.." ]\r\n"
								end
							end
						end
      					toUser(user,"*** Результат поиска: по ссылке\r\n\r\n"..sMsg)
				    else
            			toUser(user,"*** Ошибка: Используйте - "..tVar.sPrefix..tCmd.sSearch.." <cat/link> <текст_который_ищем>");
				    end
				else
				    toUser(user,"*** Ошибка: Используйте - "..tVar.sPrefix..tCmd.sSearch.." <cat/link> <текст_который_ищем>");
				end
				return 1;
			end,

			[tCmd.sCShow] = function(user,data)
                if not pUser[user.iProfile] == 1 then return 1; end
				toUser(user,"*** Лист категорий: \r\n\r\n"..showCatInfo());
				return 1;
			end,
			
		}		
		if tScriptCmds[sCmd] then
			return tScriptCmds[sCmd](user,data);
	 	end
	end
end

function NewUserConnected(user)
	if string.lower(tVar.sSendRC) == "on" then
		if user.bUserCommand then
			if (pUser[user.iProfile] == 1) then
				if (tVar.sUser ~= "on") then
				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Добавить ссылку$<%[mynick]> "..tVar.sPrefix..tCmd.sAdd.." %[line:Название категории?] %[line:URL?] %[line:Описание?]&#124;");
				end
				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Все ссылки$<%[mynick]> "..tVar.sPrefix..tCmd.sShow.."&#124;");
                		user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Показать ссылки по категории$<%[mynick]> "..tVar.sPrefix..tCmd.sShow.." %[line:Название категории?]&#124;");
				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Показать категории$<%[mynick]> "..tVar.sPrefix..tCmd.sCShow.."&#124;");
				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Поиск$<%[mynick]> "..tVar.sPrefix..tCmd.sSearch.." %[line:cat/link?] %[line:Что ищем?]&#124;");
    		end
    		if (pAdmin[user.iProfile] == 1) then
				if (tVar.sUser == "on") then
				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Админ\\Добавить ссылку$<%[mynick]> "..tVar.sPrefix..tCmd.sAdd.." %[line:Название категории?] %[line:URL?] %[line:Описание?]&#124;");
				end
				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Админ\\Добавить категорию$<%[mynick]> "..tVar.sPrefix..tCmd.sAddCat.." %[line:Название категории?]&#124;");
      				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Админ\\Удалить ссылку$<%[mynick]> "..tVar.sPrefix..tCmd.sDel.." %[line:Введите ID. Можно ввести несколько через пробел]&#124;");
      				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Админ\\Удалить категорию$<%[mynick]> "..tVar.sPrefix..tCmd.sDelCat.." %[line:Имя категории?]&#124;");
      				user:SendData("$UserCommand 1 3 "..tVar.sMenu.."\\Админ\\Перенумеровать ID ссылок$<%[mynick]> "..tVar.sPrefix..tCmd.sFixID.."&#124;");
				end
  		end
 	end
	if tVar.sSpam ~= "off" then
		local sMsg = "\r\n";
		for cats,v in pairsByKeys(LinkData) do
		   	sMsg = sMsg.."\r\n\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n\t\t\t\t• "..cats.." •\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n";
			for desc,v in pairsByKeys(LinkData[cats]) do
				sMsg = sMsg..tVar.sSep0.."ID: "..LinkData[cats][desc]["ID"]..tVar.sSep1..desc..tVar.sSep2..LinkData[cats][desc]["URL"].." ";
				if string.lower(tVar.sExtNfo) == "on" and LinkData[cats][desc]["User"] then
					sMsg = sMsg..tVar.sSep3..LinkData[cats][desc]["User"]..tVar.sSep4..LinkData[cats][desc]["Date"]..tVar.sSep5.."\r\n";
				elseif string.lower(tVar.sExtNfo) == "on" then
					sMsg = sMsg..tVar.sSep3.."Неизвестно"..tVar.sSep4.."Неизвестно"..tVar.sSep5.."\r\n";
				else
					sMsg = sMsg..tVar.sSep5.."\r\n";
				end
		   	end
		end
		if tVar.sSpam == "main" then
 	        user:SendData(tVar.sBot, sMsg);
 		elseif tVar.sSpam == "pm" then
 	        user:SendPM(tVar.sBot, sMsg);
 		end
	end
end

function OnTimer()
 	local current = os.date("%H:%M");
	local sMsg = "";
    local found = false;
	if tVar.tTime[current] then
		if tVar.sRTime == "on" then
            math.randomseed(os.clock());
			found = true;
			local tRandCat = { };
			for cats in pairs(LinkData) do
				table.insert(tRandCat, cats);
      		end
      		local rand = math.random(1,TableMaxSize(tRandCat));
			local cats = tRandCat[rand];
			sMsg = sMsg.."\r\n\r\n"
			.."\r\n\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n\t\t\t\t• "..cats.." •\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n";
			for desc,v in pairsByKeys(LinkData[cats]) do
				sMsg = sMsg..tVar.sSep0.."ID: "..LinkData[cats][desc]["ID"]..tVar.sSep1..desc..tVar.sSep2..LinkData[cats][desc]["URL"].." ";
				if string.lower(tVar.sExtNfo) == "on" and LinkData[cats][desc]["User"] then
					sMsg = sMsg..tVar.sSep3..LinkData[cats][desc]["User"]..tVar.sSep4..LinkData[cats][desc]["Date"]..tVar.sSep5.."\r\n";
				elseif string.lower(tVar.sExtNfo) == "on" then
					sMsg = sMsg..tVar.sSep3.."Неизвестно"..tVar.sSep4.."Неизвестно"..tVar.sSep5.."\r\n";
				else
					sMsg = sMsg..tVar.sSep5.."\r\n";
				end
			end
		else
   			for cats in pairs(LinkData) do
				if string.find(string.lower(cats),string.lower(tVar.tTime[current])) then
					found = true;
					sMsg = sMsg.."\r\n\r\n"
				    .."\r\n\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n\t\t\t\t• "..cats.." •\r\n "..string.rep(tVar.sHdStr,tVar.iHdSize).."\r\n";
					for desc,v in pairsByKeys(LinkData[cats]) do
						sMsg = sMsg..tVar.sSep0.."ID: "..LinkData[cats][desc]["ID"]..tVar.sSep1..desc..tVar.sSep2..LinkData[cats][desc]["URL"].." ";
						if string.lower(tVar.sExtNfo) == "on" and LinkData[cats][desc]["User"] then
							sMsg = sMsg..tVar.sSep3..LinkData[cats][desc]["User"]..tVar.sSep4..LinkData[cats][desc]["Date"]..tVar.sSep5.."\r\n";
						elseif string.lower(tVar.sExtNfo) == "on" then
							sMsg = sMsg..tVar.sSep3.."Неизвестно"..tVar.sSep4.."Неизвестно"..tVar.sSep5.."\r\n";
						else
							sMsg = sMsg..tVar.sSep5.."\r\n";
						end
					end
				end
      		end
		end
		if found == true then
			if tVar.sTimed == "main" then
				SendToAll(tVar.sBot,"["..current.."] Категория: "..tVar.tTime[current].."\r\n"..sMsg);
            elseif tVar.sTimed =="pm" then
                SendPmToAll(tVar.sBot,"["..current.."] Категория: "..tVar.tTime[current].."\r\n"..sMsg);
            end
		else
			SendToOps(tVar.sBot,"*** Ошибка: Категория "..tVar.tTime[current].." не существует.");
		end
	end
end

-- Misc Functions
function toUser(curUser,sMsg)
	if tVar.sResp == "pm" then
        curUser:SendPM(tVar.sBot,sMsg);
	else
		curUser:SendData(tVar.sBot,sMsg);
	end
end

function showCatInfo()
	local sMsg = string.rep("-",20).."\r\n  Категории:\r\n"..string.rep("-",20).."\r\n\r\n";
	for cats,v in pairsByKeys(LinkData) do
		local lNum = function(cat) local cnt = 0; for c in pairs(LinkData[cat]) do cnt=cnt+1; end	return tostring(cnt); end 
		sMsg = sMsg.." Название категории: "..cats.."\r\n Кол-во ссылок: "..lNum(cats).."\r\n\r\n"
	end
	return sMsg;
end

function doIDNum(sType,IDNum)
	if sType == "fix" then
		local curNum = 1
		if LinkData ~= nil then
			for cats,v in pairsByKeys(LinkData) do
				if LinkData[cats] ~= nil then
					for desc,v in pairsByKeys(LinkData[cats]) do
						LinkData[cats][desc]["ID"] = curNum;						
						curNum = curNum + 1;
			        end
				end	
			end
	    end
		doSaveData();	
	else
		if LinkData ~= nil then
			for cats,v in pairsByKeys(LinkData) do
				if LinkData[cats] ~= nil then
					for desc,v in pairsByKeys(LinkData[cats]) do
						if sType == "set" then --set
							local curNum = tonumber(LinkData[cats][desc]["ID"])
							if curNum >= IDNum then
								IDNum = curNum + 1;
							end
						else --check & delete
							if tonumber(LinkData[cats][desc]["ID"]) == tonumber(IDNum) then
								LinkData[cats][desc] = nil; -- deleted
								return 0;
							end
						end					
					end
				end	
	
			end
	    end
	end
	return IDNum;
end

-- File Functions
function doLoadData()
	if loadfile(tVar.sFolder.."/"..tVar.sFile) then
    	dofile(tVar.sFolder.."/"..tVar.sFile);
  	else
        local file = io.open(tVar.sFolder.."/"..tVar.sFile , "a" );
        local data = "LinkData = {\r\n}";
		io.output(tVar.sFolder.."/"..tVar.sFile);
    	file:write( data );
    	file:close();
    	dofile(tVar.sFolder.."/"..tVar.sFile);
  	end
end

function doSaveData()
	SaveToFile(tVar.sFolder.."/"..tVar.sFile,LinkData,"LinkData")
	doLoadData()
end

function SendCmdErr(user)
	user:SendData(tVar.sBot, "*** Ошибка: У Вас нет доступа к данной команде!");
end

-- Function from: http://www.lua.org/pil/19.3.html --
function pairsByKeys (t, f)
    local a = {}
    for n in pairs(t) do table.insert(a, n) end
    table.sort(a, f)
    local i = 0
    local iter = function ()
        i = i + 1
        if a[i] == nil then return nil
        else return a[i], t[a[i]]
        end
    end
	return iter
end

-- Functions from: Entry Bot 1.1e (by jiten) --
Serialize = function(tTable,sTableName,hFile,sTab)
	sTab = sTab or "";
	hFile:write(sTab..sTableName.." = {\n");
	for key,value in pairs(tTable) do
		if (type(value) ~= "function") then
			local sKey = (type(key) == "string") and string.format("[%q]",key) or string.format("[%d]",key);
			if(type(value) == "table") then
				Serialize(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
	end
	hFile:write(sTab.."}");
end

SaveToFile = function(file,table,tablename)
	local hFile = io.open(file,"w+") Serialize(table,tablename,hFile); hFile:close()
end

OpDisconnected=UserDisconnected
OpConnected=NewUserConnected

?[-?Genius?-]?

Hi

This script its for using in HubLink?

SMF spam blocked by CleanTalk