Fast Guild Invite - Revived

A WoW Classic AddOn to help recruit new members into your guild.

File Details

FastGuildInvite-v1.7.8

  • R
  • Apr 16, 2026
  • 5.32 MB
  • 834
  • 12.0.1+6
  • Retail + 2

File Name

FastGuildInvite-FastGuildInvite-v1.7.8.zip

Supported Versions

  • 12.0.1
  • 12.0.0
  • 11.2.7
  • 4.4.0
  • 3.4.3
  • 2.5.5
  • 1.15.8

<FGI> FastGuildInvite

[v1.7.7] (2026-04-14) - Combat Sync Fix, Anti-Spam Accuracy, Scan State Cleanup

Bug Fixes

  • TBC: Sync failed: disconnected spam and screen stutter during combat (SYNC-016) — getTableHash() and getTotalHash() each called IsInCombat(true), which invoked Sync.closeConnect() as a side effect of computing a hash; the resulting CLOSED-state reset left a wandering 10-second timer that re-killed any new sync started 1 second later, looping indefinitely; every closeConnect cascade (ChatThrottleLib flush + timer cancel + chat print + UI refresh) ran synchronously in CHAT_MSG_ADDON OnEvent, dropping a frame on each cycle; removed the IsInCombat local function entirely; combat is now checked only at fn.startSync() entry via UnitAffectingCombat("player"), which prevents initiating a new sync in combat without ever aborting an in-flight one
  • Stale scan results from previous sessions caused invites to offline players (SCAN-006) — saveSearch wrote the entire addon.search table (including inviteList) to SavedVariables after every WHO callback and restored it on login; WHO results are an online-only snapshot with no value after the session ends, and WoW provides no reliable way to distinguish /reload from logout, so players who logged off hours ago could remain in the queue and receive broken invite attempts; removed saveSearch entirely — addon.search is now always freshly initialised on login; the corresponding Settings checkbox, AceDB default, and analytics call are also removed
  • Offline players added to anti-spam list; players never added on Classic Era; not_found cleanup incorrect on cluster realms (SCAN-007) — fn:rememberPlayer() was called before GuildInvite() returned, writing failed invites to the anti-spam list; on Classic Era ERR_GUILD_INVITE_S is never sent to the inviter's client so the original "invite"-only handler never fired and players were never added to the list at all; not_found cleanup used normalizePlayerName on the bare server name which is a no-op on Classic, missing a cluster-realm key like "Name-OtherRealm"; added addon.pendingInvites keyed by normalizePlayerName(playerName); types 1/2/4 defer rememberPlayer to server confirmation; "decline" and "auto_decline" handlers now also flush pendingInvites (covering Classic Era); not_found uses next(pendingInvites) since only one invite can be in-flight at a time

[v1.7.6] (2026-04-13) - Retail Anti-Spam & Invite Fixes

Bug Fixes

  • Retail: anti-spam list silently cleared after every same-realm invite (SCAN-004) — on Retail, C_GuildInfo.Invite and C_ChatInfo.SendChatMessage reject "Name-MyRealm" for same-realm players and fire a not_found error event; scanFrame.pausePlayFilter was handling that event by deleting DB.realm.alreadySended[normalizedName], erasing the entry that rememberPlayer() had just written; only cross-realm players (~1 in 10 WHO results) were stored correctly because their realm suffix was already different; fixed by stripping the self-realm suffix in API.GuildInvite() and fn:sendWhisper() before calling the WoW API on Retail so the API call succeeds and no not_found event is raised
  • Retail: blackListAutoKick crashes on every guild join (SCAN-005) — fn:blackListAutoKick() registered a CHAT_MSG_SYSTEM listener that called strfind(ERR_GUILD_JOIN_S, ...) directly, the same protected C-side string that caused the v1.7.5 crash in the main handler; the auto-kick handler was missed in that fix; now guarded with not gv.isRetail and falls through to the same English text-pattern fallback used by the main handler
  • Anti-Spam List panel not refreshing in real time (UI-003) — fn:rememberPlayer() wrote to DB.realm.alreadySended but never notified the panel; entries were only visible after switching settings tabs; rememberPlayer() now calls antiSpamList:update() immediately when the panel is visible; settings.ShowContent() also calls update() when either the Anti-Spam List or Blacklist tab is opened so bulk sync arrivals are reflected without a second tab switch
  • Anti-spam timestamps always show :00 for minutes and seconds (UI-002) — fn.getTime() called time({year, month, day, hour}) with min and sec omitted; Lua's time() defaults omitted fields to 0, so every stored timestamp was HH:00:00; min and sec are now included

