GRIP - Guild Recruitment

Automates guild recruitment — scans /who for unguilded players, queues whispers and guild invites, and schedules Trade/General channel posts.
Back to Files

v1.6.0

File nameGRIP-v1.6.0.zip
Uploader
sirsataanasirsataana
Uploaded
Aug 8, 2026
Downloads
269
Size
247.8 KB
Flavors
Retail
File ID
8602028
Type
R
Release
Supported game versions
  • 12.1.0
  • 12.0.7
  • 12.0.5
  • 12.0.1

What's new

Changelog

All notable changes to GRIP - Guild Recruitment Automation are documented here.

This project follows a lightweight variant of Keep a Changelog and uses semantic-ish versioning. Dates are in YYYY-MM-DD.


[1.6.0] - 2026-08-08

Added

  • Dark theme across the interface. New colour palette, restyled main frame, themed buttons and widgets, and the Stats page sections now sit in panel cards inside a scroll container, with a tooltip on Peak Hour.
  • Guild master forced settings. A GM can lock chosen settings for the guild. Members see an indicator on any setting being forced, and the locked value is applied through GetEffectiveSetting in the scan, whisper and post paths. Sync protocol V3 carries the forced-settings payload alongside the blacklist and templates.
  • GRIP category and brand tagline in the AddOns list, so the family groups together.

Fixed

  • Interface version now lists 120100 for game patch 12.1. Midnight removed the option to load out-of-date addons, so without this GRIP would not have loaded at all once 12.1 went live.
  • The minimap button angle called math.atan with two arguments. Lua 5.1 ignores the second one, so the button sat at the wrong point on the ring. It uses math.atan2 now.
  • GRIP.VERSION reported 1.5.4 while the addon was 1.5.5. It tracks the real version again.
  • Ghost Mode no longer stalls after a /who request times out.
  • SetBackdrop error on the main frame. The frame was missing the BackdropTemplate mixin.

Changed

  • Blacklist normalisation and the sync request builder each had two branches that did the same thing by different routes. Collapsed to one path each. Neither changes what it does.
  • Zero luacheck errors across the addon, with a .luacheckrc that declares the WoW globals GRIP uses.

[1.5.5] - 2026-03-18

Fixed

  • Scan button cooldown bypass via spam-click and keybind. Cooldown enforcement moved from UI button handler into SendNextWho() so it applies to both button clicks and keybind presses. Immediate button disable prevents same-frame re-entry. Ghost Mode queue now sets lastWhoSentAt at queue time to prevent spam-queuing multiple ghost actions

Added

  • WagoAnalytics tracking shim (Libs/WagoAnalyticsShim): enables Wago install metrics. OptionalDeps: WagoAnalytics
  • GhostMode.lua hardcoded strings localized via AceLocale L[] keys

Changed

  • License changed from MIT to GPL v2 (all bundled libraries are GPL-compatible)
  • CHANGELOG.md moved to repo root (was Docs/CHANGELOG.md)
  • Repository tooling: added .mcp.json, lane_sync_refresh.py, settings.local.json

[1.5.4] - 2026-03-07

Added

  • /grip perf slash command: C_AddOnProfiler performance baseline metrics (session/recent averages, peak tick, memory usage, tick distribution)

Fixed

  • GRIP.VERSION and README now correctly show 1.5.3 (were stuck at 1.3.0/1.3.1)
  • Whisper opt-out detection: fixed scope bug where senderShort was nil during pendingInvite lookup (variable was defined in a different block)
  • Ghost Mode nil-guards added to Invite.lua and Post.lua: prevents errors if Ghost table isn't loaded
  • Campaign cooldown messages and ghost-post string now routed through AceLocale L[] for localization consistency
  • Replaced orphaned L[] keys in enUS.lua with actual strings used by Core.lua

Changed

  • Simplified .gitignore for Libs/ tracking: untracked redundant bundled AceLocale-3.0 files (packager fetches from external)

[1.5.2] - 2026-03-06

