34 Commits

Author SHA1 Message Date
dc94b70259 Add timestamp logging to ChatSniffer events 2025-05-25 02:41:20 +02:00
500c543d7c Add ChatSniffer module and update saved variables 2025-05-25 02:37:07 +02:00
bfce95b299 Ignore zip 2025-05-21 00:07:49 +02:00
a13ad67359 Rename dumpTable to dump and make it work with plain values 2025-05-20 20:34:04 +02:00
d4fd72ec71 Hook friends list show to NOT show while we're waiting for who
This way no window spop up :D
2025-05-20 20:12:28 +02:00
e6525c6443 Release 3.12.0 2025-05-20 18:43:24 +02:00
dfd2064a40 Implement chat copy frame 2025-05-20 18:43:10 +02:00
dfe5b94780 Update subproject commit reference in Meta 2025-05-18 15:16:26 +02:00
52246e2e16 Update subproject commit reference in Meta 2025-05-18 10:18:45 +02:00
4897a5b1a9 Update ticker field type in HeimdallMessengerData and HeimdallNetworkMessengerData 2025-05-18 10:18:11 +02:00
2381f68912 Updater meta config 2025-05-18 10:10:45 +02:00
ad969e8604 Update subproject commit reference in Meta 2025-05-18 10:09:02 +02:00
31678f9a82 Fix config frame visibility in shared.Config.Init() 2025-05-18 10:08:23 +02:00
1785af4d9d Remove the premature exit 2025-05-05 01:16:57 +02:00
69d7efe6f0 Release 3.11.0 2025-05-05 01:16:31 +02:00
202c5d0f46 Update release script to automatically tag releases
Maybe it's a bit better who knows...........
2025-05-05 01:16:21 +02:00
476e907205 Release 3.10.4 2025-05-05 01:15:55 +02:00
724194abe2 Fix up the release to be a little more manual 2025-05-05 01:02:59 +02:00
d57b573683 Update
Some checks failed
Release Workflow / release (push) Failing after 18s
2025-05-05 00:58:16 +02:00
5d8afe8db7 Add the FUCKING REMOVED _
Some checks failed
Release Workflow / release (push) Failing after 18s
2025-05-05 00:30:58 +02:00
b14f1ff2f9 Update
Some checks failed
Release Workflow / release (push) Failing after 18s
2025-05-05 00:02:47 +02:00
a1301abdb2 Update 2025-05-05 00:02:38 +02:00
f897183920 Update 2025-05-04 23:56:58 +02:00
c1885ce76a Fix up config to comply with meta
Update
2025-05-04 23:39:35 +02:00
e676d53e97 Update meta 2025-05-04 23:23:48 +02:00
f05156b257 Update 2025-05-04 21:38:03 +02:00
c8f9d81b3e Remove meaningless vscode settings 2025-05-04 21:37:57 +02:00
3a1639ab27 Clean up the modules a little 2025-05-04 20:47:00 +02:00
1da1e7bf9f Code format
Some checks failed
Release Workflow / release (push) Failing after 23s
2025-05-04 15:09:47 +02:00
304fbcbaae Update meta
Some checks failed
Release Workflow / release (push) Failing after 20s
Update meta
2025-05-04 15:07:42 +02:00
80f8500f6e Add luacheckrcAdd debug logs
Some checks failed
Release Workflow / release (push) Failing after 18s
2025-04-30 20:18:15 +02:00
78cbcbde9d Add luacheckrc 2025-04-30 20:13:10 +02:00
Git Admin
8db1cb179c Release 3.10.1 2025-01-29 20:31:06 +00:00
a065e47545 Automagically tag shit
All checks were successful
Release Workflow / release (push) Successful in 7s
2025-01-29 21:30:56 +01:00
40 changed files with 5119 additions and 4530 deletions

View File

@@ -1,61 +0,0 @@
name: Release Workflow
on: [push]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install zip
run: sudo apt-get install zip
- name: Run deploy script
run: bash deploy.sh
- name: Determine Tag
id: determine_tag
run: |
# Check if the last commit has a tag
TAG=$(git describe --tags --exact-match 2>/dev/null || echo "")
if [ -z "$TAG" ]; then
# Get the latest tag
LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)
# Increment the minor version
IFS='.' read -r -a VERSION_PARTS <<< "$LATEST_TAG"
VERSION_PARTS[2]=$((VERSION_PARTS[2]+1))
TAG="${VERSION_PARTS[0]}.${VERSION_PARTS[1]}.${VERSION_PARTS[2]}"
# Create a new tag
git tag $TAG
git push origin $TAG
fi
echo "::set-output name=tag::$TAG"
- name: Create Release
id: create_release
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.JEBENI_TOKEN }}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"tag_name": "${{ steps.determine_tag.outputs.tag }}",
"name": "${{ steps.determine_tag.outputs.tag }}",
"draft": false,
"prerelease": false
}' \
http://srv-captain--git:3000/api/v1/repos/dave/wow-Heimdall/releases
- name: Upload Release Asset
run: |
RELEASE_ID=$(curl -s \
-H "Authorization: token ${{ secrets.JEBENI_TOKEN }}" \
http://srv-captain--git:3000/api/v1/repos/dave/wow-Heimdall/releases/tags/${{ steps.determine_tag.outputs.tag }} | jq -r '.id')
curl -X POST \
-H "Authorization: token ${{ secrets.JEBENI_TOKEN }}" \
-H "Content-Type: application/zip" \
--data-binary @Heimdall.zip \
http://srv-captain--git:3000/api/v1/repos/dave/wow-Heimdall/releases/${RELEASE_ID}/assets

1
.gitignore vendored
View File

@@ -0,0 +1 @@
*.zip

5
.luacheckrc Symbolic link
View File

@@ -0,0 +1,5 @@
globals = { "CykaPersistentData", "CreateFrame", "GetItemInfo", "aura_env" }
unused_args = false
max_line_length = 150
exclude_files = { "Meta/" }
global = false

14
.luarc.json Symbolic link
View File

@@ -0,0 +1,14 @@
{
"workspace": {
"library": [
"./Meta"
]
},
"diagnostics.disable": [
"unused-local",
"unused-vararg"
],
"diagnostics.globals": [
"aura_env"
]
}

View File

@@ -1,6 +0,0 @@
{
"Lua.diagnostics.globals": [
"UIParent",
"BattlefieldMinimap"
]
}

View File

@@ -2,7 +2,7 @@ local addonname, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local VERSION = "3.10.0"
local VERSION = "3.12.0"
shared.VERSION = VERSION
local function init()
@@ -26,7 +26,7 @@ local function init()
---@field _L fun(key: string, locale: string): string
---@field _Locale Localization
---@field VERSION string
---@field dumpTable fun(table: any, depth?: number): nil
---@field dump fun(table: any, depth?: number): nil
---@field utf8len fun(input: string): number
---@field padString fun(input: string, targetLength: number, left?: boolean): string
---@field GetOrDefault fun(table: table<any, any>, keys: string[], default: any): any
@@ -59,6 +59,7 @@ local function init()
---@field StinkyCache InitTable
---@field Configurator InitTable
---@field AchievementSniffer InitTable
---@field ChatSniffer InitTable
--- Config ---
---@class HeimdallConfig
@@ -140,6 +141,7 @@ local function init()
---@field kickOffline boolean
---@field cleanupInterval number
---@field afkThreshold number
---@field listeningChannel table<string, boolean>
---@class HeimdallDuelerConfig
---@field enabled boolean
@@ -234,6 +236,7 @@ local function init()
---@field enabled boolean
---@field debug boolean
---@field channels string[]
---@field lastNotes number
---@class HeimdallNetworkConfig
---@field enabled boolean
@@ -269,11 +272,11 @@ local function init()
--- Data ---
---@class HeimdallMessengerData
---@field queue table<string, Message>
---@field ticker number?
---@field ticker Timer?
---@class HeimdallNetworkMessengerData
---@field queue table<string, Message>
---@field ticker number?
---@field ticker Timer?
---@class HeimdallWhoData
---@field updateTicker number?
@@ -303,15 +306,13 @@ local function init()
break
end
if i == #keys then
value = traverse
end
if i == #keys then value = traverse end
end
return value
end
shared.messenger = {
queue = {}
queue = {},
}
shared.who = {
ignored = {},
@@ -329,7 +330,7 @@ local function init()
stinky = shared.GetOrDefault(Heimdall_Data, { "config", "spotter", "stinky" }, true),
channels = shared.GetOrDefault(Heimdall_Data, { "config", "spotter", "channels" }, { "Agent" }),
zoneOverride = shared.GetOrDefault(Heimdall_Data, { "config", "spotter", "zoneOverride" }, nil),
throttleTime = shared.GetOrDefault(Heimdall_Data, { "config", "spotter", "throttleTime" }, 10)
throttleTime = shared.GetOrDefault(Heimdall_Data, { "config", "spotter", "throttleTime" }, 10),
},
who = {
enabled = shared.GetOrDefault(Heimdall_Data, { "config", "who", "enabled" }, false),
@@ -373,6 +374,7 @@ local function init()
kickOffline = shared.GetOrDefault(Heimdall_Data, { "config", "inviter", "kickOffline" }, false),
cleanupInterval = shared.GetOrDefault(Heimdall_Data, { "config", "inviter", "cleanupInterval" }, 10),
afkThreshold = shared.GetOrDefault(Heimdall_Data, { "config", "inviter", "afkThreshold" }, 300),
listeningChannel = shared.GetOrDefault(Heimdall_Data, { "config", "inviter", "listeningChannel" }, {}),
},
dueler = {
enabled = shared.GetOrDefault(Heimdall_Data, { "config", "dueler", "enabled" }, false),
@@ -427,7 +429,11 @@ local function init()
enabled = shared.GetOrDefault(Heimdall_Data, { "config", "messageDelegator", "enabled" }, false),
debug = shared.GetOrDefault(Heimdall_Data, { "config", "messageDelegator", "debug" }, false),
delegates = shared.GetOrDefault(Heimdall_Data, { "config", "messageDelegator", "delegates" }, {}),
masterChannel = shared.GetOrDefault(Heimdall_Data, { "config", "messageDelegator", "masterChannel" }, "Agent"),
masterChannel = shared.GetOrDefault(
Heimdall_Data,
{ "config", "messageDelegator", "masterChannel" },
"Agent"
),
},
sniffer = {
enabled = shared.GetOrDefault(Heimdall_Data, { "config", "sniffer", "enabled" }, false),
@@ -445,37 +451,71 @@ local function init()
scale = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "scale" }, 3),
tagTTL = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "tagTTL" }, 1),
tagSound = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "tagSound" }, false),
tagSoundFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "tagSoundFile" },
"MGSSpot.ogg"),
tagSoundFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "tagSoundFile" },
"MGSSpot.ogg"
),
tagSoundThrottle = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "tagSoundThrottle" }, 0),
tagTextureFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "tagTextureFile" },
"Aura4.tga"),
tagTextureFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "tagTextureFile" },
"Aura4.tga"
),
---
alertTTL = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "alertTTL" }, 1),
alertSound = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "alertSound" }, false),
alertSoundFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "alertSoundFile" },
"OOF.ogg"),
alertSoundThrottle = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "alertSoundThrottle" },
0),
alertTextureFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "alertTextureFile" },
"Aura27.tga"),
alertSoundFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "alertSoundFile" },
"OOF.ogg"
),
alertSoundThrottle = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "alertSoundThrottle" },
0
),
alertTextureFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "alertTextureFile" },
"Aura27.tga"
),
---
combatTTL = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "combatTTL" }, 1),
combatSound = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "combatSound" }, false),
combatSoundFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "combatSoundFile" },
"StarScream.ogg"),
combatSoundThrottle = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "combatSoundThrottle" },
2),
combatTextureFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "combatTextureFile" },
"Aura58.tga"),
combatSoundFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "combatSoundFile" },
"StarScream.ogg"
),
combatSoundThrottle = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "combatSoundThrottle" },
2
),
combatTextureFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "combatTextureFile" },
"Aura58.tga"
),
---
helpTTL = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "helpTTL" }, 1),
helpSound = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "helpSound" }, false),
helpSoundFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "helpSoundFile" },
"MedicGangsterParadise.ogg"),
helpSoundThrottle = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "helpSoundThrottle" }, 2),
helpTextureFile = shared.GetOrDefault(Heimdall_Data, { "config", "minimapTagger", "helpTextureFile" },
"Aura68.tga"),
helpSoundFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "helpSoundFile" },
"MedicGangsterParadise.ogg"
),
helpSoundThrottle = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "helpSoundThrottle" },
2
),
helpTextureFile = shared.GetOrDefault(
Heimdall_Data,
{ "config", "minimapTagger", "helpTextureFile" },
"Aura68.tga"
),
},
whisperNotify = shared.GetOrDefault(Heimdall_Data, { "config", "whisperNotify" }, {}),
stinkies = shared.GetOrDefault(Heimdall_Data, { "config", "stinkies" }, {}),
@@ -550,7 +590,7 @@ local function init()
["Void Elf"] = "Alliance",
["Lightforged Draenei"] = "Alliance",
["Mechagnome"] = "Alliance",
["Mag'har Orc"] = "Horde"
["Mag'har Orc"] = "Horde",
}
shared.classColors = {
@@ -565,15 +605,13 @@ local function init()
["Warlock"] = "8788EE",
["Monk"] = "00FF98",
["Druid"] = "FF7C0A",
["Demon Hunter"] = "A330C9"
["Demon Hunter"] = "A330C9",
}
---@param input string
---@return number
shared.utf8len = function(input)
if not input then
return 0
end
if not input then return 0 end
local len = 0
local i = 1
local n = #input
@@ -615,9 +653,7 @@ local function init()
---@param deliminer string
---@return table<number, string>
shared.Split = function(input, deliminer)
if deliminer == nil then
deliminer = "%s"
end
if deliminer == nil then deliminer = "%s" end
local t = {}
for str in string.gmatch(input, "([^" .. deliminer .. "]+)") do
table.insert(t, str)
@@ -636,9 +672,7 @@ local function init()
local mem = {} -- memoizing table
setmetatable(mem, { __mode = "kv" }) -- make it weak
return function(x) -- new version of f, with memoizing
if Heimdall_Data.config.debug then
print(string.format("[Heimdall] Memoize %s", tostring(x)))
end
if Heimdall_Data.config.debug then print(string.format("[Heimdall] Memoize %s", tostring(x))) end
local r = mem[x]
if r == nil then -- no previous result?
if Heimdall_Data.config.debug then
@@ -659,22 +693,20 @@ local function init()
---@param channel string
---@return string
shared.GetLocaleForChannel = function(channel)
return Heimdall_Data.config.channelLocale[channel] or "en"
end
shared.GetLocaleForChannel = function(channel) return Heimdall_Data.config.channelLocale[channel] or "en" end
---@param key string
---@param locale string
---@return string
shared._L = function(key, locale)
local locale = shared._Locale[locale]
if not locale then
local localeTable = shared._Locale[locale]
if not localeTable then
if Heimdall_Data.config.debug then
print(string.format("[Heimdall] Locale %s not found", tostring(locale)))
end
return key
end
local value = locale[key]
local value = localeTable[key]
if not value then
if Heimdall_Data.config.debug then
print(string.format("[Heimdall] Key %s not found in locale %s", tostring(key), tostring(locale)))
@@ -706,13 +738,78 @@ local function init()
shared.Configurator.Init()
shared.StinkyCache.Init()
shared.AchievementSniffer.Init()
shared.ChatSniffer.Init()
print("Heimdall loaded!")
end
local loadedFrame = CreateFrame("Frame")
loadedFrame:RegisterEvent("ADDON_LOADED")
loadedFrame:SetScript("OnEvent", function(self, event, addonName)
if addonName == addonname then
init()
end
if addonName == addonname then init() end
end)
-- Create the import/export frame
local ccpFrame = CreateFrame("Frame", "CCPFrame", UIParent)
ccpFrame:SetSize(512 * 1.5, 512 * 1.5)
ccpFrame:SetPoint("CENTER")
ccpFrame:SetFrameStrata("HIGH")
ccpFrame:EnableMouse(true)
ccpFrame:SetMovable(true)
ccpFrame:SetResizable(false)
ccpFrame:SetBackdrop({
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = true,
tileSize = 4,
edgeSize = 4,
insets = {
left = 4,
right = 4,
top = 4,
bottom = 4,
},
})
ccpFrame:SetBackdropColor(0, 0, 0, 0.8)
ccpFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
ccpFrame:SetMovable(true)
ccpFrame:EnableMouse(true)
ccpFrame:RegisterForDrag("LeftButton")
ccpFrame:SetScript("OnDragStart", function(self) self:StartMoving() end)
ccpFrame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
ccpFrame:SetScript("OnShow", function(self) self:SetScale(1) end)
ccpFrame:Hide()
-- Create scroll frame
local scrollFrame = CreateFrame("ScrollFrame", "CCPFrameScrollFrame", ccpFrame, "UIPanelScrollFrameTemplate")
scrollFrame:SetPoint("TOPLEFT", ccpFrame, "TOPLEFT", 10, -10)
scrollFrame:SetPoint("BOTTOMRIGHT", ccpFrame, "BOTTOMRIGHT", -30, 10)
-- Create the text box
local ccpFrameTextBox = CreateFrame("EditBox", "CCPFrameTextBox", scrollFrame)
ccpFrameTextBox:SetSize(512 * 1.5 - 40, 512 * 1.5 - 20)
ccpFrameTextBox:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
ccpFrameTextBox:SetFont("Fonts\\FRIZQT__.ttf", 12)
ccpFrameTextBox:SetTextColor(1, 1, 1, 1)
ccpFrameTextBox:SetTextInsets(10, 10, 10, 10)
ccpFrameTextBox:SetMultiLine(true)
ccpFrameTextBox:SetAutoFocus(true)
ccpFrameTextBox:SetMaxLetters(1000000)
ccpFrameTextBox:SetScript("OnEscapePressed", function(self) ccpFrame:Hide() end)
-- Set the scroll frame's scroll child
scrollFrame:SetScrollChild(ccpFrameTextBox)
CCP = function(window)
window = window or 1
local charFrame = _G["ChatFrame" .. window]
local maxLines = charFrame:GetNumMessages() or 0
local chat = {}
for i = 1, maxLines do
local currentMsg = charFrame:GetMessageInfo(i)
chat[#chat + 1] = currentMsg
end
ccpFrameTextBox:SetText(table.concat(chat, "\n"))
ccpFrame:Show()
ccpFrameTextBox:SetFocus()
end

View File

@@ -1,9 +1,9 @@
## Interface: 70300
## Title: Heimdall
## Version: 3.10.0
## Version: 3.12.0
## Notes: Watches over areas and alerts when hostiles spotted
## Author: Cyka
## SavedVariables: Heimdall_Data, Heimdall_Achievements
## SavedVariables: Heimdall_Data, Heimdall_Achievements, Heimdall_Chat
_L.lua
Modules/CLEUParser.lua
@@ -33,4 +33,5 @@ Modules/NetworkMessenger.lua
Modules/StinkyCache.lua
Modules/Configurator.lua
Modules/AchievementSniffer.lua
Modules/ChatSniffer.lua
Heimdall.lua

BIN
Heimdall.zip (Stored with Git LFS)

Binary file not shown.

2
Meta

Submodule Meta updated: c0337ef97f...eee043a846

View File

@@ -1,10 +1,9 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "AchievementSniffer"
local HeimdallRoot = "Interface\\AddOns\\Heimdall\\"
local TextureRoot = HeimdallRoot .. "Texture\\"
-- local HeimdallRoot = "Interface\\AddOns\\Heimdall\\"
-- local TextureRoot = HeimdallRoot .. "Texture\\"
local Achievements = {
15,
@@ -248,9 +247,7 @@ function shared.AchievementSniffer.Init()
if Heimdall_Data.config.achievementSniffer.debug then
print(string.format("[%s] Event triggered: %s for unit: %s", ModuleName, event, unit))
end
if event == "NAME_PLATE_UNIT_ADDED" then
TryInspect(unit)
end
if event == "NAME_PLATE_UNIT_ADDED" then TryInspect(unit) end
--UpdateFrames()
end)
@@ -271,7 +268,6 @@ function shared.AchievementSniffer.Init()
Scan(name)
end)
local function Tick()
C_Timer.NewTimer(Heimdall_Data.config.achievementSniffer.scanInterval, Tick)
if not Heimdall_Data.config.achievementSniffer.enabled then return end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "AgentTracker"
---@diagnostic disable-next-line: missing-fields
@@ -37,16 +36,20 @@ function shared.AgentTracker.Init()
local newAgents = 0
for i = 1, count do
local name = GetChannelRosterInfo(index, i)
name = GetChannelRosterInfo(index, i)
if name then
local isNewAgent = not Heimdall_Data.config.agents[name]
Heimdall_Data.config.agents[name] = date("%Y-%m-%dT%H:%M:%S")
if isNewAgent then
newAgents = newAgents + 1
end
if isNewAgent then newAgents = newAgents + 1 end
if Heimdall_Data.config.agentTracker.debug then
print(string.format("[%s] %s agent: %s", ModuleName, isNewAgent and "Added new" or "Updated existing",
name))
print(
string.format(
"[%s] %s agent: %s",
ModuleName,
isNewAgent and "Added new" or "Updated existing",
name
)
)
end
end
end
@@ -86,23 +89,30 @@ function shared.AgentTracker.Init()
end
if Heimdall_Data.config.agentTracker.debug then
print(string.format("[%s] Processing message from master channel: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.agentTracker)
shared.dump(Heimdall_Data.config.agentTracker)
end
sender = string.match(sender, "^[^-]+")
local isNewAgent = not Heimdall_Data.config.agents[sender]
Heimdall_Data.config.agents[sender] = date("%Y-%m-%dT%H:%M:%S")
if Heimdall_Data.config.agentTracker.debug then
print(string.format("[%s] %s agent from message: %s", ModuleName,
isNewAgent and "Added new" or "Updated existing", sender))
print(
string.format(
"[%s] %s agent from message: %s",
ModuleName,
isNewAgent and "Added new" or "Updated existing",
sender
)
)
end
end)
if Heimdall_Data.config.agentTracker.debug then
local count = 0
for _ in pairs(Heimdall_Data.config.agents) do count = count + 1 end
for _ in pairs(Heimdall_Data.config.agents) do
count = count + 1
end
print(string.format("[%s] Module initialized - Tracking %d agents", ModuleName, count))
end
print("[Heimdall] AgentTracker loaded")

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "BonkDetector"
---@diagnostic disable-next-line: missing-fields
@@ -30,14 +29,23 @@ function shared.BonkDetector.Init()
return
end
local source, err = CLEUParser.GetSourceName(...)
---@type string|nil, string, string, string, string
local err, source, sourceGUID, destination, destinationGUID
source, err = CLEUParser.GetSourceName(...)
if err then
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Error getting source name: %s", ModuleName, err))
end
return
end
local sourceGUID = CLEUParser.GetSourceGUID(...)
sourceGUID, err = CLEUParser.GetSourceGUID(...)
if err then
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Error getting source GUID: %s", ModuleName, err))
end
return
end
if not string.find(sourceGUID, "Player") then
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Source %s is not a player, nothing to do", ModuleName, source))
@@ -45,14 +53,20 @@ function shared.BonkDetector.Init()
return
end
local destination, err = CLEUParser.GetDestName(...)
destination, err = CLEUParser.GetDestName(...)
if err then
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Error getting destination name: %s", ModuleName, err))
end
return
end
local destinationGUID = CLEUParser.GetDestGUID(...)
destinationGUID, err = CLEUParser.GetDestGUID(...)
if err then
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Error getting destination GUID: %s", ModuleName, err))
end
return
end
if not string.find(destinationGUID, "Player") then
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Destination %s is not a player, nothing to do", ModuleName, destination))
@@ -73,8 +87,14 @@ function shared.BonkDetector.Init()
if lastReportTime[source] and (currentTime - lastReportTime[source]) < throttle then
if Heimdall_Data.config.bonkDetector.debug then
local timeLeft = throttle - (currentTime - lastReportTime[source])
print(string.format("[%s] Damage report throttled for %s (%.1f seconds remaining)",
ModuleName, source, timeLeft))
print(
string.format(
"[%s] Damage report throttled for %s (%.1f seconds remaining)",
ModuleName,
source,
timeLeft
)
)
end
return
end
@@ -82,8 +102,15 @@ function shared.BonkDetector.Init()
lastReportTime[source] = currentTime
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Processing damage event - Source: %s, Target: %s, Type: %s",
ModuleName, source, destination, subevent))
print(
string.format(
"[%s] Processing damage event - Source: %s, Target: %s, Type: %s",
ModuleName,
source,
destination,
subevent
)
)
end
for _, channel in pairs(Heimdall_Data.config.bonkDetector.channels) do
@@ -97,7 +124,7 @@ function shared.BonkDetector.Init()
}
if Heimdall_Data.config.bonkDetector.debug then
print(string.format("[%s] Queuing bonk detector message", ModuleName))
shared.dumpTable(message)
shared.dump(message)
end
table.insert(shared.messenger.queue, message)
end

