Giter Site home page Giter Site logo

ranksentinel's Introduction

RankSentinel

RankSentinel watches the combat log and detects when group members (and now their pets!) accidentally use a low-rank ability and sends them a private message so they can fix the issue. It's inspired by the legacy add-on RankWatch.

We built this tool to help your raid group make small improvements so they can avoid those 1%-wipe situations. In testing it detected so many guildies, friends, and PUGs who had just forgotten to update their action bars or macros after training. Everyone has at least one ability they forgot to update. Everyone.

  • Legitimate low-rank Abilities have been excluded
  • Battlegrounds are also excluded
  • Ability data comes from Gogo's revised ability list, please leave a comment for any ability data changes you have in mind.
  • A large focus has been on delivering the most optimized code possible, memory usage is significantly less than Questie, your favorite damage meter, or inventory management add-on.
  • RankSentinel's GitHub issues and CurseForge comments are great locations to report any issues you find.
  • RankSentinel is a spiritual successor to the now-defunct GogoWatch and SpellSnob add-ons.

Commands

Use /ranksentinel to get the latest commands.

  • /ranksentinel enable: toggles combat log parsing
  • /ranksentinel whisper: toggles whispers to players
  • /ranksentinel report [channel]: report session data [self, say, raid, guild]
  • /ranksentinel count: prints current statistics
  • /ranksentinel lead: sets yourself as lead
  • /ranksentinel flavor: list available notification flavors
  • /ranksentinel flavor [option]: set notification flavor to option
  • /ranksentinel advanced: Advanced command-line options

Use /ranksentinel advanced to get additional commands.

  • /ranksentinel debug: toggles debug output for testing
  • /ranksentinel clear: clears local ability caches
  • /ranksentinel ignore: adds current target to addon ignore list, will not report rank errors
  • /ranksentinel queue: prints queued notifications
  • /ranksentinel queue clear: clears queued notifications
  • /ranksentinel queue process: processes queued notifications
  • /ranksentinel reset: resets profile to defaults
  • /ranksentinel sync: broadcast announcement cache

Contributors

  • Gogo - for continued addon collaboration and data curation
  • Aevala and Fathom - ability data feedback
  • Splendiferus - for continued testing and feedback

ranksentinel's People

Contributors

road-block avatar sabrevalkyrn avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

amoeslund freite

ranksentinel's Issues

unexpected symbol near '<'

Comes in multiples of 5 on reloads or zone transitions.

10x ...ceSpellSentinel\libs\CallbackHandler-1.0-7\CallbackHandler-1.0.xml:1: unexpected symbol near '<'


Locals:

Rank 3 Explosive Shot

It might be weird, but the current single target max DPS rotation for survival hunters is to cast a rank 3 explosive shot between your rank 4 explosive shots during Lock and Load. Maybe add the option to ignore user-defined spells per client?

Support SoM/ClassicEra

  • Build ability GSheet
  • Update Build.py for BCC+SoM/ClassicEra
  • Support multi-toc
  • Only load expansion-specific ability data

Separate settings into character profiles

Either changing to AceDB profiles or changing using SavedVariablesPerCharacter

Leveling characters, alts, officers, raiding mains, and likely have different use cases or sway.

Mage Flamestrike, Top 2 Ranks should Always be Viable

So the top 2 ranks should be viable, mages stack them.

I think this can be done by just adjusting the level that the lower rank is allowed.

So if Rank N+1 was 80...

And, Rank N is learned at 78...

Rank N-1 would also be allowed unitl 78.

Late, but hopefully you get it. I'm pretty bushed.

Exclude Flametongue Weapon Rank 9

Rank 9 and 10 don't share internal cooldowns so a minmax shammy will use one on each weapon. Please exclude rank 9.

Or, better yet, I think this addon should have a feature to BLOCK or set a blacklist to spells for whispers from others using the addon. Obviously that's more work but its annoying being whisper spammed because I'm playing my class correctly.

