Module:AchievementSystem: Difference between revisions
// via Wikitext Extension for VSCode |
// via Wikitext Extension for VSCode |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
-- | --[[ | ||
* Name: AchievementSystem | |||
* Author: Mark W. Datysgeld | |||
* 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 | |||
* 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 | |||
]] | |||
---@class UserAchievement | ---@class UserAchievement | ||
| Line 391: | Line 390: | ||
-- @return Array of badge achievement objects | -- @return Array of badge achievement objects | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
function Achievements.getBadgeAchievements(pageId, frame) | function Achievements.getBadgeAchievements(pageId, frame) | ||
if not pageId or pageId == '' then | if not pageId or pageId == '' then | ||
| Line 421: | Line 415: | ||
local achType = achievementTbl['type'] | local achType = achievementTbl['type'] | ||
if achType and typeDefinitions[achType] and typeDefinitions[achType]['type'] == "badge" then | if achType and typeDefinitions[achType] and typeDefinitions[achType]['type'] == "badge" then | ||
local newAchievement = { | |||
type = achType, | |||
date = achievementTbl['date'] or '', | |||
name = typeDefinitions[achType].name or achType, | |||
category = typeDefinitions[achType].category | |||
} | |||
table.insert(badgeAchievements, newAchievement) | table.insert(badgeAchievements, newAchievement) | ||
end | end | ||
| Line 610: | Line 604: | ||
-- Direct lookup for the requested achievement type | -- Direct lookup for the requested achievement type | ||
for _, | for _, achievementTbl in ipairs(userAchievements) do | ||
if | if achievementTbl["type"] == achievementType then | ||
return | local def = Achievements.getAchievementDefinition(achievementType) | ||
return { | |||
type = achievementTbl.type, | |||
date = achievementTbl.date or '', | |||
name = def and def.name or achievementType, | |||
category = def and def.category | |||
} | |||
end | end | ||
end | end | ||
| Line 652: | 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 686: | Line 686: | ||
end | end | ||
return titleAchievement | |||
end | end | ||
| Line 710: | 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 | ||