Модуль:FetchData: відмінності між версіями

3811 байтів вилучено ,  2 грудень
нема опису редагування
Немає опису редагування
Немає опису редагування
Рядок 602: Рядок 602:


-- ================================================
-- ================================================
-- FETCHDATA5 (записи ігор) - ОНОВЛЕНО З ЧАСОМ
-- FETCHDATA5 (записи ігор) - ВИПРАВЛЕНО
-- ================================================
-- ================================================


local function get_tournament_link_games(short_name, full_name)
local function get_tournament_link_games(short_name, full_name)
    if not short_name or short_name == "" then
        return "Невідомо"
    end
   
     if short_name == "Фанова гра" then
     if short_name == "Фанова гра" then
         return "Фанова гра"
         return "Фанова гра"
     elseif short_name == "Score Battle" then
     end
        return "[[Score Open Battle I|Score Battle]]"
   
     elseif short_name and short_name ~= "" and full_name and full_name ~= "" then
    -- Очищаємо full_name від [[ ]]
     if full_name then
        full_name = clean_wikilinks(full_name)
    end
   
    if full_name and full_name ~= "" and full_name ~= short_name then
         return "[[" .. full_name .. "|" .. short_name .. "]]"
         return "[[" .. full_name .. "|" .. short_name .. "]]"
     else
     else
         return short_name or full_name or "Невідомо"
         return "[[" .. short_name .. "]]"
    end
end
 
local function parse_games_table_rows(table_content)
    local rows = {}
   
    -- Шукаємо рядки після |- (inline формат: все в одному рядку)
    for row in mw.ustring.gmatch(table_content, "|-\n([^\n]+)") do
        -- Пропускаємо заголовки (починаються з !)
        if not mw.ustring.match(row, "^%s*!") then
            table.insert(rows, row)
        end
     end
     end
   
    return rows
end
local function parse_games_row_cells(row)
    local cells = {}
   
    -- Видаляємо початковий |
    row = mw.ustring.gsub(row, "^%s*|%s*", "")
   
    -- Розділяємо по ||
    for cell in mw.ustring.gmatch(row .. "||", "(.-)%s*||%s*") do
        cell = mw.text.trim(cell)
        table.insert(cells, cell)
    end
   
    return cells
end
end


local function get_player_role(player_name, cells)
local function get_player_role(player_name, cells)
     -- ОНОВЛЕНО: після додавання колонки "Час", гравці тепер в позиціях 6-15
     -- Колонки 6-11: мирні
     for i = 6, 11 do -- 6 мирних
     for i = 6, 11 do
         if cells[i] and clean_wikilinks(cells[i]) == player_name then
         if cells[i] and clean_wikilinks(cells[i]) == player_name then
             return "Мирний"
             return "Мирний"
Рядок 625: Рядок 663:
     end
     end
      
      
     if cells[12] and clean_wikilinks(cells[12]) == player_name then -- Шериф
    -- Колонка 12: шериф
     if cells[12] and clean_wikilinks(cells[12]) == player_name then
         return "Шериф"
         return "Шериф"
     end
     end
      
      
     for i = 13, 14 do -- 2 мафії
    -- Колонки 13-14: мафія
     for i = 13, 14 do
         if cells[i] and clean_wikilinks(cells[i]) == player_name then
         if cells[i] and clean_wikilinks(cells[i]) == player_name then
             return "Мафія"
             return "Мафія"
Рядок 635: Рядок 675:
     end
     end
      
      
     if cells[15] and clean_wikilinks(cells[15]) == player_name then -- Дон
    -- Колонка 15: дон
     if cells[15] and clean_wikilinks(cells[15]) == player_name then
         return "Дон"
         return "Дон"
     end
     end
