Немає опису редагування
(Сторінка очищена)
Мітка: Очищення
 
Рядок 1: Рядок 1:
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;'>[Games Error: %s. Details: %s]</span>",
        context or "Unknown Context", safe_details)
end
--- Видаляє вікі-посилання [[link]]
local function clean_wikilinks(text)
    if not text then return nil end
    text = mw.ustring.gsub(text, "%[%[([^%]|]+)|([^%]]+)%]%]", "%2")
    text = mw.ustring.gsub(text, "%[%[([^%]]+)%]%]", "%1")
    return mw.text.trim(text)
end
--- Створює посилання на турнір
local function get_tournament_link(short_name, full_name)
    if short_name == "Фанова гра" then
        return "Фанова гра"
    elseif short_name and short_name ~= "" and full_name and full_name ~= "" then
        return "[[" .. full_name .. "|" .. short_name .. "]]"
    else
        return short_name or full_name or "Невідомо"
    end
end
--- Визначає роль гравця в грі
local function get_player_role(player_name, cells)
    -- Колонки: 1-Формат, 2-Тип, 3-Турнір, 4-Скорочення
    -- 5-10: Мирні (6 гравців)
    -- 11: Шериф
    -- 12-13: Мафія (2 гравці)
    -- 14: Дон
    -- 15: Результат
    -- 16: Посилання
   
    -- Перевіряємо Мирних (колонки 5-10)
    for i = 5, 10 do
        if cells[i] and clean_wikilinks(cells[i]) == player_name then
            return "Мирний"
        end
    end
   
    -- Перевіряємо Шерифа (колонка 11)
    if cells[11] and clean_wikilinks(cells[11]) == player_name then
        return "Шериф"
    end
   
    -- Перевіряємо Мафію (колонки 12-13)
    for i = 12, 13 do
        if cells[i] and clean_wikilinks(cells[i]) == player_name then
            return "Мафія"
        end
    end
   
    -- Перевіряємо Дона (колонка 14)
    if cells[14] and clean_wikilinks(cells[14]) == player_name then
        return "Дон"
    end
   
    return "Невідомо"
end
--- Визначає результат для гравця
local function get_player_result(role, game_result)
    if not game_result or game_result == "" then
        return "Невідомо"
    end
   
    game_result = mw.text.trim(game_result)
   
    -- Місто перемогло
    if game_result == "Місто" or game_result == "Мирні" then
        if role == "Мирний" or role == "Шериф" then
            return "Перемога"
        else
            return "Поразка"
        end
    end
   
    -- Мафія перемогла
    if game_result == "Мафія" then
        if role == "Мафія" or role == "Дон" then
            return "Перемога"
        else
            return "Поразка"
        end
    end
   
    return "Невідомо"
end
--- Отримує список ігор гравця
local function get_player_games_list(player_name)
    local title = mw.title.new("Ігри")
    if not title or not title.exists then
        return nil
    end
   
    local content = title:getContent()
    if not content then
        return nil
    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
    end
   
    local table_content = mw.ustring.sub(content, table_start, table_end + 1)
   
    -- Збираємо всі рядки
    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
   
    local games = {}
   
    -- Обробляємо кожен рядок
    for _, row in ipairs(rows) do
        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
       
        -- Перевіряємо чи гравець є в цій грі
        local player_in_game = false
        for i = 5, 14 do
            if cells[i] and clean_wikilinks(cells[i]) == player_name then
                player_in_game = true
                break
            end
        end
       
        if player_in_game and #cells >= 15 then
            local tournament = cells[3] or ""
            local short_name = cells[4] or ""
            local game_result = cells[15] or ""
            local link = cells[16] or ""
           
            local role = get_player_role(player_name, cells)
            local result = get_player_result(role, game_result)
           
            table.insert(games, {
                tournament = tournament,
                short = short_name,
                role = role,
                result = result,
                link = link
            })
        end
    end
   
    return games
end
--- Головна функція для виведення ігор гравця
function p.player_games(frame)
    local player_name = frame.args.player
   
    if not player_name or player_name == "" then
        return error_output("No Player Name", "")
    end
   
    local games = get_player_games_list(player_name)
   
    if not games then
        return error_output("Cannot Load Games", "Ігри")
    end
   
    if #games == 0 then
        return "''Ігор не знайдено''"
    end
   
    -- Створюємо HTML таблицю за допомогою mw.html
    local htmlTable = mw.html.create('table')
        :addClass('wikitable sortable')
        :css('width', '100%')
        :css('font-size', '14.5px')
   
    -- Додаємо заголовки
    local headerRow = htmlTable:tag('tr')
    headerRow:tag('th'):wikitext('Турнір')
    headerRow:tag('th'):wikitext('Роль')
    headerRow:tag('th'):wikitext('Результат')
    headerRow:tag('th'):wikitext('Запис')
   
    -- Додаємо рядки з іграми
    for _, game in ipairs(games) do
        local row = htmlTable:tag('tr')
       
        -- Турнір (з посиланням)
        row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
            :wikitext(get_tournament_link(game.short, game.tournament))
       
        -- Роль
        row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
            :wikitext(game.role)
       
        -- Результат
        local resultCell = row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
       
        if game.result == "Перемога" then
            resultCell:tag('span')
                :css('color', '#4caf50')
                :css('font-weight', 'normal')
                :wikitext('Перемога')
        elseif game.result == "Поразка" then
            resultCell:tag('span')
                :css('color', 'indianred')
                :css('font-weight', 'normal')
                :wikitext('Поразка')
        else
            resultCell:wikitext(game.result)
        end
       
        -- Запис (посилання)
        local linkCell = row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
       
        if game.link and game.link ~= "" then
            linkCell:wikitext('<span class="game-record-btn">[' .. game.link .. ' Дивитися]</span>')
        end
    end
   
    return tostring(htmlTable)
end
--- Функція для отримання кількості ігор гравця
function p.games_count(frame)
    local player_name = frame.args.player
   
    if not player_name or player_name == "" then
        return "0"
    end
   
    local games = get_player_games_list(player_name)
   
    if not games then
        return "0"
    end
   
    return tostring(#games)
end
return p

Поточна версія на 12:46, 1 грудня 2025

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