View File

@@ -1,13 +1,10 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Bully"
---@diagnostic disable-next-line: missing-fields
shared.Bully = {}
function shared.Bully.Init()
if Heimdall_Data.config.bully.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.bully.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] Bully loaded")
end

View File

@@ -12,12 +12,12 @@ local function Init()
["destGUID"] = 8,
["destName"] = 9,
["destFlags"] = 10,
["destRaidFlags"] = 11
["destRaidFlags"] = 11,
},
["GENERIC_SPELL"] = {
["spellId"] = 12,
["spellName"] = 13,
["spellSchool"] = 14
["spellSchool"] = 14,
},
["GENERIC_DAMAGE"] = {
["amount"] = 15,
@@ -29,19 +29,19 @@ local function Init()
["critical"] = 21,
["glancing"] = 22,
["crushing"] = 23,
["isOffHand"] = 24
["isOffHand"] = 24,
},
["GENERIC_MISSED"] = {
["missType"] = 15,
["isOffHand"] = 16,
["amountMissed"] = 17,
["critical"] = 18
["critical"] = 18,
},
["GENERIC_HEAL"] = {
["amount"] = 15,
["overhealing"] = 16,
["absorbed"] = 17,
["critical"] = 18
["critical"] = 18,
},
["GENERIC_HEAL_ABSORBED"] = {
["extraGUID"] = 15,
@@ -52,44 +52,44 @@ local function Init()
["extraSpellName"] = 20,
["extraSchool"] = 21,
["absorbedAmount"] = 22,
["totalAmount"] = 23
["totalAmount"] = 23,
},
["GENERIC_ENERGIZE"] = {
["amount"] = 15,
["overEnergize"] = 16,
["powerType"] = 17
["powerType"] = 17,
},
["GENERIC_DRAIN"] = {
["amount"] = 15,
["powerType"] = 16,
["extraAmount"] = 17
["extraAmount"] = 17,
},
["GENERIC_LEECH"] = {
["amount"] = 15,
["powerType"] = 16,
["extraAmount"] = 17
["extraAmount"] = 17,
},
["GENERIC_INTERRUPT"] = {
["extraSpellId"] = 15,
["extraSpellName"] = 16,
["extraSchool"] = 17
["extraSchool"] = 17,
},
["GENERIC_DISPEL"] = {
["extraSpellId"] = 15,
["extraSpellName"] = 16,
["extraSchool"] = 17,
["auraType"] = 18
["auraType"] = 18,
},
["GENERIC_DISPEL_FAILED"] = {
["extraSpellId"] = 15,
["extraSpellName"] = 16,
["extraSchool"] = 17
["extraSchool"] = 17,
},
["GENERIC_STOLEN"] = {
["extraSpellId"] = 15,
["extraSpellName"] = 16,
["extraSchool"] = 17,
["auraType"] = 18
["auraType"] = 18,
},
["GENERIC_EXTRA_ATTACKS"] = { ["amount"] = 15 },
["GENERIC_AURA_APPLIED"] = { ["auraType"] = 15, ["amount"] = 16 },
@@ -102,38 +102,32 @@ local function Init()
["extraSpellId"] = 15,
["extraSpellName"] = 16,
["extraSchool"] = 17,
["auraType"] = 18
["auraType"] = 18,
},
["GENERIC_CAST_START"] = {},
["GENERIC_CAST_SUCCESS"] = {},
["GENERIC_CAST_FAILED"] = {}
["GENERIC_CAST_FAILED"] = {},
}
CLEUEventInfo["SWING_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"]
CLEUEventInfo["SWING_MISSED"] = CLEUEventInfo["GENERIC_MISSED"]
CLEUEventInfo["SWING_HEAL"] = CLEUEventInfo["GENERIC_HEAL"]
CLEUEventInfo["SWING_HEAL_ABSORBED"] =
CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["SWING_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["SWING_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"]
CLEUEventInfo["SWING_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"]
CLEUEventInfo["SWING_LEECH"] = CLEUEventInfo["GENERIC_LEECH"]
CLEUEventInfo["SWING_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"]
CLEUEventInfo["SWING_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"]
CLEUEventInfo["SWING_DISPEL_FAILED"] =
CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["SWING_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["SWING_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"]
CLEUEventInfo["SWING_EXTRA_ATTACKS"] =
CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["SWING_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["SWING_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"]
CLEUEventInfo["SWING_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"]
CLEUEventInfo["SWING_AURA_APPLIED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["SWING_AURA_REMOVED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["SWING_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["SWING_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["SWING_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"]
CLEUEventInfo["SWING_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"]
CLEUEventInfo["SWING_AURA_BROKEN_SPELL"] =
CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["SWING_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["SWING_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"]
CLEUEventInfo["SWING_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"]
CLEUEventInfo["SWING_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"]
@@ -141,28 +135,22 @@ local function Init()
CLEUEventInfo["RANGE_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"]
CLEUEventInfo["RANGE_MISSED"] = CLEUEventInfo["GENERIC_MISSED"]
CLEUEventInfo["RANGE_HEAL"] = CLEUEventInfo["GENERIC_HEAL"]
CLEUEventInfo["RANGE_HEAL_ABSORBED"] =
CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["RANGE_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["RANGE_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"]
CLEUEventInfo["RANGE_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"]
CLEUEventInfo["RANGE_LEECH"] = CLEUEventInfo["GENERIC_LEECH"]
CLEUEventInfo["RANGE_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"]
CLEUEventInfo["RANGE_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"]
CLEUEventInfo["RANGE_DISPEL_FAILED"] =
CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["RANGE_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["RANGE_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"]
CLEUEventInfo["RANGE_EXTRA_ATTACKS"] =
CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["RANGE_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["RANGE_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"]
CLEUEventInfo["RANGE_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"]
CLEUEventInfo["RANGE_AURA_APPLIED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["RANGE_AURA_REMOVED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["RANGE_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["RANGE_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["RANGE_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"]
CLEUEventInfo["RANGE_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"]
CLEUEventInfo["RANGE_AURA_BROKEN_SPELL"] =
CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["RANGE_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["RANGE_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"]
CLEUEventInfo["RANGE_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"]
CLEUEventInfo["RANGE_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"]
@@ -170,28 +158,22 @@ local function Init()
CLEUEventInfo["SPELL_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"]
CLEUEventInfo["SPELL_MISSED"] = CLEUEventInfo["GENERIC_MISSED"]
CLEUEventInfo["SPELL_HEAL"] = CLEUEventInfo["GENERIC_HEAL"]
CLEUEventInfo["SPELL_HEAL_ABSORBED"] =
CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["SPELL_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["SPELL_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"]
CLEUEventInfo["SPELL_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"]
CLEUEventInfo["SPELL_LEECH"] = CLEUEventInfo["GENERIC_LEECH"]
CLEUEventInfo["SPELL_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"]
CLEUEventInfo["SPELL_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"]
CLEUEventInfo["SPELL_DISPEL_FAILED"] =
CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["SPELL_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["SPELL_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"]
CLEUEventInfo["SPELL_EXTRA_ATTACKS"] =
CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["SPELL_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["SPELL_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"]
CLEUEventInfo["SPELL_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"]
CLEUEventInfo["SPELL_AURA_APPLIED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["SPELL_AURA_REMOVED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["SPELL_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["SPELL_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["SPELL_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"]
CLEUEventInfo["SPELL_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"]
CLEUEventInfo["SPELL_AURA_BROKEN_SPELL"] =
CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["SPELL_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["SPELL_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"]
CLEUEventInfo["SPELL_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"]
CLEUEventInfo["SPELL_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"]
@@ -199,39 +181,25 @@ local function Init()
CLEUEventInfo["SPELL_PERIODIC_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"]
CLEUEventInfo["SPELL_PERIODIC_MISSED"] = CLEUEventInfo["GENERIC_MISSED"]
CLEUEventInfo["SPELL_PERIODIC_HEAL"] = CLEUEventInfo["GENERIC_HEAL"]
CLEUEventInfo["SPELL_PERIODIC_HEAL_ABSORBED"] =
CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["SPELL_PERIODIC_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"]
CLEUEventInfo["SPELL_PERIODIC_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"]
CLEUEventInfo["SPELL_PERIODIC_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"]
CLEUEventInfo["SPELL_PERIODIC_LEECH"] = CLEUEventInfo["GENERIC_LEECH"]
CLEUEventInfo["SPELL_PERIODIC_INTERRUPT"] =
CLEUEventInfo["GENERIC_INTERRUPT"]
CLEUEventInfo["SPELL_PERIODIC_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"]
CLEUEventInfo["SPELL_PERIODIC_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"]
CLEUEventInfo["SPELL_PERIODIC_DISPEL_FAILED"] =
CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["SPELL_PERIODIC_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"]
CLEUEventInfo["SPELL_PERIODIC_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"]
CLEUEventInfo["SPELL_PERIODIC_EXTRA_ATTACKS"] =
CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED"] =
CLEUEventInfo["GENERIC_AURA_APPLIED"]
CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED"] =
CLEUEventInfo["GENERIC_AURA_REMOVED"]
CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED_DOSE"] =
CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["SPELL_PERIODIC_AURA_REFRESH"] =
CLEUEventInfo["GENERIC_AURA_REFRESH"]
CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN"] =
CLEUEventInfo["GENERIC_AURA_BROKEN"]
CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN_SPELL"] =
CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["SPELL_PERIODIC_CAST_START"] =
CLEUEventInfo["GENERIC_CAST_START"]
CLEUEventInfo["SPELL_PERIODIC_CAST_SUCCESS"] =
CLEUEventInfo["GENERIC_CAST_SUCCESS"]
CLEUEventInfo["SPELL_PERIODIC_CAST_FAILED"] =
CLEUEventInfo["GENERIC_CAST_FAILED"]
CLEUEventInfo["SPELL_PERIODIC_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"]
CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"]
CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"]
CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"]
CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"]
CLEUEventInfo["SPELL_PERIODIC_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"]
CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"]
CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"]
CLEUEventInfo["SPELL_PERIODIC_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"]
CLEUEventInfo["SPELL_PERIODIC_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"]
CLEUEventInfo["SPELL_PERIODIC_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"]
---@class CLEUParser
CLEUParser = {
@@ -239,132 +207,88 @@ local function Init()
---@return number, nil|string
GetTimestamp = function(...)
local val = select(CLEUEventInfo["GENERIC"]["timestamp"], ...)
if val == nil then
return 0, "Timestamp is nil or missing"
end
if type(val) ~= "number" then
return 0, "Timestamp is not a number"
end
if val == nil then return 0, "Timestamp is nil or missing" end
if type(val) ~= "number" then return 0, "Timestamp is not a number" end
return val, nil
end,
---@param ... any
---@return string, nil|string
GetSubevent = function(...)
local val = select(CLEUEventInfo["GENERIC"]["subevent"], ...)
if val == nil then
return "", "Subevent is nil or missing"
end
if type(val) ~= "string" then
return "", "Subevent is not a string"
end
if val == nil then return "", "Subevent is nil or missing" end
if type(val) ~= "string" then return "", "Subevent is not a string" end
return val, nil
end,
---@param ... any
---@return boolean, nil|string
GetHideCaster = function(...)
local val = select(CLEUEventInfo["GENERIC"]["hideCaster"], ...)
if val == nil then
return false, "HideCaster is nil or missing"
end
if type(val) ~= "boolean" then
return false, "HideCaster is not a boolean"
end
if val == nil then return false, "HideCaster is nil or missing" end
if type(val) ~= "boolean" then return false, "HideCaster is not a boolean" end
return val, nil
end,
---@param ... any
---@return string, nil|string
GetSourceGUID = function(...)
local val = select(CLEUEventInfo["GENERIC"]["sourceGUID"], ...)
if val == nil then
return "", "SourceGUID is nil or missing"
end
if type(val) ~= "string" then
return "", "SourceGUID is not a string"
end
if val == nil then return "", "SourceGUID is nil or missing" end
if type(val) ~= "string" then return "", "SourceGUID is not a string" end
return val, nil
end,
---@param ... any
---@return string, nil|string
GetSourceName = function(...)
local val = select(CLEUEventInfo["GENERIC"]["sourceName"], ...)
if val == nil then
return "", "SourceName is nil or missing"
end
if type(val) ~= "string" then
return "", "SourceName is not a string"
end
if val == nil then return "", "SourceName is nil or missing" end
if type(val) ~= "string" then return "", "SourceName is not a string" end
return val, nil
end,
---@param ... any
---@return number, nil|string
GetSourceFlags = function(...)
local val = select(CLEUEventInfo["GENERIC"]["sourceFlags"], ...)
if val == nil then
return 0, "SourceFlags is nil or missing"
end
if type(val) ~= "number" then
return 0, "SourceFlags is not a number"
end
if val == nil then return 0, "SourceFlags is nil or missing" end
if type(val) ~= "number" then return 0, "SourceFlags is not a number" end
return val, nil
end,
---@param ... any
---@return number, nil|string
GetSourceRaidFlags = function(...)
local val = select(CLEUEventInfo["GENERIC"]["sourceRaidFlags"], ...)
if val == nil then
return 0, "SourceRaidFlags is nil or missing"
end
if type(val) ~= "number" then
return 0, "SourceRaidFlags is not a number"
end
if val == nil then return 0, "SourceRaidFlags is nil or missing" end
if type(val) ~= "number" then return 0, "SourceRaidFlags is not a number" end
return val, nil
end,
---@param ... any
---@return string, nil|string
GetDestGUID = function(...)
local val = select(CLEUEventInfo["GENERIC"]["destGUID"], ...)
if val == nil then
return "", "DestGUID is nil or missing"
end
if type(val) ~= "string" then
return "", "DestGUID is not a string"
end
if val == nil then return "", "DestGUID is nil or missing" end
if type(val) ~= "string" then return "", "DestGUID is not a string" end
return val, nil
end,
---@param ... any
---@return string, nil|string
GetDestName = function(...)
local val = select(CLEUEventInfo["GENERIC"]["destName"], ...)
if val == nil then
return "", "DestName is nil or missing"
end
if type(val) ~= "string" then
return "", "DestName is not a string"
end
if val == nil then return "", "DestName is nil or missing" end
if type(val) ~= "string" then return "", "DestName is not a string" end
return val, nil
end,
---@param ... any
---@return number, nil|string
GetDestFlags = function(...)
local val = select(CLEUEventInfo["GENERIC"]["destFlags"], ...)
if val == nil then
return 0, "DestFlags is nil or missing"
end
if type(val) ~= "number" then
return 0, "DestFlags is not a number"
end
if val == nil then return 0, "DestFlags is nil or missing" end
if type(val) ~= "number" then return 0, "DestFlags is not a number" end
return val, nil
end,
---@param ... any
---@return number, nil|string
GetDestRaidFlags = function(...)
local val = select(CLEUEventInfo["GENERIC"]["destRaidFlags"], ...)
if val == nil then
return 0, "DestRaidFlags is nil or missing"
end
if type(val) ~= "number" then
return 0, "DestRaidFlags is not a number"
end
if val == nil then return 0, "DestRaidFlags is nil or missing" end
if type(val) ~= "number" then return 0, "DestRaidFlags is not a number" end
return val, nil
end,
@@ -380,9 +304,7 @@ local function Init()
GetSpellId = function(...)
local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellId"], ...)
if val == nil then return 0, "SpellId is nil or missing" end
if type(val) ~= "number" then
return 0, "SpellId is not a number"
end
if type(val) ~= "number" then return 0, "SpellId is not a number" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -396,12 +318,8 @@ local function Init()
---@return string, nil|string
GetSpellName = function(...)
local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellName"], ...)
if val == nil then
return "", "SpellName is nil or missing"
end
if type(val) ~= "string" then
return "", "SpellName is not a string"
end
if val == nil then return "", "SpellName is nil or missing" end
if type(val) ~= "string" then return "", "SpellName is not a string" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -414,14 +332,9 @@ local function Init()
---@param ... any
---@return number, nil|string
GetSpellSchool = function(...)
local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellSchool"],
...)
if val == nil then
return 0, "SpellSchool is nil or missing"
end
if type(val) ~= "number" then
return 0, "SpellSchool is not a number"
end
local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellSchool"], ...)
if val == nil then return 0, "SpellSchool is nil or missing" end
if type(val) ~= "number" then return 0, "SpellSchool is not a number" end
return val, nil
end,
@@ -451,15 +364,10 @@ local function Init()
---@return number, nil|string
GetAmount = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["amount"], ...)
if val == nil then return 0, "Amount is nil or missing" end
if type(val) ~= "number" then
return 0, "Amount is not a number"
end
if type(val) ~= "number" then return 0, "Amount is not a number" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -479,21 +387,12 @@ local function Init()
---@return number, nil|string
GetOverkill = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if not CLEUEventInfo[subevent] then
return 0, "Subevent is not a valid event"
end
if not CLEUEventInfo[subevent]["overkill"] then
return 0, "Overkill is nil or missing"
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
if not CLEUEventInfo[subevent] then return 0, "Subevent is not a valid event" end
if not CLEUEventInfo[subevent]["overkill"] then return 0, "Overkill is nil or missing" end
local val = select(CLEUEventInfo[subevent]["overkill"], ...)
if val == nil then return 0, "Overkill is nil or missing" end
if type(val) ~= "number" then
return 0, "Overkill is not a number"
end
if type(val) ~= "number" then return 0, "Overkill is not a number" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -513,15 +412,10 @@ local function Init()
---@return number, nil|string
GetSchool = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["school"], ...)
if val == nil then return 0, "School is nil or missing" end
if type(val) ~= "number" then
return 0, "School is not a number"
end
if type(val) ~= "number" then return 0, "School is not a number" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -543,17 +437,10 @@ local function Init()
---@return boolean, nil|string
GetResisted = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["resisted"], ...)
if val == nil then
return false, "Resisted is nil or missing"
end
if type(val) ~= "boolean" then
return false, "Resisted is not a boolean"
end
if val == nil then return false, "Resisted is nil or missing" end
if type(val) ~= "boolean" then return false, "Resisted is not a boolean" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -575,17 +462,10 @@ local function Init()
---@return boolean, nil|string
GetBlocked = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["blocked"], ...)
if val == nil then
return false, "Blocked is nil or missing"
end
if type(val) ~= "boolean" then
return false, "Blocked is not a boolean"
end
if val == nil then return false, "Blocked is nil or missing" end
if type(val) ~= "boolean" then return false, "Blocked is not a boolean" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -608,17 +488,10 @@ local function Init()
---@return boolean, nil|string
GetAbsorbed = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["absorbed"], ...)
if val == nil then
return false, "Absorbed is nil or missing"
end
if type(val) ~= "boolean" then
return false, "Absorbed is not a boolean"
end
if val == nil then return false, "Absorbed is nil or missing" end
if type(val) ~= "boolean" then return false, "Absorbed is not a boolean" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -640,17 +513,10 @@ local function Init()
---@return boolean, nil|string
GetCritical = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["critical"], ...)
if val == nil then
return false, "Critical is nil or missing"
end
if type(val) ~= "boolean" then
return false, "Critical is not a boolean"
end
if val == nil then return false, "Critical is nil or missing" end
if type(val) ~= "boolean" then return false, "Critical is not a boolean" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -670,17 +536,10 @@ local function Init()
---@return boolean, nil|string
GetGlancing = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["glancing"], ...)
if val == nil then
return false, "Glancing is nil or missing"
end
if type(val) ~= "boolean" then
return false, "Glancing is not a boolean"
end
if val == nil then return false, "Glancing is nil or missing" end
if type(val) ~= "boolean" then return false, "Glancing is not a boolean" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -700,17 +559,10 @@ local function Init()
---@return boolean, nil|string
GetCrushing = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["crushing"], ...)
if val == nil then
return false, "Crushing is nil or missing"
end
if type(val) ~= "boolean" then
return false, "Crushing is not a boolean"
end
if val == nil then return false, "Crushing is nil or missing" end
if type(val) ~= "boolean" then return false, "Crushing is not a boolean" end
return val, nil
end,
--- Specific to subevents prefixed by:
@@ -731,17 +583,10 @@ local function Init()
---@return boolean, nil|string
GetIsOffHand = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return false,
string.format("Failed getting subevent due to: %s", err)
end
if err then return false, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["isOffHand"], ...)
if val == nil then
return false, "IsOffHand is nil or missing"
end
if type(val) ~= "boolean" then
return false, "IsOffHand is not a boolean"
end
if val == nil then return false, "IsOffHand is nil or missing" end
if type(val) ~= "boolean" then return false, "IsOffHand is not a boolean" end
return val, nil
end,
@@ -764,17 +609,10 @@ local function Init()
---@return string, nil|string
GetMissType = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return "",
string.format("Failed getting subevent due to: %s", err)
end
if err then return "", string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["missType"], ...)
if val == nil then
return "", "MissType is nil or missing"
end
if type(val) ~= "string" then
return "", "MissType is not a string"
end
if val == nil then return "", "MissType is nil or missing" end
if type(val) ~= "string" then return "", "MissType is not a string" end
return val, nil
end,
@@ -797,17 +635,10 @@ local function Init()
--- return type is unconfirmed!
GetAmountMissed = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["amountMissed"], ...)
if val == nil then
return 0, "AmountMissed is nil or missing"
end
if type(val) ~= "number" then
return 0, "AmountMissed is not a number"
end
if val == nil then return 0, "AmountMissed is nil or missing" end
if type(val) ~= "number" then return 0, "AmountMissed is not a number" end
return val, nil
end,
@@ -830,17 +661,10 @@ local function Init()
---@return number, nil|string
GetOverhealing = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["overhealing"], ...)
if val == nil then
return 0, "Overhealing is nil or missing"
end
if type(val) ~= "number" then
return 0, "Overhealing is not a number"
end
if val == nil then return 0, "Overhealing is nil or missing" end
if type(val) ~= "number" then return 0, "Overhealing is not a number" end
return val, nil
end,
@@ -861,17 +685,10 @@ local function Init()
---@return string, nil|string
GetExtraGUID = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return "",
string.format("Failed getting subevent due to: %s", err)
end
if err then return "", string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraGUID"], ...)
if val == nil then
return "", "ExtraGUID is nil or missing"
end
if type(val) ~= "string" then
return "", "ExtraGUID is not a string"
end
if val == nil then return "", "ExtraGUID is nil or missing" end
if type(val) ~= "string" then return "", "ExtraGUID is not a string" end
return val, nil
end,
@@ -892,17 +709,10 @@ local function Init()
---@return string, nil|string
GetExtraName = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return "",
string.format("Failed getting subevent due to: %s", err)
end
if err then return "", string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraName"], ...)
if val == nil then
return "", "ExtraName is nil or missing"
end
if type(val) ~= "string" then
return "", "ExtraName is not a string"
end
if val == nil then return "", "ExtraName is nil or missing" end
if type(val) ~= "string" then return "", "ExtraName is not a string" end
return val, nil
end,
@@ -923,17 +733,10 @@ local function Init()
---@return number, nil|string
GetExtraFlags = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraFlags"], ...)
if val == nil then
return 0, "ExtraFlags is nil or missing"
end
if type(val) ~= "number" then
return 0, "ExtraFlags is not a number"
end
if val == nil then return 0, "ExtraFlags is nil or missing" end
if type(val) ~= "number" then return 0, "ExtraFlags is not a number" end
return val, nil
end,
@@ -954,17 +757,10 @@ local function Init()
---@return number, nil|string
GetExtraRaidFlags = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraRaidFlags"], ...)
if val == nil then
return 0, "ExtraRaidFlags is nil or missing"
end
if type(val) ~= "number" then
return 0, "ExtraRaidFlags is not a number"
end
if val == nil then return 0, "ExtraRaidFlags is nil or missing" end
if type(val) ~= "number" then return 0, "ExtraRaidFlags is not a number" end
return val, nil
end,
@@ -989,17 +785,10 @@ local function Init()
---@return number, nil|string
GetExtraSpellID = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraSpellID"], ...)
if val == nil then
return 0, "ExtraSpellID is nil or missing"
end
if type(val) ~= "number" then
return 0, "ExtraSpellID is not a number"
end
if val == nil then return 0, "ExtraSpellID is nil or missing" end
if type(val) ~= "number" then return 0, "ExtraSpellID is not a number" end
return val, nil
end,
@@ -1025,17 +814,10 @@ local function Init()
---@return string, nil|string
GetExtraSpellName = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return "",
string.format("Failed getting subevent due to: %s", err)
end
if err then return "", string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraSpellName"], ...)
if val == nil then
return "", "extraSpellName is nil or missing"
end
if type(val) ~= "string" then
return "", "extraSpellName is not a string"
end
if val == nil then return "", "extraSpellName is nil or missing" end
if type(val) ~= "string" then return "", "extraSpellName is not a string" end
return val, nil
end,
@@ -1061,17 +843,10 @@ local function Init()
---@return number, nil|string
GetExtraSchool = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraSchool"], ...)
if val == nil then
return 0, "ExtraSchool is nil or missing"
end
if type(val) ~= "number" then
return 0, "ExtraSchool is not a number"
end
if val == nil then return 0, "ExtraSchool is nil or missing" end
if type(val) ~= "number" then return 0, "ExtraSchool is not a number" end
return val, nil
end,
@@ -1092,17 +867,10 @@ local function Init()
---@return number, nil|string
GetAbsorbedAmount = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["absorbedAmount"], ...)
if val == nil then
return 0, "AbsorbedAmount is nil or missing"
end
if type(val) ~= "number" then
return 0, "AbsorbedAmount is not a number"
end
if val == nil then return 0, "AbsorbedAmount is nil or missing" end
if type(val) ~= "number" then return 0, "AbsorbedAmount is not a number" end
return val, nil
end,
@@ -1123,17 +891,10 @@ local function Init()
---@return number, nil|string
GetOverEnergize = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["overEnergize"], ...)
if val == nil then
return 0, "OverEnergize is nil or missing"
end
if type(val) ~= "number" then
return 0, "OverEnergize is not a number"
end
if val == nil then return 0, "OverEnergize is nil or missing" end
if type(val) ~= "number" then return 0, "OverEnergize is not a number" end
return val, nil
end,
@@ -1158,17 +919,10 @@ local function Init()
---@return number, nil|string
GetPowerType = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["powerType"], ...)
if val == nil then
return 0, "PowerType is nil or missing"
end
if type(val) ~= "number" then
return 0, "PowerType is not a number"
end
if val == nil then return 0, "PowerType is nil or missing" end
if type(val) ~= "number" then return 0, "PowerType is not a number" end
return val, nil
end,
@@ -1190,17 +944,10 @@ local function Init()
---@return number, nil|string
GetExtraAmount = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraAmount"], ...)
if val == nil then
return 0, "ExtraAmount is nil or missing"
end
if type(val) ~= "number" then
return 0, "ExtraAmount is not a number"
end
if val == nil then return 0, "ExtraAmount is nil or missing" end
if type(val) ~= "number" then return 0, "ExtraAmount is not a number" end
return val, nil
end,
@@ -1229,17 +976,10 @@ local function Init()
---@return number, nil|string
GetExtraSpellId = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["extraSpellId"], ...)
if val == nil then
return 0, "ExtraSpellId is nil or missing"
end
if type(val) ~= "number" then
return 0, "ExtraSpellId is not a number"
end
if val == nil then return 0, "ExtraSpellId is nil or missing" end
if type(val) ~= "number" then return 0, "ExtraSpellId is not a number" end
return val, nil
end,
@@ -1268,17 +1008,12 @@ local function Init()
---@return number, nil|string
GetExtraAuraType = function(...)
local subevent, err = CLEUParser.GetSubevent(...)
if err then
return 0,
string.format("Failed getting subevent due to: %s", err)
end
if err then return 0, string.format("Failed getting subevent due to: %s", err) end
local val = select(CLEUEventInfo[subevent]["auraType"], ...)
if val == nil then return 0, "AuraType is nil or missing" end
if type(val) ~= "number" then
return 0, "AuraType is not a number"
end
if type(val) ~= "number" then return 0, "AuraType is not a number" end
return val, nil
end
end,
}
end
@@ -1286,7 +1021,5 @@ local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("GUILD_ROSTER_UPDATE")
frame:SetScript("OnEvent", function(self, event, ...)
Init()
end)
frame:SetScript("OnEvent", function(self, event, ...) Init() end)
Init()

40
Modules/ChatSniffer.lua Normal file
View File

@@ -0,0 +1,40 @@
local _, shared = ...
---@cast shared HeimdallShared
local ModuleName = "ChatSniffer"
---@diagnostic disable-next-line: missing-fields
shared.ChatSniffer = {}
function shared.ChatSniffer.Init()
Heimdall_Chat = Heimdall_Chat or {}
local frame = CreateFrame("Frame")
frame:RegisterEvent("CHAT_MSG_SAY")
frame:RegisterEvent("CHAT_MSG_YELL")
frame:RegisterEvent("CHAT_MSG_CHANNEL")
frame:RegisterEvent("CHAT_MSG_WHISPER")
frame:RegisterEvent("CHAT_MSG_CHANNEL_JOIN")
frame:RegisterEvent("CHAT_MSG_CHANNEL_LEAVE")
frame:RegisterEvent("CHAT_MSG_EMOTE")
frame:RegisterEvent("CHAT_MSG_PARTY")
frame:RegisterEvent("CHAT_MSG_PARTY_LEADER")
frame:RegisterEvent("CHAT_MSG_RAID")
frame:RegisterEvent("CHAT_MSG_RAID_LEADER")
frame:RegisterEvent("CHAT_MSG_RAID_WARNING")
frame:RegisterEvent("CHAT_MSG_SYSTEM")
frame:RegisterEvent("CHAT_MSG_TEXT_EMOTE")
frame:RegisterEvent("CHAT_MSG_YELL")
frame:SetScript("OnEvent", function(self, event, msg, sender, language, channel)
local timestamp = date("%Y-%m-%d %H:%M:%S")
local log = string.format(
"%s|%s|%s|%s|%s|%s",
tostring(timestamp),
tostring(event),
tostring(sender),
tostring(msg),
tostring(language),
tostring(channel)
)
Heimdall_Chat[#Heimdall_Chat + 1] = log
end)
print("[Heimdall] ChatSniffer loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "CombatAlerter"
---@diagnostic disable-next-line: missing-fields
@@ -20,7 +19,10 @@ function shared.CombatAlerter.Init()
return
end
local destination, err = CLEUParser.GetDestName(...)
---@type string|nil, string, string
local err, source, destination
destination, err = CLEUParser.GetDestName(...)
if err then
if Heimdall_Data.config.combatAlerter.debug then
print(string.format("[%s] Error getting destination: %s", ModuleName, err))
@@ -39,7 +41,7 @@ function shared.CombatAlerter.Init()
return
end
local source, err = CLEUParser.GetSourceName(...)
source, err = CLEUParser.GetSourceName(...)
if err then
if Heimdall_Data.config.combatAlerter.debug then
print(string.format("[%s] Error getting source, using 'unknown': %s", ModuleName, err))
@@ -53,8 +55,14 @@ function shared.CombatAlerter.Init()
if shared.stinkyTracker.stinkies and shared.stinkyTracker.stinkies[source] then
if Heimdall_Data.config.combatAlerter.debug then
print(string.format("[%s] Source is tracked stinky: %s (Already alerted: %s)", ModuleName, source,
tostring(alerted[source] or false)))
print(
string.format(
"[%s] Source is tracked stinky: %s (Already alerted: %s)",
ModuleName,
source,
tostring(alerted[source] or false)
)
)
end
if alerted[source] then return end
@@ -63,8 +71,16 @@ function shared.CombatAlerter.Init()
local zone, subZone = GetZoneText(), GetSubZoneText()
if Heimdall_Data.config.combatAlerter.debug then
print(string.format("[%s] Player location: %s/%s at %.2f,%.2f", ModuleName, zone, subZone, x * 100,
y * 100))
print(
string.format(
"[%s] Player location: %s/%s at %.2f,%.2f",
ModuleName,
zone,
subZone,
x * 100,
y * 100
)
)
end
SetMapToCurrentZone()
@@ -73,11 +89,14 @@ function shared.CombatAlerter.Init()
for _, channel in pairs(Heimdall_Data.config.combatAlerter.channels) do
local locale = shared.GetLocaleForChannel(channel)
local text = string.format(shared._L("combatAlerterInCombat", locale),
local text = string.format(
shared._L("combatAlerterInCombat", locale),
source,
shared._L("zone", locale), shared._L("subZone", locale),
shared._L("zone", locale),
shared._L("subZone", locale),
tostring(areaId),
x * 100, y * 100
x * 100,
y * 100
)
---@type Message
local msg = {
@@ -87,7 +106,7 @@ function shared.CombatAlerter.Init()
}
if Heimdall_Data.config.combatAlerter.debug then
print(string.format("[%s] Queuing alert message", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
table.insert(shared.messenger.queue, msg)
end
@@ -111,8 +130,6 @@ function shared.CombatAlerter.Init()
alerted = {}
end)
if Heimdall_Data.config.combatAlerter.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.combatAlerter.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] CombatAlerter loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Commander"
local helpMessages = {
@@ -29,7 +28,7 @@ local helpMessages = {
"9) note <name> i..j - lists notes from i to j for the character.",
"10) note <name> delete i - deletes the i-th note for the character.",
"11) note <name> delete i..j - deletes notes from i to j for the character.",
}
},
}
---@diagnostic disable-next-line: missing-fields
@@ -51,16 +50,12 @@ function shared.Commander.Init()
if #currentChunk + #word + 1 <= size then
currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word)
else
if #currentChunk > 0 then
ret[#ret + 1] = currentChunk
end
if #currentChunk > 0 then ret[#ret + 1] = currentChunk end
currentChunk = word
end
end
if #currentChunk > 0 then
ret[#ret + 1] = currentChunk
end
if #currentChunk > 0 then ret[#ret + 1] = currentChunk end
return ret
end
@@ -69,9 +64,7 @@ function shared.Commander.Init()
local function Count(arr)
local ret = {}
for _, player in pairs(arr) do
if shared.Whoer.ShouldNotifyForZone(player.zone) then
ret[player.zone] = (ret[player.zone] or 0) + 1
end
if shared.Whoer.ShouldNotifyForZone(player.zone) then ret[player.zone] = (ret[player.zone] or 0) + 1 end
end
local text = {}
for zone, count in pairs(ret) do
@@ -84,6 +77,7 @@ function shared.Commander.Init()
local function CountPartitioned(arr)
local count = Count(arr)
local text = {}
---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack
for _, line in pairs(Partition(strjoin(", ", unpack(count)), 200)) do
text[#text + 1] = line
end
@@ -95,8 +89,13 @@ function shared.Commander.Init()
local ret = {}
for _, player in pairs(arr) do
if shared.Whoer.ShouldNotifyForZone(player.zone) then
ret[#ret + 1] = string.format("%s/%s (%s) %s", player.name, player.class, player.zone,
player.stinky and "(!!!!)" or "")
ret[#ret + 1] = string.format(
"%s/%s (%s) %s",
player.name,
player.class,
player.zone,
player.stinky and "(!!!!)" or ""
)
end
end
if Heimdall_Data.config.commander.debug then
@@ -109,6 +108,7 @@ function shared.Commander.Init()
local function WhoPartitioned(arr)
local who = Who(arr)
local text = {}
---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack
for _, line in pairs(Partition(strjoin(", ", unpack(who)), 200)) do
text[#text + 1] = "who: " .. line
end
@@ -119,9 +119,7 @@ function shared.Commander.Init()
local function CountClass(arr)
local ret = {}
for _, player in pairs(arr) do
if shared.Whoer.ShouldNotifyForZone(player.zone) then
ret[player.class] = (ret[player.class] or 0) + 1
end
if shared.Whoer.ShouldNotifyForZone(player.zone) then ret[player.class] = (ret[player.class] or 0) + 1 end
end
local text = {}
for class, count in pairs(ret) do
@@ -137,6 +135,7 @@ function shared.Commander.Init()
local function CountClassPartitioned(arr)
local countClass = CountClass(arr)
local text = {}
---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack
for _, line in pairs(Partition(strjoin(", ", unpack(countClass)), 200)) do
text[#text + 1] = line
end
@@ -144,36 +143,27 @@ function shared.Commander.Init()
end
local function CountClassPartitionedStinkies()
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Executing: CountClassPartitionedStinkies",
ModuleName))
print(string.format("[%s] Executing: CountClassPartitionedStinkies", ModuleName))
end
local res = CountClassPartitioned(HeimdallStinkies)
if #res == 0 then
return { "No stinkies found" }
end
if #res == 0 then return { "No stinkies found" } end
return res
end
local function WhoPartitionedStinkies()
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Executing: WhoPartitionedStinkies",
ModuleName))
shared.dumpTable(HeimdallStinkies)
print(string.format("[%s] Executing: WhoPartitionedStinkies", ModuleName))
shared.dump(HeimdallStinkies)
end
local res = WhoPartitioned(HeimdallStinkies)
if #res == 0 then
return { "No stinkies found" }
end
if #res == 0 then return { "No stinkies found" } end
return res
end
local function CountPartitionedStinkies()
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Executing: CountPartitionedStinkies",
ModuleName))
print(string.format("[%s] Executing: CountPartitionedStinkies", ModuleName))
end
local res = CountPartitioned(HeimdallStinkies)
if #res == 0 then
return { "No stinkies found" }
end
if #res == 0 then return { "No stinkies found" } end
return res
end
local function HelpRu()
@@ -190,26 +180,32 @@ function shared.Commander.Init()
AcceptGroup()
groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST")
C_Timer.NewTimer(0.1, function()
if Heimdall_Data.config.commander.debug then print(string.format("[%s] Click event triggered", ModuleName)) end
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Click event triggered", ModuleName))
end
_G["StaticPopup1Button1"]:Click()
end, 1)
end)
local function JoinGroup()
if Heimdall_Data.config.commander.debug then print(string.format("[%s] JoinGroup command received", ModuleName)) end
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] JoinGroup command received", ModuleName))
end
groupInviteFrame:RegisterEvent("PARTY_INVITE_REQUEST")
C_Timer.NewTimer(10, function()
groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST")
end, 1)
C_Timer.NewTimer(10, function() groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST") end, 1)
return { "+" }
end
local function LeaveGroup()
if Heimdall_Data.config.commander.debug then print(string.format("[%s] LeaveGroup command received", ModuleName)) end
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] LeaveGroup command received", ModuleName))
end
LeaveParty()
return {}
end
---@param target string
local function FollowTarget(target)
if Heimdall_Data.config.commander.debug then print(string.format("[%s] Following target: %s", ModuleName, target)) end
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Following target: %s", ModuleName, target))
end
if not target then return end
FollowUnit(target)
return {}
@@ -218,14 +214,13 @@ function shared.Commander.Init()
---@param args string[]
local function MacroTarget(args)
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Macroing: %s", ModuleName,
strjoin(" ", unpack(args))))
---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack
print(string.format("[%s] Macroing: %s", ModuleName, strjoin(" ", unpack(args))))
end
if #args < 2 or #args % 2 ~= 0 then
if #args < 2 or #args % 2 ~= 0 then
if Heimdall_Data.config.commander.debug then
print(string.format(
"[%s] Invalid number of arguments for MacroTarget", ModuleName))
print(string.format("[%s] Invalid number of arguments for MacroTarget", ModuleName))
end
return {}
end
@@ -243,7 +238,7 @@ function shared.Commander.Init()
name = name,
class = class or "unknown",
seenAt = GetTime(),
hostile = true
hostile = true,
}
end
return {}
@@ -271,7 +266,7 @@ function shared.Commander.Init()
commanderChannelFrame:SetScript("OnEvent", function(self, event, msg, sender, ...)
--if Heimdall_Data.config.commander.debug then
-- print(string.format("[%s] Event received", ModuleName))
-- shared.dumpTable(Heimdall_Data.config.commander)
-- shared.dump(Heimdall_Data.config.commander)
--end
if not Heimdall_Data.config.commander.enabled then
--if Heimdall_Data.config.commander.debug then
@@ -290,8 +285,14 @@ function shared.Commander.Init()
end
if not ok then
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Channel name '%s' does not match any of the channels '%s'", ModuleName,
channelname, table.concat(Heimdall_Data.config.commander.channels, ", ")))
print(
string.format(
"[%s] Channel name '%s' does not match any of the channels '%s'",
ModuleName,
channelname,
table.concat(Heimdall_Data.config.commander.channels, ", ")
)
)
end
return
end
@@ -299,7 +300,7 @@ function shared.Commander.Init()
sender = string.match(sender, "^[^-]+")
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Message from: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.commander)
shared.dump(Heimdall_Data.config.commander)
end
for _, command in ipairs(commands) do
@@ -307,28 +308,33 @@ function shared.Commander.Init()
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Command match: %s = %s", ModuleName, command.keywordRe, tostring(enabled)))
end
if enabled and
(not command.commanderOnly
or (command.commanderOnly
and sender == Heimdall_Data.config.commander.commander)) then
if
enabled
and (
not command.commanderOnly
or (command.commanderOnly and sender == Heimdall_Data.config.commander.commander)
)
then
if msg:match(command.keywordRe) then
---@diagnostic disable-next-line: redundant-parameter Currently luals does not support variadic functions as a @field
local messages = command.callback({ strsplit(",", msg) })
if Heimdall_Data.config.commander.debug then
---@diagnostic disable-next-line: param-type-mismatch
print(string.format("[%s] Messages to send: %s", ModuleName, strjoin(", ", unpack(messages))))
end
for _, message in ipairs(messages) do
---@type Message
local msg = {
local returnmsg = {
channel = "C",
data = channelname,
message = message
message = message,
}
if Heimdall_Data.config.commander.debug then
print(string.format("[%s] Queuing message", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
--table.insert(shared.messenger.queue, msg)
table.insert(shared.networkMessenger.queue, msg)
table.insert(shared.networkMessenger.queue, returnmsg)
end
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,7 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Configurator"
---@diagnostic disable-next-line: missing-fields
shared.Configurator = {}
function shared.Configurator.Init()
print("[Heimdall] Configurator module loaded")
end
function shared.Configurator.Init() print(string.format("[Heimdall] %s module loaded", ModuleName)) end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "DeathReporter"
---@diagnostic disable-next-line: missing-fields
@@ -16,8 +15,15 @@ function shared.DeathReporter.Init()
---@param spellName string
local function RegisterDeath(source, destination, spellName)
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Processing death event - Source: %s, Target: %s, Spell: %s",
ModuleName, source, destination, spellName))
print(
string.format(
"[%s] Processing death event - Source: %s, Target: %s, Spell: %s",
ModuleName,
source,
destination,
spellName
)
)
end
if not Heimdall_Data.config.deathReporter.enabled then
@@ -27,27 +33,52 @@ function shared.DeathReporter.Init()
return
end
if recentDeaths[destination] and GetTime() - recentDeaths[destination] < Heimdall_Data.config.deathReporter.throttle then
if
recentDeaths[destination]
and GetTime() - recentDeaths[destination] < Heimdall_Data.config.deathReporter.throttle
then
if Heimdall_Data.config.deathReporter.debug then
local timeLeft = Heimdall_Data.config.deathReporter.throttle - (GetTime() - recentDeaths[destination])
print(string.format("[%s] Death report throttled for %s (%.1f seconds remaining)",
ModuleName, destination, timeLeft))
print(
string.format(
"[%s] Death report throttled for %s (%.1f seconds remaining)",
ModuleName,
destination,
timeLeft
)
)
end
return
end
if recentDuels[destination] and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle then
if
recentDuels[destination]
and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle
then
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Ignoring death report - Recent duel detected for target: %s", ModuleName,
destination))
print(
string.format(
"[%s] Ignoring death report - Recent duel detected for target: %s",
ModuleName,
destination
)
)
end
return
end
if recentDuels[source] and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle then
if
recentDuels[source]
and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle
then
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Ignoring death report - Recent duel detected for source: %s", ModuleName,
source))
print(
string.format(
"[%s] Ignoring death report - Recent duel detected for source: %s",
ModuleName,
source
)
)
end
return
end
@@ -58,25 +89,48 @@ function shared.DeathReporter.Init()
recentDeaths[destination] = GetTime()
C_Timer.NewTimer(3, function()
if recentDuels[destination] and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle then
if
recentDuels[destination]
and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle
then
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Cancelling delayed death report - Recent duel detected for: %s", ModuleName,
destination))
print(
string.format(
"[%s] Cancelling delayed death report - Recent duel detected for: %s",
ModuleName,
destination
)
)
end
return
end
if recentDuels[source] and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle then
if
recentDuels[source]
and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle
then
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Cancelling delayed death report - Recent duel detected for: %s", ModuleName,
source))
print(
string.format(
"[%s] Cancelling delayed death report - Recent duel detected for: %s",
ModuleName,
source
)
)
end
return
end
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Sending death report - %s killed %s with %s",
ModuleName, source, destination, spellName))
print(
string.format(
"[%s] Sending death report - %s killed %s with %s",
ModuleName,
source,
destination,
spellName
)
)
end
local zone, subzone = GetZoneText() or "Unknown", GetSubZoneText() or "Unknown"
@@ -95,22 +149,26 @@ function shared.DeathReporter.Init()
for _, channel in pairs(Heimdall_Data.config.deathReporter.channels) do
local locale = shared.GetLocaleForChannel(channel)
local text = string.format(shared._L("killed", locale),
local text = string.format(
shared._L("killed", locale),
source,
destination,
shared._L(spellName, locale),
shared._L(zone, locale), shared._L(subzone, locale),
shared._L(zone, locale),
shared._L(subzone, locale),
zoneId,
x * 100, y * 100)
x * 100,
y * 100
)
---@type Message
local msg = {
channel = "C",
data = channel,
message = text
message = text,
}
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Queuing death report message", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
table.insert(shared.messenger.queue, msg)
end
@@ -124,32 +182,33 @@ function shared.DeathReporter.Init()
-- print(string.format("[%s] Received combat log event", ModuleName))
-- end
if not Heimdall_Data.config.deathReporter.enabled then return end
local overkill, err = CLEUParser.GetOverkill(...)
local overkill, source, destination, spellName, sourceGUID, destinationGUID, err
overkill, err = CLEUParser.GetOverkill(...)
if not err and overkill > 0 then
local source, err = CLEUParser.GetSourceName(...)
source, err = CLEUParser.GetSourceName(...)
if err then
source = "unknown"
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Error getting source name", ModuleName))
end
end
local destination, err = CLEUParser.GetDestName(...)
destination, err = CLEUParser.GetDestName(...)
if err then
destination = "unknown"
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Error getting destination name", ModuleName))
end
end
local spellName, err = CLEUParser.GetSpellName(...)
spellName, err = CLEUParser.GetSpellName(...)
if err then
spellName = "unknown"
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Error getting spell name", ModuleName))
end
end
local sourceGUID, err = CLEUParser.GetSourceGUID(...)
sourceGUID, err = CLEUParser.GetSourceGUID(...)
if err or not string.match(sourceGUID, "Player") then return end
local destinationGUID, err = CLEUParser.GetDestGUID(...)
destinationGUID, err = CLEUParser.GetDestGUID(...)
if err or not string.match(destinationGUID, "Player") then return end
RegisterDeath(source, destination, spellName)
end
@@ -162,7 +221,9 @@ function shared.DeathReporter.Init()
local source, destination = string.match(msg, "([^ ]+) has defeated ([^ ]+) in a duel")
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Received system message: %s", ModuleName, msg))
print(string.format("[%s] Source: %s, Destination: %s", ModuleName, tostring(source), tostring(destination)))
print(
string.format("[%s] Source: %s, Destination: %s", ModuleName, tostring(source), tostring(destination))
)
end
if not source or not destination then return end
source = string.match(source, "([^-]+)")
@@ -178,8 +239,14 @@ function shared.DeathReporter.Init()
end)
if Heimdall_Data.config.deathReporter.debug then
print(string.format("[%s] Module initialized with throttle: %.1fs, duel throttle: %.1fs",
ModuleName, Heimdall_Data.config.deathReporter.throttle, Heimdall_Data.config.deathReporter.duelThrottle))
print(
string.format(
"[%s] Module initialized with throttle: %.1fs, duel throttle: %.1fs",
ModuleName,
Heimdall_Data.config.deathReporter.throttle,
Heimdall_Data.config.deathReporter.duelThrottle
)
)
end
print("[Heimdall] DeathReporter loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Dueler"
---@diagnostic disable-next-line: missing-fields
@@ -44,8 +43,13 @@ function shared.Dueler.Init()
end)
if Heimdall_Data.config.dueler.debug then
print(string.format("[%s] Module initialized with auto-decline: %s", ModuleName,
tostring(Heimdall_Data.config.dueler.declineOther)))
print(
string.format(
"[%s] Module initialized with auto-decline: %s",
ModuleName,
tostring(Heimdall_Data.config.dueler.declineOther)
)
)
end
print("[Heimdall] Dueler loaded")
end

