Сохранение содержимого диалогового окна в .ini

w99zzl1

Участник
Автор темы
108
10
Версия MoonLoader
.026-beta
Приветствую! Написал простенький код:
Полный Код:
local inicfg = require 'inicfg'

local color_dialog = 0xDEB887
local color_tag = "{00FF00}"
local color_white = -1
local tag = color_tag .. "[SAMSONOV]:"
local color_error = "{FF0000}"
local error_tag = color_error .. "[ОШИБКА]:"

local dialogTabHeaderStr = "Nick Name\tСтепень\tПричина\tКем занесено"
local blacklist = {}

local blacklistIni = "blacklist.ini" -- Имя файла .ini для сохранения черного списка

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    loadBlacklistFromIni()

    sampRegisterChatCommand("blf", cmd_dialog)
    sampRegisterChatCommand("addbl", cmd_add_blacklist)
    sampRegisterChatCommand("delbl", cmd_remove_blacklist)
    sampRegisterChatCommand("checkall", cmd_check_all)

    while true do
        wait(0)
    end
end

function loadBlacklistFromIni()
    local ini = inicfg.load(blacklistIni)
    if ini then
        blacklist = ini.blacklist or {}
    end
end

function saveBlacklistToIni()
    local ini = { blacklist = blacklist }
    inicfg.save(ini, blacklistIni)
end

function cmd_dialog()
    local dialogText = dialogTabHeaderStr
    for _, entry in ipairs(blacklist) do
        local degreeColor
        if entry.degree == "1" then
            degreeColor = "{FF0000}" -- Красный цвет для степени 1
        elseif entry.degree == "2" then
            degreeColor = "{FFA500}" -- Оранжевый цвет для степени 2
        elseif entry.degree == "3" then
            degreeColor = "{FFFF00}" -- Желтый цвет для степени 3
        else
            degreeColor = "{FFFFFF}"
        end
        dialogText = dialogText .. "\n" .. entry.nick .. "\t" .. degreeColor .. entry.degree .. "\t" .. entry.reason .. "\t" .. entry.by_whom
    end
    sampShowDialog(15, "Черный Список Семьи", dialogText, "Закрыть", "", 5)
end

