# Dragon Shout

## [1.1.0](https://github.com/Xerrion/DragonShout/tree/1.1.0) (2026-04-15)
[Full Changelog](https://github.com/Xerrion/DragonShout/commits/1.1.0) [Previous Releases](https://github.com/Xerrion/DragonShout/releases)

- chore(master): release 1.1.0 (#1)  
    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>  
- chore: add CurseForge and Wago project IDs to TOC  
- docs: add MIT license  
- docs: add logo to README header  
- feat: add per-type Solo/Group/Raid channel selection (#5) (#6)  
- fix: wrap long debug print lines to pass luacheck W631 (#4)  
- chore: add 400x400 logo and 64x64 TGA icon (#3)  
- chore: add issue templates, PR template, CODEOWNERS, FUNDING, and label/project docs (#2)  
- refactor: rename CCListener to AuraListener  
- feat: add debug suite, fix playerGUID nil bug, fix test throttle, update CC templates  
    - Fix ns.playerGUID always nil: register PLAYER\_LOGIN fallback in Lifecycle.Initialize  
    - Fix test buttons silently throttled: add noThrottle param to Announcer.Announce  
    - Add /ds debug toggle and enhanced /ds status with GUID, version, debug state  
    - Add Debug Settings section in Options (debug toggle, print status, clear throttle)  
    - Add Announcer.ClearThrottle() public API; wipe throttle via options or /ds clear  
    - Add debug traces throughout all listeners and announcer guard paths  
    - Update ccOnYou template defaults to per-type strings (Silenced/Stunned/etc.)  
    - Add schema migration v2 for ccOnYou template format upgrade  
    - Remove dead C\_ChatInfo.SendChatMessage branch (always fell through to SendChatMessage)  
    - Fix ApplyTemplate: nil tokens now emit empty string, not literal {token} in chat  
    - Fix AnnounceCustom: only fires when player is source or dest of the CC event  
- refactor: convert Options tabs to Section card layout  
    Replace flat header layout (W.CreateHeader + widgets directly in parent)  
    with Section card layout (W.CreateSection with widgets in section.content)  
    across all 7 DragonShout\_Options tabs.  
    - GeneralTab: Core Settings + Testing sections  
    - InterruptsTab: Interrupts section  
    - CCAppliedTab: CC Applied section  
    - CCOnYouTab: CC on You + CC Types + Per-Type Templates sections  
    - DispelsTab: Dispels section  
    - CustomSpellsTab: Custom Spells section  
    - ProfilesTab: Current Profile + Profile Actions sections  
    Also adds local ipairs = ipairs cache in CCOnYouTab, CustomSpellsTab,  
    and ProfilesTab; uses ipairs in RefreshProfileWidgets widget loop.  
- refactor: merge CC tables, remove AuraListener  
- feat: per-CC-type template overrides and custom spell token help text  
    - Add ccOnYou.typeTemplates sub-table (silence/polymorph/stun/disorient/fear/root) - empty string falls back to global template  
    - Announcer.Announce() accepts optional 4th ccType param; resolves typeTemplates[ccType] override when non-empty  
    - CCListener and AuraListener pass ccType to Announce for ccOnYou  
    - CCOnYouTab: new Per-Type Templates section with one TextInput per type  
    - CustomSpellsTab: token help description ({spell}, {target}, {source})  
- feat: add {type} and {duration} template tokens for CC announcements  
    - CCListener: add CC\_TYPE\_LABEL table (Silenced/Stunned/Polymorphed/etc.)  
      and GetPlayerCCDuration() helper (Retail via C\_UnitAuras, Classic via  
      UnitDebuff). Pass {type} and {duration} tokens in ccOnYou and ccApplied  
      announce calls. Fix ccOnYou/ccApplied/AnnounceCustom control flow: use  
      inverted conditions instead of bare returns so AnnounceCustom always runs.  
    - AuraListener: pass duration from addedAuras (Retail) and UnitDebuff pos5  
      (Classic) into AnnounceIfCC. Add {type} token via CC\_TYPE\_LABEL. Guard  
      durationStr against zero-duration auras (permanent silences).  
    - Config: update ccOnYou default template to include {type} and {duration}.  
    - enUS.lua: update template and tooltip locale keys; add Silenced/Stunned/  
      Polymorphed/Disoriented/Feared/Rooted locale strings for future UI use.  
    - CCOnYouTab: update template tooltip to list {spell}, {type}, {duration}.  
- chore: set ignore = dirty on all submodules  
- chore: initialize git submodules  
- fix: correct CLEU dispatching, AuraListener robustness, and options degradation  
    - Fix SPELL\_INTERRUPT/SPELL\_AURA\_APPLIED/SPELL\_DISPEL: remove shared  
      fixed-position destructure from CombatLogListener; each handler now  
      calls select(12, CombatLogGetCurrentEventInfo()) for its own suffix  
      fields. Fixes auraType=nil bug that silently disabled all CC detection  
      via CLEU  
    - Fix InterruptListener: SPELL\_INTERRUPT has no extraSpellName field;  
      resolve interrupted spell name from extraSpellId via GetSpellName()  
      helper (C\_Spell.GetSpellName on Retail, GetSpellInfo on Classic)  
    - Fix AuraListener Retail: handle updateInfo.isFullUpdate with full  
      debuff scan via C\_UnitAuras.GetAuraDataByIndex  
    - Fix AuraListener Classic: replace 0.5s debounce with absent-to-present  
      CC tracking via announcedCCs table; prevents re-announcing active CCs  
      on every UNIT\_AURA fire  
    - Fix Lifecycle: remove PLAYER\_LOGIN event registration that accumulated  
      handlers on every addon re-enable  
    - Fix Announcer: tonumber(entry.spellId) guards against string/number  
      mismatch in custom spell matching  
    - Fix DragonShout\_Options/Core.lua: replace error() with graceful print  
      and sentinel ns tables; use direct GetLocale for ns.L  
    - Initialize git submodules (Ace3, LibDataBroker-1.1, LibDBIcon-1.0, DragonWidgets)  
- feat: initial DragonShout addon scaffold  
    Full Ace3-based combat announcer addon.  
    - Interrupt, CC, dispel, and custom spell announcements  
    - Per-category channel selection and message templates  
    - Throttle per spell, minimap icon, slash commands  
    - LoadOnDemand options UI with DragonWidgets  
    - Supports Retail, MoP Classic, TBC Anniversary  