View File

@@ -1,28 +1,29 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
if not shared.dumpTable then
---@param table table
if not shared.dump then
---@param value any
---@param depth number?
shared.dumpTable = function(table, depth)
if not table then
print(tostring(table))
shared.dump = function(value, depth)
if not value then
print(tostring(value))
return
end
if depth == nil then
depth = 0
end
if (depth > 200) then
print("Error: Depth > 200 in dumpTable()")
if type(value) ~= "table" then
print(tostring(value))
return
end
for k, v in pairs(table) do
if (type(v) == "table") then
print(string.rep(" ", depth) .. k .. ":")
shared.dumpTable(v, depth + 1)
if depth == nil then depth = 0 end
if depth > 200 then
print("Error: Depth > 200 in dump()")
return
end
for k, v in pairs(value) do
if type(v) == "table" then
print(string.rep(" ", depth) .. tostring(k) .. ":")
shared.dump(v, depth + 1)
else
print(string.rep(" ", depth) .. k .. ": ", v)
print(string.rep(" ", depth) .. tostring(k) .. ": " .. tostring(v))
end
end
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Echoer"
---@diagnostic disable-next-line: missing-fields
@@ -37,25 +36,23 @@ function shared.Echoer.Init()
end
if Heimdall_Data.config.echoer.debug then
print(string.format("[%s] Processing message from master channel: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.echoer)
shared.dump(Heimdall_Data.config.echoer)
end
if string.find(msg, "^" .. Heimdall_Data.config.echoer.prefix) then
if Heimdall_Data.config.echoer.debug then
print(string.format("[%s] Found echo command in message: %s", ModuleName, msg))
end
local msg = string.sub(msg, string.len(Heimdall_Data.config.echoer.prefix) + 1)
local echomsg = string.sub(msg, string.len(Heimdall_Data.config.echoer.prefix) + 1)
if Heimdall_Data.config.echoer.debug then
print(string.format("[%s] Echoing message: %s", ModuleName, msg))
print(string.format("[%s] Echoing message: %s", ModuleName, echomsg))
end
SendChatMessage(msg, "SAY")
SendChatMessage(echomsg, "SAY")
elseif Heimdall_Data.config.echoer.debug then
print(string.format("[%s] Message does not start with echo prefix", ModuleName))
end
end)
if Heimdall_Data.config.echoer.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.echoer.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] Echoer loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Emoter"
---@diagnostic disable-next-line: missing-fields
@@ -38,7 +37,7 @@ function shared.Emoter.Init()
if Heimdall_Data.config.emoter.debug then
print(string.format("[%s] Processing message from master channel: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.emoter)
shared.dump(Heimdall_Data.config.emoter)
end
if string.find(msg, "^" .. Heimdall_Data.config.emoter.prefix) then
@@ -55,8 +54,6 @@ function shared.Emoter.Init()
end
end)
if Heimdall_Data.config.emoter.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.emoter.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] Emoter loaded")
end