Fix attempt to call method 'SetPoint' (a nil value) on load

Message: Interface\FrameXML\PlayerFrame.lua:330: attempt to call method 'SetPoint' (a nil value)
Time: Sat Dec 25 14:34:31 2021
Count: 1
Stack: Interface\FrameXML\PlayerFrame.lua:330: attempt to call method 'SetPoint' (a nil value)
[string "@Interface\FrameXML\PlayerFrame.lua"]:330: in function `PlayerFrame_ToPlayerArt'
[string "@Interface\FrameXML\PlayerFrame.lua"]:152: in function <Interface\FrameXML\PlayerFrame.lua:134>

Locals: self = PlayerFrame {
 0 = <userdata>
 statusCounter = 0
 portrait = PlayerPortrait {
 }
 manabar = PlayerFrameManaBar {
 }
 statusSign = -1
 unit = "player"
 inSequence = false
 state = "player"
 name = PlayerName {
 }
 feedbackText = PlayerHitIndicator {
 }
 isAnimatedOut = false
 menu = <function> defined @Interface\FrameXML\PlayerFrame.lua:47
 feedbackFontHeight = 30
 healthbar = PlayerFrameHealthBar {
 }
}
(temporary) = nil
(temporary) = "REDACT"
(temporary) = "CENTER"
(temporary) = 50
(temporary) = 19
(temporary) = "attempt to call method 'SetPoint' (a nil value)"

frFR local file

new to github, how/where do i submit my frFR.lua File!
(french translation contribution)
My file is working fine if i replace enUS.lua with mine,
However i can't get the addon to autochoose local currently, but my LUA knowledge is close to none.
EDIT: figured the file is not "that" big, i'll dump it's content here !

local addonName, _ = ...
local L = LibStub("AceLocale-3.0"):NewLocale(addonName, "frFR", true)

L[addonName] = "Rank Sentinel"
L["Enable"] = "activer";
L["Whisper"] = "chuchoter";
L["Debug"] = "Debug";

L["Notification"] = {
    ["random"] = false,
    ["default"] = {
        ["Prefix"] = {
            ["Self"] = '|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_7.blp:0|t',
            ["Whisper"] = string.format("{rt7} %s d\195\169tect\195\169", addonName)
        },
        ["Base"] = "%s (Rang %d) utilis\195\169%s, il y a un nouveau rang au niveau %d.",
        ["Suffix"] = "v\195\169rifiez vos raccourcis la prochaine fois, ou voyez si un maitre a quelque chose \195\160 vous apprendre.",
        ["By"] = " par %s"
    },
    ["troll"] = {
        ["Prefix"] = {
            ["Self"] = '|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_8.blp:0|t',
            ["Whisper"] = string.format("{rt8} %s: Oi,", addonName)
        },
        ["Base"] = "%s (Rang %d) be used%s, new at %d mon.",
        ["Suffix"] = "Ya may be missin' trainin' or usin' an old shortcut",
        ["By"] = " from %s"
    },
    ["gogowatch"] = {
        ["Prefix"] = {
            ["Self"] = '|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_7.blp:0|t you',
            ["Whisper"] = string.format("{rt7} %s: Friendly Reminder! You",
                addonName)
        },
        ["Base"] = "just used a low rank of %s (Rank %d)%s.",
        ["Suffix"] = "Please check your Action Bars or visit your Class Trainer to make sure you've got the right ability for your level.",
        ["By"] = " (on %s)"
    },
    ["ogre"] = {
        ["Prefix"] = {
            ["Self"] = '|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_8.blp:0|t me see',
            ["Whisper"] = "{rt8} me see"
        },
        ["Base"] = "puny %s %d power%s smash lurn gud smash %d.",
        ["Suffix"] = "Big smash!",
        ["By"] = " from %s"
    },
    ["murloc"] = {
        ["Prefix"] = {
            ["Self"] = '|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_4.blp:0|t',
            ["Whisper"] = "{rt4} Mmmrrglllm,"
        },
        ["Base"] = "nk mrrrggk %s %d%s urka %d.",
        ["Suffix"] = "Mmmm mrrrggk!",
        ["By"] = " mmgr %s"
    },
    ["pirate"] = {
        ["Prefix"] = {
            ["Self"] = '|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_2.blp:0|t',
            ["Whisper"] = "{rt2} Ahoy!"
        },
        ["Base"] = "%s (Rank %d) be used%s, there be better booty at %d.",
        ["Suffix"] = "Check yer dock master fer a new beauty!",
        ["By"] = " by ye %s"
    }
}

L["Cache"] = {
    ["Reset"] = "Cache vid\195\169: %d entr\195\169es purg\195\169es et %d rangs max oubli\195\169s",
    ["Queue"] = "mis en attente - %s, %s"
}

L["Broadcast"] = {
    ["Unrecognized"] = "communication non-reconnue(%s), votre ou %s client peut-être obsol\195\168te"
}

L["Cluster"] = {
    ["Lead"] = "Cluster Lead: %s",
    ["Sync"] = "Synchronisation des communications %d",
    ["Batch"] = "synchro l'ensemble %d \195\160 %d"
}

L["Utilities"] = {
    ["Upgrade"] = "Version du Addon chang\195\169, cache r\195\169initialis\195\169",
    ["IgnorePlayer"] = {
        ["Error"] = "Vous devez cibler un joueur",
        ["Ignored"] = "Ignor\195\169: %s",
        ["Unignored"] = "d\195\169-ignor\195\169: %s"
    }
}

L["ChatCommand"] = {
    ["Reset"] = "R\195\169glages reset",
    ["Count"] = {
        ["Spells"] = "Sorts attrap\195\169s: %d",
        ["Ranks"] = "Rangs mis en cache: %d"
    },
    ["Ignore"] = {
        ["Target"] = "Selectionnez une cible \195\160 ignorer",
        ["Count"] = "Ignore actuellement %d joueurs"
    },
    ["Queue"] = {
        ["Clear"] = "Vid\195\169 %d notifications en attente",
        ["Count"] = "Actuellement %d notifications en attente"
    },
    ["Report"] = {
        ["Header"] = "%sD\195\169tect\195\169 %d Rangs bas-niveau cette session",
        ["Summary"] = "%s - %s (Rang %d)",
        ["Unsupported"] = "Canal non-support\195\169 %s"
    },
    ["Flavor"] = {
        ["Set"] = "style de Notification r\195\169gl\195\169 sur: %s",
        ["Available"] = "Styles de notifications disponibles",
        ["Unavailable"] = "le Style %s n'est plus disponible, remis par d\195\169faut"
    }
}

L["Help"] = {
    ["title"] = "Options de ligne de commande",
    ["advanced"] = "Options de ligne de commande avanc\195\169es",
    ["enable"] = "toggle l'analyse du journal de combat",
    ["whisper"] = "toggle le chuchotement aux joueurs",
    ["reset"] = "reset le profil par d\195\169faut",
    ["count"] = "\195\169crit les statistiques actuelles",
    ["debug"] = "toggle le mode debug pour tests",
    ["clear"] = "remet \195\160 z\195\169ro le cache local des sorts",
    ["lead"] = "vous d\195\169fini comme leader",
    ["ignore"] = "ajoute la cible actuelle \195\160 la liste des ignor\195\169s du Addon, ne rapportera plus les erreurs de Rangs",
    ["queue"] = "\195\169crit les notifications en attente",
    ["queue clear"] = "vide les notifications en attente",
    ["queue process"] = "traite les notifications en attente",
    ["sync"] = "envoie le cache des annonces",
    ["report [channel]"] = "rapport des donn\195\169es de la session [self, say, party, raid, guild]",
    ["flavor"] = "liste les styles de notifications disponibles",
    ["flavor [option]"] = "r\195\168gle le style de notifications sur l'option"
}

Troll, ogre, murloc flavors are NOT tranlated (yet)

Add an unsupported notification cache

Add an unsupported cache. I added broadcasting for syncing announcement data.

/sentinel sync to everyone else with an older addon will get like a hundred unrecognized SYNC comm received.

Overhaul notifications messages

  • Convert to friendlier phrasing
  • Simplify cluster broadcasted notification
  • Avoid message duplication on subsequent alerts
  • Simplify queued notification
  • Add rank to notifications

For both in-combat and queued notifications, all happen at once with the same text.

For queued messages, subsequent notifications should be truncated

The next rank of [spell link] is also available at xx.

Separate CLI options into advanced menu

Currently

- enable (true): toggles combat log parsing
- whisper (false): toggles whispers to players
- combat (false): toggles whispers to players after comba
- debug (false): toggles debug output for testing
- report [channel]: report session data [say, raid, guild]
- reset: resets profile to defaults
- count: prints current statistics
- clear: clears local ability caches
- lead (Kymoora): sets yourself as lead
- ignore: adds current target to addon ignore list, will not report rank errors
- queue: prints queued notifications
- queue clear: clears queued notifications
- queue process: processes queued notifications
- sync: broadcast announcement cache

Separate into

Basic

- count: prints current statistics
- enable (true): toggles combat log parsing
- lead (Kymoora): sets yourself as lead
- report [channel]: report session data [say, raid, guild]
- whisper (false): toggles whispers to players
- advanced: show advanced commands

Advanced

- clear: clears local ability caches
- combat (false): toggles whispers to players after combat
- debug (false): toggles debug output for testing
- ignore: adds current target to addon ignore list, will not report rank errors
- queue clear: clears queued notifications
- queue process: processes queued notifications
- queue: prints queued notifications
- reset: resets profile to defaults
- sync: broadcast announcement cache

Explosive Shot Rank 3

I've got a hunter that uses Explosive Shot (Rank 3) in his rotation. There's an explanation on Reddit of why it's used by u/JC3EXD: https://www.reddit.com/r/classicwow/comments/ypaxh0/our_tank_at_malygos/

For context, I play SV hunter, and its not widely known (unless keeping up on hunter discord posts) that during Lock&Load procs, you can actually use different ranks of Explosive Shot to STACK the DoT effect of ability, rather than override it with the same rank. Lock&Load is a proc that occurs from damage/pulse ticks of traps or black arrow that gives you 2 additional charges of Explosive Shot or Arcane Shot with no cooldown (except the gcd). Explosive Shot is the bread & butter ability for SV hunters, so this is great. Explosive Shot, upon reaching the target, instantly deals a tick of fire damage and applies a short DoT, doing 2 more ticks of fire damage one second apart. For reference, as a 214 ilvl hunter in a 25man setting, each tick can crit for over 7k (making this a potential 21k+ damage ability from a single GCD).

The issue is, if you decide to simply press Explosive Shot 3 times in a row (on the GCD) your initial DoT effect is actually replaced by the new one. If you didn't get all three ticks off before applying a new one, the remaining ones are lost. This is known as Explosive Clipping. Usually, you either have to manually time it so that you press your Explosive Shot just as the final tick is about to go off (allowing for travel time on the shot) or you have a WA that basically tells you based on your distance from the boss when you need to press it again to not clip. Because its such a precisely timed ability and you need to get all 3 Explosive Shots off during the L&L window, you usually dont press any buttons whilst waiting for the right time to press ES again (its only just longer than the gcd wait so you dont wait long, but hard-casting something else puts you at risk of not getting all 3 Explosive Shots out before L&L expires). You can use instant abilities, but basically can't cast steady shot during this time. It creates a stutter in what is otherwise a fluid rotation.

However... during Lock&Load, you can actually alternate ranks of Explosive Shot and it won't consume the existing DoT effect, but actually stack them. So, you get the L&L proc, press Explosive Shot max rank (4), then use your next gcd on Explosive Shot (rank 3), then your third on ES (r4, as by this time your initial rank 4 cast should have done all 3 damage ticks or will have done by the time your final shot lands). Then you go back to your rotation with zero downtime or stuttering/pausing for procs. Sure, there is a loss of damage in the lowered rank ability, but its outweighed by the gain achieved from not pausing your rotation during that window (and the damage difference between rank 3 and 4 isn't huge).

Exclude Health Funnel

My warlock friend, who has Illustration trinket thinks it should be excluded to use low rank Health funnel, because he can use it to get stacks up quicker

Add queue command options

Add a /sentinel queue to print queue, then /sentinel queue clear and /sentinel queue process to send out messages

Temporarily ignore players who just levelled

Add player dings to session cache and ignore further alerts. Small chance to hide actual alerts, but far less irritating to ding and get immediately hit with a bunch of alerts.

Move CLEU to it's own frame handler

Can you move CLEU to it's own frame and event handler. I did this to my local copy and it improved my frame rate by at least 20.

    local frame = CreateFrame("Frame")
    frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
    frame:SetScript("OnEvent", function() addon:COMBAT_LOG_EVENT_UNFILTERED() end)

is all you need in the OnEnable()

Clear cache on version change

Right now, if a bugged isMaxRank is cached, rank removals or bug fixes may not take effect until cache is reset.

Store addon version in DB, if runtime version is different than DB version, reset the cache.

Exclude life tap rank 1

Life tap rank 1 is used by warlocks to pre-stack the Life Tap spellpower buff before fights (as well as to proc some trinkets before fights) so I believe it should be excluded from RankSentinel

Big thanks for making RankSentinel by the way, it's awesome!

Add session summary report

In session, start/stop report generation to track player, spellName, and rank used to whisper to raid leader or post to chat.

Request for Creator / Sponsor Names in Tooltips

Nudge people to contribute a bit.

image

Also, request to have anyone on this list automatically made leader in groups.

Take whatever code you want from Groupie / GogoLoot / GDKPd. This is a very light-weight check on GUIDs.

[FR] Add support for public shaming

I'd love to have a toggle to post in channel (or raid if raid, party if party) instead of whisper automatically so everyone can point and laugh together when it procs

Rename project to RankSentinel

After talking with Gogo, RankSentinel seems a better homage to the origin RankWatch.

Will rename after rebuilding ability tables #7

Pets group units cause errors

6x RankSentinel\Utilities.lua:102: attempt to index field 'petOwnerCache' (a nil value)
[string "@RankSentinel\Utilities.lua"]:102: in function <RankSentinel\Utilities.lua:97>
[string "=(tail call)"]: ?
[string "@RankSentinel\RankSentinel-264371b.lua"]:114: in function `?'
[string "@Ace3\CallbackHandler-1.0\CallbackHandler-1.0-7.lua"]:119: in function <...Ons\Ace3\CallbackHandler-1.0\CallbackHandler-1.0.lua:119>
[string "=[C]"]: ?
[string "@Ace3\CallbackHandler-1.0\CallbackHandler-1.0-7.lua"]:29: in function <...Ons\Ace3\CallbackHandler-1.0\CallbackHandler-1.0.lua:25>
[string "@Ace3\CallbackHandler-1.0\CallbackHandler-1.0-7.lua"]:64: in function `Fire'
[string "@Ace3\AceEvent-3.0\AceEvent-3.0-4.lua"]:120: in function <Ace3\AceEvent-3.0\AceEvent-3.0.lua:119>

Flametongue rank 9 and 10

Hi,

Spellweave enhance shamans use Flametongue 9 on Mainhand, and Flametongue 10 on offhand.

Can you whitelist Flametongue 9? It's giving enhancement shamans false positives for not using max rank.

Restore the 1-level Grace Period for Players under 70

Currently the moment someone dings in a dungeon they start getting messages that they are "doing it wrong." The perception is that this isn't really fair because they haven't had time to train yet.

With GogoWatch, we gave a a 1-level grace period makes sense for players under 70. The moment they hit 70, yeah send them all the messages. But when they're leveling, give them a minute to do the right thing on their own. (=

Feature Request: Support for Fishing Poles, Carrots, & Cosmetic Item Warnings

Thinking ahead, when Wrath comes out it's likely that ranks go away.

May be useful to have some sort of reminder about fishing poles. Seem to recall the APIs being in place for inspect, seems fairly low latency to do checks -- maybe it's in the combat log even. That's probably how the parse sites get their gear during casts. May be worth looking into. (=

image

Version Check & Disable for Outdated RankSentinel

Far too often, out-dated RankSentinel makes bugs persist longer than they need to.

Suggest adding a version check, showing that RankSentinel is out of date, and disabling it until the user updates.

Feel free to use any of the code from Groupie for version check.

To remind users to update... you can post a message to the user in place of messages it would send casters of low-rank abilities, "RankSentinel detected {Named} used a low-rank of {Spell}, please update your add-ons to have RankSentinel continue to send messages."

Look, everyone hates all the UX I come up with, but I think this would be better than spamming out low-rank stuff when we fix bugs.

Maybe the ship has sailed already, but better late than never.

Improve player ignore

/sentinel ignore and /ranksentinel ignore work on players inside my group but not players outside my group. I get the following error:

Message: Interface\AddOns\RankSentinel\Cache.lua:5: table index is nil
Time: Tue Dec 28 01:28:57 2021
Count: 8
Stack: Interface\AddOns\RankSentinel\Cache.lua:5: table index is nil
[string "@Interface\SharedXML\SharedBasicControls.lua"]:297: in function <Interface\SharedXML\SharedBasicControls.lua:296>
[string "=[C]"]: ?
[string "@Interface\AddOns\RankSentinel\Cache.lua"]:5: in function `IgnorePlayer'
[string "@Interface\AddOns\RankSentinel\RankSentinel.lua"]:145: in function `ChatCommand'
[string "@Interface\AddOns\RankSentinel\RankSentinel.lua"]:52: in function `?'
[string "@Interface\FrameXML\ChatFrame.lua"]:4825: in function `ChatEdit_ParseText'
[string "@Interface\FrameXML\ChatFrame.lua"]:4488: in function `ChatEdit_SendText'
[string "@Interface\FrameXML\ChatFrame.lua"]:4524: in function <Interface\FrameXML\ChatFrame.lua:4520>
[string "=[C]"]: in function `ChatEdit_OnEnterPressed'
[string "*:OnEnterPressed"]:1: in function <[string "*:OnEnterPressed"]:1>

Locals: errorMessage = "Interface\AddOns\RankSentinel\Cache.lua:5: table index is nil"
DisplayMessageInternal = <function> defined @Interface\SharedXML\SharedBasicControls.lua:279
MESSAGE_TYPE_ERROR = 0

Also, using /sentinel ignore on an already ignored player doesn't remove the ignore (or at least the message doesn't say it does).

Apologies for making this 3 issues in one but a command like /sentinel ignore or /sentinel ignores to list ignored players would be useful

Version 1.2.2-bcc

Reduce Ace3 dependencies

Discovered with #15, there are a lot of embedded Ace3 libraries for an addon without many customization options.

Trim down dependencies, which may also remove the GUI related #16 error.

Support unique or progressive rank abilities

More complex outliers, nice-to-have. Listed in abilities GSheet with Unique rank

Rogue poisons are unique names but upgrades, sort of moot given Rogues can't downrank.

Deadly Poison
Deadly Poison II
Deadly Poison III
Deadly Poison IV
Deadly Poison V
Deadly Poison VI
Deadly Poison VII

Similar scenario with

Conjure Mana Agate
Conjure Mana Citrine
Conjure Mana Emerald
Conjure Mana Jade
Conjure Mana Ruby

As well as Bear Form to Dire Bear Form

Progressive ability groups like Cure->Abolish poison may also be useful.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.