Fixed

  • /who returning 0 results no longer triggers false "server throttle" warning. Events.lua now detects the WHO_NUM_RESULTS system message and clears pending state
  • BigWigsMods packager changelog integration: added manual-changelog directive to .pkgmeta pointing at Docs/CHANGELOG.md
  • Locale @localization@ keyword fix: removed empty namespace param that caused CurseForge API error 1006

[1.5.1] - 2026-03-06

Fixed

  • Locale export fix: removed empty namespace="" from @localization@ keywords in all locale files (enUS/deDE/frFR/esES) to fix CurseForge API rejection

[1.5.0] - 2026-03-06

Added

  • Full localization infrastructure via AceLocale-3.0: all 553 user-facing strings now route through L[] locale keys (Locale/enUS.lua). German, French, and Spanish stub files ready for CurseForge community translations (Locale/deDE.lua, Locale/frFR.lua, Locale/esES.lua)
  • AceLocale-3.0 library dependency added (.pkgmeta external)
  • @localization@ keywords in all locale files for BigWigsMods packager integration with CurseForge translation portal

[1.4.0] - 2026-03-06

Added

  • Officer sync v2 protocol: per-collection hash-compare-transfer for blacklists (set-union merge) and whisper templates (last-writer-wins with 5-min clock tolerance). Backward compatible with v1 clients (Sync/Sync.lua)
  • FE8 clipboard import/export for blacklists and whisper templates: encode to printable string for cross-guild/cross-addon sharing. /grip export bl|templates, /grip import with auto-detect (Sync/ImportExport.lua)
  • Template sync opt-in toggle (config.syncTemplates, default: on) with /grip sync status display showing per-collection hashes
  • New slash commands: /grip export, /grip import, /grip templates

[1.3.1] - 2026-03-06

Added

  • FUNDING.yml activated with PayPal.me sponsor link
  • Sponsor badge added to README.md

[1.3.0] - 2026-03-05

Added

  • Raider.IO integration: optional M+ score filtering for candidates when RIO addon is installed. Fail-open design: all checks pass when RIO is absent. New config keys: rioMinScore, rioShowColumn. Settings UI with min-score slider and column toggle (DB/DB_RaiderIO.lua, DB/DB_Filters.lua, DB/DB_Potential.lua, UI/UI_Settings.lua, UI/UI_Home.lua)
  • Officer blacklist sync: guild officers running GRIP automatically share permanent blacklist entries via AceComm on GUILD channel. Hash-compare-transfer protocol with djb2 hashing, LibSerialize + LibDeflate compression, set-union merge (add-only, never removes). 1-hour broadcast cooldown, 10-second startup delay, pcall-wrapped. /grip sync on|off|now (Sync/Sync.lua, Core/Events.lua, Core/Slash.lua)
  • Aggressive opt-out tier: optional profanity-based rejection phrases ("fuck off", "piss off", etc.) behind config.optOutAggressiveEnabled toggle (default off). /grip set aggressive on|off. Per-language aggressive tables in Data/OptOut_Phrases.lua
  • origin parameter passed to C_FriendList.SendWho() calls for good-citizen telemetry (Recruit/Who.lua)
  • New slash commands: /grip sync, /grip set aggressive, /grip set riominscore, /grip set riocolumn
  • Library dependencies: AceComm-3.0, LibSerialize, LibDeflate (managed via .pkgmeta externals)

Changed

  • README.md and platform descriptions updated for v1.3.0 feature set
  • CHANGELOG.md brought current

[1.0.0] - 2026-03-05

Changed

  • Invite-first mode now whispers on invite delivery (ERR_GUILD_INVITE_S) instead of waiting for accept. Players who receive the invite get a follow-up whisper immediately
  • First stable release: no code changes from v0.9.0
  • Version bumped to 1.0.0 for distribution
  • Author field changed to Sataana in TOC metadata
  • README updated with full feature list, Stats tab documentation, and missing slash commands
  • Platform descriptions refreshed for CurseForge, Wago, and WoWInterface