function cmd_add_blacklist(params)
    local nick, degree, reason, by_whom = params:match("(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
    if not nick or not degree or not reason or not by_whom then
        sampAddChatMessage(error_tag .. " {FFFFFF}Неверный формат команды. Пример: {FF0000}/addbl [Nick_Name] [Степень (1-3)] [Причина] [Кем занесено]", -1)
        return
    end
    for _, entry in ipairs(blacklist) do
        if entry.nick == nick then
            sampAddChatMessage(error_tag .. " {FFFFFF}Игрок уже занесен в черный список.", -1)
            return
        end
    end
    table.insert(blacklist, {nick = nick, degree = degree, reason = reason, by_whom = by_whom})
    sampAddChatMessage(tag .. " {FFFFFF}Пользователь добавлен в черный список.", -1)
    saveBlacklistToIni()я
end

function cmd_remove_blacklist(nick)
    if not nick then
        sampAddChatMessage(tag .. " {FFFFFF}Неверный формат команды. Пример: {FF0000}/delbl NickName", -1)
        return
    end
    for i, entry in ipairs(blacklist) do
        if entry.nick == nick then
            table.remove(blacklist, i)
            sampAddChatMessage(tag .. " {FFFFFF}Пользователь удален из черного списка.", -1)
            saveBlacklistToIni()
            return
        end
    end
    sampAddChatMessage(tag .. " {FFFFFF}Пользователь не найден в черном списке.", -1)
end

function cmd_check_all()
    sampAddChatMessage(tag .. " {FFFFFF}Ниже показаны чушпаны из ЧСС которые находятся в игре:", -1)

    for _, entry in ipairs(blacklist) do
        sampSendChat("/id " .. entry.nick)
    end
end

Суть такова:
на команду /blf открывается окно, с игроками, которые я записал (не буду углубятся) с помощью /addbl (удалить из списка - /delbl)
Однако, чтобы я мог делится этим списком с другими игроками, и не приходилось после каждого перезахода вновь вписывать всех, хочу сделать сохранение в ini файл, но я рукожоп, и у меня не получается :( Создал файл blacklist.ini в папке moonloader (там же где и скрипт с кодом), захожу в игру - пишу для теста /addbl 1 1 1 1, в таблице показывает:
sa-mp-138.png

Однако я замечаю, что файл blacklist.ini пустой, никак не заполнен. Переделывал код кучу раз, ничего не помогало, вот обращаюсь сюда:
Может, кто то поможет сделать так, чтобы код записывал содержимое окна (/blf) и записывал всё ф ини. Например как то так:

ини:
[[
nick = Nick_Name
degree = 1
reason = Test
by_whom = Nick_Name
]]

[[
— следующие данные из окна по команде /addbl
]]
Буду искренне благодарен, если кто то поможет или попытается :'(
 
Решение
А как? Что делать в кратце? Я паровоз, даже не чайник :(
На самом деле ничего трудного нет, вот пример перевода одной из твоих функций на жсон, что заметно, что это очень просто

Lua:
local encoding = require('encoding')
encoding.default = 'CP1251'
u8 = encoding.UTF8
local error_tag = "{00ffff}"
local file = getWorkingDirectory()..'\\config\\checklist.json'
local list = {}

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end
    list = json(file):read()
  
    -- Регистрируем команду 'add_list'
    sampRegisterChatCommand('add_list', cmd_add_list)
    wait(-1)
end

function cmd_add_list(params)
    local nick, degree, reason, by_whom =...

chromiusj

Известный
Модератор
5,656
3,959
А как? Что делать в кратце? Я паровоз, даже не чайник :(
На самом деле ничего трудного нет, вот пример перевода одной из твоих функций на жсон, что заметно, что это очень просто

Lua:
local encoding = require('encoding')
encoding.default = 'CP1251'
u8 = encoding.UTF8
local error_tag = "{00ffff}"
local file = getWorkingDirectory()..'\\config\\checklist.json'
local list = {}

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end
    list = json(file):read()
  
    -- Регистрируем команду 'add_list'
    sampRegisterChatCommand('add_list', cmd_add_list)
    wait(-1)
end

function cmd_add_list(params)
    local nick, degree, reason, by_whom = params:match("(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
    if not nick or not degree or not reason or not by_whom then
        sampAddChatMessage(error_tag .. " {FFFFFF}Неверный формат команды. Пример: {FF0000}/add_list [Nick_Name] [Степень (1-3)] [Причина] [Кем занесено]", -1)
        return
    end
  
    for _, entry in ipairs(list) do
        if entry.nick == nick then
            sampAddChatMessage(error_tag .. " {FFFFFF}Игрок уже занесен в черный список.", -1)
            return
        end
    end
  
    table.insert(list, {nick = nick, degree = degree, reason = reason, by_whom = by_whom})
    json(file):write(list)
end

function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")
        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end
Пример выходящих данных в JSON:
JSON:
[{"degree":"3","reason":"пидорас","by_whom":"Chro_Miusj","nick":"Eclipse_Autistic"}]
Также пример простого скрипта, работающего с конфигами из JSON:
 

w99zzl1

Участник
Автор темы
108
10
На самом деле ничего трудного нет, вот пример перевода одной из твоих функций на жсон, что заметно, что это очень просто

Lua:
local encoding = require('encoding')
encoding.default = 'CP1251'
u8 = encoding.UTF8
local error_tag = "{00ffff}"
local file = getWorkingDirectory()..'\\config\\checklist.json'
local list = {}

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end
    list = json(file):read()
 
    -- Регистрируем команду 'add_list'
    sampRegisterChatCommand('add_list', cmd_add_list)
    wait(-1)
end

function cmd_add_list(params)
    local nick, degree, reason, by_whom = params:match("(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
    if not nick or not degree or not reason or not by_whom then
        sampAddChatMessage(error_tag .. " {FFFFFF}Неверный формат команды. Пример: {FF0000}/add_list [Nick_Name] [Степень (1-3)] [Причина] [Кем занесено]", -1)
        return
    end
 
    for _, entry in ipairs(list) do
        if entry.nick == nick then
            sampAddChatMessage(error_tag .. " {FFFFFF}Игрок уже занесен в черный список.", -1)
            return
        end
    end
 
    table.insert(list, {nick = nick, degree = degree, reason = reason, by_whom = by_whom})
    json(file):write(list)
end

function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")
        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end
Пример выходящих данных в JSON:
JSON:
[{"degree":"3","reason":"пидорас","by_whom":"Chro_Miusj","nick":"Eclipse_Autistic"}]
Также пример простого скрипта, работающего с конфигами из JSON:
БРАТАН! СПАСИБО! Я могу как то тебя отблагодарить?

Сделал код:
Lua:
local encoding = require('encoding')
encoding.default = 'CP1251'
u8 = encoding.UTF8
local error_tag = "{00ffff}"
local file = getWorkingDirectory()..'\\config\\checklist.json'
local list = {}

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end
    list = json(file):read()
 
    sampRegisterChatCommand("blf", cmd_dialog)
    sampRegisterChatCommand("addbl", cmd_add_blacklist)
    sampRegisterChatCommand("delbl", cmd_remove_blacklist)
    sampRegisterChatCommand("checkall", cmd_check_all)
    wait(-1)
end

function cmd_dialog()
    local dialogTabHeaderStr = "Ник\tСтепень\tПричина\tЗанесен"
    local dialogText = dialogTabHeaderStr
    for _, entry in ipairs(list) do
        local degreeColor
        if entry.degree == "1" then
            degreeColor = "{FF0000}" -- Красный цвет для степени 1
        elseif entry.degree == "2" then
            degreeColor = "{FFA500}" -- Оранжевый цвет для степени 2
        elseif entry.degree == "3" then
            degreeColor = "{FFFF00}" -- Желтый цвет для степени 3
        else
            degreeColor = "{FFFFFF}" -- Белый цвет для неопределенной степени
        end
        dialogText = dialogText .. "\n" .. entry.nick .. "\t" .. degreeColor .. entry.degree .. "\t" .. entry.reason .. "\t" .. entry.by_whom
    end
    sampShowDialog(15, "Черный Список Семьи", dialogText, "Закрыть", "", 5)
end

function cmd_add_blacklist(params)
    local nick, degree, reason, by_whom = params:match("(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
    if not nick or not degree or not reason or not by_whom then
        sampAddChatMessage(error_tag .. " {FFFFFF}Неверный формат команды. Пример: {FF0000}/add_list [Nick_Name] [Степень (1-3)] [Причина] [Кем занесено]", -1)
        return
    end
 
    for _, entry in ipairs(list) do
        if entry.nick == nick then
            sampAddChatMessage(error_tag .. " {FFFFFF}Игрок уже занесен в черный список.", -1)
            return
        end
    end
 
    table.insert(list, {nick = nick, degree = degree, reason = reason, by_whom = by_whom})
    json(file):write(list)
end

function cmd_remove_blacklist(nick)
    if not nick then
        sampAddChatMessage(error_tag .. " {FFFFFF}Неверный формат команды. Пример: {FF0000}/delbl NickName", -1)
        return
    end
    for i, entry in ipairs(list) do
        if entry.nick == nick then
            table.remove(list, i)
            sampAddChatMessage(error_tag .. " {FFFFFF}Пользователь удален из черного списка.", -1)
            json(file):write(list)
            return
        end
    end
    sampAddChatMessage(error_tag .. " {FFFFFF}Пользователь не найден в черном списке.", -1)
end

function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")

        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end

теперь содержимое /blf регулируется файлом json, в который записывается игнфа через /addbl и /delbl
 
  • Нравится
Реакции: chromiusj