Рядок 662: Рядок 703:
     if not table_content then return nil end
     if not table_content then return nil end
      
      
     local rows = parse_table_rows(table_content)
     local rows = parse_games_table_rows(table_content)
     local games = {}
     local games = {}
      
      
     for _, row in ipairs(rows) do
     for _, row in ipairs(rows) do
         local cells = parse_row_cells(row)
         local cells = parse_games_row_cells(row)
          
          
         local player_in_game = false
         if #cells >= 17 then
        -- ОНОВЛЕНО: гравці тепер в колонках 6-15
            -- Перевіряємо чи гравець у грі (колонки 6-15)
        for i = 6, 15 do
            local player_in_game = false
            if cells[i] and clean_wikilinks(cells[i]) == player_name then
            for i = 6, 15 do
                player_in_game = true
                if cells[i] and clean_wikilinks(cells[i]) == player_name then
                 break
                    player_in_game = true
                    break
                 end
             end
             end
        end
       
        if player_in_game and #cells >= 17 then
            local role = get_player_role(player_name, cells)
            local result = get_player_result(role, cells[16])
              
              
             table.insert(games, {
             if player_in_game then
                tournament = clean_wikilinks(cells[4]) or "", -- Турнір (колонка 4)
                local role = get_player_role(player_name, cells)
                short = cells[3] or "", -- Скорочення (колонка 3)
                local result = get_player_result(role, cells[16])
                time = cells[5] or "", -- ЧАС (НОВА КОЛОНКА 5!)
               
                role = role,
                table.insert(games, {
                result = result,
                    short = cells[3] or "",
                link = cells[17] or "" -- Посилання (колонка 17)
                    tournament = cells[4] or "",
             })
                    time = cells[5] or "",
                    result = result,
                    link = cells[17] or ""
                })
             end
         end
         end
     end
     end
Рядок 717: Рядок 759:
     local headerRow = htmlTable:tag('tr')
     local headerRow = htmlTable:tag('tr')
     headerRow:tag('th'):wikitext('Турнір')
     headerRow:tag('th'):wikitext('Турнір')
     headerRow:tag('th'):wikitext('Час') -- НОВА КОЛОНКА!
     headerRow:tag('th'):wikitext('Час')
    headerRow:tag('th'):wikitext('Роль')
     headerRow:tag('th'):wikitext('Результат')
     headerRow:tag('th'):wikitext('Результат')
     headerRow:tag('th'):wikitext('Запис')
     headerRow:tag('th'):wikitext('Запис')
Рядок 725: Рядок 766:
         local row = htmlTable:tag('tr')
         local row = htmlTable:tag('tr')
          
          
         row:tag('td'):css('text-align', 'center'):css('padding', '8px')
        -- Турнір (скорочення з посиланням)
         row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
             :wikitext(get_tournament_link_games(game.short, game.tournament))
             :wikitext(get_tournament_link_games(game.short, game.tournament))
          
          
         -- НОВА КОЛОНКА - ЧАС
         -- Час
         row:tag('td'):css('text-align', 'center'):css('padding', '8px')
         row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
             :wikitext(game.time)
             :wikitext(game.time)
          
          
         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')
          
          
        local resultCell = row:tag('td'):css('text-align', 'center'):css('padding', '8px')
         if game.result == "Перемога" then
         if game.result == "Перемога" then
             resultCell:tag('span'):css('color', '#4caf50'):css('font-weight', 'normal'):wikitext('Перемога')
             resultCell:tag('span')
                :css('color', '#4caf50')
                :wikitext('Перемога')
         elseif game.result == "Поразка" then
         elseif game.result == "Поразка" then
             resultCell:tag('span'):css('color', 'indianred'):css('font-weight', 'normal'):wikitext('Поразка')
             resultCell:tag('span')
                :css('color', 'indianred')
                :wikitext('Поразка')
         else
         else
             resultCell:wikitext(game.result)
             resultCell:wikitext(game.result)
         end
         end
          
          
         local linkCell = row:tag('td'):css('text-align', 'center'):css('padding', '8px')
        -- Кнопка перегляду
         local linkCell = row:tag('td')
            :css('text-align', 'center')
            :css('padding', '8px')
       
         if game.link and game.link ~= "" then
         if game.link and game.link ~= "" then
             linkCell:wikitext('<span class="game-record-btn">[' .. game.link .. ' ▶︎]</span>')
             linkCell:wikitext('<span class="game-record-btn">[' .. game.link .. ' ▶︎]</span>')