[0.9.0] - 2026-03-05

Added

  • Hybrid opt-out detection algorithm: SAFE phrases (multi-word, abbreviations) use plain substring matching, RISKY phrases ("no", "stop", "pass", "spam", "nope", "nah") use word-boundary-aware matching via MatchWholeWord() to prevent false positives (Recruit/Whisper.lua)
  • French, German, and Spanish opt-out phrase lists in new data file (Data/OptOut_Phrases.lua)
  • Language selection config key (optOutLanguages) with Settings UI checkboxes for EN/FR/DE/ES (DB/DB_Init.lua, UI/UI_Settings.lua)

Changed

  • Extracted magic numbers to named constants across codebase (pipeline thresholds, UI dimensions, color values)
  • UI color constants consolidated for consistent theming

[0.8.4] - 2026-03-05

Added

  • Hourly activity bucketing: each daily stats bucket now tracks hours[0..23] action counts for time-of-day analysis (DB_Init.lua)
  • "Peak Hour" display on Stats page: shows busiest hour per time window (today/7d/30d) with action count (UI_Stats.lua)
  • /grip stats [7d|30d] slash command: print today/7-day/30-day recruitment summary to chat (Slash.lua)
  • /grip stats reset: clear all stats history (Slash.lua)
  • GitHub repository topics for WoWUp Hub discoverability (wow, world-of-warcraft, wow-addon, lua, guild-recruitment, warcraft, retail, midnight)

Fixed

  • Onboarding overlay no longer shows for experienced users. Smart-dismiss guard skips if blacklist, potential list, or stats history exists (UI_Home.lua)
  • Onboarding overlay no longer bleeds outside GRIP window. Page container now clips children (UI.lua)
  • Added _onboardingDismissed to DEFAULT_DB_CHAR schema for explicit documentation (DB_Init.lua)

[0.8.3] - 2026-03-05

Added

  • Daily recruitment statistics tracking: 30-day rolling history stored per-character in SavedVariables, auto-pruned on login (DB_Init.lua)
  • RecordStat() helper with hooks across the full pipeline: whispers sent, invites sent, accepted, declined, opt-outs, posts sent, scans completed (Whisper.lua, Invite.lua, Post.lua, Events.lua)
  • New "Stats" tab (4th tab) showing Today / Last 7 Days / Last 30 Days summaries with per-metric counters and accept rate (UI_Stats.lua, UI.lua)

[0.8.2] - 2026-03-05

Improved

  • Guild link fallback now prints a one-time per-session notice explaining why {guildlink} resolved to plain text, with actionable steps (open Communities window, check Guild Finder listing, use /grip link) (Utils.lua)
  • /grip status now shows perm/temp blacklist split and conditional breakdown of permanent entries by reason (opt-out, no-response, other) (Slash.lua)

Added

  • First-run onboarding overlay on Home page: dismissible setup guide shown once until "Got it!" is clicked, persisted via _onboardingDismissed config flag (UI_Home.lua)
  • Documentation comment for NormalizeWhoCounts explaining the return-value swap detection (Who.lua)

[0.8.1] - 2026-03-05

Changed

  • Expanded opt-out phrase detection with 9 new entries: "nty" (abbreviation), polite rejections ("i'll pass", "ill pass", "not for me", "thanks but no thanks"), hostile responses ("go away", "fuck off", "piss off"), and WoW-specific ("just looking") (Whisper.lua)
  • Documented opt-out detection design rationale and false positive trade-offs in CLAUDE.md

[0.8.0] - 2026-03-05

Added

  • Invite-first safety toggle: send guild invite before whisper, only whispers players who accept the invite. Reduces Silence penalty risk from players with "Block Guild Invites" enabled. Off by default. (DB_Init.lua, Invite.lua, Whisper.lua, UI_Settings.lua, Slash.lua)

Changed

  • All chat sends (whisper, channel post) now check C_ChatInfo.InChatMessagingLockdown() before sending, silently skipping when the player is chat-restricted (Recruit/Whisper.lua, Recruit/Post.lua, Recruit/Invite.lua)
  • Max level clamp corrected from 100 to 90 for Midnight level cap (Slash.lua, UI_Settings.lua, Who.lua)

