Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
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() или как сделать так чтобы в одной этой функции выполнялось несколько действий с разным интервалом времени? |
|
|
Похожие темы
|
Сейчас: 26.11.2024, 22:40 |