Автор: intlive 19.5.2009, 19:38
Собственно вот.. Пытался по примерам делать небольшой скрипт рекордов
CODE
bot = SetMan.GetString(21)
nTime = 30 -- время сохранения таблицы в минутах
tHub = {}
function OnStartup()
sAway = Core.GetPtokaXPath().."scripts/silka1.txt"
if loadfile(sAway) then
dofile(sAway)
end
OnlineUsers = Core.GetOnlineUsers()
OnlineShare = Core.GetCurrentSharedSize()
tHub = {}
tHub["MaxUsers"] = 0
tHub["MaxShare"] = 0
tHub["MaxUsersDate"] = 0
tHub["MaxShareDate"] =
TmrMan.AddTimer(nTime*60000, "OnExit")
end
function OnExit()
WriteTable(tHub, "tHub", sAway)
end
function UserConnected(user)
Core.GetUserAllData(user)
if tHub["MaxUsers"] < OnlineUsers then
tHub["MaxUsers"] = OnlineUsers
tHub["MaxUsersDate"] = os.date("[%H:%M-%d.%m.%y]")
end
if tHub["MaxShare"] < OnlineShare then
tHub["MaxShare"] = OnlineShare
tHub["MaxShareDate"] = os.date("[%H:%M-%d.%m.%y]")
end
end
OpConnected = UserConnected
RegConnected = UserConnected
function WriteTable(tTable, tablename, file)
local handle = io.open(file, "w")
Serialize(tTable, tablename, handle)
handle:close()
end
function Serialize(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
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
hFile:write(sTab.."}");
end
0.4.1.1\scripts\records.lua:31: attempt to compare number with table - вот такая штуковина... подскажите как правильно записать данные в таблицу.. а потом брать и использовать при необходимости
Автор: Wariner 19.5.2009, 20:12
тут много ошибок! в основном даже просто в концепции скрипта!
начнём пожалуй с твоей написанной птокой ошибки:
Код
if tHub["MaxUsers"] < OnlineUsers then
читая описание ошибки видим что tHub["MaxUsers"] даёт нам число а OnlineUsers даёт таблицу, смотрим почему:
Код
OnlineUsers = Core.GetOnlineUsers()
читаем скрипт интерфейс
Цитата
Return table with all logged user tables.
это означает что это нам даёт таблицу с юзерами на хабе а не их количество! поэтому надо так:
Код
OnlineUsers = Core.GetUsersCount()
теперь о самом скрипте
Код
function OnStartup()
sAway = Core.GetPtokaXPath().."scripts/silka1.txt"
if loadfile(sAway) then
dofile(sAway)
end
OnlineUsers = Core.GetOnlineUsers()
OnlineShare = Core.GetCurrentSharedSize()
tHub = {}
tHub["MaxUsers"] = 0
tHub["MaxShare"] = 0
tHub["MaxUsersDate"] = 0
tHub["MaxShareDate"] = 0
TmrMan.AddTimer(nTime*60000, "OnExit")
end
тут ты загружаешь данные, а потом действием
Код
tHub = {}
tHub["MaxUsers"] = 0
tHub["MaxShare"] = 0
tHub["MaxUsersDate"] = 0
tHub["MaxShareDate"] = 0
их обнуляешь!
да и потом не рационально проверять рекорды при входе юзера! лучше делать это по таймеру!
но если хочешь чтоб было именно так то вид будет такой:
Код
local bot = SetMan.GetString(21)
local nTime = 30 -- время сохранения таблицы в минутах
tHub = {}
function OnStartup()
sAway = Core.GetPtokaXPath().."scripts/silka1.txt"
if loadfile(sAway) then
dofile(sAway)
end
if not
TmrMan.AddTimer(nTime*60000, "OnExit")
end
function OnExit()
WriteTable(tHub, "tHub", sAway)
end
function UserConnected(user)
if not tHub["MaxUsers"] or tHub["MaxUsers"] < Core.GetUsersCount() then
tHub["MaxUsers"] = Core.GetUsersCount()
tHub["MaxUsersDate"] = os.date("[%H:%M-%d.%m.%y]")
end
if not tHub["MaxShare"] or tHub["MaxShare"] < Core.GetCurrentSharedSize() then
tHub["MaxShare"] = Core.GetCurrentSharedSize()
tHub["MaxShareDate"] = os.date("[%H:%M-%d.%m.%y]")
end
end
OpConnected = UserConnected
RegConnected = UserConnected
function WriteTable(tTable, tablename, file)
function Serialize(tTable, sTableName, hFile, sTab)
Автор: intlive 19.5.2009, 20:14
Спасибо большое, а как как оптимальней будет? Как с таймером поступать?
Автор: Wariner 19.5.2009, 20:19
пустить секундный таймер на какую нибудь функцию
Код
TmrMan.AddTimer(1000, "название функциии")
и перенести всё из функции UserConnected в эту функцию
Автор: intlive 19.5.2009, 20:25
Помоги пожалуйста еще (я наглый, извините) :
сделал так:
CODE
local bot = SetMan.GetString(21)
local nTime = 30 -- время сохранения таблицы в минутах
tHub = {}
function OnStartup()
sAway = Core.GetPtokaXPath().."scripts/silka1.txt"
if loadfile(sAway) then
dofile(sAway)
end
TmrMan.AddTimer(nTime*60000, "OnExit")
TmrMan.AddTimer(1000, "hubstat")
end
function hubstat()
if not tHub["MaxUsers"] or tHub["MaxUsers"] < Core.GetUsersCount() then
tHub["MaxUsers"] = Core.GetUsersCount()
tHub["MaxUsersDate"] = os.date("[%H:%M-%d.%m.%y]")
end
if not tHub["MaxShare"] or tHub["MaxShare"] < Core.GetCurrentSharedSize() then
tHub["MaxShare"] = Core.GetCurrentSharedSize()
tHub["MaxShareDate"] = os.date("[%H:%M-%d.%m.%y]")
end
end
function OnExit()
WriteTable(tHub, "tHub", sAway)
end
OpConnected = UserConnected
RegConnected = UserConnected
function WriteTable(tTable, tablename, file)
end
function Serialize(tTable, sTableName, hFile, sTab)
end
И запутался..
Автор: Wariner 19.5.2009, 20:51
ну вроде всё так, в чём проблема?
PS: конечно же должен присутствовать код функция WriteTable и Serialize
Автор: intlive 19.5.2009, 20:59
Спасибо, работает что-то я уснул за клавой.. Большенство функций смотрел как сделано в твоих скриптах, пасиба