GreenWall-v1.13.5
What's new
Change Log
This project uses Semantic Versioning.
[v1.13.5] (2026-08-05) - Offline test suite, and the ten defects it found
Bug Fixes
- The Interface Options "Defaults" button raised a Lua error and, had it not, would have done nothing. Interface.lua:GreenWallInterfaceFrame_SetDefaults calls
gw.settings:reset()with no arguments, butGwSettings:reset(svtable, meta)required the settings table and indexed it immediately — so the first key it looked at raisedattempt to index local 'svtable' (a nil value). Underneath that was a second defect that would have surfaced the moment the first was fixed: the body only assigned a defaultif svtable[k] == nil or self:validate(k, svtable[k]), i.e. only for keys that were absent or invalid. That guard is correct ininitialize(), which fills gaps, and was copied intoreset(), whose whole job is to overwrite values that are present and valid — making it a no-op on any real settings store. Now defaultssvtableto the store for the current mode and assigns unconditionally, stampingupdated. Location: Settings.lua:reset. - Third-party addons that registered an API handler with
'*'never received a single message. API.md documents'*'as "messages from all addons will be handled", butgw.APIDispatchertestedaddon == e[2] or addon == '*'— asking whether the sending addon was literally named'*'rather than whether the registration was the wildcard. BothGreenWallAPI.SendMessageandAddMessageHandlerassertaddon == C_AddOns.GetAddOnInfo(addon), so no real sender can ever be named'*'and that clause was dead: every wildcard handler was registered, sorted, and never called. Now testse[2] == '*'. Location: API.lua:APIDispatcher. - A single mistyped version line in the Guild Information panel aborted the entire configuration parse for every member of the confederation. The
GW:v:andGW:o:mv=handlers gated onstrmatch(field[2], '^%d+%.%d+%.%d+%w*$'), which is looser than the vendored semantic-version parser accepts — that parser requires a-before a pre-release suffix. SoGW:v:1.2.3betapassed the regex,semver()returned nothing at all, andtostring()with no argument raised, unwinding out ofGwConfig:load()before the channel, peer and officer directives on the following lines were ever read. Validation is now done by parsing rather than by regex: an unparseable version is logged and skipped, and the rest of the page still loads. Location: Config.lua:load. GwConfig:is_container()raised on every call. It opened withif guild == self:GetGuildName(), butGwConfighas no such method — the helper isgw.GetGuildName()— so any call died withattempt to call method 'GetGuildName' (a nil value). Fixed, and the guild-tag test tightened to reject the empty string as well as nil, so a confederation whoseGW:p:list omits the local guild is correctly reported as not configured rather than claiming membership on an empty tag. Location: Config.lua:is_container.- The bridge channel was never hidden from the chat windows, and the code that tried would have raised if it had ever matched. Channel.lua:join scanned
GetChatWindowMessages(i)looking for the bridge channel's name, but that API returns message group names (GUILD,SAY,SYSTEM) — the channel list is the separateGetChatWindowChannels(i), and Blizzard reads the two intoRegisterForMessagesandRegisterForChannelsrespectively. A group name can never equal a channel name, so the loop matched nothing and the hide step silently did nothing. Inside it,ChatFrame_RemoveChannel(frame, self.name)passed the frame's name string; since patch 1.15.9 that global is only a deprecation alias forChatFrameMixin.RemoveChannel, which takes the frame asself, so a match would have raised onpairs(self.channelList). This is the fourth site broken by the same 1.15.9 refactor (after v1.13.2, v1.13.3 and v1.13.4) and the only one not reported by a player. Now scans the channel list with the correct stride and passes the frame object, overNUM_CHAT_WINDOWSrather than a hard-coded 10. Location: Channel.lua:join. - Hold-down timers could stop firing silently, and leaked a frame on every start.
GwHoldDown:startcreated itsOnUpdateframe into a bare local that went out of scope the moment the method returned; nothing else referenced it, because the handler takesframeas a parameter rather than capturing it. Whether the timer survived therefore depended entirely on the client never reclaiming the frame — and when it does not fire there is no error, the callback simply never runs. Sincerefresh_channelsrestarts these timers for the whole session, the flip side was that every start created a new frame that is never released. The frame is now created once, kept on the instance, and reused. Found by the new suite, which fails deterministically under the coverage runner and passes without it. Location: HoldDown.lua:start. /gw logsize lots(and any non-numeric value for a numeric setting) threw a Lua error instead of printing the message explaining the mistake.gw.Error('%s setting must be numeric: %s', key)supplies two format specifiers and one argument, sostring.formatraised before the message could be written. Location: GreenWall.lua:GwSettingCmd.- Three defects in the vendored semantic-version library, all in the pre-release comparison layer that had never executed offline. Found once the vendored
Lib/files were brought under test. (1) A version carrying build metadata but no pre-release was rejected outright — the suffix pattern required a leading-, so1.0.0+20130313144700, which semver 2.0.0 section 10 explicitly permits, parsed to nothing and aGW:v:line using it was silently discarded. (2) The comparison was not antisymmetric: an alphanumeric-versus-numeric identifier returned "less than" in both directions, so1.0.0-alpha < 1.0.0-1and1.0.0-1 < 1.0.0-alphawere both true and any ordering built on it depended on argument order. (3) A shorter pre-release outranked a longer one — running out of fields on the left returned "greater than", making1.0.0-alpharank above1.0.0-alpha.1, the reverse of the specification's own worked example. The library is GreenWall's own (Copyright 2010-2020 Mark Rogaski) and its output never crosses the wire — the minimum-version check is evaluated independently by each client — so fixing it changes no peer-visible behaviour.VERSION_MINORis bumped from 1 to 2, and that bump is load-bearing rather than bookkeeping:LibStub:NewLibraryreturns nil whenoldminor >= minor, so at an unchanged minor this corrected copy would lose to any other addon vendoring the same very genericSemanticVersion-1.0major that happened to load first — the fixes would ship and never execute. At minor 2 GreenWall's copy upgrades an older one in place, on the same table, so references captured by whoever registered first pick up the corrected behaviour. Location: Lib/SemanticVersion.lua.
Changes
gw.IsOfficer()no longer takes a target. Its documentedtargetparameter had been silently ignored since the rank lookup was replaced by the GM-officer-note check (a workaround for 7.3.0 makingGuildControlSetRank()protected). The rank-based helper it left behind was unreachable dead code and has been removed, along with the parameter — a signature that advertises a contract it does not honour is worse than none, and no caller passed one. Location: Utility.lua:IsOfficer.
Repo Tooling
- Added an offline test suite: 427 examples, 100% line coverage across all 13 addon files and the three vendored libraries GreenWall owns. Built on the shared WoWAPITesting harness, carried as a git submodule at
Tests/wowapi. It needs nothing but a Lua 5.1 interpreter — no LuaRocks, no busted, no C modules — and runs in well under a second:lua Tests/wowapi/run.luafrom the addon root, withlua Tests/wowapi/coverage.lua <files>gating coverage at 100%. Every one of the defects above was found by writing the spec for how the code should behave and then reading the failure. Nothing here ships:Testsis ignored by the packager. - Removed the previous
tests/suite. The luaunit-based cases, the vendoredluaunit.lua,MockAPI.lua,Loader.luaandrun-tests.ps1are gone, their coverage folded into the new specs. That suite needed thebitlibC module (and therefore a C toolchain) to run at all; the harness suppliesbitin pure Lua. The upstream PR branches (pr/era-fixes-testsand friends, cut fromupstream-*) keep their own copy and are unaffected. - Fixed
.pkgmeta, which was shipping the entire development tree to players. Every folder entry carried a trailing slash (docs/,tests/) and the script globs used**/(**/*.ps1). The BigWigs packager trims a trailing/*and not a bare/, sodocs/becamedocs//*and matched nothing; itscase-based glob matching has no recursive**, so those globs never matched either. Both folders and both script globs were therefore being packaged. Rewritten to bare folder names and single-star repo-relative globs, with the no-op dot-entries dropped — the packager prunes those unconditionally. - Raised eight harness contracts and adopted the answers.
Tests/HARNESS_CONTRACT.mdrecords what GreenWall needed that the harness did not model: the chat-window subscription queries, the chat frames and their edit boxes, a steerabletime(), the four missingERR_GUILD_*strings,C_GuildInfo.GetInfoText,GetChannelDisplayInfo/GetChannelList,getglobal, andC_AddOns.GetAddOnInfo/IsAddOnLoaded. All eight were delivered upstream and the local stand-ins deleted; the submodule is pinned at65de3af. - Added the
.bustedshim, taught.luarc.jsonthe spec globals, and normalised the test directory toTests— it had been tracked as lowercasetests, which the case-sensitive Linux packager would not have matched against the.pkgmetaentry.
Notes
- No behaviour visible to players changed except the fixes above; the TOC, wire protocol and configuration grammar are untouched.
Lib/is now under test too, with one deliberate exception and one structural limit.Lib/LibStub.luais the canonical public-domain stub and GreenWall's copy correctly stands down in favour of whichever identical copy registered first, so almost none of it is reachable in a suite — that is the file working as designed, not a gap.Lib/SemanticVersion.luasits at 98.86%: the single remaining line is acmp(nil, nil)guard that cannot be reached, since the loop that calls it never runs past the longer operand. Left in place rather than deleted to keep the diff minimal for the upstream offer.Lib/Base64BCA.luais deliberately not changed. Its output is the only vendored library's that crosses the wire (a sender encodes an API payload and a peer decodes it), so a behavioural change there would break interop between GreenWall versions across a confederation. It is now covered at 100% and round-trips every byte value, so the encoding is pinned rather than merely assumed.
[v1.13.4] (2026-07-22) - Restore inbound bridging after the 1.15.9 chat-frame refactor
Bug Fixes
- Co-guild messages stopped displaying on the stock UI after patch 1.15.9, throwing
Chat.lua:110: attempt to call a nil valueon every inbound message. The same chat-frame refactor that broke outbound bridging in v1.13.3 also removed the globalChatFrame_MessageEventHandleroutright — it is now a method on each chat frame (ChatFrameMixin:MessageEventHandler), with no deprecation-fallback shim. GreenWall bound that global once at load in Compat.lua and uses it in Chat.lua:ReplicateMessage to inject received peer messages into the chat windows, so on the default UI it capturedniland every decoded peer message errored instead of displaying. Inbound receipt and decoding still worked (the debug log showedopcode=Csegments arriving from peers) — only the final display call failed. This is why the breakage looked partial in the field: GreenWall overrides that same binding with ElvUI's and Prat's own handlers (Compat.lua), which still exist, so ElvUI/Prat users' inbound kept working while stock-UI users saw nothing (matching the reported "only some people can see messages" pattern). Now feature-detects: uses the globalChatFrame_MessageEventHandlerwhere it still exists, otherwise adapts to the frame method (frame:MessageEventHandler(...)); the ElvUI/Prat overrides are untouched. Location: Compat.lua.
Notes
- This completes the trio of WoW 1.15.9 (interface 11509) breakages, all stemming from the same client refactor of the chat frame and add-on APIs: v1.13.2 fixed the
GetAddOnInfologin crash, v1.13.3 fixed outbound/gand/obridging (the deadChatEdit_ParseTexthook), and this fixes inbound display of co-guild messages on the stock UI.
[v1.13.3] (2026-07-22) - Restore outbound bridging after the 1.15.9 chat-frame refactor
Bug Fixes
- Guild and officer chat stopped bridging outbound after WoW patch 1.15.9 — messages reached local guild chat but were never sent to co-guilds. 1.15.9 (interface 11509) rebuilt the chat edit box into the mixin-based
Blizzard_ChatFrameBasesystem. GreenWall forwarded your outgoing/gand/omessages to the bridge viahooksecurefunc("ChatEdit_ParseText", ...), but in the new system the globalChatEdit_ParseTextis only a deprecation-fallback alias (ChatEdit_ParseText = ChatFrameEditBoxMixin.ParseText) — the client now calls the edit box's ownParseTextmethod, so the hook on the global never fired. The addon still loaded and the bridge channel still connected (inbound worked), which is why/gw statusshowedconnected=truewhile nothing you typed ever crossed; adebug 5capture confirmed thetype=GUILD, message=...hook line was absent on send. Verified against the 1.15.9 UI source that the newChatFrameEditBoxBaseMixin:ParseText(send, ...)still exposesGetAttribute("chatType")and the stripped message viaGetText(), so GreenWall's handler body is unchanged — only the hook target was wrong. Now hooks each chat edit box instance'sParseTextmethod where the mixin exists (if ChatFrame1EditBox and ChatFrame1EditBox.ParseText then ... hooksecurefunc(editbox, 'ParseText', ...) ... end), and falls back to the legacy global hook on older clients — so every supported flavor keeps working. This same refactor already shipped on Retail (11.0) and Mists Classic, where the global hook was likewise dead. Location: GreenWall.lua.
Changes
- Bumped the Classic Era TOC to interface 11509 for WoW 1.15.9. Only GreenWall.toc (Era) changed; the other five per-flavor TOCs keep their own interface versions. Location: GreenWall.toc.
Notes
- This is the second half of the 1.15.9 breakage. v1.13.2 fixed the
GetAddOnInfologin crash that the same patch introduced; this release fixes the separate, quieter outbound-bridging regression from the chat-frame refactor. Inbound replication (peer messages arriving in your guild window) was unaffected — it flows throughCHAT_MSG_CHANNEL/ChatFrame_MessageEventHandler, not the edit-box hook.
Repo Tooling
- Added
ChatFrame1EditBoxto the .luarc.json known-globals list so the new feature-detect reads clean under the Lua language server.
[v1.13.2] (2026-07-22) - Fix GetAddOnInfo nil-call crash and migrate deprecated chat/guild globals
Bug Fixes
GreenWallAPIcrashed withattempt to call a nil valuewhenever a third-party addon touched the API — a WoW client update removed the loose globalGetAddOnInfo, which now exists only asC_AddOns.GetAddOnInfo(confirmed in the generatedAddOnsDocumentationunderNamespace = "C_AddOns", with no deprecation-fallback shim, so the bare global is simplynil). Unlike the softer guild/chat deprecations below, this one is a hard removal: any caller reachingGreenWallAPI.SendMessage/AddMessageHandler/ClearMessageHandlersfor a non-'*'addon id hitassert(addon == GetAddOnInfo(addon))and threw immediately — observed in the wild asVersionCheck-1.0callingAddMessageHandlerat login. The rest of the addon had already migrated to theC_AddOnsnamespace in v1.12.0 (Globals.lua, Compat.lua); API.lua was the one file missed. Replaced all three call sites withC_AddOns.GetAddOnInfo. Location: API.lua.
Changes
- Proactively migrated two now-deprecated globals off the client deprecation-fallback path. The same client update that removed
GetAddOnInfoalso demotedGetGuildInfoTextandSendChatMessageto deprecated shims that live inBlizzard_DeprecatedGuildScript/Blizzard_DeprecatedChatInfo— they are now thin aliases forC_GuildInfo.GetInfoTextandC_ChatInfo.SendChatMessage, load only when theloadDeprecationFallbacksCVar is set, and are documented in-client as "will be removed in the future." GreenWall still worked because that CVar defaults on, but the fork should not depend on a fallback that can be switched off or dropped in a later patch. Migrated both using the same feature-detect-with-fallback idiom v1.13.1 introduced forC_GuildInfo.GuildRoster:if C_GuildInfo and C_GuildInfo.GetInfoText then ... else GetGuildInfoText() endin Config.lua:load, andif C_ChatInfo and C_ChatInfo.SendChatMessage then ... else SendChatMessage(...) endin Channel.lua:tl_flush. The namespaced call is used wherever it exists (Era 1.15.x and every other current flavor) and the original global is preserved as the fallback, so no flavor regresses. The namespacedC_ChatInfo.SendChatMessageis the same restricted function as the global — this is a rename, not a taint/protection change — so the wire protocol and CRC-16 loopback accounting are unaffected. Locations: Config.lua, Channel.lua.
Notes
- Full audit of the addon's WoW API surface against the updated Classic Era docs. Every loose global the addon calls was cross-checked against the generated API docs, the
GlobalAPI.luaenumeration, and theBlizzard_Deprecated*shim files. Results:GetAddOnInfowas the only hard removal (fixed above);GetGuildInfoTextandSendChatMessagewere the only two deprecations (migrated above). Everything else the addon uses is still a first-class global with no namespaced-only replacement —GetChannelName,JoinTemporaryChannel,LeaveChannelByName,GetChannelList,GetChatWindowMessages(Channel.lua / Chat.lua / GreenWall.lua);GetGuildInfo,GetNumGuildMembers,GetGuildRosterInfo(Utility.lua);GetRealmName,UnitName,GetBuildInfo(Globals.lua / Utility.lua / SystemEventHandler.lua); andGetCVar(a real global defined inBlizzard_SharedXMLBase/CvarUtil.lua, GreenWall.lua). No further changes were required. - This supersedes the v1.13.0 note that listed
GetGuildInfoTextandSendChatMessageas "verified portable" loose globals — that was accurate when written, before Blizzard moved them behind the deprecation-fallback CVar.
Repo Tooling
- Added
TestConfigInfoTextregression coverage for the new guild-info-text source selection, mirroring the existingTestConfigReloadcases: verifiesGwConfig:load()prefersC_GuildInfo.GetInfoTextwhen present, and falls back to theGetGuildInfoTextglobal both whenC_GuildInfois absent and when the table exists but lacks the method. UpdatedTestAPI'ssetUpto stubC_AddOns.GetAddOnInfoinstead of the removed global. Full offline harness green (60 cases). Locations: tests/TestConfig.lua, tests/TestAPI.lua.
[v1.13.1] (2026-05-19) - Fix GuildRoster() nil-call crash on non-Era flavors
Bug Fixes
GuildRoster()crashed on TBC Classic / Wrath / Cata / Mists / Retail withattempt to call global 'GuildRoster' (a nil value)— v1.13.0 added per-flavor TOCs but did not audit the Lua source for API calls that were Era-only. Blizzard movedGuildRoster()into theC_GuildInfonamespace years ago (it remains as a loose global only on Classic Era 1.15.x); on every other flavor the global isnil, soGwConfig:reload()threw on the very first config load and the addon was unable to bootstrap its bridge configuration. Replaced the bareGuildRoster()call withif C_GuildInfo and C_GuildInfo.GuildRoster then C_GuildInfo.GuildRoster() else GuildRoster() end— modern API on flavors that have it, original global preserved for Era so existing 1.15.x users see no behavior change. Reported on TBC/Anniversary. Location: Config.lua:reload.
Repo Tooling
- Refreshed CLAUDE.md to match post-v1.12.0 / post-v1.13.0 reality. The "Changelog rules" section described the legacy
## X.Y.Z -- YYYY-MM-DD/### Fixedformat, but the project switched to the togpm format (## [vX.Y.Z] (YYYY-MM-DD) - Titleheaders with prose-rich### Bug Fixes/### New Features/### Changes/### Notes/### Lint Pass/### Repo Toolingsections) in v1.12.0; updated the rules to document the togpm format. Added a new TOC rules section: TOCs now use theGreenWall-v1.13.5packager substitution token (no manual## Version:bump), there is no## X-Date:line, and there are 6 flavor-specific TOC files to keep in sync — the previous CLAUDE.md still instructed bumping## Version:and## X-Date:in a single GreenWall.toc, neither of which exists anymore. - Fixed three pre-existing
markdownlinterrors in CLAUDE.md so the file lints clean under the project's .markdownlint.json config. (1) Saved-variables andGW:directive tables used the compact alignment-row style (|---|---|---|) while their data rows used padded pipes — mismatched style flagged asMD060/table-column-style. Normalized both alignment rows to padded style (| --- | --- | --- |). (2) TheGreenWallMetarow contained an unescaped|inside a code span (mode = 'account' | 'character') whichMD056/table-column-countparsed as an extra column separator. Escaped the pipe to\|. (3) The wire-segment example fence had no language hint — flagged asMD040/fenced-code-language. Tagged it astext.
[v1.13.0] (2026-04-30) - Multi-flavor support: per-flavor builds for Classic Era, BCC, Wrath, Cata, Mists, and Retail
GreenWall has been Classic-Era-only since the fork started, by virtue of a single-flavor TOC. The Lua source itself was already portable — every API the addon touches has been present on Retail and the intermediate Classic flavors for years. This release is the packaging change that lets the BigWigs packager produce a build per flavor from one source tree.
New Features
Per-flavor TOC files added. The CurseForge / BigWigs packager auto-detects flavor-suffixed TOCs and builds one zip per flavor on every tagged release. The unsuffixed GreenWall.toc remains the Classic Era 1.15.x build (Interface 11508). New siblings:
- GreenWall_TBC.toc — Burning Crusade Classic / Anniversary 2.5.x (Interface 20505)
- GreenWall_Wrath.toc — Wrath Classic 3.4.x (Interface 30405)
- GreenWall_Cata.toc — Cataclysm Classic 4.4.x (Interface 40402)
- GreenWall_Mists.toc — Mists Classic 5.5.x (Interface 50503)
- GreenWall_Mainline.toc — Retail 11.x (Interface 110207)
All TOC bodies are byte-for-byte identical except for
## Interface:and## X-Min-Interface:. The packager workflow at .github/workflows/release.yml is unchanged and picks them up automatically.
Notes
- No Lua source changes. Surfaces verified portable across all supported flavors:
Settings.RegisterCanvasLayoutCategory/Settings.RegisterAddOnCategory(GreenWall.lua),C_AddOns.GetAddOnMetadata(Globals.lua),C_AddOns.IsAddOnLoaded(Compat.lua),C_ChatInfo.RegisterAddonMessagePrefix(GreenWall.lua), the channel API surface (JoinTemporaryChannel,LeaveChannelByName,GetChannelName,GetChannelDisplayInfo,SendChatMessage/'CHANNEL',ChatFrame_RemoveChannel, Channel.lua/Utility.lua), the localizedERR_*constants used by SystemEventHandler.lua,GetGuildInfoTextand the rest of the guild-roster API used by Config.lua and Utility.lua, and thehooksecurefunc("ChatEdit_ParseText", ...)outbound hook in GreenWall.lua. Defensive compat shims (Settings.* or InterfaceOptions_AddCategory,C_AddOns or _G) were considered and skipped — there is no live flavor where any of these is absent. - Transport is unchanged and works on every flavor. The custom-chat-channel transport (
JoinTemporaryChannel+SendChatMessage(..., 'CHANNEL', ...)) carries across connected-realm clusters on every flavor of WoW. Guild membership is itself bounded to a cluster, so no cross-cluster transport rework was needed for Retail.
[v1.12.0] (2026-04-29) - First Pimptasty fork release: long-standing bug fixes, dead-code cleanup, modernized TOC
This is the first release of the Pimptasty fork. Mark Rogaski's original work covers releases 0.9.00 (2010-11-01) through 1.11.18 (2025-05-24); see LICENSE for full attribution.
Bug Fixes
Roster announcements duplicating for every co-guild member crossing the bridge channel —
GwHoldDownCache:holdhad an inverted comparison since v1.5.3 (2014-11-11):if self.cache[s] > t + self.interval then rv = trueis structurally never true (a stored timestamp can't be greater than a later timestamp plus an interval), so the comember-cache that was supposed to dedupe online/offline announcements always returnedfalse. Every member of every co-guild logging in produced two notifications: one from the naturalCHAT_MSG_SYSTEMevent (ERR_FRIEND_ONLINE_SS), and one generated by GreenWall'sCHAT_MSG_CHANNEL_JOINhandler. The cache's pruning logic was also broken:#self.cache > self.soft_maxalways evaluates 0 because the cache is hash-keyed by player name, andtable.remove(self.cache, k)is the wrong API for a string key. Replaced the comparison witht - self.cache[s] < self.interval, the length check with apairs()enumeration, and the deletion withself.cache[k] = nil. Location: HoldDown.lua:GwHoldDownCache:hold.Stale channels not cleared after Guild Information edits —
GwConfig:load()'s cleanup loop usedfor _, channel in ipairs(self.channel) dooverself.channel = { guild = ..., officer = ... }.ipairsonly iterates contiguous numeric keys starting at 1, so the loop body never ran. When officers edited Guild Information to remove a channel directive, the addon would keep transmitting on the now-orphaned channel until the player ran/gw resetor relogged. Switched topairs. Location: Config.lua:load.GreenWallAPI.RemoveMessageHandlerwas broken since the API was introduced in v1.7.0 — the function had three bugs in its 14 lines:rv = falsewas a leaked global; theif addon ~= '*' then addon = GetAddOnInfo(addon); assert(addon ~= nil) endblock referencedaddon, which is not a parameter of this function (it was copy-pasted fromClearMessageHandlers); andgw.api_table[i] = nilleft a hole that stopped subsequentipairswalks at the gap. Any third-party caller using the documented API hit undefined behavior on every call. Rewrote to match the documented contract and switched totable.remove. Location: API.lua:RemoveMessageHandler.gw.IsLegendaryleaked_andrarityglobals on every call —_, _, rarity = GetItemInfo(item)had nolocaldeclaration. Function was an orphan from the legendary-loot-replication feature removed in v1.11.0 (Blizzard madeSendChatMessagepartially protected in patch 8.2.5, killing the feature). Deletedgw.IsLegendaryandgw.GetItemString. Also deleted other v1.11.0 orphans missed at the time:GwPromoteSystemEventHandler(never dispatched by the factory), therankfield destructured fromGW_MTYPE_BROADCASTpayloads ingw.handlerGuildChat, and an unusedlocal semver = LibStub:GetLibrary(...)import. Locations: Utility.lua, SystemEventHandler.lua, Chat.lua.Invalid Lua 5.1 escape sequence in the
gw.Debugcall-stack parser — the pattern string'in function \`([%a_-]+)\''used a backslash followed by a backtick, which is not a valid escape sequence per the Lua 5.1 spec (only\a \b \f \n \r \t \v \\ \" \' \[ \] \xxxare recognized). WoW's interpreter accepted it (treating unknown escapes as the literal char), butlua-language-serverflagged it as an error-severity diagnostic. Replaced with a literal backtick — runtime behavior unchanged. Location: Utility.lua:gw.Debug.Malformed
'id=%, addon=%s, priority=%d'debug format string in twogw.Debugcalls in API.lua —%,is not a valid format specifier;string.formatwould error if the message was ever logged at debug level 4+ (GW_LOG_INFOfor theadd API handler/remove API handlermessages). Replaced with%s. Location: API.lua.GreenWallAPI.ClearMessageHandlersleft holes when removing multiple matching handlers —gw.api_table[i] = nilwhile iterating withipairscauses the iterator to stop at the first nil. If two handlers for the same addon were registered, only the first one would be cleared. Switched to reverse-iteration withtable.removeso deletions properly compact the array. Location: API.lua:ClearMessageHandlers.Redundant
self:initialize_param(true)argument inGwConfig:reset()— the method takes no parameters; thetruewas silently ignored. Cosmetic but flagged as aredundant-parameterwarning by lua-language-server. Location: Config.lua:reset.
Lint Pass
- Cleaned trailing whitespace, dead
localdeclarations, and unused loop variables (_substitution) across Config.lua, Utility.lua, Channel.lua, and Chat.lua. All Lua source files now lint clean under the bundled.luarc.jsonconfiguration.
Changes
- Updated TOC for WoW Classic 1.15.8 (Interface 11508).
- Modernized the TOC. Switched
## Versionto the CurseForge packager substitution tokenGreenWall-v1.13.5. Replaced legacy## X-Category: Guildwith the modern## Category: Guild. Added## X-Min-Interface: 11508,## OptionalDeps: ElvUI, Prat-3.0, Identity-2, Name2Chat, Incognito(one per chat-addon GreenWall has compat shims for in Compat.lua),## X-License: MIT, and## X-Curse-Project-ID. Dropped## DefaultState: enabled(default behavior anyway),## X-Date: 2025-05-24(CHANGELOG is the source of truth), and the two## URL:lines (now declared viaX-Curse-Project-IDand.pkgmeta). Location: GreenWall.toc. - Future changelog entries use the togpm format —
## [vX.Y.Z] (YYYY-MM-DD) - Short Titleheaders, prose-rich Bug Fixes / New Features / Changes / Improvements sections, root-cause + symptom + fix structure, file-link locations. Older entries (v1.11.18 and below) keep their original format.
Repo Tooling
- Filled in LICENSE. It was the unfilled MIT template (
Copyright (c) <year> <copyright holders>) since the project began. Mark Rogaski credited for 2010-2025 (releases 0.9.00 through 1.11.18); Pimptasty credited for 2026+ modifications. The MIT license body is unchanged. - Added CLAUDE.md — architectural guidance for working in the codebase: file load order,
GwChannel/GwConfig/GwSettingsclass roles, theGW:configuration-directive grammar, the hidden-channel wire protocol with CRC-16 loopback detection, the publicGreenWallAPIsurface, and the changelog/commit conventions used by this fork. - Added docs/curseforge_description.html — CurseForge listing copy, the source of truth for the project's listing page. Updated on every release alongside the changelog.
- Added repo configs: .pkgmeta (CurseForge packager), .luarc.json (lua-language-server config tuned to GreenWall's API surface), .markdownlint.json, .markdownlintignore.
- Author line in GreenWall.toc now reads
Mark Rogaski <stigg@aie-guild.org>, Pimptasty.
1.11.18 -- 2025-05-24
- Fixed TOC date.
1.11.17 -- 2025-05-24
- Fixed Lua errors. Vielen dank, Jan Heise.
- Updated TOC for WoW Classic 1.15.7.
1.11.16 -- 2024-11-10
- Fixed interface options registration for removal of InterfaceOptions_AddCategory.
1.11.15 -- 2024-10-24
- Updated TOC for WoW Classic 1.15.4.
1.11.14 -- 2024-08-13
Fixed
- Replaced deprecated GetAddOnMetadata and IsAddOnLoaded with C_AddOns namespaced functions.
1.11.13 -- 2024-07-31
Fixed
- Removed reference to undefined variable.
1.11.12 -- 2024-07-30
Fixed
- Fix for Greenwall settings not displaying in Options>AddOns Tab and the related 'InterfaceOptions_AddCategory' (a nil value) error.
Updated
- Updated the TOC for WoW 11.0.0.
1.11.11 -- 2023-11-11
Updated
- Updated the TOC for WoW 10.2.0.
1.11.10 -- 2023-05-06
Updated
- Updated the TOC for WoW 10.1.0.
1.11.9 -- 2023-02-17
Updated
- Updated the TOC for WoW 10.0.5.
1.11.8 -- 2022-10-26
Updated
- Updated the TOC for WoW 10.0.0.
Removed
- Removed an unsupported anchor positioning element.
1.11.7 -- 2022-06-20
Updated
- Updated the TOC for WoW 9.2.5.
1.11.6 -- 2021-09-03
Updated
- Updated the TOC for WoW 9.1.0.
1.11.5 -- 2021-03-14
Updated
- Updated the TOC for WoW 9.0.5.
1.11.4 -- 2020-12-23
Updated
- Updated the README to point to the current connected realm documentation.
1.11.3 -- 2020-12-19
Changed
- Updated the TOC for WoW 9.0.2.
1.11.2 -- 2020-10-13
Fixed
- Replaced usage of deprecated GuildRoster() with C_GuildInfo.GuildRoster().
1.11.1 -- 2020-08-09
Fixed
- Added a conditional check for successfully parsed addon version for minimum version enforcement. This is a tactical fix to address the semantic version parsing.
1.11.0 -- 2020-04-27
Removed
- Removed replication of achievements, promotions, demotions, and loot
announcements between co-guilds. The
SendChatMessagefunction was made partially protected in 8.2.5, and events that are not triggered by hardware events cannot use the function. - Removed unnecessary local co-guild use of the addon communication channel.
Added
GreenWallAPI.GetChannelNumbersfunction to query the custom chat channels in use by GreenWall
Changed
- Updated the TOC for WoW 8.3.0.
- Refactored CHAT_MSG_SYSTEM handling to use an abstract factory and added full unit testing for the polymorphic classes.
Fixed
- Updated debug message call stack parsing for 8.3.
1.10.1 -- 2019-09-24
Updated
- Updated the TOC for WoW 8.2.5.
Added
- Added unit test coverage reporting through Coveralls.
1.10.0 -- 2019-09-05
Changed
- Moved to customer branch approach for WoW Classic releases.
Removed
- Removed transitional code for handling PLAYER_ENTERING_WORLD.
1.9.15 -- 2019-08-27
Changed
- Cleaned up project to support CurseForge automatic packaging.
1.9.14 -- 2019-08-22
Added
- Added compatibility support for Incognito.
1.9.13 -- 2019-07-02
Updated
- Updated the TOC for WoW 8.2.
Removed
- Removed Gitter badge from documentation.
1.9.12 -- 2019-01-10
Fixed
- Added missing message alteration for Name2Chat.
1.9.11 -- 2019-01-06
Fixed
- Added ID tagging support for Identity-2 and Name2Chat under the WoW 8.1.0 changes.
- Changed legendary loot notifications from second-person to third-person.
1.9.10 -- 2019-01-04
Fixed
- Fixed GreenWall_ParseText message filtering to filter blank messages.
Added
- Added warning for any transmission of a blank message on a channel.
Changed
- Removed unused CRC import.
1.9.9 -- 2018-12-13
Fixed
- Added chat interception workaround for guild chat changes in BFA 8.1.
Thank you to Ashayo for the patch.
1.9.8 -- 2018-08-23
Changed
- Refactored system message pattern matching.
1.9.7 -- 2018-08-11
Fixed
- Removed a debug statement that was raising format errors.
Thank you to Legracen from AIE for helping with the fault isolation.
Changed
- Refactored gw.Debug to test the debug level before formatting the message.
1.9.6 -- 2018-08-10
Fixed
- Restored context menu availability for speakers in other co-guilds.
1.9.5 -- 2018-07-19
Fixed
- Checks for ElvUI compatibility now recognize ElvUI user profiles.
Thank you, again, to Simpy from the ElvUI team.
1.9.4 -- 2018-07-19
Fixed
- Applied workaround for chat channel sender regression introduced in 8.0.1.
Removed
- Removed pre-8.0 call to bare SendLocal.
1.9.3 -- 2018-07-17
Updated
- Updated the TOC for WoW 8.0.
1.9.2 -- 2018-06-11
Fixed
- Updated compatibility mode for ElvUI 10.74 changes to chat.
- Removed combat log from chat window scanning.
Thank you to Simpy from the ElvUI team for the fixes.
1.9.1 -- 2018-04-28
Fixed
- SendAddonMessage is now called in the C_ChatInfo namespace for 8.0.x.
Changed
- Moved WoW build information to gw.build global.
1.9.0 -- 2018-01-08
Added
- Added support for shared, account-level settings per character. Each character can either use the account settings or a character-specific configuration. If an existing GreenWall configuration exists for the character character mode will be the default, otherwise account mode is the default.
- Added confederation announcements of legendary items looted.
- Moved configuration handling to a proxy class to allow a single point of access for all configuration data.
- Added Travis CI build testing with luaunit for unit tests.
- Added a dedication in memoriam to Roger K White (aka Ralff), we will always miss you.
Fixed
- Corrected item string matching for legendary loot toasts.
Changed
- Pointed documentation to new CurseForge URL.
Updated
- Rewrote the project README.
Removed
- Removed luadoc HTML output.
- HTML copies of other documentation.
1.8.5 -- 2017-08-29
Fixed
- Applied a workaround for 7.3.0 where GuildControlSetRank() was made protected. Checking for rank access is now determined by reading the officer note of the GM.
1.8.4 -- 2017-08-29
Updated
- Updated the TOC for WoW 7.3.
1.8.3 -- 2017-04-16
Updated
- Updated the TOC for WoW 7.2.
1.8.2 -- 2017-01-12
Added
- The version command now give WoW version information.
1.8.1 -- 2016-10-25
Fixed
- Corrected configuration whitespace grooming.
Changed
- Updated TOC for WoW 7.1.
1.8.0 -- 2016-09-20
Fixed
- Added whitespace trimming to configuration parser.
Changed
- Compatibility messages are now raised as debugging output.
1.7.3 -- 2016-08-03
Fixed
- Corrected global name parsing to account for UTF-8.
- Updated API documentation.
1.7.2 -- 2016-07-20
Fixed
- Workaround for delayed bridge channel join caused by missing CHAT_MSG_CHANNEL_NOTICE events.
1.7.1 -- 2016-07-20
Changed
- Updated TOC for WoW 7.0.3.
1.7.0 -- 2016-01-01
Fixed
- Improved message validation during adaptation layer decoding.
- Fixed message handling logic.
Changed
- Updated color of addon messages in chat.
Added
- Confederation bridging API for third-party add-ons.
- Automatic Prat-3.0 compatibility mode.
Removed
- Removed version number from options screen title.
1.6.6 -- 2015-12-16
Fixed
- A check is now done for officer status before sending a gratuitous officer announcement.
- Added officer note data validation before parsing.
Added
- Automatic ElvUI compatibility mode. Thank you, Blazeflack.
- Added Markdown change log.
- Added channel-specific hold downs for join failures.
1.6.5 -- 2015-06-24
Changed
- Updated TOC for WoW 6.2.
1.6.4 -- 2015-03-07
Changed
- Refactored the user option validation.
- Modified the GwHoldDown object. Renamed
GwHoldDown:set()toGwHoldDown:start()and created a new 'GwHoldDown:set()' mutator to change the interval. - Moved the Semantic Versioning parser to a LibStub library.
Added
- Added a user option (joindelay) to control the channel join hold-down.
1.6.3 -- 2015-03-04
Changed
- Restored original channel hold-down timer value of 30 seconds.
1.6.2 -- 2015-03-01
Changed
- Removed lazy sweeper case in the event loop and replaced it with a callback for handling hold-down expiry.
- Reduced channel hold-down to 10 seconds.
1.6.1 -- 2015-02-28
Fixed
- Added conditional to check achievements flag on receipt of achievement spam.
Added
- Added guild ID to debugging output on message receipt.
1.6.0 -- 2015-02-24
Changed
- Comprehensive refactor to allow new features in 2.0.
- Refactored configuration parser.
- Split GreenWall_Core.lua into multiple files.
- Removed excess semicolons ... Lua is not Perl.
Added
- Added GwConfig object to contain configuration.
- Added GwChannel objects for channel management, implementing transport and adaptation layers for communication.
- Added GwHoldDown and GwHoldDownCache objects.
- Added LibStub libraries for SHA256, Salsa20, CRC16-CCITT, and Base64.
1.5.4 -- 2014-12-12
Fixed
- Corrected comparisons of character names to account for capitalization normalization in the API.
Changed
- Updated luadoc.
1.5.3 -- 2014-11-11
Fixed
- Added comember cache updates for channel join/leave events. This stops flapping roster announcements for characters in peer co-guilds.
1.5.2 -- 2014-10-31
Fixed
- Fixed the General chat delay lockout.
- Improved the tests for officer status.
1.5.1 -- 2014-10-15
Fixed
- Fixed regular expression for realm name in GwGlobalName.
1.5.0 -- 2015-10-14
Fixed
- Updated for fully qualified names.
Changed
- Switched to MIT license.
- Minor changes to debug messages.
Added
- Added support for guilds on connected realms.
1.4.1 -- 2014-08-10
Fixed
- Corrected the processing of the reload request.
1.4.0 -- 2014-03-22
Changed
- Update documentation for Interface Options.
- Cleaned up debugging levels.
Added
- Added Interface Options panel for GreenWall options.
1.3.6 -- 2014-02-18
Fixed
- Fixed sender identification under WoW 5.4.7.
Added
- Added realm name to gwPlayerName.
1.3.5 -- 2014-0120
Added
- Added missing roster notification functionality.
1.3.4 -- 2013-11-17
Changed
- Changed officer note format and updated parsing.
1.3.3 -- 2013-09-10
Changed
- Updated TOC for WoW 5.4.0.
1.3.2 -- 2013-08-07
Fixed
- Fixed message integrity checking for duplicated messages.
- Fixed messages generated on guild join, leave, or kick.
- Corrected formatting of documentation.
1.3.1 -- 2013-08-06
Changed
- Project moved to GitHub.
- All text documentation has been converted to Markdown and HTML.
- All URLs have been updated in the TOC.
Added
- Guild configuration format documentation has been added.
1.3.0 -- 2013-06-09
Fixed
- Fixed handling of a kick from a guild.
- Fixed variable names for input validation in GwStringHash().
Changed
- Simplified the unpacking of inter-guild messages.
Added
- Added support for a newer, compact configuration format.
1.2.7 -- 2013-02-27
Changed
- Updated TOC for WoW 5.2.0.
1.2.6 -- 2012-12-04
Changed
- Updated TOC for WoW 5.1.0.
1.2.5 -- 2012-09-01
Fixed
- Localized _ to avoid the taint issues with glyphs in 5.0.4.
1.2.4 -- 2012-08-29
Changed
- Updated TOC for WoW 5.0.4.
1.2.3 -- 2012-08-25
Changed
- Replaced the 32-bit string hash used to obfuscate channel names in the
debugging output with a standard CRC-16-CCITT implementation to avoid
overflow issues with
string.format()in MoP. - Made some changes to the debugging code to improve visibility into message passing and replication.
Added
- Added extra debugging information for current guild information.
- Added value checking for missing coguild ID in GwSendConfederationMsg().
1.2.2 -- 2012-11-12
Fixed
- Fixed officer chat bridging for the guild leader.
1.2.1 -- 2011-11-29
Changed
- Updated TOC for WoW version 4.3.
Added
- Added link to LemonKing's add-on in the documentation.
- Documented prequisites.
1.2.0 -- 2011-11-26
Fixed
- Fixed unnecessary channel resets due to configuration reload.
- Fixed behavior during UI reload.
- Corrected join/leave handling.
- Corrected case statement for handling chat events.
Changed
- Switched to Semantic Versioning.
- Separated guild info parsing from the
GwRefreshComms()function. - Factored out some ugly flags.
- Cleaned up CLI configuration.
- Cleaned up debugging output.
- Cleaned up guild info handling.
- Parameterized all channel control functions.
- Masked all channel names and passwords in debugging output.
Added
- Added officer chat support.
- Added message queuing.
- Added a GwIsOfficer() check to the officer chat configuration phase to avoid pointless work.
- Added broadcast message type.
- Added broadcasts of guild join and leave events.
- Added broadcasts of promote and demote messages.
- Added hold-down for reconfiguration.
- Added broadcast receiver code.
- Added string hash to determine changes in text fields.
- Added error checking for officer note parsing failure.
- Added README.txt and GUILD_QUICKSTART.txt.
Removed
- Removed channel protection code.
- Removed SHA1 library.
1.1.07 -- 2011-06-28
Changed
- Updated TOC for WoW version 4.2.
1.1.06 -- 2011-03-21
Changed
- Babel now disabled by default.
1.1.05 -- 2011-03-21
Changed
- Moved scan of chat windows to chat message event handlers.
- Sorted clauses in the main event switch for legibility.
Added
- Added
GwReplicateMessage()function. - Added RegisterAddonMessagePrefix call for 4.1 changes.
- Added Babel.
1.1.04 -- 2011-01-15
Changed
- Minor updates for Curse packager.
- Cleaned up status display code.
Added
- Added BSD-derived license.
1.1.03 -- 2011-01-14
Changed
- Moved
GuildRostercall to PLAYER_LOGIN handler. - Limited conditions under which reinitialization occurred on PLAYER_GUILD_UPDATE.
- Renamed
gwPlayerGuildtogwGuildName. - Cleaned up prep/refresh/join flow for connecting to the common channel.
Added
- Added a delay mechanism to prevent hijacking of general channel.
- Added connection statistics gathering.
- Added LuaDoc data for functions and procedures.
1.1.02 -- 2010-12-11
Fixed
- Fixed missing assignment of channel number on join.
Changed
- Redacted sensitive data in the status output.
Added
- Added hold-downs for join and configuration messages.
- Added a configuration flag to enable replication of achievement messages.
- Added frame identifier to Tx debug messages.
- Added help text with command listing.
Removed
- Removed tabs from the source code!
- Removed event registration for channel leave events.
- Removed squelch message on reload flood.
1.1.01 -- 2010-12-06
Fixed
- Fixed status output when no channel has been configured.
Added
- Added co-guild tagging.
1.1.00 -- 2010-12-05
Added
- Added announcement flag check for logout announcements.
Removed
- Removed unused moderation release code.
1.0.18 -- 2010-12-04
Added
- Added options line to configuration.
1.0.17 -- 2010-12-04
Fixed
- Fixed SavedVariables processing.
1.0.16 -- 2010-12-04
Fixed
- Removed moderator handling and switched to better handling of owner status.
1.0.15 -- 2010-12-03
Fixed
- Removed faulty
tContains()forgwPeerTablechecks to stop prolific kicking.
1.0.14 -- 2010-12-03
Fixed
- Fixed missing argument to
GetGuildInfo().
1.0.13 -- 2010-12-03
Changed
- Updated guild change/update handling.
1.0.12 -- 2010-12-03
Fixed
- Fixed /who and channel join event processing.
1.0.11 -- 2010-12-03
Fixed
- Limited handling of channel owner/moderator changes to the common channel.
Changed
- Simplified and improved
GwIsConnected().
Added
- Added a nil result check for the system message regex.
- Added gratuitous container officer response on channel join.
- Suspend confederation messages until container ID is known.
- Limit scope of the channel debugging.
Removed
- Removed proactive channel leave before a join.
1.0.10 -- 2010-11-22
Changed
- Rewrote guild lookups.
Added
- Added extra slash commands.
1.0.09 -- 2010-11-21
Fixed
- Missing negation in channel defense code.
1.0.08 -- 2010-11-21
Fixed
- Corrected guild join handling.
Added
- Added more debugging code.
Removed
- Removed channel bans.
1.0.07 -- 2010-11-17
Fixed
- Typos in variable names.
1.0.06 -- 2010-11-13
Added
- Added online/offline notices.
1.0.05 -- 2010-11-13
Fixed
- Fixed the placement and use of
GwLeaveChannel().
Changed
- Changed container messaging system to generalize the request message type.
1.0.04 -- 2010-11-13
Fixed
- Fixed container recognition in configuration processing.
Added
- Added debugging output to slash command handling.
1.0.03 -- 2010-11-12
Changed
- Changed configuration to support common configurations across co-guilds.
- Refactored configuration parsing.
- Cleaned up slash command handling.
Added
- Added variable field to the saved variables.
1.0.02 -- 2010-11-12
Added
- Added container IDs to channel messages to avoid duplicates within the same co-guild.
1.0.01 -- 2010-11-12
Added
- Brought back GUILD_ROSTER_UPDATE to get around the guild info loading delay.
1.0.00 -- 2010-11-11
Changed
- Cleaned up debugging statements.
Added
- Added moderator/owner status handling.
- Added kick/ban handling for interlopers.
- Added channel leave if player leaves the guild.
- Finished defensive ownership/moderation handling.
- Added handling for guild achievements.
- Added forced reload.
Removed
-Removed GUILD_ROSTER_UPDATE event handling.
0.9.02 -- 2010-11-06
Fixed
- Fixed parsing of peer entries in configuration.
Changed
- Expanded debugging code.
Removed
- Removed slash command code, left stub.
0.9.01 -- 2010-11-06
Changed
- Abstracted several functions.
Added
- Added peer configuration entries.
0.9.00 -- 2010-11-01
Initial commit.
This mod has no additional files