[v1.7.5] (2026-04-13) - Retail Secret String Crash Fix

Bug Fixes

  • Lua crash on guild join in RetailERR_GUILD_JOIN_S is a protected C-side "secret string" in Retail WoW; calling strfind() on it raised attempt to perform string conversion on a secret string value (642 times per session per report); the Classic ERR_GUILD_JOIN_S path is now skipped on Retail, which already has a working fallback pattern match for the "has joined the guild" message

[v1.7.4] (2026-04-13) - Add to Blacklist from Anti-Spam List

New Features

  • Add to Blacklist from Anti-Spam List — right-clicking a player name in the Anti-Spam List window now shows an "Add to Blacklist" option alongside the existing Delete option; adds the player to the blacklist (with the configured default reason, chat confirmation, and sync propagation) while leaving them in the anti-spam list unchanged

Bug Fixes

  • Blank "Add to Blacklist" button text — the locale key "Добавить в черный список" was missing from ruRU.lua, which is the master key source for the locale merge in summary.lua; all keys absent from ruRU are silently omitted from the final L table, causing the button to display no text

[v1.7.3] (2026-04-13) - Scan Window Resize Fix

Bug Fixes

  • Scan window resize clears player display (SCAN-003) — resizing the scan frame while a scan was running caused the player name label to go blank and the invite count to disappear, causing missed invitations; the OnSizeChanged hook now calls onListUpdate() after each size event to re-sync the display with inviteList

[v1.7.2] (2026-04-11) - Sync Stability & Multi-Peer Queue

Bug Fixes

  • Sync sender false failure message (SYNC-014) — the peer who sent data during a sync always received a red failure message in chat even when the sync completed successfully; CLOSE_CONNECT received while in CHECK state is now correctly treated as a clean success
  • Second peer disrupts in-progress sync (SYNC-015) — a competing initSync from a second peer while already syncing caused the first sync to be torn down mid-handshake; the second peer is now refused gracefully and queued
  • Sync queue implementation — refused peers are added to Sync.queue; when the current session ends, a re-broadcast is triggered automatically so every online peer eventually gets synced without manual intervention
  • Nil crash in onSyncSuccess (SYNC-014 follow-up) — automatic login sync triggered onSyncSuccess without onSyncStarted ever being called, leaving syncPreCounts.blackList nil and causing a Lua arithmetic error; count diff is now skipped when syncPreCounts was not initialised

[v1.7.1] (2026-04-11) - Settings Tab Highlight & Sync Feedback

New Features

  • Active settings tab highlight — the left-hand navigation buttons in the Settings window now visually indicate which panel is currently open; the active button stays highlighted using WoW's native LockHighlight / UnlockHighlight button methods
  • Sync status messages — pressing the Sync button now prints status messages to the default chat frame with the <FGI> prefix; messages are suppressed when "Disable addon messages" is enabled
    • Yellow Syncing... on broadcast
    • Green Synced with <player> (+N entries) or (already up to date) on success
    • Red Sync failed: <player> disconnected on timeout or mid-sync disconnect
    • Grey Already up to date. when no guild peer responded to the broadcast

Bug Fixes

  • False sync failure message on sender sideCLOSE_CONNECT received while in CHECK state is now treated as a successful close; previously the sending peer always printed a failure message even when the sync completed normally

[v1.7.0] (2026-04-10) - Blacklist Sync Overhaul & Class Filter Fix

New Features

  • Blacklist removal propagation — removing a player from the blacklist now syncs the removal to all online guild peers; a blackListRemoved tombstone table tracks deletions so removed entries are never re-synced back by peers
  • Auto-broadcast on blacklist removal — triggers an immediate guild hash broadcast when a player is removed so online peers sync without requiring relog or manual sync

