| 
 | 
Здравствуйте, гость ( Вход | Регистрация )
|   | 
| 
 | 
|  26.8.2008, 11:25 
				 Сообщение
					#41
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				Вот тут в одной теме просили написать скрипт статистики.... Написал... вроде всё правильно, но есть ошибка:не сохраняются данные в файл(не таблица), а ещё как наилучшим способом реализовать чтоб шара удалялась из таблицы если пользователь не был какое то время или поменял её.
				
				
				 
	Прикрепленные файлы
	
 | 
|  | |
|  26.8.2008, 12:07 
				 Сообщение
					#42
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				папку Statistics создай! что касается изменения шары, то это можно взять из хуббабота, там при входе сканируется и изменяется таблица топа шары и устанавливается время очистки | 
|  | |
|  26.8.2008, 15:09 
				 Сообщение
					#43
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				Папка была!!! При первом запуске скрипта создаётся два нужных файла. В файл с таблицей запись идёт а в во второй нет(((
				
				
				
			 | 
|  | |
|  26.8.2008, 15:37 
				 Сообщение
					#44
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				во-первых, думаю, что следует написать так: Код local sSettings = "MaxUser = 0\r\nMaxUsersTime = 0\r\nMaxShara = 0\r\nMaxSharaTime = 0"  MaxUser,MaxUsersTime,MaxShara,MaxSharaTime = 0,0,0,0 local sHandle = io.open(gStat, "w+") sHandle:write(sSettings) sHandle:flush() sHandle:close() P.S. переменные MaxUser,MaxUsersTime,MaxShara и MaxSharaTime останутся в стеке скрипта. во-вторых: запись в этот файл производится по таймеру (каждые 30 секунд) Код TmrMan.AddTimer(30*1000,"UpdateHubStats") | 
|  | |
|  10.9.2008, 13:08 
				 Сообщение
					#45
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				давненько уже сам ничего не делал вот тут нашли ещё один баг в вышеприведённом скрипте статистики! CODE gPath = Core.GetPtokaXPath():gsub("/", "\\").."scripts\\Statistics\\" -- основная папка скрипта gStat = gPath.."Statistics.tbl" -- таблица max статистики gShara = gPath.."Sharatop.tbl" -- таблица шары пользователей tShara = {} function OnStartup() -- функции которые выполняются при загрузке скрипта if loadfile(gStat) ~= nil then dofile(gStat) Core.SendToAll("Файл найден") else local sSettings = "MaxUser = 0\r\nMaxUsersTime = 0\r\nMaxShara = 0\r\nMaxSharaTime = 0" MaxUser,MaxUsersTime,MaxShara,MaxSharaTime = 0,0,0,0 local sHandle = io.open(gStat, "w+") sHandle:write(sSettings) sHandle:flush() sHandle:close() Core.SendToAll("Файл не найден") end end Он всегда не находит файл(хотя он там есть) и при перезагрузке обнуляет всю стату((( в чём проблема | 
|  | |
|  10.9.2008, 15:00 
				 Сообщение
					#46
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				попробуй так: Код gPath = "scripts\\Statistics\\" | 
|  | |
|    11.9.2008, 15:16 
				 Сообщение
					#47
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				не помогло((( попробовал и так:gPath = "scripts\\Statistics\\" и так: gPath = "Statistics\\" Собственно у меня птока 0400 поэтому первый вариант и так не подходит! Когда файла нет, он пишет файл не найден и создаёт его, но когда в него вносятся какие то изменения при перезагрузке скрипта он опять пишет файл не найден и воссоздаёт его в первоначальном виде(((
				
				
				
			 | 
|  | |
|  15.9.2008, 21:05 
				 Сообщение
					#48
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				как создать папку если она прописана как Код gPath = Core.GetPtokaXPath():gsub("/", "\\").."scripts\\Hub files\\" вроде это просто... черещ вот этот код Код         if os.execute("dir "..gPath) ~= 0 then os.execute("md "..gPath) end | 
|  | |
|    15.9.2008, 21:07 
				 Сообщение
					#49
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				не совсем верно есть 3 ошибки: 1). Нафига использовать полный путь? Незачем выполнять лишние действия и писать Core.GetPtokaXPath():gsub("/", "\\") Функция os.execute вызывает командную строку (командная строка вызывается из папки, где лежит файл PtokaX.exe), поэтому ошибочным будет загонять полный путь. 2). В аргументе команды md недопустимы пробелы. 3). Действие os.execute("md "..gPath) создает папку, если она еще не была создана до этого, поэтому действие if os.execute("dir "..gPath) ~= 0 then также бессмысленно. В итоге надо написать так: Код local gPath = "scripts\\Hub_files" os.execute("md "..gPath) | 
|  | |
|  16.9.2008, 22:34 
				 Сообщение
					#50
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				А можно ли получить IP юзера по нику? Вот например когда делаем вот так: CODE function ChatArrival(sUser, sData) sData = string.sub(sData,1,-2) local _,_,cmd =string.find(sData, "%b<>%s+(%S+)") if cmd == "!gagmainnick" then local _,_,Nick = string.find(sData, "%b<>%s+%S+%s+(%S+)") local IP = ??? end end если я напишу local IP = sUser.sIP, то IP будет присвоенно значение моего ип, а как сделать чтоб IP было равно айпишнику юзера с ником Nick? И ещё вопросец, видемо к Setuper`у(ибо остальные куда то пропали) Ты был прав в скрипте гага я ошибся... Посмотри пожалуйста где я напортачил: CODE function ChatArrival... if cmd == "!showgagmain" then showgag(sUser, Main) return true end if cmd == "!showgagpm" then showgag(sUser, Pm) return true end function showgag(sUser, tip) local qwerty = nil tNick = {} tIP = {} if tip == Main then qwerty = "главном чате" tNick = tGag.Main["Nick"] tIP = tGag.Main["Ip"] end qwerty = "привате" tNick = tGag.Pm["Nick"] tIP = tGag.Pm["Ip"] end ... end Почемуто когда нажиимаешь посмотреть заглушенных в мейне он всё равно показывает заглушенных в PM | 
|  | |
|  16.9.2008, 22:57 
				 Сообщение
					#51
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | Код function ChatArrival(sUser, sData) sData = string.sub(sData,1,-2) local _,_,cmd =string.find(sData, "%b<>%s+(%S+)") if cmd == "!gagmainnick" then local _,_,Nick = string.find(sData, "%b<>%s+%S+%s+(%S+)") local tUs=Core.GetUser(Nick) if tUs then local IP = tUs.sIP end end end Код function ChatArrival... if cmd == "!showgagmain" then showgag(sUser, "Main") return true elseif cmd == "!showgagpm" then showgag(sUser, "Pm") return true end function showgag(sUser, tip) local qwerty = nil tNick = {} tIP = {} if tip == "Main" then qwerty = "главном чате" tNick = tGag.Main["Nick"] tIP = tGag.Main["Ip"] elseif tip == "Pm" then qwerty = "привате" tNick = tGag.Pm["Nick"] tIP = tGag.Pm["Ip"] end ... end | 
|  | |
|  17.9.2008, 20:06 
				 Сообщение
					#52
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 3). Действие os.execute("md "..gPath) создает папку, если она еще не была создана до этого, поэтому действие  if os.execute("dir "..gPath) ~= 0 then  также бессмысленно. не понимаю почему это действие бессмыслено, ведь dir это команда просмотра содержимого папки, поэтому если os.execute("dir "..gPath) ~= 0 (просмотр папки не удался), значит надо применять os.execute("md "..gPath). Или я не правильно понимаю? А ещё CODE function ChatArrival(sUser, sData) sData = string.sub(sData,1,-2) local _,_,cmd =string.find(sData, "%b<>%s+(%S+)") if cmd == "!gagmainnick" then local _,_,Nick = string.find(sData, "%b<>%s+%S+%s+(%S+)") local tUs=Core.GetUser(Nick) if tUs then local IP = tUs.sIP end end end не работает. Пишет что tUs равно nil((( И ещё вопрос как сделать так чтоб изменение в скрипте применялись без перезагрузки. Т.е. если сделать переименование бота из меню чтобы после введения нового имении сразу становился с таким именем а не ждал перезагрузки скрипта | 
|  | |
|  18.9.2008, 11:52 
				 Сообщение
					#53
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | не понимаю почему это действие бессмыслено, ведь dir это команда просмотра содержимого папки, поэтому если os.execute("dir "..gPath) ~= 0 (просмотр папки не удался), значит надо применять os.execute("md "..gPath). Или я не правильно понимаю? Зачем просматривать содержимое папки, если команда os.execute("md "..gPath) создаёт папку в случае если она ещё не создана (в случае если папка уже создана команда ничего не делает). Просмотр содержимого папки - лишнее действие. не работает. Пишет что tUs равно nil((( Если пользователя с указанным ником не существует или он оффлайн, то будет nil. Данное действие применимо только к онлайн пользователям. И ещё вопрос как сделать так чтоб изменение в скрипте применялись без перезагрузки. Т.е. если сделать переименование бота из меню чтобы после введения нового имении сразу становился с таким именем а не ждал перезагрузки скрипта Со случаем переименования через меню можно сделать сразу после введения нового имени действие по регистрации нового бота и удаления старого. Во всех других случаях можно воспользоваться таймером, который отслеживает изменения имени бота. | 
|  | |
|  18.9.2008, 18:23 
				 Сообщение
					#54
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | |
|  | |
|  18.9.2008, 20:42 
				 Сообщение
					#55
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				незнаю почему у тебя не пашет. может быть api1 у тя?
				
				
				
			 | 
|  | |
|  18.9.2008, 21:25 
				 Сообщение
					#56
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				Ну блин я же не совсем нуБ(ну во всяком случае не до такой степени)!!!   Все тесты провожу на птоке 0.4.0.0 | 
|  | |
|  18.9.2008, 21:46 
				 Сообщение
					#57
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				возможно ты нарушаешь правило локализации переменных Код function ChatArrival(sUser, sData) sData = string.sub(sData,1,-2) local _,_,cmd =string.find(sData, "%b<>%s+(%S+)") if cmd == "!gagmainnick" then local _,_,Nick = string.find(sData, "%b<>%s+%S+%s+(%S+)") local tUs=Core.GetUser(Nick) if tUs then local IP = tUs.sIP //Тут IP ~= nil !!! end //А тут уже IP == nil !!! end end Можно написать вот так: Код function ChatArrival(sUser, sData) sData = string.sub(sData,1,-2) local _,_,cmd =string.find(sData, "%b<>%s+(%S+)") if cmd == "!gagmainnick" then local _,_,Nick = string.find(sData, "%b<>%s+%S+%s+(%S+)") local tUs,IP=Core.GetUser(Nick) if tUs then IP = tUs.sIP end end end | 
|  | |
|  18.9.2008, 22:12 
				 Сообщение
					#58
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				да с локальной переменной IP я ошибся, но всё дело в том что до этого места кода реализация не доходит! CODE function ChatArrival(sUser, sData) sData = string.sub(sData,1,-2) local _,_,msg =string.find(sData, "(.*)") local _,_,cmd =string.find(sData, "%b<>%s+(%S+)") if cmd == "!gagmainfull" then local _,_,Nick = string.find(sData, "%b<>%s+%S+%s+(%S+)") if Nick ~= nil then Core.SendToAll("="..Nick.."=") -- ВОТ ТУТ ПРОВЕРИЛ, NICK = НИК БЕЗ ПРОБЕЛОВ И ЛИШНИХ СИМВОЛОВ local tUs = Core.GetUser(Nick) -- ЗДЕСЬ ОШИБКИ НЕТ(так как если ника нет то возвращает nil), ПОЭТОМУ Core.SendToAll(tUs) -- ВОТ ТУТ ПИШЕТ СТРИНГ ЭКСПЕКТИД ГОТ НИЛ(извини что по русски) собственно дальнейший код в данной ситуации не важен if tUs then local IP = tUs.sIP Core.SendToAll(IP) if (tGag.Main.Nick[Nick] ~= 1) and (tGag.Main.Ip[IP] ~= 1) then tGag.Main.Nick[Nick] = 1 tGag.Main.Ip[IP] = 1 WriteFile(tGag, "tGag", gGag) Core.SendPmToNick(Nick, gBot, "Вы были заглушены и теперь не можете общаться в главном чате!") Core.SendToAll("<"..gBot.."> Юзер с ником "..Nick.." и ip "..IP.." был заглушен и теперь не может общаться в главном чате! Наказал: "..sUser.sNick) ... | 
|  | |
|  18.9.2008, 22:23 
				 Сообщение
					#59
					
				
			 | |
|  RusHub team lead               Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз  | 
				Core.SendToAll(tUs) --так нельзя писать tUs является таблицей. Если хочешь проверить тип переменной, то надо написать так: Core.SendToAll(type(tUs)) Если хочешь проверить значение переменной, то напиши лучше так: Core.SendToAll(tostring(tUs)) В последнем случае в чат отправится адрес памяти, в котором хранится данная таблица. Если тебе известен язык си или с++, то там существуют структуры или класса - это аналоги таблиц. | 
|  | |
|  19.9.2008, 9:29 
				 Сообщение
					#60
					
				
			 | |
|  Самый главный активист :-D            Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз  | 
				Спасибо, разобрался))) Заработало))) PS: других языков фактически не знаю... в школе проходили бейсик, сам пробовал изучать паскаль, в универе один семестр было "C". В итоге везде нахватал верхушек.... бывает же  А вот ещё вопросец: а может ли быть в скрипте несколько функций OnTaimer() или как сделать так чтобы в одной этой функции выполнялось несколько действий с разным интервалом времени? | 
|  | |
|   | 
 Похожие темы
 Похожие темы
|   | Сейчас: 30.10.2025, 16:14 |