Skip to content

Changelog

2.1.0 22/09/2026

  • [NEW] Portal page-level guild tabs (#360) — bb_portal_tabs table + module_tab axis on bb_portal_modules so a guild's portal page can have more than one tab, each with its own independently column-organized set of modules; renderer resolves the active tab and emits a tab bar between the guild header and the portal grid; ACP tab CRUD; /guild/{tab}/{guild_id} route reuses the previously-ignored page-slug segment.
  • [NEW] Guild statistics portal module (#366) — new game-agnostic portal\modules\statistics block showing class distribution, race distribution, level distribution, rank/active-member counts, and recent joins/departures for the current guild, all read from core's own bb_players/bb_ranks/bb_classes/bb_races/bb_language tables. Item level distribution and DKP/raid stats are deliberately out of scope — ilvl only exists for WoW (via bbguildwow's own equipment-sync table, breaking game-agnosticism) and DKP/raid stats are bbDKP v2's territory.
  • [NEW] Character-sync scheduler contract (#361) — core cron task drives per-character syncs through a character_sync_interface/registry that game plugins register handlers against (tagged bbguild.character_sync); new player_last_synced column + bbguild_sync_last_run config track sync state, player::get_stalest_players()/update_last_synced() drive the batch selection, and a CHARACTER_SYNC_FAILED admin-log type records failures. bbguildwow's WoW handler is the first real consumer (#362).
  • [NEW] Public phpBB event catalogue, phase 1 (#370) — 12 new PHP events (character add/edit/delete/claim/unclaim, character_sync_completed, roster_display, portal_module_display, recruitment posted/updated/deleted, motd_updated) let sibling extensions (game plugins, bbAccounts, a future Discord integration) react to bbGuild lifecycle actions without patching core files; documented alongside the extension's existing events and template hooks in contrib/Events.md.
  • [NEW] About page + footer copyright credit (#373) — new /about route rendered as a headerless popup (simple_header/simple_footer), linked from the footer, with credits pulled from the extension's existing (previously unused) bbDKP/EQDkp-era language strings; the current maintainer is shown by handle only.
  • [NEW] Player-detail sub-tab bar, core half (#375) — new player_detail_tab_interface + bbguild.player_detail_tab tagged-service collection (player_detail_tab_registry) let game plugins register additional tabs (e.g. Talents, PvP) on the player-detail page without core needing to know game-specific concepts; view_controller/routing extended with an optional tab slug, Character remains core's built-in first tab. bbguildwow's restyled Character tab plus new Talents/Raid Progression/PVP tabs are the first real consumer (see its own changelog).
  • [FIX] Guild portal rendered completely empty (no roster, no MOTD, nothing) for every guild created after #360 shipped (#374) — seed_guild_layout()'s new-guild template lookup reads from guild_id=0, but no migration ever populated that template; the only layout ever seeded lived at guild_id=1, a removable demo guild predating the guild_id=0 convention. Seeded the guild_id=0 template directly and backfilled any existing guild left with zero tabs.
  • [FIX] UCP character-add 503 (#377) — player's constructor never initialized $deactivate_reason; the UCP add flow (Makeplayer()Updateplayer()) never calls Getplayer() in between (the only place that otherwise set it), so Updateplayer()'s UPDATE wrote null into a NOT NULL column on every character add. Makeplayer() now defaults it to '' when null, matching the existing convention already used there for player_status/player_title.
  • [FIX] Specialization dropdowns/lists interleaved classes and ignored role (#331 follow-up) — specialization::get_for_class()'s ORDER BY was spec_order, spec_name only; now class_id, role_id, spec_order, spec_name so every consumer (UCP/ACP dropdowns, ACP admin list, roster lookup) groups class → role → spec consistently.
  • [FIX] ACP Edit Game's race/class column-sort links 404'd — the sort header links pointed at an unassigned U_ADD_GAMES, and the O_* order vars were never set; wired both through util::switch_order(). Added instant client-side table sorting (adm/style/sortable_tables.js, no page reload) as a progressive enhancement over the fixed server-side sort, which remains as the no-JS fallback.
  • [CHG] ACP log viewer's per-page row count is now configurable (LOGS_PER_PAGE) instead of hardcoded to constants::USER_LLIMIT.
  • [CHG] Squashed all 2.0.x migrations into one and all 2.1.x migrations into one (#383), matching the 2.0.0 train's precedent at v200b3 — clean install is the only supported upgrade path, so there's no need to preserve fine-grained migration history for either line.
  • [NEW] Player-detail page visual overhaul (#380) — hero pane redesigned, realm display format fixed, per-faction background images wired in; front-end info sections boxed into player-detail panes matching the character page's style (Comment folded into the Activity pane, Gender removed, the top Rank/Role/Status fieldset dropped in favor of bbguildwow's own panes); guild portal-block panes (MOTD, Roster, Recruitment, etc.) rewritten to emit the same pane markup instead of the older Board3 forabg/topiclist wrapper, and panes now inherit the active style's own .panel look.
  • [NEW] Guild nav tab (#379) — the player-detail tab bar (Character/Talents/Achievements) gained a "Guild" entry linking back to the guild's own portal page, placed first; also fixes the tab bar being hidden entirely for players on games with no extra registered tabs, since it's now never just the single Character entry. The nav tab bar was also added to the guild front page itself.
  • [NEW] ACP roster listing: split the combined Race/Class column into separate Race, Class, and Spec columns, each with its icon where available — added the previously-missing race-name join to guilds::list_players() (only the race image was ever shown before) and reused the front-end roster's spec-resolution/legacy-fallback pattern.
  • [FIX] ACP "Linked user" dropdown for character-linking could select newly-registered or banned accounts (#382) — it only excluded BOTS/GUESTS (hardcoded group ids); now also excludes NEWLY_REGISTERED and banned accounts, resolved by group name at request time rather than hardcoded ids.
  • [FIX] ACP character add/edit form crashed with an undefined-array-key warning when a new character's region was inherited from a guild whose own region was never configured (empty string isn't a valid getRegionlist() key).
  • [CHG] Deprecated sql_nextid() calls replaced with sql_last_inserted_id() throughout.
  • [CHG] Deprecated user::add_lang_ext()/add_lang() calls replaced with the non-deprecated language service throughout (both are @deprecated 3.2.0-dev, removed in phpBB 4.0).
  • [DOCS] Unit test coverage added for migration idempotency and the remaining guild/player CRUD paths (#372, split from #244).

2.0.0-rc5 26/07/2026

  • [FIX] Three non-functional buttons on the ACP Games → List games page — "Create custom game" (addgame2) and the "Default game" Confirm (upddefaultgame) had no POST handler in listgames() (which only assigned template vars and never inspected the request), so both silently did nothing; they are now wired to game::install_game() (custom-install path, with form-token check, length validation, and a duplicate-id guard via ERROR_GAME_EXISTS) and game::update_gamedefault() respectively, and {{ S_FORM_TOKEN }} was added to the default-game form (#371)
  • [CHG] Removed the redundant "Install from game plugin" control from the same page — game plugins already register their game automatically on extension enable (each plugin's migrations/basics/data.php seeds the bb_games row via its installer), so the separate ACP "install" step was duplicate work and its addgame1 button was itself dead; the fieldset is renamed "Custom game installation" with the Region dropdown reordered last, and the now-unused gamelistrow/CANINSTALL/PREINSTALLED code was dropped (#371)

2.0.0-rc4 25/07/2026

  • [CHG] ACP restructured: new Game settings category (ACP_BBGUILD_GAMESETTINGS) under the bbGuild menu (positioned right after General Settings), and the Game List module moved into it out of General Settings. Migration v200rc4 creates the category and re-parents the module on existing installs (fresh installs get the same result via the normal migration chain). bbguildwow rc2 moves its BattleNet API module into the same category. Category label added for all 7 languages.
  • [FIX] The region selected on a game's ACP settings page (e.g. WoW: America / Europe / Korea …) was silently discarded on save and always reverted to the stored default (#357) — SaveGameSettings() read every other field but never the region dropdown, so setRegion() was never called before update_game(). The region is now persisted.
  • [FIX] A Battle.net armory sync could leave the ACP/frontend showing a week-stale guild row — guilds::get_guild() cached its per-guild read for 7 days, but update_guild_battleNet() writes bb_guild directly with no cache-destroy, so the stale row (faction, roster flag, player count) survived until the cache expired. This primary-key read is no longer cached.
  • [FIX] ACP guild update failed with "Cannot modify header information — headers already sent" when the message-of-the-day field was left empty (#28) — the empty MOTD was still run through generate_text_for_storage(), whose empty-message branch references the posting-only TOO_FEW_CHARS language key (not loaded in the ACP); on PHP 8 with display_errors on, the resulting "Undefined array key" warning printed before the ACP headers and corrupted the response. The message parser is now skipped entirely when the MOTD is empty (an empty MOTD is valid).
  • [FIX] Faction dropdown on the ACP edit-guild form snapped to the last option (Horde) whenever the game dropdown was changed (#29) — the AJAX faction rebuild created every <option> with defaultSelected = true, so the last one always won the selection; now created with defaultSelected = false
  • [CHG] Default minimum roster level lowered from 50 to 1 — 50 hid every guild member below that level from the roster (both at Battle.net sync time and at display time), too high a floor for a default. New installs seed 1 so all members are visible out of the box; existing installs keep their configured value and the setting stays adjustable in the ACP.

2.0.0-rc3 24/07/2026

  • [FIX] Fatal error Call to undefined method player::getPlayerId() on the UCP character-add form, UCP character-edit form, and ACP roster's character-edit form (#354) — player only ever exposed player_id as a public property (plus an unrelated get_player_id($playername, $playerrealm, $guild_id) lookup method); all three portrait-URL call sites now read the property directly

2.0.0-rc2 24/07/2026

  • [FIX] Roster search form (layout/filter dropdowns, name search, submit button) disappeared entirely when a search returned zero results, leaving no way to search again without navigating away — the form was nested inside the same conditional as the results listing
  • [FIX] Class filter did nothing in the roster's "grouped by class" grid view — display_grid() called player::get_classes() with a hardcoded 0 for the class id instead of the actual selected class, so every class still got a heading regardless of the filter (armor-type filters were unaffected, since that branch doesn't depend on class id)
  • [CHG] Split the roster's combined class/armor-type filter into two independent dropdowns (class_filter and armor_filter) — the single merged filter pulldown (disambiguated server-side by checking which lookup array the value matched) was legacy EQDKP design and is what made the class-filter bug above possible in the first place
  • [FIX] Roster search field and filter button rendered oversized — the filter box reused phpBB's reserved search-box class, which every active style already sizes for the full header search widget; renamed to roster-search-box and given its own compact sizing, decoupled from any site-style search-box CSS
  • [FIX] Roster search field/button sat ~2px off from the layout/class/armor dropdowns — the site style sizes <select> and <button> on different box-sizing/line-height bases; every control in the filter row now gets the same explicit height/line-height/box-sizing so they line up regardless
  • [FIX] UCP "bbGuild" tab (character claim/add) was entirely hidden for admin accounts not also in REGISTERED — v200rc1 only granted ADMINISTRATORS/GLOBAL_MODERATORS the u_bbguild view-only floor, but the UCP modes require u_charclaim/u_charadd specifically; ADMINISTRATORS now also gets u_charclaim/u_charadd/u_chardelete/u_charupdate (GLOBAL_MODERATORS intentionally stays view-only)
  • [DOCS] README fixed: stale bbguild_<game> naming corrected to bbguild<game>, and the specialization system (#331) — previously undocumented — added to the feature list

2.0.0-rc1 24/07/2026

  • [FIX] SQL injection risk (#352): game_id interpolated unescaped into raw-concatenated queries across game.php and the rpg/{classes,races,roles,faction} models (~33 sites) — now consistently escaped via sql_escape(), matching the pattern already used correctly in a handful of sibling methods
  • [FIX] Follow-up hardening (#352): class_id/c_index, race_id, role_id/role_pkid, and faction_id cast to (int) at every remaining raw-concatenated SQL site in those same models — not previously exploitable (every caller already passed pre-cast ints) but fragile without the query itself being protected
  • [FIX] u_bbguild, u_charclaim, u_charadd, u_chardelete, u_charupdate defaulting to "No" for REGISTERED, ADMINISTRATORS, and GLOBAL_MODERATORS on installs that manage user permissions via direct per-group grants instead of the stock role templates — v200b3's role-based grant never reached them; now also granted directly, matching the pattern already used for GUESTS
  • [FIX] Fresh-install failure: bbguild_version was never created via config.add anywhere in the migration history (only ever updated), so a genuinely from-scratch install failed with CONFIG_NOT_EXIST during the v200b4 migration
  • [FIX] bb_language.language column (CHAR:2) too narrow for this project's own es_x_tu-style locale codes (used across recenttopics/bbaccounts/bbpoints) — widened to VCHAR:10; previously crashed bbguildwow's install outright with a hard SQL error, and would hit any game plugin shipping that locale
  • [FIX] PHP 8.2+ "creation of dynamic property" deprecation warnings on every player instantiation — ext_path/time/games are now declared properties instead of ad-hoc constructor assignments
  • [FIX] 9 raw $_GET reads in admin_games.php/acp/player_module.php replaced with $this->request->is_set(..., GET), consistent with every neighboring input check in those same methods
  • [FIX] @unlink() + @-suppressed file_exists() in delete_guild()'s emblem cleanup replaced with the phpBB filesystem service (exists()/remove()), preserving the existing best-effort semantics
  • [FIX] Claiming/unclaiming a character (#290) and the guild achievements pane (#278) confirmed already shipped in earlier b-releases; stale roadmap notes removed
  • [CHG] bbguild_version moved out of phpbb_config entirely into ext::BBGUILD_VERSION, a class constant (#353) — matches avatharbe/recenttopics's ext::RT_VERSION pattern; the ACP version-check panel and every migration's effectively_installed() now read from it (or a concrete per-migration artifact check) instead of a config row
  • [DOCS] Individual player page (#288) deferred to 2.1.0 as a portal-module conversion — the existing standalone page ships and works in rc1
  • [DOCS] Unit test coverage added for guild CRUD (update_guilddefault, get_guild, update_guild) and the character claim/unclaim flow (#244)
  • All 8 issues in the GitHub 2.0.0-rc1 milestone confirmed shipped: guild pane, achievements pane, player page, claiming/unclaiming, UCP language files, UCP bugfixes, roster portal grid view, game-plugin compatibility

2.0.0-b4 28/04/2026

  • [NEW] Specialization system (#331) — model, migration, and ACP/UCP integration
    • bb_specializations table with (spec_id, game_id, class_id, role_id, spec_name, spec_icon, spec_order) and a nullable player_spec_id FK on bb_players
    • specialization model with load/save/delete/get_for_class/get_translations
    • Specializations panel on the Edit Game page (add/edit/delete with class + role dropdowns)
    • Spec dropdown on ACP and UCP player edit forms, JS-filtered by selected class
    • Optional Spec column on the roster portal module (listing + grid views), hidden for games without specs, with per-locale display names overlaid from bb_language (attribute='spec')
    • Optional specialization_provider_interface (get_specializations(), get_spec_label()) for game plugins to declare their spec catalog without breaking the existing 9 plugin providers
    • install_specs() extension point on abstract_game_install; called during install/uninstall and guarded so older installs without bb_specializations are unaffected
  • [CHG] Repo and PHP namespaces dropped to no-separator form (bbguildwow, bbguildeq, …); composer name, dir name, PHP namespace, and GitHub repo all match. DB-stored config and cache keys (bbguild_<game>_version, bbguild_eqdkp_start, bbguild_wow_oauth_token_*, …) preserved with the original underscore form to avoid orphaning rows
  • [FIX] EPV CI green: event docblocks gain @since, acp_editguild_* events split into acp_editguild_* + acp_addguild_* to satisfy the unique-event-name rule, unserialize calls in model/admin/log.php replaced with json_decode
  • [FIX] avathar.bbguild.log service definition gained the missing @user constructor argument (latent bug since 547ec380; surfaced when the container rebuilt)
  • [FIX] tests/functional/.gitkeep so PHPUnit's functional test suite resolves on CI checkout
  • [DOCS] Test plan documents added under tests/ (epv / unit / functional / smoke / integration)

2.0.0-b3 15/03/2026

  • [NEW] Game edition field on guilds for WoW Classic support (#15) — edition dropdown in guild ACP, flows to child plugins via template events
  • [NEW] Auto-disable child game-plugin extensions when bbGuild core is disabled
  • [NEW] Block game deletion when guilds or players still reference it
  • [NEW] Player portraits displayed on roster
  • [NEW] Player detail page (#288) with character info, guild history, and armory link
  • [NEW] UCP character claim/unclaim (#290) — users can link forum accounts to guild characters
  • [NEW] UCP character editing with portrait and specialization fields
  • [NEW] Guild emblem stored in phpBB files/ directory instead of extension directory
  • [NEW] API sync log types for roster, specs, and portraits
  • [NEW] Template events for game plugins to inject achievement sync and edition controls
  • [FIX] Recruitment duplicate rows and cartesian product on frontend
  • [FIX] Guild disappearing after game change in ACP
  • [FIX] Emblem URL resolution in ACP guild and player views
  • [FIX] Image path resolution for game plugins
  • [FIX] UCP character edit: title, null portrait, image paths
  • [CHG] Roster name column uses class-color text instead of background
  • [CHG] Guild header emblem moved to left with flexbox layout
  • [CHG] Guest users granted u_bbguild permission to view guild pages
  • [CHG] Squashed all migrations into single v200b3 release migration

2.0.0-b2 08/03/2026

  • [NEW] Player detail page (#288) and UCP claim/unclaim (#290)
  • [NEW] Roster as portal module with grid/listing layout switcher
  • [NEW] Recruitment ACP integrated as tab in Edit Guild
  • [NEW] Portal ACP integrated as tab in Edit Guild
  • [CHG] Slimmed view_controller to 4 constructor args; guild_context as proper DI service
  • [CHG] ACP/UCP modules resolve table names from container parameters
  • [CHG] Removed dead code: viewwelcome, viewroster, viewnavigation, iviews, admin_player, model/blocks
  • [FIX] Multiple bug fixes (#336, #337, #341, #343, #344)

2.0.0-b1 05/03/2026

  • [NEW] Guild portal system — guild-scoped block engine with 3-column layout (top, center, right)
  • [NEW] Portal modules: Message of the Day, Roster, Recruitment
  • [NEW] Module plugin system via tagged services (bbguild.portal.module)
  • [NEW] Default layout template copied to new guilds
  • [NEW] Multi-guild dropdown in breadcrumb navbar
  • [CHG] Welcome page rewritten to use portal renderer
  • [CHG] Removed sidebar navigation — full-width layout
  • [CHG] Log system refactored from XML serialization to phpBB log pattern

2.0.0-a11 04/03/2026

  • [FIX] Multiple ACP and namespace fixes (#299, #301)
  • [CHG] Game plugin architecture — game support extracted into separate bbguild_<game> extensions
  • [CHG] Language cleanup — archived DKP keys, removed dead entries
  • [CHG] ACP UI — replaced radio button pairs with checkboxes

2.0.0-a10 02/03/2026

  • [FIX] phpBB 3.3 and PHP 8.x compatibility fixes
  • [CHG] Minimum requirements: PHP >= 7.4.0, phpBB >= 3.3.0

2.0.0-a5 27/03/2016

  • [NEW] Front page design updated to look like Blizzard Armory
  • [NEW] Default game setting

2.0.0-a4 13/03/2016

  • [NEW] Guild news page with Blizzard news feed data

2.0.0-a2 21/02/2016

  • [NEW] View controller with guild roster front page

2.0.0-a1

  • [NEW] Conversion from phpBB MOD to extension
  • [CHG] DKP no longer part of core