Немає опису редагування
Немає опису редагування
Рядок 81: Рядок 81:
      
      
     return nil, error_output("Player Not Found", player_name)
     return nil, error_output("Player Not Found", player_name)
end
--- Генерує іконку медалі
local function get_medal_icon(value)
    if not value or value == "" or value == " " then
        return nil
    end
   
    value = mw.text.trim(value)
   
    if value == "" then
        return nil
    elseif value == "1" then
        return "[[Файл:Gold.png|1-е Місце]]"
    elseif value == "2" then
        return "[[Файл:Silver.png|2-е Місце]]"
    elseif value == "3" then
        return "[[Файл:Bronze.png|3-є Місце]]"
    elseif value == "4" then
        return "[[Файл:Finalist.png|Фіналіст]]"
    elseif value == "S" or mw.ustring.match(value, "^S%d") then
        return "[[Файл:Star.png|Найкращий]]"
    else
        return nil
    end
end
--- Конвертує число в римські цифри
local function to_roman(num)
    local romans = {
        {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},
        {100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"},
        {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}
    }
    local result = ""
    for _, pair in ipairs(romans) do
        local value, letter = pair[1], pair[2]
        while num >= value do
            result = result .. letter
            num = num - value
        end
    end
    return result
end
--- Генерує посилання на турнір
local function get_tournament_link(header_name)
    local season_num = mw.ustring.match(header_name, "([А-Яа-яЁёІіЇїЄєҐґ']+) сезон %(фінал%)")
    if not season_num then
        season_num = mw.ustring.match(header_name, "([А-Яа-яЁёІіЇїЄєҐґ']+) сезон %(рейтинг%)")
    end
   
    if season_num then
        local season_map = {
            ["Перший"] = 1, ["Другий"] = 2, ["Третій"] = 3,
            ["Четвертий"] = 4, ["П'ятий"] = 5, ["Шостий"] = 6,
            ["Сьомий"] = 7, ["Восьмий"] = 8, ["Дев'ятий"] = 9
        }
       
        local season_number = season_map[season_num]
        if season_number then
            local roman = to_roman(season_number)
           
            local type_text = ""
            if mw.ustring.find(header_name, "фінал") then
                type_text = "Фінал."
            elseif mw.ustring.find(header_name, "рейтинг") then
                type_text = "Рейтинг."
            end
           
            local clean_name = mw.ustring.gsub(header_name, "%s*%(фінал%)%s*", "")
            clean_name = mw.ustring.gsub(clean_name, "%s*%(рейтинг%)%s*", "")
            clean_name = mw.text.trim(clean_name)
           
            return string.format("[[%s|%s сезон. %s]]", clean_name, roman, type_text)
        end
    end
   
    return string.format("[[%s]]", header_name)
end
end


Рядок 170: Рядок 91:
     if not name or name == "" then
     if not name or name == "" then
         return error_output("No Player Name", "")
         return error_output("No Player Name", "")
    end
   
    -- Отримуємо дані з таблиці "Титули"
    local titles_data, err1 = get_player_row("Титули", name)
    if not titles_data then
        return err1 or "''Відсутні''"
     end
     end
      
      
     -- Отримуємо дані з таблиці "Призові"
     -- Отримуємо дані з таблиці "Призові"
     local prize_data = get_player_row("Призові", name)
     local prize_data, err = get_player_row("Призові", name)
   
     if not prize_data then
    -- Створюємо мапу призових для швидкого доступу
         return err or "''Відсутні''"
    local prize_map = {}
     if prize_data then
         for j = 1, #prize_data.headers do
            local header = prize_data.headers[j]
            local value = prize_data.cells[j] or ""
           
            -- Очищуємо заголовок від (фінал) та (рейтинг) для ключа мапи
            local clean_header = mw.ustring.gsub(header, "%s*%(фінал%)%s*", "")
            clean_header = mw.ustring.gsub(clean_header, "%s*%(рейтинг%)%s*", "")
            clean_header = mw.text.trim(clean_header)
           
            prize_map[clean_header] = value
        end
     end
     end
   
    -- Мапа дат турнірів
    local tournament_dates = {
        ["Перший сезон"] = "09.09.2023",
        ["Другий сезон"] = "28.10.2023",
        ["Третій сезон"] = "23.12.2023",
        ["Четвертий сезон"] = "10.02.2024",
        ["П'ятий сезон"] = "06.04.2024",
        ["Шостий сезон"] = "11.05.2024",
        ["Сьомий сезон"] = "06.07.2024",
        ["Восьмий сезон"] = "10.08.2024",
        ["Дев'ятий сезон"] = "28.09.2024",
        ["Mafia Closed Cup I"] = "12.11.2023",
        ["Mafia Closed Cup I Online"] = "28.01.2024",
        ["Фінал Року"] = "13.10.2024"
    }
      
      
     local results = {}
     local results = {}
      
      
     -- Пропускаємо першу колонку (ім'я гравця)
     -- Пропускаємо першу колонку (ім'я гравця)
     for i = 2, #titles_data.cells do
     for i = 2, #prize_data.cells do
         local cell_value = titles_data.cells[i]
         local prize_value = prize_data.cells[i]
         local header = titles_data.headers[i]
         local header = prize_data.headers[i]
          
          
         if cell_value and cell_value ~= "" and cell_value ~= "-" and header then
         if prize_value and prize_value ~= "" and prize_value ~= "-" and header then
             local medal = get_medal_icon(cell_value)
            -- Видаляємо символ ₴ якщо він вже є
             local clean_prize = mw.ustring.gsub(prize_value, "₴", "")
            clean_prize = mw.text.trim(clean_prize)
              
              
             if medal then
             -- Перевіряємо чи це число більше 0
                -- Отримуємо назву турніру без (фінал)/(рейтинг)
            if clean_prize ~= "0" then
                local clean_header = mw.ustring.gsub(header, "%s*%(фінал%)%s*", "")
                clean_header = mw.ustring.gsub(clean_header, "%s*%(рейтинг%)%s*", "")
                clean_header = mw.text.trim(clean_header)
               
                -- Отримуємо призові з мапи за очищеним заголовком
                local prize_value = prize_map[clean_header]
                local prize_amount = "0 ₴"
               
                if prize_value and prize_value ~= "" and prize_value ~= "-" then
                    -- Видаляємо символ ₴ якщо він вже є
                    prize_value = mw.ustring.gsub(prize_value, "₴", "")
                    prize_value = mw.text.trim(prize_value)
                   
                    if prize_value ~= "0" then
                        prize_amount = prize_value .. " ₴"
                    end
                end
               
                -- Отримуємо дату турніру
                local date = tournament_dates[clean_header] or "01.01.2023"
               
                -- Форматуємо посилання на турнір
                local tournament_link = get_tournament_link(header)
               
                -- Текст місця
                local place_text = ""
                if cell_value == "1" then
                    place_text = "1-е"
                elseif cell_value == "2" then
                    place_text = "2-е"
                elseif cell_value == "3" then
                    place_text = "3-є"
                elseif cell_value == "4" then
                    place_text = "Участь"
                elseif cell_value == "S" or mw.ustring.match(cell_value, "^S%d") then
                    place_text = "Кращий"
                end
               
                 table.insert(results, {
                 table.insert(results, {
                    date = date,
                     tournament = header,
                    place = place_text,
                     prize = clean_prize .. " ₴"
                    medal = medal,
                     tournament = tournament_link,
                     prize = prize_amount
                 })
                 })
             end
             end
Рядок 281: Рядок 128:
     local table_html = {
     local table_html = {
         '{| class="wikitable sortable" style="width: calc(100% - 470px);"',
         '{| class="wikitable sortable" style="width: calc(100% - 470px);"',
         '! Дата !! Місце !! Турнір !! Призові',
         '! Турнір !! Призові',
         '|-'
         '|-'
     }
     }
Рядок 287: Рядок 134:
     for _, result in ipairs(results) do
     for _, result in ipairs(results) do
         table.insert(table_html, string.format(
         table.insert(table_html, string.format(
             '| style="text-align:left;" | %s || style="text-align:left;" | %s || style="text-align:left; padding-left:10px;" | %s %s || style="text-align:right;" | %s',
             '| style="text-align:left;" | [[%s]] || style="text-align:right;" | %s',
            result.date,
            result.place,
            result.medal,
             result.tournament,
             result.tournament,
             result.prize
             result.prize

Версія за 13:41, 27 листопада 2025

Документацію для цього модуля можна створити у Модуль:FetchData3/документація

local p = {}

--- Функція для виведення помилки
local function error_output(context, error_details)
    local safe_details = error_details or "N/A" 
    return string.format("<span style='color:red; font-weight:bold;'>[FD3 Error: %s. Details: %s]</span>", 
        context or "Unknown Context", safe_details)
end

--- Отримує заголовки та рядок гравця з таблиці
local function get_player_row(page_title, player_name)
    local title = mw.title.new(page_title)
    if not title or not title.exists then 
        return nil, error_output("Page Missing", page_title)
    end
    
    local content = title:getContent()
    if not content then 
        return nil, error_output("Content Read Fail", page_title) 
    end
    
    -- Знаходимо таблицю
    local table_start = mw.ustring.find(content, "{|")
    local table_end = mw.ustring.find(content, "|}", table_start)
    
    if not table_start or not table_end then
        return nil, error_output("Table Missing", page_title)
    end
    
    local table_content = mw.ustring.sub(content, table_start, table_end + 1)
    
    -- Отримуємо заголовки (перший рядок після {|)
    local headers = {}
    local first_row = mw.ustring.match(table_content, "{|[^\n]*\n!(.-)[\n]")
    
    if first_row then
        -- Розбиваємо заголовки по ||
        for header in mw.ustring.gmatch(first_row, "([^|]+)") do
            local trimmed = mw.text.trim(header)
            if trimmed ~= "" then
                table.insert(headers, trimmed)
            end
        end
    end
    
    if #headers == 0 then
        return nil, error_output("No Headers Found", page_title)
    end
    
    -- Шукаємо рядок з гравцем
    local escaped = mw.ustring.gsub(player_name, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1")
    local player_pattern = "%[%[" .. escaped .. "%]%]"
    
    -- Збираємо всі рядки
    local rows = {}
    for row in mw.ustring.gmatch(table_content, "|-\n(.-)\n|-") do
        table.insert(rows, row)
    end
    
    local last_row = mw.ustring.match(table_content, "|-\n(.-)%s*|}")
    if last_row then
        table.insert(rows, last_row)
    end
    
    -- Обробляємо кожен рядок
    for _, row in ipairs(rows) do
        if mw.ustring.find(row, player_pattern) then
            local cells = {}
            row = mw.ustring.gsub(row, "^%s*|%s*", "")
            
            for cell in mw.ustring.gmatch(row, "([^|]+)") do
                local trimmed = mw.text.trim(cell)
                if trimmed ~= "" then
                    table.insert(cells, trimmed)
                end
            end
            
            return {headers = headers, cells = cells}
        end
    end
    
    return nil, error_output("Player Not Found", player_name)
end

----------------------------------------------------------------------
-- ГОЛОВНА ФУНКЦІЯ ДЛЯ ОТРИМАННЯ ТИТУЛІВ У ВИГЛЯДІ ТАБЛИЦІ
----------------------------------------------------------------------
function p.titles(frame)
    local name = frame.args.player
    
    if not name or name == "" then
        return error_output("No Player Name", "")
    end
    
    -- Отримуємо дані з таблиці "Призові"
    local prize_data, err = get_player_row("Призові", name)
    if not prize_data then
        return err or "''Відсутні''"
    end
    
    local results = {}
    
    -- Пропускаємо першу колонку (ім'я гравця)
    for i = 2, #prize_data.cells do
        local prize_value = prize_data.cells[i]
        local header = prize_data.headers[i]
        
        if prize_value and prize_value ~= "" and prize_value ~= "-" and header then
            -- Видаляємо символ ₴ якщо він вже є
            local clean_prize = mw.ustring.gsub(prize_value, "₴", "")
            clean_prize = mw.text.trim(clean_prize)
            
            -- Перевіряємо чи це число більше 0
            if clean_prize ~= "0" then
                table.insert(results, {
                    tournament = header,
                    prize = clean_prize .. " ₴"
                })
            end
        end
    end
    
    if #results == 0 then
        return "''Відсутні''"
    end
    
    -- Генеруємо таблицю
    local table_html = {
        '{| class="wikitable sortable" style="width: calc(100% - 470px);"',
        '! Турнір !! Призові',
        '|-'
    }
    
    for _, result in ipairs(results) do
        table.insert(table_html, string.format(
            '| style="text-align:left;" | [[%s]] || style="text-align:right;" | %s',
            result.tournament,
            result.prize
        ))
        table.insert(table_html, '|-')
    end
    
    table.insert(table_html, '|}')
    
    return table.concat(table_html, '\n')
end

return p