Classic Calendar - Revived

Forking and maintaining the Classic Calendar addon for WoW Classic

File Details

ClassicCalendar-v1.6.0

  • R
  • Jul 4, 2026
  • 411.43 KB
  • 1.7K
  • 2.5.5+1
  • Classic + 1

File Name

ClassicCalendar-ClassicCalendar-v1.6.0.zip

Supported Versions

  • 2.5.5
  • 1.15.8

Classic Calendar

[v1.6.0] (2026-07-04)

New Features

  • Officer "Clear All" for world buffs (guild-wide start-fresh). An officer-only button in the World Buff window (and /calwbclear guild) wipes all world-buff data for the whole guild after a confirmation prompt. Implemented as a synced wipe epoch (WBWipeAt): the timestamp propagates like a setting (LWW), every member clears entries at/before it, and pre-wipe entries are rejected on sync (and skipped by migration) so cleared data can't resurrect from an offline peer. Location: WorldBuffDB.lua, WorldBuffSync.lua, WorldBuff.lua.
  • Sortable columns in the World Buff window. Click a column header (Player Name, Main Name, Date Received, Dropped) to sort by it; click again to reverse direction. The active column shows a sort-direction arrow (Interface\Calendar\MoreArrow — the same icon Blizzard's calendar and FastGuildInvite use), and each header has a hover tooltip. Headers are fixed above the scroll area rather than scrolling with the rows. Location: WorldBuff.lua.

Changed

  • Rebuilt world buff sync on the DeltaSync-1.0 library stack. Replaced the bespoke hash/session/delta protocol (WorldBuffHash.lua, WorldBuffDelta.lua, WorldBuffSession.lua, the old WorldBuffSync.lua, and the dead DataSync.lua) with a thin DeltaSync bridge routed through AceCommQueue-1.0 (throttled sends) and LibGuildRoster-1.0 (identity/trust). New hard dependencies: DeltaSync, AceCommQueue-1.0, GuildRoster.
    • Each of the 4 buff tables plus a guild-settings record is one DeltaSync "item" (wb:rend|hakkar|onyxia|nefarian, wb:settings); entries reconcile per-entry via last-writer-wins on lastModified. Uses the multi-host DS:NewHost API (DeltaSync MINOR 15+) under an isolated AceAddon shell (ClassicCalendarSync) so it can't clobber other DeltaSync consumers on the same client.
  • World buff storage is now account-wide, keyed by guild (ClassicCalendarWBDB), replacing the four per-character positional arrays. Entries are stored as [normalizedPlayerKey] = entry maps (LibGuildRoster-normalized keys) instead of index arrays, eliminating duplicate rows and index/name drift. A one-time migration folds each character's legacy WorldBuff*Data into the guild store on first login. Location: WorldBuffDB.lua.
  • Ship explicit per-flavor TOCs instead of packager-generated multi-version. ClassicCalendar.toc is now Classic Era only (## Interface: 11508); a new ClassicCalendar_BCC.toc carries BCC (## Interface: 20505). .pkgmeta enable-toc-creation is now no. Multi-## Interface-* single TOCs proved unreliable to load on live installs; matches the per-flavor convention used by GuildRoster / FastGuildInvite. Both TOCs must keep the same file load list.

Bug Fixes

  • Fixed dropped status never propagating. The field was written as the string "Yes"/"No" but hashed as tostring(entry.dropped == true), so it always hashed as "false" — toggling it never changed the sync hash. dropped is now a canonical boolean everywhere. Location: WorldBuff.lua, WorldBuffDB.lua.
  • Fixed guild event creation being blocked while the GM is offline. The RestrictGuildEventsToOfficers gate now fails open — members can create guild events unless an officer has explicitly enabled the restriction. The setting rides the DeltaSync relay, so any guildmate holding it can serve it (previously only the setter could answer a request). Location: ClassicCalendar.lua, WorldBuff.lua.
  • Fixed unthrottled comms. World buff messages now route through AceCommQueue-1.0, preventing ChatThrottleLib chunk interleaving / CRC corruption under guild load.

Hardening

  • Deterministic convergence tie-break. Version vectors now carry a content checksum alongside the timestamp, so two edits to the same entry (or setting) in the same second resolve to the same winner on every peer instead of offering forever. The guild-settings hash also excludes setBy (not reconciled by the LWW merge) to avoid the same no-op-resync trap. Location: WorldBuffSync.lua, WorldBuffDB.lua.
  • Anti-grief wipe epoch. A wipe epoch more than a day in the future is rejected, so a modified client can't clear everyone's data and block new entries indefinitely. Migration and the receive path both honor the epoch, so cleared data can't resurrect from an offline peer. Location: WorldBuffDB.lua.
  • World Buff window: frame pooling, key case-folding, roster-load refresh. Table rows are pooled/reused instead of leaking a frame per row on every render/sort/sync; normalized player keys are case-folded so bob/Bob dedupe to one entry; the window refreshes once the guild roster loads so it isn't stuck empty when opened at login. Location: WorldBuff.lua, WorldBuffDB.lua, WorldBuffSync.lua.
  • Guildless edits are rejected with a message instead of silently dropped (world buffs are guild-scoped). Location: WorldBuff.lua.

Removed

  • DataSync.lua, WorldBuffHash.lua, WorldBuffDelta.lua, WorldBuffSession.lua, and the bespoke WorldBuffSync.lua protocol. The XOR-obfuscated CC-SET guild-settings channel is retired in favour of the wb:settings DeltaSync item.

[v1.5.4] (2026-05-05)

Bug Fixes

  • Fixed ZG (Zul'Gurub) and AQ20 (Ruins of Ahn'Qiraj) 3-day lockout schedule
    • Adjusted first reset from January 1 to January 3, 2026
    • Now correctly displays resets on May 3, 6, 9, 12, 15, etc. (matching official schedule)
    • Previously showed incorrect dates: May 1, 4, 7, 10, 13

[v1.5.2] (2026-05-03)

New Features

  • Added "Hide the calendar minimap button" checkbox to General settings in the Options panel
    • Saves and restores across sessions via CCConfig.HideMinimapButton
    • Uses LibDBIcon:Hide/Show to toggle the icon
    • Calendar remains accessible via /cal or /calendar when hidden

[v1.5.1] (2026-04-13)

Bug Fixes

  • Fixed delete event confirmation popup covering half the screen (BUG-024)
    • Replaced oversized StaticPopupDialogs["CALENDAR_DELETE_EVENT"] with a compact custom frame (320×115 px)
    • Supports Escape to cancel, Enter to confirm, and standard OK/Cancel buttons
    • CalendarFrame_PushModal/PopModal preserved via OnShow/OnHide
  • Fixed SetBackdrop nil error on delete confirmation frame
    • Added "BackdropTemplate" inheritance to CalendarDeleteConfirmFrame
    • Same fix applied pre-emptively to CalendarGuildRankConfirmPopup in GuildRankConfirm.lua

[v1.5.0] (2026-04-13)

New Features

  • Invite list right-click menu now shows RSVP options (Confirmed, Standby) directly in the context menu — previously displayed behind a blank flyout arrow
  • Right-click RSVP menu restricted to event creator/moderator only (EventCanEdit()) — non-creators use the existing top RSVP buttons
  • Removed redundant myInviteIndex player scan from CalendarViewEventInviteListScrollFrame_Update

Bug Fixes

  • Fixed invite list #, Rank, and Level sort buttons firing both their own handler and the inherited template handler on each click — added inherit="false" to <OnClick> in ClassicCalendarTemplates.xml
  • Fixed custom sort columns cycling through a redundant third "clear" state — now toggles between ascending and descending only, matching native sort button behavior
  • Fixed Status column header rendering lower than all other column headers — was anchored to inviteList.ScrollBox instead of inviteList

Internal

  • Fixed undefined globals in GuildRankConfirm.lua: GameTooltip_Hide, DONE, CALENDAR_CREATEEVENTFRAME_DEFAULT_TITLE, CalendarGuildRankConfigButton
  • Added nil guard for popup in PopulateAndShowPopup
  • Fixed tabFocusGroup:OnTabPressed nil safety in ClassicCalendar.lua
  • Used _G[] lookup for CalendarCreateEventDivider to resolve linter undefined global

[v1.4.4] (2026-04-10)

Bug Fixes

  • Fixed art type checkbox labels not showing for non-English locales (BUG-023)
    • checkLocale() now iterates over enUS keys so keys absent from other locale tables correctly fall back to English
    • All 9 newly-added art type checkbox labels now display properly regardless of client language

[v1.4.3] (2026-04-04)

Bug Fixes

  • Removed all leftover debug print statements from click handlers and Today View
    • Cleaned up remaining print() calls that were not gated behind ClassicCalendar.debug

[v1.4.2] (2026-04-04)

Bug Fixes

  • Removed leftover debug print from LibDBIcon OnClick handler

[v1.4.1] (2026-03-30)

New Features

  • Calendar frame position now persists across /reload and sessions
    • CalendarFrame saves and restores its position via CCConfig.calendarFramePos
    • Removed hardcoded XML anchor; default position now set in Lua on first load
    • Frame marked movable with clampedToScreen to keep it on screen
  • Today View frame position now persists across /reload and sessions
    • OnDragStop saves position to CCConfig.todayViewPos; restored on PLAYER_LOGIN

[v1.4.0] (2026-03-30)

New Features

  • Today's Events panel — new Today View window showing all events for the current (or navigated) day
    • Holiday banner art displayed matching the main calendar — BORDER texture for non-ONGOING, ARTWORK banner for ONGOING events
    • Prev/Next day arrow navigation buttons in the title strip to move between days without closing the panel
    • Filter dropdown for event category visibility
    • Right-click an event button to open the full context menu (Create Personal Event, Create Guild Event, and event-specific options)
    • Right-click empty content area to open the day-level create menu
  • Consistent gradient background on every calendar day cell
    • EventBackgroundTexture now always rendered on all cells, including holiday-only and empty cells, eliminating the inconsistent look where some cells lacked the gradient
    • CalendarEventBackground added as a permanent overlay in Today View to match the main calendar aesthetic

[v1.3.1] (2026-03-30)

Bug Fixes

  • Fixed debug messages bleeding through without /caldebug enabled (BUG-021)
    • Wrapped all sync and diagnostic print statements behind ClassicCalendar.debug check
    • Affected files: CalendarHelper.lua, WorldBuffSession.lua, WorldBuffSync.lua, WorldBuffHash.lua, WorldBuffDelta.lua
    • User-facing error messages remain visible by default
  • Fixed calendar day cells remaining highlighted after mouse leaves event buttons (BUG-022)
    • Added missing UnlockHighlight() calls to event button OnLeave handlers
    • Prevents visual clutter from accumulated stuck highlights

[v1.3.0] (2026-03-27)

New Features

  • Officer-controlled guild event creation restriction via Options > Officer Settings
  • General tab now shows "Valid Hash" and "Event Creation" status (Yes / No / Unknown)
  • "Create Guild Event" context menu entry hidden for non-officers when restriction is active
  • Right-click minimap button or calendar button to toggle the Options panel directly to the General tab
  • Left and right clicks on calendar/minimap buttons now both toggle open/closed

Bug Fixes

  • Fixed multi-day holiday banner art only displaying on the final day of an event (BUG-008)
    • ShouldDisplayEventOnCalendar now returns true for ONGOING sequence days when displayBanner=true
  • Fixed Love is in the Air and Winter's Veil textures returning nil due to incorrect texture path casing (BUG-008)
  • Added individual on/off toggles for all 11 holiday banner art types in Options > Art (BUG-008)
    • All checkboxes persist through /reload; Fireworks Spectacular only appears in Season of Discovery
  • Added Winter's Veil 2026–2027 calendar entry (BUG-008)
  • Fixed Fishing Extravaganza starting on Monday instead of Sunday (BUG-008)
  • Removed duplicate Noblegarden entry causing date overlap (BUG-008)
  • Optimized version detection — isClassicEra and isSoD are now cached globally at load time (BUG-008)

[v1.2.2] (2026-03-26)

Bug Fixes

  • Fixed string vs number comparison error in officer rank checking (BUG-005)
    • Added tonumber() conversion before all rank comparisons; GetGuildInfo returns rank as a string, not a number
    • Affected: ClassicCalendar_Options.lua, WorldBuff.lua, WorldBuffSync.lua, ClassicCalendar.lua, DataSync.lua
  • Fixed FontString OnUpdate script error spamming the UI error log (BUG-006)
    • FontStrings do not support OnUpdate; replaced with invisible Frame intermediaries that update the FontStrings
    • Eliminates 21+ repeated errors when opening the Options panel
  • Fixed incorrect GetGuildInfo return index causing all officer checks to fail (BUG-007)
    • Changed select(2, GetGuildInfo(...))select(3, ...) to retrieve the numeric rank index instead of the rank name string
    • Guild Master and officers can now broadcast guild settings correctly

[v1.2.1] (2026-03-16)

Bug Fixes

  • Fixed debug mode status display in /calwbsync
  • Fixed integer overflow in FNV-1a hash computation (BUG-004)
  • Persist debug mode state across /reload
  • Improved debug diagnostics output for WorldBuff sync

[v1.2.0] (2026-03-16)

New Features

  • Added /calwbsync command for manual WorldBuff sync trigger
  • Enabled WorldBuffSync debug messages via /caldebug

Bug Fixes

  • Added nil checks for ClassicCalendar.debug across all WorldBuff modules
  • Fixed function argument count and type issues in sync modules

[v1.1.12] (2026-03-16)

Changes

  • Complete WorldBuff Sync rewrite with delta-sync P2P system (Protocol v4)
  • 96% traffic reduction via hash-based pull protocol
  • Session management: limits concurrent syncs (3 inbound / 3 outbound)
  • Self-healing mesh via periodic heartbeat for eventual consistency
  • Fixed critical DataSync issues and improved sync reliability

New Files

  • WorldBuffHash.lua - FNV-1a hash computation and tracking
  • WorldBuffDelta.lua - Delta computation and application
  • WorldBuffSession.lua - P2P session manager
  • WorldBuffSync.lua - Protocol coordinator and message router

Breaking Changes

  • No backward compatibility with v1.1.x clients (protocol v3)
  • All guild members must upgrade for sync to function

[v1.1.11] (2026-02-26)

Bug Fixes

  • Fixed deletedDate/deletedTime field inconsistency causing garbage collection failure in DataSync
  • Fixed direct table reference bleeding in SendGuildSync() — now creates shallow copies before sending
  • Implemented separate communication prefixes per buff table (CCWB_RH, CCWB_HH, CCWB_OH, CCWB_NH) for complete isolation
  • Added 5-minute cooldown on GUILD_ROSTER_UPDATE to prevent spam (~90% network traffic reduction)
  • Added prefix-to-buffType validation layer
  • Rejected wipe commands when guild roster not yet loaded (closes exploit window)
  • Skipped processing own addon messages to prevent double-processing by officers
  • Bumped sync protocol to v3 (backward compatible with v2)
  • Moved BUG_TRACKER.md, FEATURE_TRACKER.md, developer_log.md to docs/ folder

[v1.1.10] (2026-02-01)

Changes

  • Moved world buff data to per-character SavedVariables to prevent data bleed between characters

[v1.1.9] (2026-01-27)

Changes

  • Added Darkmoon Faire schedule for 2026

[v1.1.8] (2026-01-22)

Changes

  • Guild Leader is now the authoritative source of truth for World Buff scheduler data
  • Prevents data corruption from non-GM characters overwriting GM data

[v1.1.7] (2026-01-22)

Changes

  • Updated .pkgmeta to exclude development documentation (BUG_TRACKER.md, FEATURE_TRACKER.md, developer_log.md) from CurseForge release packages

[v1.1.6] (2026-01-22)

Bug Fixes

  • Fixed BUG-002: World Buff data corruption — deep copy and table separation to prevent cross-contamination

[v1.1.5] (2025-11-20)

Bug Fixes

  • Fixed BUG-001: Intermittent BG event display issue

[v1.1.4] (2026-01-19)

Changes

  • Updated holiday dates

[v1.1.3] (2025-12-04)

Changes

  • Updated .pkgmeta to include calendar-helper dependency

[v1.1.2] (2025-12-03)

Changes

  • WB sync now only accepts data newer than the last wipe timestamp
  • Improved wipe function reliability

[v1.1.1] (2025-11-25)

Changes

  • Added function to wipe corrupted world buff data
  • Split WB sync into 4 separate messages per buff type to stop cross-table data contamination

[v1.1.0] (2025-11-19)

New Features

  • Added CalendarHelper as a dependency for Discord Raid Helper event import

[v1.0.0] (2025-10-01)

New Features

  • Added duplicate event detection to prevent creating duplicate raid events from CalendarHelper data
  • CalendarHelper integration stable

[v0.9.6] (2025-10-30)

Changes

  • Updated world buff event creation logic

[v0.9.5] (2025-10-26)

Changes

  • Updated world buff data table logic

[v0.9.4] (2025-10-25)

Bug Fixes

  • Fixed Lua errors in ClassicCalendar.xml

[v0.9.3] (2025-10-25)

Changes

  • Hid debug print statements behind debug flags

[v0.9.2] (2025-10-25)

Bug Fixes

  • Fixed bug in hide/show filters for world buff events

[v0.9.1] (2025-10-25)

Changes

  • Updated display logic and spacing for player names in the world buff window

[v0.9.0] (2025-10-24)

Changes

  • All world buff window buttons now match the calendar button style

[v0.8.8] (2025-09-28)

Changes

  • Removed Brewfest (not present in Classic Era)

[v0.8.6] (2025-09-18)

Changes

  • Updated December Darkmoon Faire schedule

[v0.8.5] (2025-09-18)

Changes

  • Hard-coded Darkmoon Faire event dates

[v0.8.4] (2025-09-17)

Changes

  • Added /caldebug debug slash command

[v0.8.3] (2025-09-17)

Changes

  • Updated calendar to display a full year of events

[v0.8.2] (2025-09-15)

Changes

  • Removed unused textures
  • Miscellaneous bug fixes

[v0.8.1] (2025-09-14)

Changes

  • Added deployment automation
  • Added minimap button

v0.7.0beta (2024-09-26)

Full Changelog Previous Releases

  • Fix bugs introduced by 1.15.4