View File

@@ -1,14 +1,14 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Inviter"
---@diagnostic disable-next-line: missing-fields
shared.Inviter = {}
function shared.Inviter.Init()
-- Fallback for old config
if type(Heimdall_Data.config.inviter.listeningChannel) == "string" then
Heimdall_Data.config.inviter.listeningChannel = {
[Heimdall_Data.config.inviter.listeningChannel] = true
[Heimdall_Data.config.inviter.listeningChannel] = true,
}
end
---@type Timer
@@ -36,7 +36,9 @@ function shared.Inviter.Init()
if Heimdall_Data.config.inviter.agentsAssist then
if Heimdall_Data.config.inviter.debug then
local agentCount = 0
for _ in pairs(Heimdall_Data.config.agents) do agentCount = agentCount + 1 end
for _ in pairs(Heimdall_Data.config.agents) do
agentCount = agentCount + 1
end
print(string.format("[%s] Processing %d agents for assistant promotion", ModuleName, agentCount))
end
@@ -100,10 +102,18 @@ function shared.Inviter.Init()
local frame = FindPlayerRaidFrame(name)
if frame then
playerButtons[name] = frame
local button = framePool[frame.unit] or CreateFrame("Button",
string.format("HeimdallKickButton%s", frame.unit, frame, "SecureActionButtonTemplate"))
-- All of these are ELVUI specific so they won't be in our meta...
---@diagnostic disable-next-line: undefined-field
local button = framePool[frame.unit]
or CreateFrame(
"Button",
---@diagnostic disable-next-line: undefined-field
string.format("HeimdallKickButton%s", frame.unit, frame, "SecureActionButtonTemplate")
)
---@diagnostic disable-next-line: undefined-field
framePool[frame.unit] = button
---@diagnostic disable-next-line: undefined-field
button:SetSize(frame.UNIT_WIDTH / 2, frame.UNIT_HEIGHT / 2)
button:SetPoint("CENTER", frame, "CENTER", 0, 0)
button:SetNormalTexture("Interface\\Buttons\\UI-GroupLoot-KickIcon")
@@ -142,9 +152,7 @@ function shared.Inviter.Init()
groupMembers[name] = now
else
local online = UnitIsConnected(unit)
if online then
groupMembers[name] = now
end
if online then groupMembers[name] = now end
end
end
end
@@ -197,7 +205,7 @@ function shared.Inviter.Init()
inviterChannelFrame:SetScript("OnEvent", function(self, event, msg, sender, ...)
--if Heimdall_Data.config.inviter.debug then
-- print(string.format("[%s] Chat message received: %s", ModuleName, msg))
-- shared.dumpTable(Heimdall_Data.config.inviter)
-- shared.dump(Heimdall_Data.config.inviter)
--end
if not Heimdall_Data.config.inviter.enabled then return end
local channelId = select(6, ...)
@@ -221,9 +229,7 @@ function shared.Inviter.Init()
return
end
if msg == Heimdall_Data.config.inviter.keyword then
if Heimdall_Data.config.inviter.debug then
print(string.format("[%s] Inviting %s", ModuleName, sender))
end
if Heimdall_Data.config.inviter.debug then print(string.format("[%s] Inviting %s", ModuleName, sender)) end
InviteUnit(sender)
else
if Heimdall_Data.config.inviter.debug then
@@ -233,17 +239,25 @@ function shared.Inviter.Init()
end)
if Heimdall_Data.config.inviter.debug then
print(string.format("[%s] Module initialized - All assist: %s, Agents assist: %s",
print(
string.format(
"[%s] Module initialized - All assist: %s, Agents assist: %s",
ModuleName,
tostring(Heimdall_Data.config.inviter.allAssist),
tostring(Heimdall_Data.config.inviter.agentsAssist)))
tostring(Heimdall_Data.config.inviter.agentsAssist)
)
)
end
if Heimdall_Data.config.inviter.debug then
print(string.format("[%s] Module initialized - All assist: %s, Agents assist: %s",
print(
string.format(
"[%s] Module initialized - All assist: %s, Agents assist: %s",
ModuleName,
tostring(Heimdall_Data.config.inviter.allAssist),
tostring(Heimdall_Data.config.inviter.agentsAssist)))
tostring(Heimdall_Data.config.inviter.agentsAssist)
)
)
end
print("[Heimdall] Inviter loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Macroer"
---@diagnostic disable-next-line: missing-fields
@@ -24,9 +23,7 @@ function shared.Macroer.Init()
CreateMacro(macroName, "INV_Misc_QuestionMark", "")
end
idx = GetMacroIndexByName(macroName)
if Heimdall_Data.config.macroer.debug then
print(string.format("[%s] Macro index: %d", ModuleName, idx))
end
if Heimdall_Data.config.macroer.debug then print(string.format("[%s] Macro index: %d", ModuleName, idx)) end
return idx
end
@@ -56,9 +53,7 @@ function shared.Macroer.Init()
local sortedStinkies = {}
for _, stinky in pairs(stinkies) do
if not Heimdall_Data.config.agents[stinky.name] then
sortedStinkies[#sortedStinkies + 1] = stinky
end
if not Heimdall_Data.config.agents[stinky.name] then sortedStinkies[#sortedStinkies + 1] = stinky end
end
if Heimdall_Data.config.macroer.debug then
@@ -73,7 +68,7 @@ function shared.Macroer.Init()
if Heimdall_Data.config.macroer.debug then
print(string.format("[%s] Sorted stinkies: %d", ModuleName, #sortedStinkies))
shared.dumpTable(sortedStinkies)
shared.dump(sortedStinkies)
end
local lines = { "/targetenemy" }
for _, stinky in pairs(sortedStinkies) do
@@ -86,6 +81,7 @@ function shared.Macroer.Init()
end
local idx = FindOrCreateMacro("HeimdallTarget")
---@diagnostic disable-next-line: param-type-mismatch
local body = strjoin("\n", unpack(lines))
if Heimdall_Data.config.macroer.debug then
print(string.format("[%s] Updating macro with %d lines", ModuleName, #lines))
@@ -100,8 +96,6 @@ function shared.Macroer.Init()
FixMacro(value)
end)
if Heimdall_Data.config.macroer.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.macroer.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] Macroer loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Messenger"
---@diagnostic disable-next-line: missing-fields
@@ -35,45 +34,74 @@ function shared.Messenger.Init()
if not shared.messenger.queue then shared.messenger.queue = {} end
if not shared.messenger.ticker then
local function DoMessage()
--if Heimdall_Data.config.messenger.debug then
-- print(string.format("[%s] Processing message queue", ModuleName))
--end
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Processing message queue - Size: %d", ModuleName, #shared.messenger.queue))
end
if not Heimdall_Data.config.messenger.enabled then
--if Heimdall_Data.config.messenger.debug then
-- print(string.format("[%s] Module disabled, skipping message processing", ModuleName))
--end
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Module disabled, skipping message processing", ModuleName))
end
return
end
---@type Message
local message = shared.messenger.queue[1]
if not message then
--if Heimdall_Data.config.messenger.debug then
-- print(string.format("[%s] Message queue empty", ModuleName))
--end
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Message queue empty", ModuleName))
end
return
end
if Heimdall_Data.config.messenger.debug then
print(
string.format(
"[%s] Processing message - Channel: %s, Data: %s",
ModuleName,
message.channel or "nil",
message.data or "nil"
)
)
print(string.format("[%s] Message content: %s", ModuleName, message.message or "nil"))
end
if not message.message or message.message == "" then
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Invalid message: empty content", ModuleName))
end
return
end
if not message.channel or message.channel == "" then
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Invalid message: no channel specified", ModuleName))
end
return
end
if string.find(message.channel, "^C") then
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Converting channel type from C to CHANNEL", ModuleName))
end
message.channel = "CHANNEL"
elseif string.find(message.channel, "^W") then
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Converting channel type from W to WHISPER", ModuleName))
end
message.channel = "WHISPER"
end
if message.channel == "CHANNEL" and message.data and string.match(message.data, "%D") then
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Processing channel message: '%s' to '%s'", ModuleName, message.message,
message.data))
print(
string.format(
"[%s] Processing channel message: '%s' to '%s'",
ModuleName,
message.message,
message.data
)
)
end
local channelId = GetChannelName(message.data)
if channelId == 0 then
@@ -109,8 +137,15 @@ function shared.Messenger.Init()
end
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Sending message: '%s' to %s:%s", ModuleName, message.message, message.channel,
message.data))
print(
string.format(
"[%s] Sending message: '%s' to %s:%s",
ModuleName,
message.message,
message.channel,
message.data
)
)
end
if string.len(message.message) > 255 then
print(string.format("[%s] Message too long!!!!: %s", ModuleName, message.message))
@@ -119,10 +154,9 @@ function shared.Messenger.Init()
SendChatMessage(message.message, message.channel, nil, message.data)
end
local function Tick()
--if Heimdall_Data.config.messenger.debug then
-- local queueSize = #shared.messenger.queue
-- print(string.format("[%s] Queue check - Messages pending: %d", ModuleName, queueSize))
--end
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Tick - Queue size: %d", ModuleName, #shared.messenger.queue))
end
DoMessage()
shared.messenger.ticker = C_Timer.NewTimer(Heimdall_Data.config.messenger.interval, Tick, 1)
end
@@ -130,8 +164,13 @@ function shared.Messenger.Init()
end
if Heimdall_Data.config.messenger.debug then
print(string.format("[%s] Module initialized with interval: %s", ModuleName,
Heimdall_Data.config.messenger.interval))
print(
string.format(
"[%s] Module initialized with interval: %s",
ModuleName,
Heimdall_Data.config.messenger.interval
)
)
end
print("[Heimdall] Messenger loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "MinimapTagger"
local HeimdallRoot = "Interface\\AddOns\\Heimdall\\"
local SoundRoot = HeimdallRoot .. "Sounds\\"
@@ -56,7 +55,7 @@ function shared.MinimapTagger.Init()
self:SetAlpha(1)
self.custom.busy = true
self.custom.progress = 0
self:SetScript("OnUpdate", function(self, elapsed)
self:SetScript("OnUpdate", function(selff, elapsed)
self.custom.progress = self.custom.progress + elapsed
local progress = self.custom.progress / ttl
-- if Heimdall_Data.config.minimapTagger.debug then
@@ -89,14 +88,21 @@ function shared.MinimapTagger.Init()
table.insert(alertFramePool, frame)
end
local muteAlertUntil = 0
---@param x number
---@param y number
---@param x number|nil
---@param y number|nil
---@param scale number?
---@param doTag boolean?
local function PlantAlert(x, y, scale, doTag)
if x == nil or y == nil then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Alert position is nil, ignoring", ModuleName))
end
return
end
if doTag == nil then doTag = true end
local frame = nil
for _, alertFrame in ipairs(alertFramePool) do
---@diagnostic disable-next-line: undefined-field
if not alertFrame.custom.busy then
frame = alertFrame
break
@@ -110,8 +116,13 @@ function shared.MinimapTagger.Init()
end
if Heimdall_Data.config.minimapTagger.alertSound then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Playing alert sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.alertSoundFile))
print(
string.format(
"[%s] Playing alert sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.alertSoundFile
)
)
end
if muteAlertUntil > GetTime() then
if Heimdall_Data.config.minimapTagger.debug then
@@ -121,14 +132,17 @@ function shared.MinimapTagger.Init()
muteAlertUntil = GetTime() + Heimdall_Data.config.minimapTagger.alertSoundThrottle
local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.alertSoundFile, "Master")
if not ok and Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Failed to play alert sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.alertSoundFile))
print(
string.format(
"[%s] Failed to play alert sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.alertSoundFile
)
)
end
end
end
if doTag then
PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.alertTTL)
end
if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.alertTTL) end
end
--endregion
@@ -145,14 +159,21 @@ function shared.MinimapTagger.Init()
table.insert(tagFramePool, frame)
end
local muteTagUntil = 0
---@param x number
---@param y number
---@param x number|nil
---@param y number|nil
---@param scale number?
---@param doTag boolean?
local function PlantTag(x, y, scale, doTag)
if x == nil or y == nil then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Tag position is nil, ignoring", ModuleName))
end
return
end
if doTag == nil then doTag = true end
local frame = nil
for _, tagFrame in ipairs(tagFramePool) do
---@diagnostic disable-next-line: undefined-field
if not tagFrame.custom.busy then
frame = tagFrame
break
@@ -166,8 +187,13 @@ function shared.MinimapTagger.Init()
end
if Heimdall_Data.config.minimapTagger.tagSound then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Playing tag sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.tagSoundFile))
print(
string.format(
"[%s] Playing tag sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.tagSoundFile
)
)
end
if muteTagUntil > GetTime() then
if Heimdall_Data.config.minimapTagger.debug then
@@ -177,14 +203,17 @@ function shared.MinimapTagger.Init()
muteTagUntil = GetTime() + Heimdall_Data.config.minimapTagger.tagSoundThrottle
local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.tagSoundFile, "Master")
if not ok and Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Failed to play tag sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.tagSoundFile))
print(
string.format(
"[%s] Failed to play tag sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.tagSoundFile
)
)
end
end
end
if doTag then
PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.tagTTL)
end
if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.tagTTL) end
end
--endregion
@@ -201,14 +230,21 @@ function shared.MinimapTagger.Init()
table.insert(combatFramePool, frame)
end
local muteCombatUntil = 0
---@param x number
---@param y number
---@param x number|nil
---@param y number|nil
---@param scale number?
---@param doTag boolean?
local function PlantCombat(x, y, scale, doTag)
if x == nil or y == nil then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Combat position is nil, ignoring", ModuleName))
end
return
end
if doTag == nil then doTag = true end
local frame = nil
for _, combatFrame in ipairs(combatFramePool) do
---@diagnostic disable-next-line: undefined-field
if not combatFrame.custom.busy then
frame = combatFrame
break
@@ -222,8 +258,13 @@ function shared.MinimapTagger.Init()
end
if Heimdall_Data.config.minimapTagger.combatSound then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Playing combat sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.combatSoundFile))
print(
string.format(
"[%s] Playing combat sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.combatSoundFile
)
)
end
if muteCombatUntil > GetTime() then
if Heimdall_Data.config.minimapTagger.debug then
@@ -233,14 +274,17 @@ function shared.MinimapTagger.Init()
muteCombatUntil = GetTime() + Heimdall_Data.config.minimapTagger.combatSoundThrottle
local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.combatSoundFile, "Master")
if not ok and Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Failed to play combat sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.combatSoundFile))
print(
string.format(
"[%s] Failed to play combat sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.combatSoundFile
)
)
end
end
end
if doTag then
PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.combatTTL)
end
if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.combatTTL) end
end
--endregion
@@ -257,14 +301,21 @@ function shared.MinimapTagger.Init()
table.insert(helpFramePool, frame)
end
local muteHelpUntil = 0
---@param x number
---@param y number
---@param x number|nil
---@param y number|nil
---@param scale number?
---@param doTag boolean?
local function PlantHelp(x, y, scale, doTag)
if x == nil or y == nil then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Help position is nil, ignoring", ModuleName))
end
return
end
if doTag == nil then doTag = true end
local frame = nil
for _, helpFrame in ipairs(helpFramePool) do
---@diagnostic disable-next-line: undefined-field
if not helpFrame.custom.busy then
frame = helpFrame
break
@@ -278,8 +329,13 @@ function shared.MinimapTagger.Init()
end
if Heimdall_Data.config.minimapTagger.helpSound then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Playing help sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.helpSoundFile))
print(
string.format(
"[%s] Playing help sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.helpSoundFile
)
)
end
if muteHelpUntil > GetTime() then
if Heimdall_Data.config.minimapTagger.debug then
@@ -289,14 +345,17 @@ function shared.MinimapTagger.Init()
muteHelpUntil = GetTime() + Heimdall_Data.config.minimapTagger.helpSoundThrottle
local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.helpSoundFile, "Master")
if not ok and Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Failed to play help sound: %s", ModuleName,
Heimdall_Data.config.minimapTagger.helpSoundFile))
print(
string.format(
"[%s] Failed to play help sound: %s",
ModuleName,
Heimdall_Data.config.minimapTagger.helpSoundFile
)
)
end
end
end
if doTag then
PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.helpTTL)
end
if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.helpTTL) end
end
--endregion
@@ -323,20 +382,23 @@ function shared.MinimapTagger.Init()
BattlefieldMinimap:SetMovable(true)
BattlefieldMinimap:EnableMouse(true)
BattlefieldMinimap:RegisterForDrag("LeftButton")
BattlefieldMinimap:SetScript("OnDragStart", function(self) self:StartMoving() end)
BattlefieldMinimap:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
BattlefieldMinimap:SetScript("OnDragStart", function(selff) selff:StartMoving() end)
BattlefieldMinimap:SetScript("OnDragStop", function(selff) selff:StopMovingOrSizing() end)
BattlefieldMinimapBackground:Hide()
BattlefieldMinimapCloseButton:Hide()
BattlefieldMinimapCorner:Hide()
BattlefieldMinimap:HookScript("OnHide", function(self)
BattlefieldMinimap:HookScript("OnHide", function(selff)
for _, alertFrame in ipairs(alertFramePool) do
alertFrame:Hide()
---@diagnostic disable-next-line: undefined-field
alertFrame.custom.busy = false
end
for _, tagFrame in ipairs(tagFramePool) do
tagFrame:Hide()
---@diagnostic disable-next-line: undefined-field
tagFrame.custom.busy = false
end
-- What the fuck is this global?
for _, battleFrame in ipairs(battleFramePool) do
battleFrame:Hide()
battleFrame.custom.busy = false
@@ -370,14 +432,20 @@ function shared.MinimapTagger.Init()
if not ok then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Ignoring message from non-master channel: %s, need %s", ModuleName, channelname,
Heimdall_Data.config.minimapTagger.masterChannel))
print(
string.format(
"[%s] Ignoring message from non-master channel: %s, need %s",
ModuleName,
channelname,
Heimdall_Data.config.minimapTagger.masterChannel
)
)
end
return
end
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Processing message from master channel: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.minimapTagger)
shared.dump(Heimdall_Data.config.minimapTagger)
end
local doTag = true
@@ -387,8 +455,14 @@ function shared.MinimapTagger.Init()
local currentMapId = GetCurrentMapAreaID()
if currentMapId ~= messageMapId then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Current map ID (%d) does not match message map ID (%d), ignoring message",
ModuleName, currentMapId, messageMapId))
print(
string.format(
"[%s] Current map ID (%d) does not match message map ID (%d), ignoring message",
ModuleName,
currentMapId,
messageMapId
)
)
end
doTag = false
end
@@ -405,9 +479,7 @@ function shared.MinimapTagger.Init()
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Found alert position: %s, %s", ModuleName, tostring(x), tostring(y)))
end
if x and y then
PlantTag(tonumber(x), tonumber(y), 2, doTag)
end
if x and y then PlantTag(tonumber(x), tonumber(y), 2, doTag) end
end
--endregion
--region Combat
@@ -425,9 +497,7 @@ function shared.MinimapTagger.Init()
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Found combat position: %s, %s", ModuleName, tostring(x), tostring(y)))
end
if x and y then
PlantCombat(tonumber(x), tonumber(y), 2, doTag)
end
if x and y then PlantCombat(tonumber(x), tonumber(y), 2, doTag) end
end
--endregion
--region Death
@@ -445,9 +515,7 @@ function shared.MinimapTagger.Init()
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Found death position: %s, %s", ModuleName, tostring(x), tostring(y)))
end
if x and y then
PlantAlert(tonumber(x), tonumber(y), 2, doTag)
end
if x and y then PlantAlert(tonumber(x), tonumber(y), 2, doTag) end
end
--endregion
--region Help
@@ -468,6 +536,7 @@ function shared.MinimapTagger.Init()
if x and y then
x, y = tonumber(x), tonumber(y)
PlantHelp(x, y, 1, doTag)
---@diagnostic disable-next-line: undefined-global
if TomTom then
if Heimdall_Data.config.minimapTagger.debug then
print(string.format("[%s] Adding help waypoint to TomTom", ModuleName))
@@ -478,6 +547,7 @@ function shared.MinimapTagger.Init()
print(string.format("[%s] Area ID: %s", ModuleName, tostring(areaId)))
end
---@diagnostic disable-next-line: undefined-global
TomTom:AddMFWaypoint(areaId, nil, x / 100, y / 100, {
title = "Help " .. sender,
world = true,
@@ -497,7 +567,5 @@ function shared.MinimapTagger.Init()
print("[Heimdall] MinimapTagger loaded")
end
SlashCmdList["HEIMDALL_MINIMAPTAGGER"] = function(args)
shared.MinimapTagger.Init()
end
SlashCmdList["HEIMDALL_MINIMAPTAGGER"] = function(args) shared.MinimapTagger.Init() end
SLASH_HEIMDALL_MINIMAPTAGGER1 = "/mf"

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Network"
---@diagnostic disable-next-line: missing-fields
@@ -15,7 +14,7 @@ function shared.Network.Init()
---@type table<string, boolean>
local friends = {}
for i = 1, GetNumFriends() do
local name, level, class, area, connected, status, note, RAF = GetFriendInfo(i)
local name, _, _, _, connected, _, _, _ = GetFriendInfo(i)
if name then
friends[name] = connected
if Heimdall_Data.config.network.debug then
@@ -39,7 +38,8 @@ function shared.Network.Init()
friends[UnitName("player")] = true
shared.networkNodes = {}
if false then shared.networkNodes[#shared.networkNodes + 1] = UnitName("player") end
-- Why are we skipping this again...?
-- if false then shared.networkNodes[#shared.networkNodes + 1] = UnitName("player") end
for _, player in ipairs(Heimdall_Data.config.network.members) do
if friends[player] then
shared.networkNodes[#shared.networkNodes + 1] = player
@@ -50,19 +50,16 @@ function shared.Network.Init()
end
if Heimdall_Data.config.network.debug then
print(string.format("[%s] Network nodes:", ModuleName))
shared.dumpTable(shared.networkNodes)
shared.dump(shared.networkNodes)
end
end
local friendsFrame = CreateFrame("Frame")
friendsFrame:RegisterEvent("FRIENDLIST_UPDATE")
friendsFrame:SetScript("OnEvent", function(self, event, ...)
end)
friendsFrame:SetScript("OnEvent", function(self, event, ...) end)
local function NetworkTick()
if Heimdall_Data.config.network.debug then
print("Network module is updating.")
end
if Heimdall_Data.config.network.debug then print("Network module is updating.") end
ShowFriends()
updatePending = true
C_Timer.After(1, function()

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "NetworkMessenger"
---@diagnostic disable-next-line: missing-fields
@@ -63,9 +62,15 @@ function shared.NetworkMessenger.Init()
end
if Heimdall_Data.config.networkMessenger.debug then
print(string.format("[%s] Sending network message: '%s' to %s:%s", ModuleName, message.message,
print(
string.format(
"[%s] Sending network message: '%s' to %s:%s",
ModuleName,
message.message,
message.channel,
message.data))
message.data
)
)
end
local payload = string.format("dmessage|%s|%s|%s", message.message, message.channel, message.data)
if Heimdall_Data.config.networkMessenger.debug then
@@ -126,21 +131,23 @@ function shared.NetworkMessenger.Init()
local parts = shared.Split(message, "|")
if Heimdall_Data.config.networkMessenger.debug then
print(string.format("[%s] Received message parts:", ModuleName))
shared.dumpTable(parts)
shared.dump(parts)
end
local command = strtrim(parts[1])
if command == "message" then
local message = strtrim(tostring(parts[2]))
local channel = strtrim(tostring(parts[3]))
local content = strtrim(tostring(parts[2]))
local targetchannel = strtrim(tostring(parts[3]))
local target = strtrim(tostring(parts[4]))
if Heimdall_Data.config.networkMessenger.debug then
print(string.format("[%s] Received message command: %s %s %s", ModuleName, message, channel, target))
print(
string.format("[%s] Received message command: %s %s %s", ModuleName, content, targetchannel, target)
)
end
---@type Message
local msg = {
channel = channel,
message = message,
data = target
channel = targetchannel,
message = content,
data = target,
}
table.insert(shared.messenger.queue, msg)
elseif command == "dmessage" then
@@ -148,17 +155,15 @@ function shared.NetworkMessenger.Init()
print(string.format("[%s] Received dmessage command", ModuleName))
end
parts[1] = "message"
local message = table.concat(parts, "|")
local content = table.concat(parts, "|")
if nextIdx > #shared.networkNodes then
nextIdx = 1
end
if nextIdx > #shared.networkNodes then nextIdx = 1 end
local recipient = shared.networkNodes[nextIdx]
nextIdx = nextIdx + 1
if Heimdall_Data.config.networkMessenger.debug then
print(string.format("[%s] Sending message %s to %s", ModuleName, message, recipient))
print(string.format("[%s] Sending message %s to %s", ModuleName, content, recipient))
end
SendAddonMessage(Heimdall_Data.config.addonPrefix, message, "WHISPER", recipient)
SendAddonMessage(Heimdall_Data.config.addonPrefix, content, "WHISPER", recipient)
end
end)
@@ -167,7 +172,7 @@ function shared.NetworkMessenger.Init()
local testmsg = {
channel = "W",
message = "Hi, mom!",
data = "Secundus"
data = "Secundus",
}
for i = 1, 36 do
table.insert(shared.networkMessenger.queue, testmsg)

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Noter"
---@class Note
@@ -12,36 +11,32 @@ local ModuleName = "Noter"
---@diagnostic disable-next-line: missing-fields
shared.Noter = {}
function shared.Noter.Init()
---Hopefully this will not be necessary
---@param text string
---@param size number
---@return string[]
local function Partition(text, size)
local words = {}
for word in text:gmatch("[^,]+") do
words[#words + 1] = word
end
-- ---Hopefully this will not be necessary
-- ---@param text string
-- ---@param size number
-- ---@return string[]
-- local function Partition(text, size)
-- local words = {}
-- for word in text:gmatch("[^,]+") do
-- words[#words + 1] = word
-- end
local ret = {}
local currentChunk = ""
-- local ret = {}
-- local currentChunk = ""
for _, word in ipairs(words) do
if #currentChunk + #word + 1 <= size then
currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word)
else
if #currentChunk > 0 then
ret[#ret + 1] = currentChunk
end
currentChunk = word
end
end
-- for _, word in ipairs(words) do
-- if #currentChunk + #word + 1 <= size then
-- currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word)
-- else
-- if #currentChunk > 0 then ret[#ret + 1] = currentChunk end
-- currentChunk = word
-- end
-- end
if #currentChunk > 0 then
ret[#ret + 1] = currentChunk
end
-- if #currentChunk > 0 then ret[#ret + 1] = currentChunk end
return ret
end
-- return ret
-- end
---@param array any[]
---@return any[]
local function Compact(array)
@@ -65,17 +60,15 @@ function shared.Noter.Init()
end
local indices = shared.Split(range, "..")
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Indices for range deletion: %s", ModuleName,
table.concat(indices, ", ")))
shared.dumpTable(indices)
print(string.format("[%s] Indices for range deletion: %s", ModuleName, table.concat(indices, ", ")))
shared.dump(indices)
end
local start = tonumber(indices[1])
local finish = tonumber(indices[2])
if not start then
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Invalid start range for delete note: %s", ModuleName,
tostring(start)))
print(string.format("[%s] Invalid start range for delete note: %s", ModuleName, tostring(start)))
end
return
end
@@ -97,7 +90,7 @@ function shared.Noter.Init()
else
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Deleting note %s at index %s", ModuleName, name, i))
shared.dumpTable(Heimdall_Data.config.notes[name][i])
shared.dump(Heimdall_Data.config.notes[name][i])
end
Heimdall_Data.config.notes[name][i] = nil
end
@@ -118,7 +111,7 @@ function shared.Noter.Init()
local msg = {
channel = "C",
data = channel,
message = string.format("[%s][%d] %s: %s", note.source, index, note.date, note.note)
message = string.format("[%s][%d] %s: %s", note.source, index, note.date, note.note),
}
--table.insert(shared.messenger.queue, msg)
table.insert(shared.networkMessenger.queue, msg)
@@ -132,8 +125,13 @@ function shared.Noter.Init()
local range = args[3]
if not range then
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] No range specified for print note, defaulting to last %d notes", ModuleName,
Heimdall_Data.config.noter.lastNotes))
print(
string.format(
"[%s] No range specified for print note, defaulting to last %d notes",
ModuleName,
Heimdall_Data.config.noter.lastNotes
)
)
end
local notes = Heimdall_Data.config.notes[name] or {}
local start = math.max(1, #notes - Heimdall_Data.config.noter.lastNotes + 1)
@@ -152,17 +150,15 @@ function shared.Noter.Init()
end
local indices = shared.Split(range, "..")
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Indices for range printing: %s", ModuleName,
table.concat(indices, ", ")))
shared.dumpTable(indices)
print(string.format("[%s] Indices for range printing: %s", ModuleName, table.concat(indices, ", ")))
shared.dump(indices)
end
local start = tonumber(indices[1])
local finish = tonumber(indices[2])
if not start then
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Invalid start range for print note: %s", ModuleName,
tostring(start)))
print(string.format("[%s] Invalid start range for print note: %s", ModuleName, tostring(start)))
end
return
end
@@ -181,7 +177,7 @@ function shared.Noter.Init()
else
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Printing note %s at index %s", ModuleName, name, i))
shared.dumpTable(Heimdall_Data.config.notes[name][i])
shared.dump(Heimdall_Data.config.notes[name][i])
end
PrintNote(channel, i, Heimdall_Data.config.notes[name][i])
end
@@ -196,7 +192,7 @@ function shared.Noter.Init()
if not Heimdall_Data.config.notes[name] then Heimdall_Data.config.notes[name] = {} end
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Adding note for: %s from: %s", ModuleName, name, sender))
shared.dumpTable(args)
shared.dump(args)
end
local msgparts = {}
for i = 3, #args do
@@ -212,12 +208,12 @@ function shared.Noter.Init()
local note = {
source = sender,
date = date("%Y-%m-%dT%H:%M:%S"),
note = msg
note = msg,
}
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Adding note", ModuleName))
shared.dumpTable(note)
shared.dump(note)
end
table.insert(Heimdall_Data.config.notes[name], note)
end
@@ -235,7 +231,7 @@ function shared.Noter.Init()
noterChannelFrame:SetScript("OnEvent", function(self, event, msg, sender, ...)
--if Heimdall_Data.config.noter.debug then
-- print(string.format("[%s] Event received", ModuleName))
-- shared.dumpTable(Heimdall_Data.config.noter)
-- shared.dump(Heimdall_Data.config.noter)
--end
if not Heimdall_Data.config.noter.enabled then
--if Heimdall_Data.config.noter.debug then
@@ -262,7 +258,7 @@ function shared.Noter.Init()
sender = string.match(sender, "^[^-]+")
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Message from: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.noter)
shared.dump(Heimdall_Data.config.noter)
end
if not msg or msg == "" then
@@ -275,7 +271,7 @@ function shared.Noter.Init()
local args = { strsplit(" ", msg) }
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Arguments received: %s", ModuleName, table.concat(args, ", ")))
shared.dumpTable(args)
shared.dump(args)
end
local command = args[1]
if command == "note" then
@@ -284,9 +280,7 @@ function shared.Noter.Init()
print(string.format("[%s] Note command received for: %s", ModuleName, name))
end
local note = strtrim(args[3] or "")
if Heimdall_Data.config.noter.debug then
print(string.format("[%s] Note: %s", ModuleName, note))
end
if Heimdall_Data.config.noter.debug then print(string.format("[%s] Note: %s", ModuleName, note)) end
if note == "delete" then
DeleteNotes(name, args)
elseif string.find(note, "^[%d%.]*$") then

