Проверка на отключение от сервера и реконект.

fkrpflgrr

Участник
Автор темы
25
1
Версия MoonLoader
Другое
Делаю скрипт под штаб армии, нужно чтобы при переподключении к серверу он "замораживался" и не реагировал на команды, только проверял ник при спавне на сервере.

Lua:
script_name = '[Army LV | ШТАБ]'
script_author = 'Marcus Kransov'
script_description = 'Скрипт для штабных офицеров армии Las Venturas, сервер: Samp-Rp.Ru Underground'

require('lib.moonloader')

local samp = require('samp.events')
local imgui, inicfg = require('mimgui'), require('inicfg')
local encoding = require('encoding')

imgui.OnInitialize(function()
    theme()
end)

encoding.default = 'CP1251'
local u8, new, tabs = encoding.UTF8, imgui.new, 0

local playTime = {0, 0, 0, 0, 0, 0, 0}
local lastCheckTime = os.time()
local lastDay = os.date('*t').day

local glavMenu = new.bool()
ranks, positions = {}, {}

function main()
    while not isSampAvailable() do wait(200) end

    local myID = select(2, sampGetPlayerIdByCharHandle(1))

    game_username = sampGetPlayerNickname(myID)
    if not game_username then sms('Не удалось получить ваш Nick_Name для проверки, возможно требуется перезайти в игру.') end
    if checkNicknameAndGetDetails(game_username) then else end
 
        sampRegisterChatCommand('am', function() glavMenu[0] = not glavMenu[0] end)

    while true do
        wait(0)

        updatePlayTime()

    end
end


Menu1 = imgui.OnFrame(function() return glavMenu[0] end,
function(self)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(800, 400), imgui.Cond.Always)
    imgui.Begin(u8'Army Las Venturas | Штаб армии | Samp-Rp.Ru Underground', glavMenu, imgui.WindowFlags.NoResize)

        imgui.BeginChild('#',imgui.ImVec2(200, 350),true)
            imgui.CenterText('ВЫБОР МЕНЮ')
                imgui.Separator()
            if imgui.Button(u8'ГЛАВНОЕ МЕНЮ', imgui.ImVec2(180,40)) then tabs = 0 end
                imgui.Separator()
            if imgui.Button(u8'НАСТРОЙКА КОМАНД', imgui.ImVec2(180,40)) then tabs = 1 end
                imgui.Separator()
            if imgui.Button(u8'НАСТРОЙКА КЛАВИШ', imgui.ImVec2(180,40)) then tabs = 2 end
                imgui.Separator()
            if imgui.Button(u8'ИЗМЕНЕНИЕ СООБЩЕНИЙ', imgui.ImVec2(180,40)) then tabs = 3 end
                imgui.Separator()
            if imgui.Button(u8'МЕНЮ ГОС.ВЕЩАНИЙ', imgui.ImVec2(180,40)) then tabs = 4 end
                imgui.Separator()
            imgui.CenterTextDisabled('Army LV | Underground | ШТАБ')
            imgui.CenterTextDisabled('Дата выпуска: 00.12.2024')

        imgui.EndChild()

        if tabs == 0 then
            
            imgui.SetCursorPos(imgui.ImVec2(410, 32))
            imgui.BeginChild('#2',imgui.ImVec2(380,100),true)
                imgui.CenterText('ПЕРСОНАЛЬНАЯ ИНФОРМАЦИЯ')
                    imgui.Separator()
                imgui.Text(u8'Имя, фамилия: ' .. game_username)
                    imgui.Text(u8'Звание: ' .. (ranks[game_username]))
                    imgui.Text(u8'Должность в штабе: ' .. (positions[game_username]))
                
            imgui.EndChild()

            imgui.SetCursorPos(imgui.ImVec2(590, 150))
            imgui.BeginChild('#3',imgui.ImVec2(200,180),true)

                imgui.CenterText('АКТИВНОСТЬ ЗА НЕДЕЛЮ')
                    imgui.Separator()
                    imgui.Text(u8'Понедельник: ' .. formatTime(playTime[2]))
                    imgui.Text(u8'Вторник: ' .. formatTime(playTime[3]))
                    imgui.Text(u8'Среда: ' .. formatTime(playTime[4]))
                    imgui.Text(u8'Четверг: ' .. formatTime(playTime[5]))
                    imgui.Text(u8'Пятница: ' .. formatTime(playTime[6]))
                    imgui.Text(u8'Суббота: ' .. formatTime(playTime[7]))
                    imgui.Text(u8'Воскресенье: ' .. formatTime(playTime[1]))

            imgui.EndChild()

            imgui.SetCursorPos(imgui.ImVec2(380, 150))
            imgui.BeginChild('#4',imgui.ImVec2(200,180),true)
                imgui.CenterText('СТАТИСТИКА ЗА НЕДЕЛЮ')
                    imgui.Separator()
                
                imgui.Text(u8'Повышено/понижено бойцов:')
                imgui.Text(u8'Принято гражданских:')
                imgui.Text(u8'Уволено бойцов:')

            imgui.EndChild()

        end

    imgui.End()