Fixed

  • Ghost Mode /who timeout closure now uses reference equality to prevent stale session callbacks (Who.lua)
  • Variable shadowing in opt-out whisper name resolution fixed (Whisper.lua)
  • Post target regex no longer matches loose hyphenated words, preventing false-positive post attribution (Post.lua)

[0.7.0] - 2026-03-04

Added

  • Slider widgets for Ghost Mode session max / cooldown settings (UI_Settings.lua)
  • Ghost session lock: pipeline slash commands, Home buttons, minimap menu items, and Settings filters locked during active Ghost session (GhostMode.lua, Slash.lua, UI_Home.lua, Minimap.lua, UI_Settings.lua)

Changed

  • Right-click "Invite to Guild" now checks blacklist gate before sending invite (UnitPopupInvite.lua)
  • Whisper ticker skips candidates when invite can't follow due to combat lockdown (Whisper.lua)
  • /who window flash suppressed during automated scans via FriendsFrame hide/show guard (Who.lua)
  • Suppress whisper echo checkbox added to Settings page (UI_Settings.lua)
  • Removed dead GetRealmToken() from Who.lua
  • Cleaned up misleading "Phase 1 backward compat" / "legacy" comments across codebase (BC1-BC6)
  • Fixed stale comments in DB_Init, UnitPopupInvite, Core (SC1-SC3)

Fixed

  • Edit box text no longer reverts on focus loss: dirty tracking rewritten with programmatic-set flag (UI_Widgets.lua, UI.lua)
  • /who panel no longer flashes despite suppressWhoUI being enabled (Who.lua)
  • Whisper echo suppression now works correctly: filter registration timing and buffer matching fixed (Utils.lua, Events.lua)
  • WASD movement no longer blocked while GRIP UI is open: removed SetPropagateKeyboardInput(false) from main frame (UI.lua)

[0.6.0] - 2026-03-04

Changed

  • Migrated Potential list (UI_Home.lua) and Blacklist panel (UI_Home_Blacklist.lua) from manual FauxScrollFrame to WowScrollBoxList + DataProvider pattern: automatic row recycling, no manual pool management
  • Updated CLAUDE.md UI Architecture section to document ScrollBox patterns

[0.5.0-beta] - 2026-03-02

Added

  • Daily whisper cap (500/day default) with 80% warning, calendar-date reset, /grip set dailycap
  • Opt-out response detection: auto-blacklists candidates who reply "no thanks", "stop", etc.
  • Whisper template variety: multiple messages with sequential/random rotation
  • Sound feedback: optional audio cues for queue complete, invite accepted, scan results, cap warning
  • Multi-template whisper editor with navigation, add/remove, rotation selector
  • /grip link command: prints current guild name and Guild Finder link for troubleshooting
  • EnsureDB now enforces 10-template cap on whisperMessages (defensive against manual SV edits)
  • Campaign cooldown: sliding-window timer with soft warning (30 min) and hard auto-pause (60 min), gap reset after inactivity, /grip set cooldown
  • Ghost Mode (experimental, disabled by default): invisible overlay frame captures hardware events to drain a universal action queue. Full pipeline: auto-scan → auto-whisper → auto-invite → auto-post. 1-hour max session, 10-minute persistent cooldown (survives /reload, relog, restart). /grip ghost start|stop|status
  • Ghost Mode UX: Settings page checkbox + session/cooldown config, Home page session status strip with Start/Stop button and live timer
  • Addon compartment right-click dropdown: 5 quick actions (Toggle UI, Status, Build Scan Queue, Ghost toggle, Whisper toggle) via MenuUtil context menu
  • Account-wide blacklist: GRIPDB (account-wide: blacklists, no-response counters) + GRIPDB_CHAR (per-character: config, potential, filters). Automatic migration from old single-SV schema via MigrateToSplitSV()
  • Frame pooling for Home page potential + blacklist rows (CreateFramePool)

