Module:AchievementSystem: Difference between revisions

// via Wikitext Extension for VSCode
// via Wikitext Extension for VSCode
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
-- Module:AchievementSystem
--[[
-- Loads data from MediaWiki:AchievementData.json and MediaWiki:AchievementList.json
* Name: AchievementSystem
--
* Author: Mark W. Datysgeld
-- AchievementList.json contains achievement type definitions
* Description: Comprehensive achievement system that manages user badges and titles throughout ICANNWiki, loading data from MediaWiki JSON files and providing rendering functions for Person templates
-- AchievementData.json contains user achievement assignments
* Notes: Loads from MediaWiki:AchievementData.json (user assignments) and MediaWiki:AchievementList.json (type definitions). CSS styling defined in Templates.css using achievement-{id} format. Includes caching and fallback mechanisms for robust JSON handling
-- All achievement styling is defined in CSS/Templates.css, not in the JSON. This module assigns CSS classes based on achievement IDs in the format:
]]
-- .person-template .template-title.achievement-{id}::after {}


---@class UserAchievement
---@class UserAchievement
Line 653: Line 652:
function Achievements.getTitleAchievement(pageId, frame)
function Achievements.getTitleAchievement(pageId, frame)
     if not pageId or pageId == '' then
     if not pageId or pageId == '' then
         return '', '', ''
         return nil
     end
     end


     local userAchievements = Achievements.getUserAchievements(pageId)
     local userAchievements = Achievements.getUserAchievements(pageId)
     if #userAchievements == 0 then
     if #userAchievements == 0 then
         return '', '', ''
         return nil
     end
     end


Line 687: Line 686:
     end
     end


     if not titleAchievement or not titleAchievement.id then
     return titleAchievement
        return '', '', ''
    end
 
    local achievementId = titleAchievement.id
    local displayName = titleAchievement.name or achievementId
   
    return achievementId, displayName, achievementId
end
end


Line 711: Line 703:
         return string.format('|-\n! colspan="2" class="%s" | %s', titleClass, titleText)
         return string.format('|-\n! colspan="2" class="%s" | %s', titleClass, titleText)
     end
     end
end
--------------------------------------------------------------------------------
-- Generate wikitext category links for a given list of achievements
-- @param achievements - An array of user achievement objects
-- @param frame - The Scribunto frame object
-- @return A string of wikitext category links, e.g., "[[Category:Cat1]][[Category:Cat2]]"
--------------------------------------------------------------------------------
function Achievements.getCategoryLinks(achievements, frame)
    if not achievements or #achievements == 0 then
        return ""
    end
    local types = Achievements.loadTypes(frame)
    local typeDefinitions = {}
    for _, typeData in ipairs(types) do
        typeDefinitions[typeData.id] = typeData
    end
    local categoryLinks = {}
    local foundCategories = {} -- To prevent duplicate categories
    for _, ach in ipairs(achievements) do
        local achType = ach['type']
        local definition = typeDefinitions[achType]
       
        if definition and definition.category and definition.category ~= "" and not foundCategories[definition.category] then
            table.insert(categoryLinks, "[[Category:" .. definition.category .. "]]")
            foundCategories[definition.category] = true
        end
    end
    return table.concat(categoryLinks)
end
end


return Achievements
return Achievements