Bug Fixes

  • Bidirectional cursor desync (SYNC-008) — the choose_table responder was incorrectly sending choose_table back, causing both peers to advance their cursors independently and compare the wrong tables against each other
  • Re-add clears tombstone — re-adding a previously removed player now correctly clears their tombstone so the re-addition propagates to peers
  • Double-delete required to remove (SYNC-010) — fn:blacklistRemove now deletes the exact stored key before case variants, so a single remove always works
  • Lua nil errors on blacklist operations (SYNC-011) — Sync, checkSync, and CHANNEL_MOD are now forward-declared at the top of functions.lua; they were previously nil when referenced by functions defined before the sync section
  • Blacklist UI not refreshing after sync (SYNC-012) — the blacklist panel now updates immediately when entries are added or removed via sync
  • Class filter checkboxes version-gated — Death Knight filter shown for Wrath/Cata/Retail; Monk, Demon Hunter, and Evoker filters shown for Retail only; previously these checkboxes were absent on non-Classic-Era clients causing incorrect filter results
  • Window resize minimum bounds (UI-001) — scan frame minimum resize now tracks actual visible content so it cannot be squished below its contents; main frame minimum width set to prevent the level range controls from overflowing the frame border; scan frame children (player label, progress bar) now resize with the frame

[v1.6.3] (2026-04-06) - Blacklist Sync & Manual Sync Button

New Features

  • Blacklist Sync Between FGI UsersDB.realm.blackList is now included in the peer-to-peer sync system alongside the leave and invited lists; hashes automatically on login and syncs when a mismatch is detected
  • Manual Sync Button — "Start Sync" button added to FGI Settings → Main tab; triggers a guild-wide hash broadcast and full sync handshake on demand without relogging

Changes

  • Refactored login sync init into fn.startSync() so it can be called externally (login and button share the same code path)

[v1.6.2] (2026-03-29) - Performance Fixes & Blacklist Auto-Advance

New Features

  • Auto-advance invite queue after blacklisting — right-clicking to blacklist a player from the scan frame now automatically advances to the next candidate (both fast-blacklist and popup-confirmation paths)

Bug Fixes

  • GuildRoster stormGuildRoster() is now guarded behind the note-setting check; was being called on every guild join even when note-setting was disabled
  • Ticker accumulationC_Timer.NewTicker in timeCallbackStart now cancels the prior ticker before creating a new one, preventing N simultaneous tickers after N scan cycles
  • removeMsgList memory leak — matched entries are now removed and empty per-player slots are nilled instead of accumulating indefinitely

[v1.6.1] (2026-03-29) - Settings & Auto-Blacklist Fixes

Bug Fixes

  • Duplicate blacklistOfficer checkbox — removed orphaned copy from the Main settings tab; canonical copy remains in the Guild tab
  • False "player is in guild" popup — when auto-blacklisting a leaver, the roster scan (blacklistKick) is now skipped via skipKick=true, preventing a false positive popup for a player who just left

[v1.6.0] (2026-03-29) - Anti-Spam List UI & Auto-Blacklist Leavers

New Features

  • Anti-Spam List Management UI — new settings tab to view and manage the invited-players list (DB.realm.alreadySended)
    • Paginated display (13 entries per page) with player names and invitation timestamps
    • Right-click context menu to remove individual players
    • "Clear All" button with confirmation dialog
    • Integrated with "Player memorization time" auto-cleanup setting
    • Fully localized (English & Russian)
    • Access via FGI Settings → "Anti-Spam List"
  • Auto-blacklist leavers (all versions)CHAT_MSG_SYSTEM handler now triggers auto-blacklist for all game versions; GUILD_EVENT_LOG_UPDATE registered for all versions

Bug Fixes

  • blacklistOfficer not persisting — Guild tab setting now correctly saves and restores across sessions
  • Statistics period dropdown not saving — period selection now persists across reloads
  • processGuildEventLog crash on Retail — now uses C_GuildInfo.GetGuildEventLog() on Retail instead of the missing global