View File

@@ -8,12 +8,8 @@ local function Init()
if otherType == "table" and other._type and other._type == self._type and other._value then
return self._value + other._value
end
if otherType == "string" and self._type == otherType then
return self._value .. other
end
if otherType == "number" and self._type == otherType then
return self._value + other
end
if otherType == "string" and self._type == otherType then return self._value .. other end
if otherType == "number" and self._type == otherType then return self._value + other end
return nil
end,
---@param self ReactiveValue
@@ -24,9 +20,7 @@ local function Init()
if otherType == "table" and other._type and other._type == self._type and other._value then
return self._value * other._value
end
if otherType == "number" and self._type == otherType then
return self._value * other
end
if otherType == "number" and self._type == otherType then return self._value * other end
return nil
end,
---@param self ReactiveValue
@@ -37,9 +31,7 @@ local function Init()
if otherType == "table" and other._type and other._type == self._type and other._value then
return self._value - other._value
end
if otherType == "number" and self._type == otherType then
return self._value - other
end
if otherType == "number" and self._type == otherType then return self._value - other end
return nil
end,
---@param self ReactiveValue
@@ -50,9 +42,7 @@ local function Init()
if otherType == "table" and other._type and other._type == self._type and other._value then
return self._value / other._value
end
if otherType == "number" and self._type == otherType then
return self._value / other
end
if otherType == "number" and self._type == otherType then return self._value / other end
return nil
end,
---@param self ReactiveValue
@@ -63,9 +53,7 @@ local function Init()
if otherType == "table" and other._type and other._type == self._type and other._value then
return self._value % other._value
end
if otherType == "number" and self._type == otherType then
return self._value % other
end
if otherType == "number" and self._type == otherType then return self._value % other end
return nil
end,
---@param self ReactiveValue
@@ -76,9 +64,7 @@ local function Init()
if otherType == "table" and other._type and other._type == self._type and other._value then
return self._value ^ other._value
end
if otherType == "number" and self._type == otherType then
return self._value ^ other
end
if otherType == "number" and self._type == otherType then return self._value ^ other end
return nil
end,
---@param self ReactiveValue
@@ -134,19 +120,13 @@ local function Init()
---@param self ReactiveValue
---@return number
__len = function(self)
if self._type == "table" then
return #self._value
end
if self._type == "string" then
return string.len(self._value)
end
if self._type == "table" then return #self._value end
if self._type == "string" then return string.len(self._value) end
return 0
end,
---@param self ReactiveValue
---@return string
__tostring = function(self)
return tostring(self._value)
end,
__tostring = function(self) return tostring(self._value) end,
---@param self ReactiveValue
---@param key string
---@param value any
@@ -168,9 +148,7 @@ local function Init()
-- If the value being assigned is a ReactiveValue
-- Then listen to changes on it as well
-- And propagate those changes upwards
if self._recursive and getmetatable(value) == getmetatable(self) then
self:_setupListeners(key, value)
end
if self._recursive and getmetatable(value) == getmetatable(self) then self:_setupListeners(key, value) end
self:_notify()
self:_notifyFieldChanged(ChangedKey)
@@ -181,18 +159,12 @@ local function Init()
---@return any|nil
__index = function(self, key)
local value = rawget(self, key)
if value ~= nil then
return value
end
if rawget(self, "_type") ~= "table" then
return nil
end
if value ~= nil then return value end
if rawget(self, "_type") ~= "table" then return nil end
local innerTable = rawget(self, "_value")
if innerTable ~= nil then
return rawget(innerTable, key)
end
if innerTable ~= nil then return rawget(innerTable, key) end
return nil
end
end,
-- __index = ReactiveValue
}
@@ -343,14 +315,10 @@ local function Init()
self._recursive = recursive or false
---@return any
self.get = function(self)
return self._value
end
self.get = function(self) return self._value end
---@param newValue any
self.set = function(self, newValue)
if self._value == newValue then
return
end
if self._value == newValue then return end
if type(newValue) ~= self._type then
error("Expected " .. self._type .. ", got " .. type(newValue))
return
@@ -364,22 +332,16 @@ local function Init()
return function() end
end
self._listeners[callback] = true
return function()
self._listeners[callback] = nil
end
return function() self._listeners[callback] = nil end
end
self.onFieldChange = function(self, field, callback)
if type(callback) ~= "function" then
error("Expected function, got " .. type(callback))
return function() end
end
if self._fieldListeners[field] == nil then
self._fieldListeners[field] = {}
end
if self._fieldListeners[field] == nil then self._fieldListeners[field] = {} end
self._fieldListeners[field][callback] = true
return function()
self._fieldListeners[field][callback] = nil
end
return function() self._fieldListeners[field][callback] = nil end
end
self.onAnyFieldChange = function(self, callback, depth)
depth = depth or 99999
@@ -387,13 +349,9 @@ local function Init()
error("Expected function, got " .. type(callback))
return function() end
end
if self._anyFieldListeners[depth] == nil then
self._anyFieldListeners[depth] = {}
end
if self._anyFieldListeners[depth] == nil then self._anyFieldListeners[depth] = {} end
self._anyFieldListeners[depth][callback] = true
return function()
self._anyFieldListeners[depth][callback] = nil
end
return function() self._anyFieldListeners[depth][callback] = nil end
end
self.once = function(self, callback)
if type(callback) ~= "function" then
@@ -401,15 +359,11 @@ local function Init()
return function() end
end
self._oneTimeListeners[callback] = true
return function()
self._oneTimeListeners[callback] = nil
end
return function() self._oneTimeListeners[callback] = nil end
end
self._setupAllListenersRecursively = function(self)
if self._type ~= "table" then
return
end
if self._type ~= "table" then return end
for key, value in pairs(self._value) do
self:_setupListeners(key, value, true)
end
@@ -419,12 +373,8 @@ local function Init()
---@param recursive boolean?
self._setupListeners = function(self, key, value, recursive)
recursive = recursive or false
if self._type ~= "table" then
return
end
if getmetatable(value) ~= getmetatable(self) then
return
end
if self._type ~= "table" then return end
if getmetatable(value) ~= getmetatable(self) then return end
value._recursive = true
if value._type == "table" then
value:onAnyFieldChange(function(key2)
@@ -440,14 +390,10 @@ local function Init()
end)
end
if recursive then
value:_setupAllListenersRecursively()
end
if recursive then value:_setupAllListenersRecursively() end
end
if recursive then
self:_setupAllListenersRecursively()
end
if recursive then self:_setupAllListenersRecursively() end
self._notify = function(self)
for listener, _ in pairs(self._oneTimeListeners) do
@@ -474,9 +420,7 @@ local function Init()
end
local strfield = table.concat(field, ".")
if self._fieldListeners[strfield] == nil then
return
end
if self._fieldListeners[strfield] == nil then return end
for listener, _ in pairs(self._fieldListeners[strfield]) do
-- task.spawn(listener, value, type(value))
listener(value, type(value))
@@ -539,7 +483,7 @@ local function Init()
-- S local clbk = test:onChange(function(value)
-- S invocations = invocations + 1
-- S print("test changed to")
-- S dumpTable(value, 0)
-- S dump(value, 0)
-- S end)
-- S test:set({1, 2, 3, 4})
-- S assert(invocations == 1)
@@ -572,7 +516,7 @@ local function Init()
-- S test:once(function(value)
-- S invocations = invocations + 1
-- S print("test changed to")
-- S dumpTable(value, 0)
-- S dump(value, 0)
-- S end)
-- S test:set({3, 2, 1})
-- S assert(invocations == 1)
@@ -583,7 +527,7 @@ local function Init()
-- S test:onChange(function(value)
-- S invocations = invocations + 1
-- S print("test changed to")
-- S dumpTable(value, 0)
-- S dump(value, 0)
-- S end)
-- S test:onAnyFieldChange(function(field, value)
-- S invocations = invocations + 1
@@ -661,7 +605,5 @@ local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("GUILD_ROSTER_UPDATE")
frame:SetScript("OnEvent", function(self, event, ...)
Init()
end)
frame:SetScript("OnEvent", function(self, event, ...) Init() end)
Init()

View File

@@ -1,35 +1,31 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Sniffer"
---@diagnostic disable-next-line: missing-fields
shared.Sniffer = {}
function shared.Sniffer.Init()
if Heimdall_Data.config.sniffer.debug then
print(string.format("[%s] Module initializing", ModuleName))
end
if Heimdall_Data.config.sniffer.debug then print(string.format("[%s] Module initializing", ModuleName)) end
local smellThrottle = {}
local SmellStinky = function(stinky)
if Heimdall_Data.config.sniffer.debug then
print(string.format("%s: SmellStinky", ModuleName))
shared.dumpTable(Heimdall_Data.config.sniffer)
shared.dump(Heimdall_Data.config.sniffer)
end
if not Heimdall_Data.config.sniffer.enabled then return end
if Heimdall_Data.config.sniffer.stinky and
not shared.IsStinky(stinky) then
if Heimdall_Data.config.sniffer.stinky and not shared.IsStinky(stinky) then
if Heimdall_Data.config.sniffer.debug then
print(string.format("%s: Stinky not found in config", ModuleName))
end
return
end
if smellThrottle[stinky] and GetTime() - smellThrottle[stinky] < Heimdall_Data.config.sniffer.throttleTime then
if Heimdall_Data.config.sniffer.debug then
print(string.format("%s: Throttled", ModuleName))
end
local now = GetTime()
local throttle = smellThrottle[stinky] or 0
if now - throttle < Heimdall_Data.config.sniffer.throttle then
if Heimdall_Data.config.sniffer.debug then print(string.format("%s: Throttled", ModuleName)) end
return
end
smellThrottle[stinky] = GetTime()
smellThrottle[stinky] = now
for _, channel in pairs(Heimdall_Data.config.sniffer.channels) do
local locale = shared.GetLocaleForChannel(channel)
@@ -42,7 +38,7 @@ function shared.Sniffer.Init()
}
if Heimdall_Data.config.sniffer.debug then
print(string.format("[%s] Queuing sniffer message", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
table.insert(shared.messenger.queue, msg)
end
@@ -60,7 +56,8 @@ function shared.Sniffer.Init()
end
return
end
local source, err = CLEUParser.GetSourceName(...)
local source, destination, err
source, err = CLEUParser.GetSourceName(...)
if Heimdall_Data.config.sniffer.debug then
print(string.format("[%s] Processing source: %s", ModuleName, source))
end
@@ -71,7 +68,7 @@ function shared.Sniffer.Init()
return
end
SmellStinky(source)
local destination, err = CLEUParser.GetDestName(...)
destination, err = CLEUParser.GetDestName(...)
if Heimdall_Data.config.sniffer.debug then
print(string.format("[%s] Processing destination: %s", ModuleName, destination))
end
@@ -83,8 +80,6 @@ function shared.Sniffer.Init()
end
SmellStinky(destination)
end)
if Heimdall_Data.config.sniffer.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.sniffer.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] Sniffer loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Spotter"
---@diagnostic disable-next-line: missing-fields
@@ -67,8 +66,13 @@ function shared.Spotter.Init()
end
if Heimdall_Data.config.spotter.debug then
print(string.format("[%s] Using everyone setting: %s", ModuleName,
tostring(Heimdall_Data.config.spotter.everyone)))
print(
string.format(
"[%s] Using everyone setting: %s",
ModuleName,
tostring(Heimdall_Data.config.spotter.everyone)
)
)
end
return Heimdall_Data.config.spotter.everyone
end
@@ -158,7 +162,8 @@ function shared.Spotter.Init()
print(string.format("[%s] Processing channel: %s", ModuleName, channel))
end
local locale = shared.GetLocaleForChannel(channel)
local text = string.format(shared._L("spotterSpotted", locale),
local text = string.format(
shared._L("spotterSpotted", locale),
hostile and shared._L("hostile", locale) or shared._L("friendly", locale),
name,
shared._L(class, locale),
@@ -168,19 +173,22 @@ function shared.Spotter.Init()
pvpOn and shared._L("pvpOn", locale) or shared._L("pvpOff", locale),
string.gsub(FormatHP(hp), "M", "kk"),
string.gsub(FormatHP(maxHp), "M", "kk"),
shared._L(zone, locale), shared._L(subzone, locale),
shared._L(zone, locale),
shared._L(subzone, locale),
areaId,
x * 100, y * 100)
x * 100,
y * 100
)
---@type Message
local msg = {
channel = "C",
data = channel,
message = text
message = text,
}
if Heimdall_Data.config.spotter.debug then
print(string.format("[%s] Queuing spotter message", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
table.insert(shared.messenger.queue, msg)
end
@@ -201,9 +209,7 @@ function shared.Spotter.Init()
return
end
if event == "UNIT_TARGET" then
unit = "target"
end
if event == "UNIT_TARGET" then unit = "target" end
local err = NotifySpotted(unit)
if err then
@@ -213,8 +219,6 @@ function shared.Spotter.Init()
end
end)
if Heimdall_Data.config.spotter.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.spotter.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] Spotter loaded")
end