end)

function sms(message)
    sampAddChatMessage(('{008D00}%s{FFFFFF} %s'):format(script_name, message), 0x008D00)
end
function theme()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2
    
    style.WindowRounding = 4.0
    style.WindowTitleAlign = ImVec2(0.5, 0.5)
    style.ChildRounding = 2.0
    style.FrameRounding = 4.0
    style.ItemSpacing = ImVec2(10, 5)
    style.ScrollbarSize = 15
    style.ScrollbarRounding = 0
    style.GrabMinSize = 9.6
    style.GrabRounding = 1.0
    style.WindowPadding = ImVec2(10, 10)
    style.AntiAliasedLines = true
    style.FramePadding = ImVec2(5, 4)
    style.DisplayWindowPadding = ImVec2(27, 27)
    style.DisplaySafeAreaPadding = ImVec2(5, 5)
    style.ButtonTextAlign = ImVec2(0.5, 0.5)
    style.IndentSpacing = 12.0
    style.Alpha = 1.0
    
    colors[clr.Text] = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled] = ImVec4(0.50, 0.50, 0.50, 1.00)
    colors[clr.WindowBg] = ImVec4(0.06, 0.06, 0.06, 0.94)
    colors[clr.ChildBg] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.PopupBg] = ImVec4(0.08, 0.08, 0.08, 0.94)
    colors[clr.Border] = ImVec4(0.43, 0.43, 0.50, 0.50)
    colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg] = ImVec4(0.44, 0.44, 0.44, 0.60)
    colors[clr.FrameBgHovered] = ImVec4(0.57, 0.57, 0.57, 0.70)
    colors[clr.FrameBgActive] = ImVec4(0.76, 0.76, 0.76, 0.80)
    colors[clr.TitleBg] = ImVec4(0.04, 0.04, 0.04, 1.00)
    colors[clr.TitleBgActive] = ImVec4(0.16, 0.16, 0.16, 1.00)
    colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.60)
    colors[clr.MenuBarBg] = ImVec4(0.14, 0.14, 0.14, 1.00)
    colors[clr.ScrollbarBg] = ImVec4(0.02, 0.02, 0.02, 0.53)
    colors[clr.ScrollbarGrab] = ImVec4(0.31, 0.31, 0.31, 1.00)
    colors[clr.ScrollbarGrabHovered] = ImVec4(0.41, 0.41, 0.41, 1.00)
    colors[clr.ScrollbarGrabActive] = ImVec4(0.51, 0.51, 0.51, 1.00)
    colors[clr.CheckMark] = ImVec4(0.13, 0.75, 0.55, 0.80)
    colors[clr.SliderGrab] = ImVec4(0.13, 0.75, 0.75, 0.80)
    colors[clr.SliderGrabActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
    colors[clr.Button] = ImVec4(0.13, 0.75, 0.55, 0.40)
    colors[clr.ButtonHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
    colors[clr.ButtonActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
    colors[clr.Header] = ImVec4(0.13, 0.75, 0.55, 0.40)
    colors[clr.HeaderHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
    colors[clr.HeaderActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
    colors[clr.Separator] = ImVec4(0.13, 0.75, 0.55, 0.40)
    colors[clr.SeparatorHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
    colors[clr.SeparatorActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
    colors[clr.ResizeGrip] = ImVec4(0.13, 0.75, 0.55, 0.40)
    colors[clr.ResizeGripHovered] = ImVec4(0.13, 0.75, 0.75, 0.60)
    colors[clr.ResizeGripActive] = ImVec4(0.13, 0.75, 1.00, 0.80)
    colors[clr.PlotLines] = ImVec4(0.61, 0.61, 0.61, 1.00)
    colors[clr.PlotLinesHovered] = ImVec4(1.00, 0.43, 0.35, 1.00)
    colors[clr.PlotHistogram] = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered] = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.TextSelectedBg] = ImVec4(0.26, 0.59, 0.98, 0.35)
    colors[clr.ModalWindowDimBg] = ImVec4(0.80, 0.80, 0.80, 0.35)
end
function imgui.CenterText(text)
    imgui.SetCursorPosX(imgui.GetWindowWidth()/2-imgui.CalcTextSize(u8(text)).x/2)
    imgui.Text(u8(text))
end
function imgui.CenterTextDisabled(text)
    imgui.SetCursorPosX(imgui.GetWindowWidth()/2-imgui.CalcTextSize(u8(text)).x/2)
    imgui.TextDisabled(u8(text))
end

function updatePlayTime()
    local currentTime = os.time()
    local timeSpent = currentTime - lastCheckTime
    local currentDate = os.date("*t")
    
    playTime[currentDate.wday] = playTime[currentDate.wday] + timeSpent
    lastCheckTime = currentTime
end
    
function resetPlayTime()
    playTime = {0, 0, 0, 0, 0, 0, 0}
end
function formatTime(seconds)
    local hours = math.floor(seconds / 3600)
    local minutes = math.floor((seconds % 3600) / 60)
    local seconds = seconds % 60
    return string.format("%02d:%02d:%02d", hours, minutes, seconds)
    end
function checkNewDay()
    local currentDate = os.date("*t")
    if currentDate.wday == 1 and currentDate.hour == 0 and currentDate.min == 0 and currentDate.sec == 0 then
        resetPlayTime()
        end
        if currentDate.day ~= lastDay then lastDay = currentDate.day end
end

function checkNicknameAndGetDetails(game_username)
    local https = require("ssl.https")
    local ltn12 = require("ltn12")
    local cjson = require("cjson")
    
    local API_KEY = "-"
    local SHEET_ID = "-"
    local RANGE = "Sheet1!A1:C9"

    local url = string.format("-", SHEET_ID, RANGE, API_KEY)
    local response_body = {}
    local res, code, response_headers = https.request{ url = url, method = "GET", sink = ltn12.sink.table(response_body) }
    
    if code == 200 then
        local data = table.concat(response_body)
        local parsed_data = cjson.decode(data)
        local nick_found = false
        local title = nil
        local position = nil

        for i, row in ipairs(parsed_data.values) do
            if row[1] == game_username then
                nick_found = true
                title = row[2]
                position = row[3]
                ranks[game_username] = row[2]
                positions[game_username] = row[3]
                break
            end
        end
        
        if nick_found then
            sms("Загружено как: " .. u8:decode(title) .. ' ' .. game_username .. ", " .. u8:decode(position))
            sms("Открыть меню: /am | Активация на кнопку в разработке, приятной игры.")
        else
            sms("У вас нет доступа к скрипту, для получения доступа свяжитесь с генералом.")
            sms("VK: -, Samp-Rp Forum: -. Скрипт отключён.")
            thisScript():unload()
        end
    else
        print("Ошибка при выполнении запроса: ", code)
        print("Сообщение об ошибке: ", table.concat(response_body))
        return false
    end
end

Может и говнокод, но что есть. По возможности подскажите ещё пожалуйста как сделать чтобы каждый день сохранялось время активности.
 

papercut

Известный
125
24
Не понятно что надо: чтобы он замораживался или чтобы только проверял ник или чтобы замораживался до проверки ника?

Чтобы жлаждал пока игрок заспавнится в main после проверки сампа
repeat wait(0) until sampIsLocalPlayerSpawned()

После это "проверяешь" ник - хз что ты под этим имеешь ввиду

Функция проверки ника
Lua:
function getMyNick()
    result, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    if result then
        return sampGetPlayerNickname(id)
    end
    return nil
end

подскажите ещё пожалуйста как сделать чтобы каждый день сохранялось время активности
Подсказываю: заводи файлик json или что еще удобно, с помощью os.time() - покури переводы из unix в текущую дату в гугле - получаешь время запуска, сохраняешь в переменную. При выключении скрипта фиксируешь текущее время (разницу между текущим и временем запуска) и сохраняешь в файлик. При сохранении проверяй наличие текущей даты в файлике. Если есть -добавляй к ней, если нет - перезаписывай
Еще где-то в while true или в отдельном потоке можно проверять не сменилась ли дата, пока скрипт включен. Ну тут уже логика понятно: записываешь так же как и при завершении к текущей дате, если она есть, доп время. Если нету - создаешь и сохраняешь