Рядок 759: Рядок 815:
     return games and tostring(#games) or "0"
     return games and tostring(#games) or "0"
end
end
-- ================================================
-- FETCHDATA6 (досягнення в сезонах)
-- ================================================
local function get_season_data(season_number, player_name)
    local season_names = {
        [1] = "Перший сезон", [2] = "Другий сезон", [3] = "Третій сезон",
        [4] = "Четвертий сезон", [5] = "П'ятий сезон", [6] = "Шостий сезон",
        [7] = "Сьомий сезон", [8] = "Восьмий сезон", [9] = "Дев'ятий сезон"
    }
   
    local season_name = season_names[season_number]
    if not season_name then return nil end
   
    local content = get_page_content(season_name)
    if not content then return nil end
   
    local rating_section = mw.ustring.match(content, "==+%s*Рейтинг%s*==+(.-)\n==")
    if not rating_section then
        rating_section = mw.ustring.match(content, "==+%s*Рейтинг%s*==+(.*)")
    end
    if not rating_section then return nil end
   
    local table_start = mw.ustring.find(rating_section, "{|")
    local table_end = mw.ustring.find(rating_section, "|}", table_start)
    if not table_start or not table_end then return nil end
   
    local table_content = mw.ustring.sub(rating_section, table_start, table_end + 1)
   
    local current_row = {}
    local all_rows = {}
   
    for line in mw.ustring.gmatch(table_content .. "\n", "([^\n]*)\n") do
        line = mw.text.trim(line)
       
        if line == "|-" then
            if #current_row > 0 then
                table.insert(all_rows, current_row)
            end
            current_row = {}
        elseif mw.ustring.match(line, "^|[^-}]") then
            local cell_content = mw.ustring.gsub(line, "^|%s*", "")
            table.insert(current_row, cell_content)
        end
    end
   
    if #current_row > 0 then
        table.insert(all_rows, current_row)
    end
   
    for _, row in ipairs(all_rows) do
        if #row >= 5 then
            local player_cell = clean_wikilinks(row[2])
           
            if player_cell == player_name then
                return {
                    place = mw.text.trim(row[1]),
                    points = mw.text.trim(row[3]),
                    games = mw.text.trim(row[4]),
                    winrate = mw.text.trim(row[5])
                }
            end
        end
    end
   
    return nil
end
function p.season_achievements(frame)
    local player_name = frame.args.player
    if not player_name or player_name == "" then
        return "<span style='color:red;'>Ім'я гравця не вказано</span>"
    end
   
    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('% перемог')
    headerRow:tag('th'):wikitext('Ігор')
   
    local season_links = {
        [1] = "[[Перший сезон#Рейтинг|01 сезон]]",
        [2] = "[[Другий сезон#Рейтинг|02 сезон]]",
        [3] = "[[Третій сезон#Рейтинг|03 сезон]]",
        [4] = "[[Четвертий сезон#Рейтинг|04 сезон]]",
        [5] = "[[П'ятий сезон#Рейтинг|05 сезон]]",
        [6] = "[[Шостий сезон#Рейтинг|06 сезон]]",
        [7] = "[[Сьомий сезон#Рейтинг|07 сезон]]",
        [8] = "[[Восьмий сезон#Рейтинг|08 сезон]]",
        [9] = "[[Дев'ятий сезон#Рейтинг|09 сезон]]"
    }
   
    for season = 1, 9 do
        local data = get_season_data(season, player_name)
        local row = htmlTable:tag('tr')
       
        row:tag('td'):css('text-align', 'center'):css('padding', '8px'):wikitext(season_links[season])
       
        if data then
            row:tag('td'):css('text-align', 'center'):css('padding', '8px'):wikitext(data.place)
            row:tag('td'):css('text-align', 'center'):css('padding', '8px'):wikitext(data.points)
            row:tag('td'):css('text-align', 'center'):css('padding', '8px'):wikitext(data.winrate)
            row:tag('td'):css('text-align', 'center'):css('padding', '8px'):wikitext(data.games)
        else
            for i = 1, 4 do
                row:tag('td'):css('text-align', 'center'):css('padding', '8px'):css('color', '#666'):wikitext('-')
            end
        end
    end
   
    return tostring(htmlTable)
end
return p