View File

@@ -13,14 +13,23 @@ function shared.StinkyCache.Init()
---@param name string
local function AskCommander(name)
if Heimdall_Data.config.stinkyCache.debug then
print(string.format("[%s] Asking commander %s about %s", ModuleName,
Heimdall_Data.config.stinkyCache.commander, name))
print(
string.format(
"[%s] Asking commander %s about %s",
ModuleName,
Heimdall_Data.config.stinkyCache.commander,
name
)
)
end
local messageParts = { "isstinky", name }
local message = table.concat(messageParts, "|")
SendAddonMessage(Heimdall_Data.config.addonPrefix,
message, "WHISPER",
Heimdall_Data.config.stinkyCache.commander)
SendAddonMessage(
Heimdall_Data.config.addonPrefix,
message,
"WHISPER",
Heimdall_Data.config.stinkyCache.commander
)
return
end
@@ -29,20 +38,25 @@ function shared.StinkyCache.Init()
addonMessageFrame:SetScript("OnEvent", function(self, event, msg, sender, ...)
if sender == Heimdall_Data.config.stinkyCache.commander then
if Heimdall_Data.config.stinkyCache.debug then
print(string.format("[%s] Received stinky from commander %s: %s", ModuleName,
Heimdall_Data.config.stinkyCache.commander, msg))
print(
string.format(
"[%s] Received stinky from commander %s: %s",
ModuleName,
Heimdall_Data.config.stinkyCache.commander,
msg
)
)
end
local name, value = {strsplit("|", msg)}
local parts = { strsplit("|", msg) }
local name, value = parts[1], parts[2]
shared.stinkyCache.stinkies[name] = { value = value, timestamp = time() }
else
if Heimdall_Data.config.stinkyCache.debug then
print(string.format("[%s] Received stinky from non-commander %s: %s", ModuleName, sender, msg))
end
local parts = {strsplit("|", msg)}
local parts = { strsplit("|", msg) }
local command, name = parts[1], parts[2]
if parts[1] == "isstinky" then
local res = Heimdall_Data.config.stinkies[parts[2]]
end
if parts[1] == "isstinky" then local res = Heimdall_Data.config.stinkies[parts[2]] end
end
end)
@@ -50,11 +64,9 @@ function shared.StinkyCache.Init()
__index = function(self, key)
local value = rawget(self, key)
local now = GetTime()
if value == nil or now - value.timestamp > Heimdall_Data.config.stinkyCache.ttl then
AskCommander(key)
end
if value == nil or now - value.timestamp > Heimdall_Data.config.stinkyCache.ttl then AskCommander(key) end
return rawget(self, key)
end
end,
})
print("[Heimdall] StinkyCache module loaded")
end

