Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Kорзина _ Помогите пожалуйста в написании скрипта

Автор: intlive 19.5.2009, 19:38

Собственно вот.. Пытался по примерам делать небольшой скрипт рекордов still_dreaming.gif

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 - вот такая штуковина... подскажите как правильно записать данные в таблицу.. а потом брать и использовать при необходимости embarrassed.gif

Автор: 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

Помоги пожалуйста еще (я наглый, извините) big_smile.gif :
сделал так:

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

Спасибо, работает big_smile.gif что-то я уснул за клавой.. Большенство функций смотрел как сделано в твоих скриптах, пасиба surrender.gif