- Версия SA-MP
-
- 0.3.7-R3
Здравствуйте дамы и господа
написал я значит скрипт для счетчика дохода с пей деев и столкнулся с такой проблемой, я захотел добавить систему сохранения по дням недели но никак не смог его реализовать, прошу помочь вас мне в этом. Зарнее всех блогадарю и прошу прощения за свой говнокод)Код:
Lua:
-------------Samp Library---------------
local samp = require 'lib.samp.events'
local effil = require('effil')
local requests = require 'requests'
local font_flag = require('moonloader').font_flag
local vk = require 'vkeys'
----------Mimgui library-------------
local imgui = require 'mimgui'
local encoding = require('encoding')
local u8 = encoding.UTF8
encoding.default = 'CP1251'
local new = imgui.new
local cjson = require "cjson"
----------Ini library-----------
local inicfg = require('inicfg')
local IniFileName = "PayDayMaster.ini"
local ffi = require("ffi")
-- sampRegisterChatCommand("testzp", function()
-- samp.onServerMessage(0xFFFFFF, "Общая заработная плата: $176,167")
-- samp.onServerMessage(0xFFFFFF, "Текущая сумма на депозите: $264,503,290 {33AA33}(+$154,220)")
-- samp.onServerMessage(0xFFFFFF, "Баланс на донат-счет: 4811 AZ {ff6666}(+2 AZ)")
-- end)
---------Ini cfg loading--------------
local ini = inicfg.load({
data = {
totalSalary = 0,
totalDeposit = 0,
totalAZ = 0,
initialBank = 0,
initialDeposit = 0,
initialAZ = 0,
pday_count = 0,
opencommad = "payday",
window_languages = 0,
chbox_chat_payday = false
}
}, IniFileName)
-- Ensure ini file is saved initially
inicfg.save(ini, IniFileName)
local currentDayNumber = tonumber(os.date("%u")) -- Получаем день недели как число от 1 до 7
print(currentDayNumber)
-------------local variables total---------
local totalSalary = ini.data.totalSalary
local totalDeposit = ini.data.totalDeposit
local totalAZ = ini.data.totalAZ
----------Local variables initial---------
local initialBank = ini.data.initialBank
local initialDeposit = ini.data.initialDeposit
local initialAZ = ini.data.initialAZ
----------Pay-Day counts-------------
pday_count = ini.data.pday_count
window_languages = ini.data.window_languages
------------Mimgui Buffers and bools--------------
local paydayBuffer = {}
local paydayVisibleRussian = new.bool(false)
local paydayVisibleEnglish = new.bool(false)
local showSettings = new.bool(false)
local inputCommand = ffi.new("char[256]", u8:encode(ini.data.opencommad))
local OpenFrameCommand = u8:decode(ffi.string(inputCommand))
local ComboLanguage = new.int(ini.data.window_languages) -- создаём буфер для комбо
local language_list = { u8 'Русский', u8 'English' } -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#language_list](language_list)
local chbox_chat_payday = new.bool(ini.data.chbox_chat_payday)
----------Remove ColorCodes----------
function removeColorCodes(str)
return str:gsub("{%x%x%x%x%x%x}", "")
end
sampRegisterChatCommand("testzp", function()
samp.onServerMessage(0xFFFFFF, "Общая заработная плата: $176,167")
samp.onServerMessage(0xFFFFFF, "Текущая сумма на депозите: $264,503,290 {33AA33}(+$154,220)")
samp.onServerMessage(0xFFFFFF, "Баланс на донат-счет: 4811 AZ {ff6666}(+2 AZ)")
end)
--------------Number format system----------------
local function formatWithCommas(number)
local formatted = tostring(number)
while true do
formatted, k = formatted:gsub("^(-?%d+)(%d%d%d)", '%1,%2')
if k == 0 then break end
end
return formatted
end
----------------Save Data-----------------
function saveData()
ini.data.totalSalary = totalSalary
ini.data.totalDeposit = totalDeposit
ini.data.totalAZ = totalAZ
ini.data.initialBank = initialBank
ini.data.initialDeposit = initialDeposit
ini.data.initialAZ = initialAZ
ini.data.pday_count = pday_count
ini.data.window_languages = ComboLanguage[0]
ini.data.opencommad = u8:decode(ffi.string(inputCommand))
ini.data.chbox_chat_payday = chbox_chat_payday[0]
inicfg.save(ini, IniFileName)
end
------------------Clear Data---------------------
function ClearData()
ini.data.totalSalary = 0
ini.data.totalDeposit = 0
ini.data.totalAZ = 0
ini.data.initialBank = 0
ini.data.initialDeposit = 0
ini.data.initialAZ = 0
ini.data.pday_count = 0
ini.data.opencommad = "payday"
ini.data.window_languages = 0
ini.data.chbox_chat_payday = false
inicfg.save(ini, IniFileName)
lua_thread.create(function()
sampAddChatMessage("{7FFF00}« PayDayMaster » {FFFFFF}Для очиститки данных скрипт перезапускается!", -1)
wait(1000)
thisScript():reload()
end)
end
-------------------------PARSING SYSTEM--------------------------
function samp.onServerMessage(color, text)
table.insert(paydayBuffer, text)
-- Initial amounts hooks
local bank = text:match("Текущая сумма в банке: %$([%d,]+)")
if bank then
initialBank = tonumber((bank:gsub(",", "")))
saveData()
end
local deposit = text:match("Текущая сумма на депозите: %$([%d,]+)")
if deposit then
initialDeposit = tonumber((deposit:gsub(",", "")))
saveData()
end
local az = text:match("Баланс на донат%-счет: (%d+) AZ")
if az then
initialAZ = tonumber(az)
saveData()
end
if #paydayBuffer >= 5 then
local fullText = table.concat(paydayBuffer, "\n")
local salary = fullText:match("Общая заработная плата: %$([%d,]+)")
if salary then
totalSalary = totalSalary + tonumber((salary:gsub(",", "")))
pday_count = pday_count + 1
end
local depositBonus = fullText:match("Текущая сумма на депозите: %$[%d,]+ %b{}%(%+%$([%d,]+)%)")
if depositBonus then
totalDeposit = totalDeposit + tonumber((depositBonus:gsub(",", "")))
end
local azBonus = fullText:match("Баланс на донат%-счет: %d+ AZ %b{}%(%+(%d+) AZ%)")
if azBonus then
totalAZ = totalAZ + tonumber(azBonus)
if chbox_chat_payday[0] then
sampAddChatMessage(
"{7FFF00}« PayDayMaster » {FFFFFF}Заработано с PayDay'ев $ " ..
formatWithCommas(totalSalary + totalDeposit), -1)
end
end
saveData()
paydayBuffer = {}
end
end
--------------Start command--------------
sampRegisterChatCommand(OpenFrameCommand, function()
if ComboLanguage[0] == 0 then
paydayVisibleRussian[0] = not paydayVisibleRussian[0]
else
paydayVisibleEnglish[0] = not paydayVisibleEnglish[0]
end
end)
------------------Final local------------
local finalBank = ""
local finalDeposit = ""
local finalAZ = ""
-------------------------Mimgui Russian Frame-------------------------
imgui.OnFrame(function()
return paydayVisibleRussian[0]
end, function()
imgui.SetNextWindowPos(imgui.ImVec2(353, 424), imgui.Cond.FirstUseEver)
imgui.SetNextWindowSize(imgui.ImVec2(350, 400), imgui.Cond.Always)
imgui.Begin(u8 "PayDay Статистика", paydayVisibleRussian, imgui.WindowFlags.NoResize)
if imgui.BeginTabBar('Tabs') then
if imgui.BeginTabItem(u8 'Главная') then
imgui.Text(u8 "Заработано с момента запуска:")
imgui.Text(u8(string.format("Зарплата: $%s", formatWithCommas(totalSalary))))
imgui.Text(u8(string.format("Депозит: $%s", formatWithCommas(totalDeposit))))
imgui.Text(u8(string.format("AZ: %s", totalAZ)))
imgui.Separator()
imgui.Text(u8 "Начальные суммы:")
imgui.Text(u8(string.format("Банк: $%s", formatWithCommas(initialBank))))
imgui.Text(u8(string.format("Депозит: $%s", formatWithCommas(initialDeposit))))
imgui.Text(u8(string.format("AZ: %s", initialAZ)))
imgui.Separator()
finalBank = formatWithCommas(initialBank + totalSalary)
finalDeposit = formatWithCommas(initialDeposit + totalDeposit)
finalAZ = tostring(initialAZ + totalAZ)
imgui.Text(u8 "Итоговые суммы:")
imgui.Text(u8(string.format("Банк: $%s", finalBank)))
imgui.Text(u8(string.format("Депозит: $%s", finalDeposit)))
imgui.Text(u8(string.format("AZ: %s", finalAZ)))
imgui.Text(u8 "Кол-во PayDays : " .. pday_count)
if imgui.Button(u8 "Закрыть") then
paydayVisibleRussian[0] = false
end
imgui.SameLine()
if imgui.Button(u8 "Очистить данные") then
ClearData()
end
imgui.EndTabItem()
end
if imgui.BeginTabItem(u8 'Другое') then -- задаём название второй вкладки
if imgui.CollapsingHeader(u8 'Смена команды для открытии окна') then
imgui.TextQuestion(u8 "Команда по которой будет открыватся меню скрипта\n P.S После ввода команды необходимо перезагрузить скрипт.")
imgui.SameLine()
imgui.InputTextWithHint(u8 ' ', u8 'Введите команду...', inputCommand, 256)
imgui.NewLine()
end
if imgui.CollapsingHeader(u8 'Смена языка интерфейса') then
imgui.TextQuestion(u8 "Изменяет язык интерфейса")
imgui.SameLine()
imgui.Combo(u8 '. ', ComboLanguage, ImItems, #language_list)
ini.data.window_languages = ComboLanguage[0]
inicfg.save(ini, IniFileName)
end
if imgui.CollapsingHeader(u8 "Выводить заработанную сумму c PayDay'ев в чат") then
imgui.TextQuestion(u8 "Выводит заработанные деньги с PayDay'ev\nПрибавляя депозит к зарплате при появлении PayDay'я")
imgui.SameLine()
imgui.Checkbox(u8 "Вкл/Выкл", chbox_chat_payday)
end
imgui.EndTabItem()
imgui.NewLine()
end
imgui.EndTabBar()
end
imgui.End()
end)
----------------------Mimgui English Frame--------------------------------
imgui.OnFrame(function()
return paydayVisibleEnglish[0]
end, function()
imgui.SetNextWindowPos(imgui.ImVec2(353, 424), imgui.Cond.FirstUseEver)
imgui.SetNextWindowSize(imgui.ImVec2(350, 400), imgui.Cond.Always)
imgui.Begin(u8 "PayDay stats", paydayVisibleEnglish, imgui.WindowFlags.NoResize)
if imgui.BeginTabBar('Tabs') then
if imgui.BeginTabItem(u8 'Main') then
imgui.Text(u8 "Earned since coming in:")
imgui.Text(u8(string.format("Salary: $%s", formatWithCommas(totalSalary))))
imgui.Text(u8(string.format("Deposit: $%s", formatWithCommas(totalDeposit))))
imgui.Text(u8(string.format("AZ-COINS: %s", totalAZ)))
imgui.Separator()
imgui.Text(u8 "Initial amounts:")
imgui.Text(u8(string.format("Salary: $%s", formatWithCommas(initialBank))))
imgui.Text(u8(string.format("Deposit: $%s", formatWithCommas(initialDeposit))))
imgui.Text(u8(string.format("AZ-COINS: %s", initialAZ)))
imgui.Separator()
finalBank = formatWithCommas(initialBank + totalSalary)
finalDeposit = formatWithCommas(initialDeposit + totalDeposit)
finalAZ = tostring(initialAZ + totalAZ)
imgui.Text(u8 "Total amounts:")
imgui.Text(u8(string.format("Salary: $%s", finalBank)))
imgui.Text(u8(string.format("Deposit: $%s", finalDeposit)))
imgui.Text(u8(string.format("AZ-COINS: %s", finalAZ)))
imgui.Text(u8 "Amount of PayDays: " .. pday_count)
if imgui.Button(u8 "Close") then
paydayVisibleEnglish[0] = false
end
imgui.SameLine()
if imgui.Button(u8 "Clear data") then
ClearData()
end
imgui.EndTabItem()
end
if imgui.BeginTabItem(u8 'Others') then -- задаём название второй вкладки
if imgui.CollapsingHeader(u8 "Opening command the script menu") then
imgui.TextQuestion(u8 "The command that will open the script menu\n P.S After entering the command, you need to reload the script.")
imgui.SameLine()
imgui.InputTextWithHint(u8 ' ', u8 'Enter the command...', inputCommand, 256)
end
if imgui.CollapsingHeader(u8 "Change frame language") then
imgui.TextQuestion(u8 "Change frame language")
imgui.SameLine()
imgui.Combo(u8 ' . ', ComboLanguage, ImItems, #language_list)
ini.data.window_languages = ComboLanguage[0]
inicfg.save(ini, IniFileName)
end
if imgui.CollapsingHeader(u8 "Withdrawing earnings from PayDay in chat") then
imgui.TextQuestion(u8 "Вывод заработанных средств из PayDay'ev\nДобавьте свой депозит к зарплате.")
imgui.SameLine()
imgui.Checkbox(u8 "ON/OFF", chbox_chat_payday)
end
imgui.EndTabItem()
imgui.NewLine()
end
imgui.EndTabBar()
end
imgui.End()
end)
---------------Main Fuction--------------
function main()
while not isSampAvailable() do
wait(100)
end
sampAddChatMessage("{7FFF00}« PayDayMaster » {FFFFFF} Скрипт {C0C0C0}загружен!")
sampAddChatMessage("{7FFF00}« PayDayMaster » {FFFFFF} Команда для активации: {C0C0C0}/" .. ini.data.opencommad)
sampAddChatMessage("{7FFF00}« PayDayMaster » {FFFFFF} Автор скрипта: {C0C0C0}Wenfost")
end
-----------------CenterText----------------------
function imgui.CenterText(text)
local width = imgui.GetWindowWidth()
local calc = imgui.CalcTextSize(text)
imgui.SetCursorPosX(width / 2 - calc.x / 2)
imgui.Text(text)
end
-----------------Text Question---------------
function imgui.TextQuestion(text)
imgui.TextDisabled('(?)')
if imgui.IsItemHovered() then
imgui.BeginTooltip()
imgui.PushTextWrapPos(450)
imgui.TextUnformatted(text)
imgui.PopTextWrapPos()
imgui.EndTooltip()
end
end
------------------------------------Mimgui Theme------------------------------------
function theme()
imgui.SwitchContext()
local style = imgui.GetStyle()
style.WindowPadding = imgui.ImVec2(15, 15)
style.WindowRounding = 10.0
style.ChildRounding = 6.0
style.FramePadding = imgui.ImVec2(8, 7)
style.FrameRounding = 8.0
style.ItemSpacing = imgui.ImVec2(8, 8)
style.ItemInnerSpacing = imgui.ImVec2(10, 6)
style.IndentSpacing = 25.0
style.ScrollbarSize = 13.0
style.ScrollbarRounding = 12.0
style.GrabMinSize = 10.0
style.GrabRounding = 6.0
style.PopupRounding = 8
style.WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
style.ButtonTextAlign = imgui.ImVec2(0.5, 0.5)
style.Colors[imgui.Col.Text] = imgui.ImVec4(0.90, 0.90, 0.93, 1.00)
style.Colors[imgui.Col.TextDisabled] = imgui.ImVec4(0.40, 0.40, 0.45, 1.00)
style.Colors[imgui.Col.WindowBg] = imgui.ImVec4(0.12, 0.12, 0.14, 1.00)
style.Colors[imgui.Col.ChildBg] = imgui.ImVec4(0.18, 0.20, 0.22, 0.30)
style.Colors[imgui.Col.PopupBg] = imgui.ImVec4(0.13, 0.13, 0.15, 1.00)
style.Colors[imgui.Col.Border] = imgui.ImVec4(0.30, 0.30, 0.35, 1.00)
style.Colors[imgui.Col.BorderShadow] = imgui.ImVec4(0.00, 0.00, 0.00, 0.00)
style.Colors[imgui.Col.FrameBg] = imgui.ImVec4(0.18, 0.18, 0.20, 1.00)
style.Colors[imgui.Col.FrameBgHovered] = imgui.ImVec4(0.25, 0.25, 0.28, 1.00)
style.Colors[imgui.Col.FrameBgActive] = imgui.ImVec4(0.30, 0.30, 0.34, 1.00)
style.Colors[imgui.Col.TitleBg] = imgui.ImVec4(0.15, 0.15, 0.17, 1.00)
style.Colors[imgui.Col.TitleBgCollapsed] = imgui.ImVec4(0.10, 0.10, 0.12, 1.00)
style.Colors[imgui.Col.TitleBgActive] = imgui.ImVec4(0.15, 0.15, 0.17, 1.00)
style.Colors[imgui.Col.MenuBarBg] = imgui.ImVec4(0.12, 0.12, 0.14, 1.00)
style.Colors[imgui.Col.ScrollbarBg] = imgui.ImVec4(0.12, 0.12, 0.14, 1.00)
style.Colors[imgui.Col.ScrollbarGrab] = imgui.ImVec4(0.30, 0.30, 0.35, 1.00)
style.Colors[imgui.Col.ScrollbarGrabHovered] = imgui.ImVec4(0.40, 0.40, 0.45, 1.00)
style.Colors[imgui.Col.ScrollbarGrabActive] = imgui.ImVec4(0.50, 0.50, 0.55, 1.00)
style.Colors[imgui.Col.CheckMark] = imgui.ImVec4(0.70, 0.70, 0.90, 1.00)
style.Colors[imgui.Col.SliderGrab] = imgui.ImVec4(0.70, 0.70, 0.90, 1.00)
style.Colors[imgui.Col.SliderGrabActive] = imgui.ImVec4(0.80, 0.80, 0.90, 1.00)
style.Colors[imgui.Col.Button] = imgui.ImVec4(0.18, 0.18, 0.20, 1.00)
style.Colors[imgui.Col.ButtonHovered] = imgui.ImVec4(0.60, 0.60, 0.90, 1.00)
style.Colors[imgui.Col.ButtonActive] = imgui.ImVec4(0.28, 0.56, 0.96, 1.00)
style.Colors[imgui.Col.Header] = imgui.ImVec4(0.20, 0.20, 0.23, 1.00)
style.Colors[imgui.Col.HeaderHovered] = imgui.ImVec4(0.25, 0.25, 0.28, 1.00)
style.Colors[imgui.Col.HeaderActive] = imgui.ImVec4(0.30, 0.30, 0.34, 1.00)
style.Colors[imgui.Col.Separator] = imgui.ImVec4(0.40, 0.40, 0.45, 1.00)
style.Colors[imgui.Col.SeparatorHovered] = imgui.ImVec4(0.50, 0.50, 0.55, 1.00)
style.Colors[imgui.Col.SeparatorActive] = imgui.ImVec4(0.60, 0.60, 0.65, 1.00)
style.Colors[imgui.Col.ResizeGrip] = imgui.ImVec4(0.20, 0.20, 0.23, 1.00)
style.Colors[imgui.Col.ResizeGripHovered] = imgui.ImVec4(0.25, 0.25, 0.28, 1.00)
style.Colors[imgui.Col.ResizeGripActive] = imgui.ImVec4(0.30, 0.30, 0.34, 1.00)
style.Colors[imgui.Col.PlotLines] = imgui.ImVec4(0.61, 0.61, 0.64, 1.00)
style.Colors[imgui.Col.PlotLinesHovered] = imgui.ImVec4(0.70, 0.70, 0.75, 1.00)
style.Colors[imgui.Col.PlotHistogram] = imgui.ImVec4(0.61, 0.61, 0.64, 1.00)
style.Colors[imgui.Col.PlotHistogramHovered] = imgui.ImVec4(0.70, 0.70, 0.75, 1.00)
style.Colors[imgui.Col.TextSelectedBg] = imgui.ImVec4(0.30, 0.30, 0.34, 1.00)
style.Colors[imgui.Col.ModalWindowDimBg] = imgui.ImVec4(0.10, 0.10, 0.12, 0.80)
style.Colors[imgui.Col.Tab] = imgui.ImVec4(0.18, 0.20, 0.22, 1.00)
style.Colors[imgui.Col.TabHovered] = imgui.ImVec4(0.60, 0.60, 0.90, 1.00)
style.Colors[imgui.Col.TabActive] = imgui.ImVec4(0.28, 0.56, 0.96, 1.00)
end
imgui.OnInitialize(function()
theme()
end)