View File

@@ -1,13 +1,12 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "StinkyTracker"
---@diagnostic disable-next-line: missing-fields
shared.StinkyTracker = {}
function shared.StinkyTracker.Init()
shared.stinkyTracker = {
stinkies = ReactiveValue.new({})
stinkies = ReactiveValue.new({}),
}
local whoRegex = "([^ -/]+)-?%w*/(%w+)"
@@ -23,12 +22,19 @@ function shared.StinkyTracker.Init()
name = name,
class = class,
seenAt = GetTime(),
hostile = true
hostile = true,
}
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Found hostile player: %s (%s) at %s", ModuleName, name, class,
date("%H:%M:%S", time())))
shared.dumpTable(stinkies)
print(
string.format(
"[%s] Found hostile player: %s (%s) at %s",
ModuleName,
name,
class,
date("%H:%M:%S", time())
)
)
shared.dump(stinkies)
end
end
return stinkies
@@ -53,13 +59,21 @@ function shared.StinkyTracker.Init()
name = name,
class = class,
seenAt = GetTime(),
hostile = aggression == "hostile"
hostile = aggression == "hostile",
}
stinkies[name] = stinky
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Found stinky in SEE: %s (%s) - %s at %s", ModuleName, name, class, aggression,
date("%H:%M:%S", time())))
shared.dumpTable(stinkies)
print(
string.format(
"[%s] Found stinky in SEE: %s (%s) - %s at %s",
ModuleName,
name,
class,
aggression,
date("%H:%M:%S", time())
)
)
shared.dump(stinkies)
end
return stinkies
end
@@ -87,12 +101,12 @@ function shared.StinkyTracker.Init()
name = name,
class = class,
seenAt = GetTime(),
hostile = true
hostile = true,
}
stinkies[name] = stinky
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("%s: Found stinky in arrived: %s/%s", ModuleName, name, class))
shared.dumpTable(stinkies)
shared.dump(stinkies)
end
return stinkies
end
@@ -126,7 +140,7 @@ function shared.StinkyTracker.Init()
end
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Processing message from master channel: %s", ModuleName, sender))
shared.dumpTable(Heimdall_Data.config.stinkyTracker)
shared.dump(Heimdall_Data.config.stinkyTracker)
end
if string.find(msg, "^who:") then
@@ -141,8 +155,9 @@ function shared.StinkyTracker.Init()
if stinky.hostile then
shared.stinkyTracker.stinkies[name] = stinky
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Added hostile stinky from WHO: %s (%s)", ModuleName, name, stinky
.class))
print(
string.format("[%s] Added hostile stinky from WHO: %s (%s)", ModuleName, name, stinky.class)
)
end
end
end
@@ -159,8 +174,9 @@ function shared.StinkyTracker.Init()
if stinky.hostile then
shared.stinkyTracker.stinkies[name] = stinky
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Added hostile stinky from SEE: %s (%s)", ModuleName, name, stinky
.class))
print(
string.format("[%s] Added hostile stinky from SEE: %s (%s)", ModuleName, name, stinky.class)
)
end
end
if not stinky.hostile then
@@ -190,7 +206,9 @@ function shared.StinkyTracker.Init()
-- Log total stinky count after processing
if Heimdall_Data.config.stinkyTracker.debug then
local count = 0
for _ in pairs(shared.stinkyTracker.stinkies:get()) do count = count + 1 end
for _ in pairs(shared.stinkyTracker.stinkies:get()) do
count = count + 1
end
print(string.format("[%s] Current total stinkies tracked: %d", ModuleName, count))
end
@@ -210,7 +228,7 @@ function shared.StinkyTracker.Init()
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Event received: %s for unit: %s", ModuleName, event, unit or "target"))
end
local unit = "target"
unit = "target"
if not Heimdall_Data.config.stinkyTracker.enabled then
if Heimdall_Data.config.stinkyTracker.debug then
@@ -236,7 +254,7 @@ function shared.StinkyTracker.Init()
name = name,
class = UnitClass(unit),
seenAt = GetTime(),
hostile = true
hostile = true,
}
return
end
@@ -254,8 +272,6 @@ function shared.StinkyTracker.Init()
shared.stinkyTracker.stinkies[name] = nil
end)
if Heimdall_Data.config.stinkyTracker.debug then
print(string.format("[%s] Module initialized", ModuleName))
end
if Heimdall_Data.config.stinkyTracker.debug then print(string.format("[%s] Module initialized", ModuleName)) end
print("[Heimdall] StinkyTracker loaded")
end

View File