[v1.5.19-beta] (2026-03-28) - Blacklist Auto-Kick Fixes

Bug Fixes

  • Hook stacking on right-click (BL-001) — AddHookClick() was called on every page turn in blackList:update(), stacking OnMouseDown handlers and causing multiple context menus per right-click
  • Auto-kick never calling GuildUninvite (BL-002) — FGI_BLACKLIST popup OnAccept now correctly calls GuildUninvite(name); button labels updated to Kick/Skip; OnCancel added to dequeue and advance

[v1.5.18-beta] (2026-03-27) - Remember Skipped Players

New Features

  • "Remember skipped players" setting — when enabled, clicking Skip/Decline adds the player to the anti-spam list so they won't appear in future scans; defaults to off
  • Right-click player name in scan frame — opens the FGI context menu (Guild Invite / Blacklist / Unblacklist), same as chat name right-click

[v1.5.17] (2026-03-27) - TBC/Wrath/Cata GuildRoster Fix

Bug Fixes

  • Crash on guild join in TBC/Wrath/Cata (KEY-017) — GuildRoster() global only exists in Classic Era; all other versions now correctly use C_GuildInfo.GuildRoster()

[v1.5.16] (2026-03-21) - Retail Guild Note Support

New Features

  • Retail note-settingGuildRosterSetPublicNote / GuildRosterSetOfficerNote confirmed working in Retail; guild note controls fully functional on all versions

Bug Fixes

  • message() global missing in Retail (KEY-010/011) — replaced with addon.API.ShowMessage() which falls back to UIErrorsFrame:AddMessage() on Retail
  • fn.debug format string crash — format string had 3 %s placeholders but only 2 arguments; fixed missing |r reset arg
  • FGI_APICompat debug calls using colon syntax — caused self (the functions table) to be passed as the message argument, triggering the error path every time
  • Guild join note: stale roster dataGuildRoster() is now requested immediately on join so the member appears in cache before setNote runs 5 seconds later
  • Note condition always true — was checking DB.global.setNote ~= "" (boolean vs string); now correctly checks DB.global.noteText ~= ""
  • GetNumGuildMembers() multi-return (KEY-016) — wrapped in parentheses to prevent the online-count being used as a loop step

[v1.5.13] (2026-03-20) - Retail Note API & Sync Fix

Bug Fixes

  • Guild notes crash on Retail (KEY-014) — SetPublicNote/SetOfficerNote now use C_GuildInfo.SetNote with correct isPublicNote boolean on Retail
  • C_GuildInfo.CanEditPublicNote missing in Retail (KEY-012) — nil-guarded; returns true when absent, deferring permission check to the server

[v1.5.12] (2026-03-19) - Sync De-taint & Stability

Bug Fixes

  • Tainted sender string crash in Retail (KEY-013) — sender in CHAT_MSG_ADDON is a Blizzard-protected secret string in Retail; replaced :match() with Ambiguate(sender, "none") to safely de-taint it
  • Sync.timeout.timer nil crash — added nil guards in restoreSyncDefaultValues() and Sync.timeout.stop() before calling :Cancel()
  • BCC interface line added to base TOC; CurseForge TOC creation re-enabled for multi-version packaging

[v1.5.8] (2026-03-13) - Multi-Version TOC

New Features

  • TBC, Wrath, Cata Classic TOC files — created FastGuildInvite_BCC.toc, FastGuildInvite_Wrath.toc, FastGuildInvite_Cata.toc for proper CurseForge multi-version packaging

[v1.5.7] (2026-03-11) - Filter UI & Tooltip Fixes

Bug Fixes

  • Fixed multi-line tooltip rendering in GUI widgets (FilterButton, TCheckBox, TLabel, TKeybinding)
  • Fixed FilterButton tooltip not displaying due to missing widget property
  • Fixed nil letterFilter causing tooltip errors in FiltersUpdate
  • Fixed fn:split() nil crash
  • Improved spacing in filter creation UI (RaidProgress labels, bottom hint text)
  • Localized new tooltips in English and Russian

[129] (2024-09-22)

  • chat menu fix