Changed

  • Zone system: removed dead STATIC_ZONES_BY_GROUP, added expansion grouping, seasonal detection, improved exclusion rules, SeedZones fix
  • scanMaxLevel default corrected from 80 to 90
  • Stripped revision header bloat from all source files; removed dead code (U.AnySelected())
  • Upvalue localization: hot-path WoW API and Lua stdlib globals localized as file-top upvalues across all 22 .lua modules
  • SavedVariables split: GRIPDB is now account-wide (## SavedVariables), GRIPDB_CHAR is per-character (## SavedVariablesPerCharacter)

Fixed

  • RemovePotential(fullName) now returns true|false (contract alignment for purge/cleanup paths).
  • GuildInvite()C_GuildInfo.Invite() deprecated API migration with compat wrapper
  • GetGuildName() removed dead C_GuildInfo.GetGuildInfo reference, improved cache warming via guild events
  • GetGuildFinderLink() added cache with 5-min TTL, suppressed debug spam
  • ApplyTemplate() Lua gsub count leak fixed

Known Limitations / Future

  • Ghost Mode is functional but disabled by default. Enable in Settings and start via /grip ghost start or the Home page button.
  • ChatThrottleLib runtime detection implemented (Utils.lua). Routes WHISPER through CTL when present; falls back gracefully when absent.

[0.4.0] - 2026-02-26

Added

  • Minimap button
    • Left-click: toggle UI (Home)
    • Middle-click: Settings
    • Right-click: Ads
    • Drag to reposition
    • /grip minimap on|off|toggle
  • All/None shortcuts for Zones/Races/Classes allowlists.
  • Scrollable Settings and Ads pages (prevents layout overflow).
  • Automatic excluded-zone building:
    • Encounter Journal instances
    • Battlegrounds
    • Manual excludes/pattern patterns
  • Static zone list (Maps_Zones.lua) used for seeding zone selections.
  • /grip zones export: writes copy/paste-ready Lua table to GRIPDB.lists.zonesExportLua.
  • Persisted debug capture (SavedVariables) with configurable cap.

Changed

  • Default /who minimum interval set to 15s to align with UI cooldown.
  • Edit boxes now use “dirty” tracking to prevent ticker overwrites.
  • /who ingestion now normalizes C_FriendList.GetWhoInfo() fields for correct race/class/zone consistency.
  • Minimap drag logic now commits SavedVariables only on drag stop (reduced churn).
  • UI now hardens against DB-not-ready states (graceful disable instead of hard error).
  • Logger refactor:
    • Introduced GRIP.Logger wrapper
    • Plain-text persistence for SavedVariables
    • Debug window resolution caching

Refactored

  • Split monolithic DB.lua into modular DB files:
    • DB_Init
    • DB_Zones
    • DB_Filters
    • DB_Blacklist
    • DB_Potential
    • DB_Util
  • Split UI.lua into page modules:
    • UI_Home.lua
    • UI_Settings.lua
    • UI_Ads.lua
    • UI.lua retained as controller

Fixed

  • Apply+Rebuild no longer reverts Max/Step on first click (ticker overwrite race resolved).
  • Whisper/Ads message Save reliably persists.
  • Append {guildlink} no longer flashes and disappears.
  • Classes list no longer includes “Adventurer”; filter keys pruned correctly.
  • Zones list pre-populates from map API (fallback to current zone if enumeration fails).
  • Whisper UI status no longer shows premature failure before confirmation.
  • Invite failure attribution hardened (prevents mis-attribution when multiple candidates pending).

[0.3.0] - 2026-02-26

Added

  • Multi-page minimal UI:

    • Home (candidate list + actions)
    • Settings (scan & filter config + whisper message)
    • Ads (General/Trade advert config + scheduler queue)
  • Structured whisper queue

  • Invite tracking + blacklist cooldown

  • Post scheduler (queues only; hardware-triggered send)

This mod has no additional files