@@ -1,6 +1,5 @@
local addonname, shared = ...
local _, shared = ...
---@cast shared HeimdallShared
---@cast addonname string
local ModuleName = "Whoer"
---@diagnostic disable-next-line: missing-fields
@@ -9,6 +8,8 @@ function shared.Whoer.Init()
if not Heimdall_Data.who then Heimdall_Data.who = {} end
if not Heimdall_Data.who.data then Heimdall_Data.who.data = {} end
local whoWaiting = false
---@type table<string, Player>
HeimdallStinkies = {}
@@ -32,7 +33,7 @@ function shared.Whoer.Init()
---@return Player
new = function(name, guild, race, class, zone)
local self = setmetatable({}, {
__index = Player
__index = Player,
})
self.name = name
self.guild = guild
@@ -47,13 +48,15 @@ function shared.Whoer.Init()
end,
---@return string
ToString = function(self)
local out = string.format("%s %s %s\nFirst: %s Last: %s Seen: %3d",
local out = string.format(
"%s %s %s\nFirst: %s Last: %s Seen: %3d",
shared.padString(self.name, 16, true),
shared.padString(self.guild, 26, false),
shared.padString(self.zone, 26, false),
shared.padString(self.firstSeen, 10, true),
shared.padString(self.lastSeen, 10, true),
self.seenCount)
self.seenCount
)
return string.format("|cFF%s%s|r", shared.classColors[self.class], out)
end,
}
@@ -67,12 +70,12 @@ function shared.Whoer.Init()
---@return WHOQuery
new = function(query, filters)
local self = setmetatable({}, {
__index = WHOQuery
__index = WHOQuery,
})
self.query = query
self.filters = filters
return self
end
end,
}
---@class WHOFilter
@@ -81,12 +84,10 @@ function shared.Whoer.Init()
---@type WHOFilter
local NotSiegeOfOrgrimmarFilter = {
Run = function(name, guild, level, race, class, zone)
if not zone then
return false
end
if not zone then return false end
return zone ~= "Siege of Orgrimmar"
end,
key = "notsoo"
key = "notsoo",
}
---@type WHOFilter
local AllianceFilter = {
@@ -95,7 +96,7 @@ function shared.Whoer.Init()
if not shared.raceMap[race] then return false end
return shared.raceMap[race] == "Alliance"
end,
key = "ally"
key = "ally",
}
---@class WhoQueryService
@@ -110,15 +111,13 @@ function shared.Whoer.Init()
queries = {},
filters = {
NotSiegeOfOrgrimmarFilter,
AllianceFilter
AllianceFilter,
},
---@param key string
---@return WHOFilter?
getFilter = function(key)
for _, filter in pairs(shared.WhoQueryService.filters) do
if filter.key == key then
return filter
end
if filter.key == key then return filter end
end
return nil
end,
@@ -164,19 +163,19 @@ function shared.Whoer.Init()
if Heimdall_Data.config.who.debug then
print(string.format("[%s] WHO query: %s with %d filters", ModuleName, queryParts[1], #filters))
end
shared.dumpTable(filters)
shared.dump(filters)
return WHOQuery.new(queryParts[1], filters)
end,
---@param queries string
---@param queryStr string
---@return WHOQuery[]
WhoQueriesFromString = function(queries)
local queries = shared.Split(queries, "\n")
WhoQueriesFromString = function(queryStr)
local queries = shared.Split(queryStr, "\n")
local ret = {}
for _, query in pairs(queries) do
table.insert(ret, shared.WhoQueryService.WhoQueryFromString(query))
end
return ret
end
end,
}
shared.WhoQueryService.queries = shared.WhoQueryService.WhoQueriesFromString(Heimdall_Data.config.who.queries)
@@ -187,9 +186,13 @@ function shared.Whoer.Init()
print(string.format("[%s] ShouldNotifyForZone %s", ModuleName, inputZone))
end
for zone, _ in pairs(Heimdall_Data.config.who.zoneNotifyFor) do
if Heimdall_Data.config.who.debug then print(string.format("[%s] Checking zone %s", ModuleName, zone)) end
if zone == "*" then return true end
if string.find(inputZone, zone) then
if not Heimdall_Data.config.who.debug then
print(string.format("[%s] ShouldNotifyForZone %s is true thanks to %s", ModuleName, inputZone, zone))
print(
string.format("[%s] ShouldNotifyForZone %s is true thanks to %s", ModuleName, inputZone, zone)
)
end
return true
end
@@ -229,6 +232,25 @@ function shared.Whoer.Init()
local function Notify(player)
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Processing notification for player: %s", ModuleName, player.name))
print(
string.format(
"[%s] Player details - Guild: %s, Race: %s, Class: %s, Zone: %s",
ModuleName,
player.guild,
player.race,
player.class,
player.zone
)
)
print(
string.format(
"[%s] Player history - First seen: %s, Last seen: %s, Seen count: %d",
ModuleName,
player.firstSeen,
player.lastSeen,
player.seenCount
)
)
end
if not Heimdall_Data.config.who.enabled then
@@ -248,30 +270,34 @@ function shared.Whoer.Init()
if not shared.Whoer.ShouldNotifyForZone(player.zone) then
--if not Heimdall_Data.config.who.zoneNotifyFor[player.zone] then
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Skipping notification - Zone '%s' not in notify list", ModuleName, player.zone))
print(
string.format("[%s] Skipping notification - Zone '%s' not in notify list", ModuleName, player.zone)
)
end
return string.format("Not notifying for zone %s", tostring(player.zone))
end
for _, channel in pairs(Heimdall_Data.config.who.channels) do
local locale = shared.GetLocaleForChannel(channel)
local text = string.format(shared._L("whoerNew", locale),
local text = string.format(
shared._L("whoerNew", locale),
player.name,
player.stinky and "(!!!!)" or "",
shared._L(player.class, locale),
--shared._L(player.race, locale),
shared._L(shared.raceMap[player.race] or "unknown", locale),
player.guild,
shared._L(player.zone, locale))
shared._L(player.zone, locale)
)
---@type Message
local msg = {
channel = "C",
data = channel,
message = text
message = text,
}
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Queuing channel notification", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
table.insert(shared.networkMessenger.queue, msg)
end
@@ -311,24 +337,26 @@ function shared.Whoer.Init()
end
for _, channel in pairs(Heimdall_Data.config.who.channels) do
local locale = shared.GetLocaleForChannel(channel)
local text = string.format(shared._L("whoerMoved", locale),
local text = string.format(
shared._L("whoerMoved", locale),
player.name,
player.stinky and "(!!!!)" or "",
shared._L(player.class, locale),
--shared._L(player.race, locale),
shared._L(shared.raceMap[player.race] or "unknown", locale),
player.guild,
shared._L(zone, locale))
shared._L(zone, locale)
)
---@type Message
local msg = {
channel = "C",
data = channel,
message = text
message = text,
}
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Queuing channel notification", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
table.insert(shared.networkMessenger.queue, msg)
end
@@ -360,24 +388,26 @@ function shared.Whoer.Init()
for _, channel in pairs(Heimdall_Data.config.who.channels) do
local locale = shared.GetLocaleForChannel(channel)
local text = string.format(shared._L("whoerGone", locale),
local text = string.format(
shared._L("whoerGone", locale),
player.name,
player.stinky and "(!!!!)" or "",
shared._L(player.class, locale),
--shared._L(player.race, locale),
shared._L(shared.raceMap[player.race] or "unknown", locale),
player.guild,
shared._L(player.zone, locale))
shared._L(player.zone, locale)
)
---@type Message
local msg = {
channel = "C",
data = channel,
message = text
message = text,
}
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Queuing channel notification", ModuleName))
shared.dumpTable(msg)
shared.dump(msg)
end
--table.insert(shared.messenger.queue, msg)
table.insert(shared.networkMessenger.queue, msg)
@@ -404,6 +434,7 @@ function shared.Whoer.Init()
frame:SetScript("OnEvent", function(self, event, ...)
if Heimdall_Data.config.who.debug then
print(string.format("[%s] WHO list update received", ModuleName))
print(string.format("[%s] Query index: %d/%d", ModuleName, whoQueryIdx, #shared.WhoQueryService.queries))
end
if not Heimdall_Data.config.who.enabled then
@@ -430,7 +461,9 @@ function shared.Whoer.Init()
for i = 1, results do
local name, guild, level, race, class, zone = GetWhoInfo(i)
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Processing result %d/%d: %s/%s/%s", ModuleName, i, results, name, class, zone))
print(
string.format("[%s] Processing result %d/%d: %s/%s/%s", ModuleName, i, results, name, class, zone)
)
end
local continue = false
@@ -438,11 +471,15 @@ function shared.Whoer.Init()
local filters = query.filters
for _, filter in pairs(filters) do
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Running filter %s on %s/%s/%s", ModuleName, filter.key, name, class, zone))
print(
string.format("[%s] Running filter %s on %s/%s/%s", ModuleName, filter.key, name, class, zone)
)
end
if not filter.Run(name, guild, level, race, class, zone) then
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Player %s filtered out by WHO filter %s", ModuleName, name, filter.key))
print(
string.format("[%s] Player %s filtered out by WHO filter %s", ModuleName, name, filter.key)
)
end
continue = true
break
@@ -454,13 +491,15 @@ function shared.Whoer.Init()
print(string.format("[%s] Ignoring blacklisted player: %s", ModuleName, name))
end
continue = true
else
end
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Player %s is not blacklisted", ModuleName, name))
end
end
if not continue then
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Player %s is not filtered out", ModuleName, name))
end
local timestamp = date("%Y-%m-%dT%H:%M:%S")
local player = HeimdallStinkies[name]
if not player then
@@ -475,8 +514,15 @@ function shared.Whoer.Init()
if existing then
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Found existing data for %s - Last seen: %s, Count: %d",
ModuleName, name, existing.lastSeen or "never", existing.seenCount or 0))
print(
string.format(
"[%s] Found existing data for %s - Last seen: %s, Count: %d",
ModuleName,
name,
existing.lastSeen or "never",
existing.seenCount or 0
)
)
end
player.lastSeen = existing.lastSeen or "never"
player.firstSeen = existing.firstSeen or "never"
@@ -497,13 +543,15 @@ function shared.Whoer.Init()
end
player.stinky = true
--PlaySoundFile("Interface\\Sounds\\Domination.ogg", "Master")
else
--PlaySoundFile("Interface\\Sounds\\Cloak.ogg", "Master")
-- else
-- PlaySoundFile("Interface\\Sounds\\Cloak.ogg", "Master")
end
local err = Notify(player)
if err then
print(string.format("[%s] Error notifying for %s: %s", ModuleName, tostring(name), tostring(err)))
print(
string.format("[%s] Error notifying for %s: %s", ModuleName, tostring(name), tostring(err))
)
end
player.lastSeen = timestamp
@@ -514,13 +562,18 @@ function shared.Whoer.Init()
player.lastSeenInternal = GetTime()
if player.zone ~= zone then
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Player %s zone changed from %s to %s", ModuleName, name, player.zone,
zone))
print(
string.format(
"[%s] Player %s zone changed from %s to %s",
ModuleName,
name,
player.zone,
zone
)
)
end
local err = NotifyZoneChanged(player, zone)
if err then
print(string.format("Error notifying for %s: %s", tostring(name), tostring(err)))
end
if err then print(string.format("Error notifying for %s: %s", tostring(name), tostring(err))) end
end
player.zone = zone
player.lastSeen = timestamp
@@ -532,7 +585,8 @@ function shared.Whoer.Init()
end
-- Turns out WA cannot do this (
-- aura_env.UpdateMacro()
_G["FriendsFrameCloseButton"]:Click()
-- We MAY not need this
-- _G["FriendsFrameCloseButton"]:Click()
end)
do
@@ -559,25 +613,46 @@ function shared.Whoer.Init()
local query = shared.WhoQueryService.queries[whoQueryIdx]
if not query then
if Heimdall_Data.config.who.debug then
print(string.format("[%s] Error: No WHO query found to run", ModuleName))
print(string.format("[%s] Error: No WHO query found to run at index %d", ModuleName, whoQueryIdx))
end
return
end
whoQueryIdx = whoQueryIdx + 1
if whoQueryIdx > #shared.WhoQueryService.queries then
whoQueryIdx = 1
if Heimdall_Data.config.who.debug then
print(
string.format(
"[%s] Running WHO query %d/%d: %s",
ModuleName,
whoQueryIdx,
#shared.WhoQueryService.queries,
query.query
)
)
print(string.format("[%s] Query has %d filters", ModuleName, #query.filters))
for i, filter in ipairs(query.filters) do
print(string.format("[%s] Filter %d: %s", ModuleName, i, filter.key))
end
end
whoQueryIdx = whoQueryIdx + 1
if whoQueryIdx > #shared.WhoQueryService.queries then whoQueryIdx = 1 end
lastQuery = query
--print(string.format("Running who query: %s", tostring(query.query)))
---@diagnostic disable-next-line: param-type-mismatch
SetWhoToUI(1)
SetWhoToUI(1)
SendWho(query.query)
whoWaiting = true
end
local function Tick()
DoQuery()
C_Timer.NewTimer(1, Tick, 1)
end
Tick()
local original_FriendsFrame_OnEvent = FriendsFrame_OnEvent
local function my_FriendsFrame_OnEvent(event)
if not (event == "WHO_LIST_UPDATE" and whoWaiting) then original_FriendsFrame_OnEvent() end
end
FriendsFrame_OnEvent = my_FriendsFrame_OnEvent
end
print("[Heimdall] Whoer loaded")

View File

@@ -6,9 +6,7 @@ local function StringToMap(str, deliminer)
local parts = { strsplit(deliminer, str) }
for _, line in ipairs(parts) do
line = strtrim(line)
if line ~= "" then
map[line] = true
end
if line ~= "" then map[line] = true end
end
return map
end
@@ -21,9 +19,7 @@ local function StringToArray(str, deliminer)
local array = { strsplit(deliminer, str) }
for i, line in ipairs(array) do
line = strtrim(line)
if line ~= "" then
ret[i] = line
end
if line ~= "" then ret[i] = line end
end
return ret
end
@@ -39,7 +35,7 @@ local config = {
stinky = aura_env.config.spotter.stinky,
notifyChannel = aura_env.config.spotter.notifyChannel,
zoneOverride = aura_env.config.spotter.zoneOverride,
throttleTime = aura_env.config.spotter.throttleTime
throttleTime = aura_env.config.spotter.throttleTime,
},
who = {
enabled = aura_env.config.who.enabled,

View File

@@ -1,53 +1,61 @@
#!/bin/bash
# Default version increment
DEFAULT_INCREMENT="0.0.1"
echo "Figuring out the tag..."
TAG=$(git describe --tags --exact-match 2>/dev/null || echo "")
if [ -z "$TAG" ]; then
# Get the latest tag
LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
# Increment the patch version
IFS='.' read -r -a VERSION_PARTS <<< "$LATEST_TAG"
VERSION_PARTS[2]=$((VERSION_PARTS[2]+1))
TAG="${VERSION_PARTS[0]}.${VERSION_PARTS[1]}.${VERSION_PARTS[2]}"
# Create a new tag
git tag $TAG
fi
echo "Tag: $TAG"
# Get the increment parameter or use the default
INCREMENT=${1:-$DEFAULT_INCREMENT}
echo "Building the thing..."
sed -i "s/## Version: .*/## Version: $TAG/" Heimdall.toc
sed -i "s/local VERSION = .*/local VERSION = \"$TAG\"/" Heimdall.lua
git add Heimdall.toc Heimdall.lua
git commit -m "Release $TAG"
git tag -f $TAG
git push origin $TAG
# Function to increment the version
increment_version() {
local version=$1
local increment=$2
IFS='.' read -r -a version_parts <<< "$version"
IFS='.' read -r -a increment_parts <<< "$increment"
# Increment major, minor, and patch
version_parts[0]=$((version_parts[0] + increment_parts[0]))
version_parts[1]=$((version_parts[1] + increment_parts[1]))
version_parts[2]=$((version_parts[2] + increment_parts[2]))
# Reset minor and patch if major is incremented
if [ "${increment_parts[0]}" -gt 0 ]; then
version_parts[1]=0
version_parts[2]=0
elif [ "${increment_parts[1]}" -gt 0 ]; then
version_parts[2]=0
fi
echo "${version_parts[0]}.${version_parts[1]}.${version_parts[2]}"
}
CURRENT_VERSION=$(grep -oP '## Version: \K[0-9]+\.[0-9]+\.[0-9]+' Heimdall.toc)
NEW_VERSION=$(increment_version "$CURRENT_VERSION" "$INCREMENT")
sed -i "s/## Version: $CURRENT_VERSION/## Version: $NEW_VERSION/" Heimdall.toc
sed -i "s/local VERSION = \"$CURRENT_VERSION\"/local VERSION = \"$NEW_VERSION\"/" Heimdall.lua
# Existing deployment steps
rm Heimdall.zip
rm Heimdall-${TAG}.zip
mkdir Heimdall
cp *.lua *.toc Heimdall
cp -r Modules Heimdall
cp -r Sounds Heimdall
cp -r Texture Heimdall
7z a Heimdall.zip Heimdall
7z a Heimdall-${TAG}.zip Heimdall
rm -rf Heimdall
# Git operations
git add Heimdall.lua Heimdall.toc Heimdall.zip
git commit -m "Release $NEW_VERSION"
git tag "$NEW_VERSION"
echo "Creating a release..."
TOKEN="$GITEA_API_KEY"
GITEA="https://git.site.quack-lab.dev"
REPO="dave/wow-heimdall"
# Create a release
RELEASE_RESPONSE=$(curl -s -X POST \
-H "Authorization: token $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"tag_name": "'"$TAG"'",
"name": "'"$TAG"'",
"draft": false,
"prerelease": false
}' \
$GITEA/api/v1/repos/$REPO/releases)
echo "Deployment complete. New version: $NEW_VERSION"
# Extract the release ID
echo $RELEASE_RESPONSE
RELEASE_ID=$(echo $RELEASE_RESPONSE | awk -F'"id":' '{print $2+0; exit}')
echo "Release ID: $RELEASE_ID"
echo "Uploading the things..."
curl -X POST \
-H "Authorization: token $TOKEN" \
-F "attachment=@Heimdall-${TAG}.zip" \
"$GITEA/api/v1/repos/$REPO/releases/${RELEASE_ID}/assets?name=Heimdall-${TAG}.zip"
rm Heimdall-${TAG}.zip

12
stylua.toml Symbolic link
View File

@@ -0,0 +1,12 @@
syntax = "All" # Specify a disambiguation for the style of Lua syntax being formatted. Possible options: All (default), Lua51, Lua52, Lua53, Lua54, LuaJIT, Luau, CfxLua
column_width = 120 # Approximate line length for printing. Used as a guide for line wrapping - this is not a hard requirement: lines may fall under or over the limit.
line_endings = "Windows" # Line endings type. Possible options: Unix (LF) or Windows (CRLF)
indent_type = "Tabs" # Indent type. Possible options: Tabs or Spaces
indent_width = 4 # Character size of single indentation. If indent_type is set to Tabs, this option is used as a heuristic to determine column width only.
quote_style = "AutoPreferDouble" # Quote style for string literals. Possible options: AutoPreferDouble, AutoPreferSingle, ForceDouble, ForceSingle. AutoPrefer styles will prefer the specified quote style, but fall back to the alternative if it has fewer string escapes. Force styles always use the specified style regardless of escapes.
call_parentheses = "Always" # Whether parentheses should be applied on function calls with a single string/table argument. Possible options: Always, NoSingleString, NoSingleTable, None, Input. Always applies parentheses in all cases. NoSingleString omits parentheses on calls with a single string argument. Similarly, NoSingleTable omits parentheses on calls with a single table argument. None omits parentheses in both cases. Note: parentheses are still kept in situations where removal can lead to obscurity (e.g. foo "bar".setup -> foo("bar").setup, since the index is on the call result, not the string). Input removes all automation and preserves parentheses only if they were present in input code: consistency is not enforced.
space_after_function_names = "Never" # Specify whether to add a space between the function name and parentheses. Possible options: Never, Definitions, Calls, or Always
collapse_simple_statement = "Always" # Specify whether to collapse simple statements. Possible options: Never, FunctionOnly, ConditionalOnly, or Always
[sort_requires]
enabled = false