Refactor multiple Heimdall modules to use class-based structure for improved organization and clarity
This commit is contained in:
@@ -352,7 +352,7 @@ shared.Commander = {
|
||||
enabled
|
||||
and (
|
||||
not command.commanderOnly
|
||||
-- if Heimdall_Data.config.commander.debug then print(string.format("[%s] Ignoring command, sender %s not commander %s", ModuleName, sender, Heimdall_Data.config.commander.commander)) end
|
||||
-- if Heimdall_Data.config.commander.debug then print(string.format("[%s] Ignoring command, sender %s not commander %s", ModuleName, sender, Heimdall_Data.config.commander.commander)) end
|
||||
|
||||
|
||||
or (command.commanderOnly and sender == Heimdall_Data.config.commander.commander)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
local _, shared = ...
|
||||
---@cast shared HeimdallShared
|
||||
local ModuleName = "Inviter"
|
||||
|
||||
---@class HeimdallInviterConfig
|
||||
---@field enabled boolean
|
||||
@@ -14,8 +15,6 @@ local _, shared = ...
|
||||
---@field afkThreshold number
|
||||
---@field listeningChannel table<string, boolean>
|
||||
|
||||
local ModuleName = "Inviter"
|
||||
|
||||
---@class Inviter
|
||||
shared.Inviter = {
|
||||
Init = function()
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
local _, shared = ...
|
||||
---@cast shared HeimdallShared
|
||||
local ModuleName = "Macroer"
|
||||
|
||||
---@class HeimdallMacroerConfig
|
||||
---@field enabled boolean
|
||||
---@field debug boolean
|
||||
---@field priority string[]
|
||||
|
||||
local ModuleName = "Macroer"
|
||||
|
||||
---@class Macroer
|
||||
shared.Macroer = {
|
||||
Init = function()
|
||||
|
||||
@@ -2,175 +2,184 @@ local _, shared = ...
|
||||
---@cast shared HeimdallShared
|
||||
local ModuleName = "Messenger"
|
||||
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
shared.Messenger = {}
|
||||
function shared.Messenger.Init()
|
||||
---@class Message
|
||||
---@field message string
|
||||
---@field channel string
|
||||
---@field data string
|
||||
---@class Message
|
||||
---@field message string
|
||||
---@field channel string
|
||||
---@field data string
|
||||
|
||||
local function FindOrJoinChannel(channelName, password)
|
||||
local channelId = GetChannelName(channelName)
|
||||
if channelId == 0 then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Channel not found, joining: %s", ModuleName, channelName))
|
||||
end
|
||||
if password then
|
||||
JoinPermanentChannel(channelName, password)
|
||||
else
|
||||
JoinPermanentChannel(channelName)
|
||||
end
|
||||
end
|
||||
channelId = GetChannelName(channelName)
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Channel found with ID: %s (%s)", ModuleName, channelId, channelName))
|
||||
end
|
||||
return channelId
|
||||
end
|
||||
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
if not shared.messenger then shared.messenger = {} end
|
||||
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 - Size: %d", ModuleName, #shared.messenger.queue))
|
||||
end
|
||||
|
||||
if not Heimdall_Data.config.messenger.enabled then
|
||||
---@class Messenger
|
||||
shared.Messenger = {
|
||||
Init = function()
|
||||
local function FindOrJoinChannel(channelName, password)
|
||||
local channelId = GetChannelName(channelName)
|
||||
if channelId == 0 then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Module disabled, skipping message processing", ModuleName))
|
||||
print(string.format("[%s] Channel not found, joining: %s", ModuleName, channelName))
|
||||
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))
|
||||
if password then
|
||||
JoinPermanentChannel(channelName, password)
|
||||
else
|
||||
JoinPermanentChannel(channelName)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
channelId = GetChannelName(channelName)
|
||||
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] Channel found with ID: %s (%s)", ModuleName, channelId, channelName))
|
||||
end
|
||||
return channelId
|
||||
end
|
||||
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
if not shared.messenger then shared.messenger = {} end
|
||||
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 - Size: %d", ModuleName, #shared.messenger.queue)
|
||||
)
|
||||
)
|
||||
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))
|
||||
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
|
||||
return
|
||||
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))
|
||||
---@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
|
||||
return
|
||||
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'",
|
||||
"[%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
|
||||
)
|
||||
)
|
||||
end
|
||||
local channelId = GetChannelName(message.data)
|
||||
if channelId == 0 then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Channel not found, attempting to join: %s",
|
||||
ModuleName,
|
||||
message.data
|
||||
)
|
||||
)
|
||||
end
|
||||
channelId = FindOrJoinChannel(message.data)
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Channel join result - ID: %s", ModuleName, channelId))
|
||||
end
|
||||
end
|
||||
message.data = tostring(channelId)
|
||||
end
|
||||
|
||||
table.remove(shared.messenger.queue, 1)
|
||||
if not message.message or message.message == "" then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Skipping empty message", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.channel or message.channel == "" then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Skipping message with no channel", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.data or message.data == "" then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Skipping message with no data", ModuleName))
|
||||
end
|
||||
return
|
||||
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
|
||||
)
|
||||
)
|
||||
end
|
||||
local channelId = GetChannelName(message.data)
|
||||
if channelId == 0 then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Channel not found, attempting to join: %s", ModuleName, message.data))
|
||||
end
|
||||
channelId = FindOrJoinChannel(message.data)
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Channel join result - ID: %s", ModuleName, channelId))
|
||||
end
|
||||
if string.len(message.message) > 255 then
|
||||
print(string.format("[%s] Message too long!!!!: %s", ModuleName, message.message))
|
||||
return
|
||||
end
|
||||
message.data = tostring(channelId)
|
||||
SendChatMessage(message.message, message.channel, nil, message.data)
|
||||
end
|
||||
local function Tick()
|
||||
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
|
||||
Tick()
|
||||
end
|
||||
|
||||
table.remove(shared.messenger.queue, 1)
|
||||
if not message.message or message.message == "" then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Skipping empty message", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.channel or message.channel == "" then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Skipping message with no channel", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.data or message.data == "" then
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(string.format("[%s] Skipping message with no data", ModuleName))
|
||||
end
|
||||
return
|
||||
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
|
||||
)
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Module initialized with interval: %s",
|
||||
ModuleName,
|
||||
Heimdall_Data.config.messenger.interval
|
||||
)
|
||||
end
|
||||
if string.len(message.message) > 255 then
|
||||
print(string.format("[%s] Message too long!!!!: %s", ModuleName, message.message))
|
||||
return
|
||||
end
|
||||
SendChatMessage(message.message, message.channel, nil, message.data)
|
||||
end
|
||||
local function Tick()
|
||||
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
|
||||
Tick()
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.messenger.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Module initialized with interval: %s",
|
||||
ModuleName,
|
||||
Heimdall_Data.config.messenger.interval
|
||||
)
|
||||
)
|
||||
end
|
||||
print("[Heimdall] Messenger loaded")
|
||||
end
|
||||
end
|
||||
print("[Heimdall] Messenger loaded")
|
||||
end,
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@ local ModuleName = "Network"
|
||||
---@class HeimdallNetworkData
|
||||
---@field ticker Timer?
|
||||
|
||||
---@class Network
|
||||
shared.Network = {
|
||||
Init = function()
|
||||
if not shared.network then shared.network = {} end
|
||||
|
||||
@@ -2,182 +2,190 @@ local _, shared = ...
|
||||
---@cast shared HeimdallShared
|
||||
local ModuleName = "NetworkMessenger"
|
||||
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
shared.NetworkMessenger = {}
|
||||
function shared.NetworkMessenger.Init()
|
||||
RegisterAddonMessagePrefix(Heimdall_Data.config.addonPrefix)
|
||||
---@class NetworkMessenger
|
||||
shared.NetworkMessenger = {
|
||||
Init = function()
|
||||
RegisterAddonMessagePrefix(Heimdall_Data.config.addonPrefix)
|
||||
|
||||
if not shared.networkMessenger then shared.networkMessenger = {} end
|
||||
if not shared.networkMessenger.queue then shared.networkMessenger.queue = {} end
|
||||
if not shared.networkMessenger.ticker then
|
||||
local function DoMessage()
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Processing network message queue", ModuleName))
|
||||
--end
|
||||
if not Heimdall_Data.config.networkMessenger.enabled then
|
||||
if not shared.networkMessenger then shared.networkMessenger = {} end
|
||||
if not shared.networkMessenger.queue then shared.networkMessenger.queue = {} end
|
||||
if not shared.networkMessenger.ticker then
|
||||
local function DoMessage()
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Module disabled, skipping network message processing", ModuleName))
|
||||
-- print(string.format("[%s] Processing network message queue", ModuleName))
|
||||
--end
|
||||
return
|
||||
end
|
||||
---@type Message
|
||||
local message = shared.networkMessenger.queue[1]
|
||||
if not message then
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Network message queue empty", ModuleName))
|
||||
--end
|
||||
return
|
||||
end
|
||||
if not message.message or message.message == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Invalid network message: empty content", ModuleName))
|
||||
if not Heimdall_Data.config.networkMessenger.enabled then
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Module disabled, skipping network message processing", ModuleName))
|
||||
--end
|
||||
return
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.channel or message.channel == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Invalid network message: no channel specified", ModuleName))
|
||||
---@type Message
|
||||
local message = shared.networkMessenger.queue[1]
|
||||
if not message then
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Network message queue empty", ModuleName))
|
||||
--end
|
||||
return
|
||||
end
|
||||
if not message.message or message.message == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Invalid network message: empty content", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.channel or message.channel == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Invalid network message: no channel specified", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
table.remove(shared.networkMessenger.queue, 1)
|
||||
if not message.message or message.message == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Skipping empty network message", ModuleName))
|
||||
table.remove(shared.networkMessenger.queue, 1)
|
||||
if not message.message or message.message == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Skipping empty network message", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.channel or message.channel == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Skipping network message with no channel", ModuleName))
|
||||
if not message.channel or message.channel == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Skipping network message with no channel", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
return
|
||||
end
|
||||
if not message.data or message.data == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Skipping network message with no data", ModuleName))
|
||||
if not message.data or message.data == "" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Skipping network message with no data", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Sending network message: '%s' to %s:%s",
|
||||
ModuleName,
|
||||
message.message,
|
||||
message.channel,
|
||||
message.data
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Sending network message: '%s' to %s:%s",
|
||||
ModuleName,
|
||||
message.message,
|
||||
message.channel,
|
||||
message.data
|
||||
)
|
||||
)
|
||||
)
|
||||
end
|
||||
local payload = string.format("dmessage|%s|%s|%s", message.message, message.channel, message.data)
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Payload: %s", ModuleName, payload))
|
||||
end
|
||||
if not shared.networkNodes or #shared.networkNodes == 0 then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] No network nodes found, wtf????", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
local target = shared.networkNodes[1]
|
||||
SendAddonMessage(Heimdall_Data.config.addonPrefix, payload, "WHISPER", target)
|
||||
end
|
||||
local payload = string.format("dmessage|%s|%s|%s", message.message, message.channel, message.data)
|
||||
local function Tick()
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- local queueSize = #shared.networkMessenger.queue
|
||||
-- print(string.format("[%s] Queue check - Network messages pending: %d", ModuleName, queueSize))
|
||||
--end
|
||||
DoMessage()
|
||||
shared.networkMessenger.ticker =
|
||||
C_Timer.NewTimer(Heimdall_Data.config.networkMessenger.interval, Tick, 1)
|
||||
end
|
||||
Tick()
|
||||
end
|
||||
|
||||
-- If we are the leader then we delegate messages (dmessage)
|
||||
-- If we get a "message" command from leader then we send the message
|
||||
|
||||
local nextIdx = 1
|
||||
local addonMsgFrame = CreateFrame("Frame")
|
||||
addonMsgFrame:RegisterEvent("CHAT_MSG_ADDON")
|
||||
addonMsgFrame:SetScript("OnEvent", function(self, event, prefix, message, channel, source)
|
||||
if not Heimdall_Data.config.networkMessenger.enabled then return end
|
||||
if prefix ~= Heimdall_Data.config.addonPrefix then return end
|
||||
source = string.match(source, "[^%-]+")
|
||||
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Payload: %s", ModuleName, payload))
|
||||
print(string.format("[%s] Received message from %s: %s", ModuleName, source, message))
|
||||
end
|
||||
if not shared.networkNodes or #shared.networkNodes == 0 then
|
||||
if #shared.networkNodes == 0 then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] No network nodes found, wtf????", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
local target = shared.networkNodes[1]
|
||||
SendAddonMessage(Heimdall_Data.config.addonPrefix, payload, "WHISPER", target)
|
||||
end
|
||||
local function Tick()
|
||||
--if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- local queueSize = #shared.networkMessenger.queue
|
||||
-- print(string.format("[%s] Queue check - Network messages pending: %d", ModuleName, queueSize))
|
||||
|
||||
-- There should always be at least one network node ergo should always exist a leader
|
||||
-- Because the us, the player, is also a node
|
||||
--local networkLeader = shared.networkNodes[1]
|
||||
--if source ~= networkLeader then
|
||||
-- if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Message from %s is not from the network leader (%s)", ModuleName, source,
|
||||
-- networkLeader))
|
||||
-- end
|
||||
-- return
|
||||
--end
|
||||
DoMessage()
|
||||
shared.networkMessenger.ticker = C_Timer.NewTimer(Heimdall_Data.config.networkMessenger.interval, Tick, 1)
|
||||
end
|
||||
Tick()
|
||||
end
|
||||
|
||||
-- If we are the leader then we delegate messages (dmessage)
|
||||
-- If we get a "message" command from leader then we send the message
|
||||
|
||||
local nextIdx = 1
|
||||
local addonMsgFrame = CreateFrame("Frame")
|
||||
addonMsgFrame:RegisterEvent("CHAT_MSG_ADDON")
|
||||
addonMsgFrame:SetScript("OnEvent", function(self, event, prefix, message, channel, source)
|
||||
if not Heimdall_Data.config.networkMessenger.enabled then return end
|
||||
if prefix ~= Heimdall_Data.config.addonPrefix then return end
|
||||
source = string.match(source, "[^%-]+")
|
||||
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Received message from %s: %s", ModuleName, source, message))
|
||||
end
|
||||
if #shared.networkNodes == 0 then
|
||||
local parts = shared.Split(message, "|")
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] No network nodes found, wtf????", ModuleName))
|
||||
print(string.format("[%s] Received message parts:", ModuleName))
|
||||
shared.dumpTable(parts)
|
||||
end
|
||||
return
|
||||
end
|
||||
local command = strtrim(parts[1])
|
||||
if command == "message" then
|
||||
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,
|
||||
content,
|
||||
targetchannel,
|
||||
target
|
||||
)
|
||||
)
|
||||
end
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = targetchannel,
|
||||
message = content,
|
||||
data = target,
|
||||
}
|
||||
table.insert(shared.messenger.queue, msg)
|
||||
elseif command == "dmessage" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Received dmessage command", ModuleName))
|
||||
end
|
||||
parts[1] = "message"
|
||||
local content = table.concat(parts, "|")
|
||||
|
||||
-- There should always be at least one network node ergo should always exist a leader
|
||||
-- Because the us, the player, is also a node
|
||||
--local networkLeader = shared.networkNodes[1]
|
||||
--if source ~= networkLeader then
|
||||
-- if Heimdall_Data.config.networkMessenger.debug then
|
||||
-- print(string.format("[%s] Message from %s is not from the network leader (%s)", ModuleName, source,
|
||||
-- networkLeader))
|
||||
-- end
|
||||
-- return
|
||||
--end
|
||||
|
||||
local parts = shared.Split(message, "|")
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Received message parts:", ModuleName))
|
||||
shared.dumpTable(parts)
|
||||
end
|
||||
local command = strtrim(parts[1])
|
||||
if command == "message" then
|
||||
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, content, targetchannel, target)
|
||||
)
|
||||
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, content, recipient))
|
||||
end
|
||||
SendAddonMessage(Heimdall_Data.config.addonPrefix, content, "WHISPER", recipient)
|
||||
end
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = targetchannel,
|
||||
message = content,
|
||||
data = target,
|
||||
end)
|
||||
|
||||
--/run Heimdall_Data.Test()
|
||||
Heimdall_Data.Test = function()
|
||||
local testmsg = {
|
||||
channel = "W",
|
||||
message = "Hi, mom!",
|
||||
data = "Secundus",
|
||||
}
|
||||
table.insert(shared.messenger.queue, msg)
|
||||
elseif command == "dmessage" then
|
||||
if Heimdall_Data.config.networkMessenger.debug then
|
||||
print(string.format("[%s] Received dmessage command", ModuleName))
|
||||
for i = 1, 36 do
|
||||
table.insert(shared.networkMessenger.queue, testmsg)
|
||||
end
|
||||
parts[1] = "message"
|
||||
local content = table.concat(parts, "|")
|
||||
|
||||
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, content, recipient))
|
||||
end
|
||||
SendAddonMessage(Heimdall_Data.config.addonPrefix, content, "WHISPER", recipient)
|
||||
end
|
||||
end)
|
||||
|
||||
--/run Heimdall_Data.Test()
|
||||
Heimdall_Data.Test = function()
|
||||
local testmsg = {
|
||||
channel = "W",
|
||||
message = "Hi, mom!",
|
||||
data = "Secundus",
|
||||
}
|
||||
for i = 1, 36 do
|
||||
table.insert(shared.networkMessenger.queue, testmsg)
|
||||
end
|
||||
end
|
||||
|
||||
print("[Heimdall] NetworkMessenger module loaded")
|
||||
end
|
||||
print("[Heimdall] NetworkMessenger module loaded")
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -8,288 +8,291 @@ local ModuleName = "Noter"
|
||||
---@field date string
|
||||
---@field note string
|
||||
|
||||
---@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
|
||||
---@class Noter
|
||||
shared.Noter = {
|
||||
Init = function()
|
||||
-- ---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
|
||||
---@param array any[]
|
||||
---@return any[]
|
||||
local function Compact(array)
|
||||
local compacted = {}
|
||||
for _, v in pairs(array) do
|
||||
compacted[#compacted + 1] = v
|
||||
end
|
||||
return compacted
|
||||
end
|
||||
|
||||
---@param name string
|
||||
---@param args string[]
|
||||
local function DeleteNotes(name, args)
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Delete note command received for: %s", ModuleName, name))
|
||||
end
|
||||
local range = args[4]
|
||||
if range then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Range received for delete note: %s", ModuleName, range))
|
||||
-- return ret
|
||||
-- end
|
||||
---@param array any[]
|
||||
---@return any[]
|
||||
local function Compact(array)
|
||||
local compacted = {}
|
||||
for _, v in pairs(array) do
|
||||
compacted[#compacted + 1] = v
|
||||
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)
|
||||
end
|
||||
local start = tonumber(indices[1])
|
||||
local finish = tonumber(indices[2])
|
||||
return compacted
|
||||
end
|
||||
|
||||
if not start then
|
||||
---@param name string
|
||||
---@param args string[]
|
||||
local function DeleteNotes(name, args)
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Delete note command received for: %s", ModuleName, name))
|
||||
end
|
||||
local range = args[4]
|
||||
if range 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] Range received for delete note: %s", ModuleName, range))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if not finish then finish = start end
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Deleting note range %s to %s for: %s", ModuleName, start, finish, name))
|
||||
end
|
||||
|
||||
-- Here, because we are deleting random notes, we lose the "iterative" index property
|
||||
-- Ie it's not longer 1..100, it might be 1..47, 50, 68..100
|
||||
-- Which means that we cannot use ipairs, bad!
|
||||
for i = start, finish do
|
||||
if not Heimdall_Data.config.notes[name] then Heimdall_Data.config.notes[name] = {} end
|
||||
if not Heimdall_Data.config.notes[name][i] then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Note at index %s does not exist", ModuleName, i))
|
||||
end
|
||||
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])
|
||||
end
|
||||
Heimdall_Data.config.notes[name][i] = nil
|
||||
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)
|
||||
end
|
||||
end
|
||||
Heimdall_Data.config.notes[name] = Compact(Heimdall_Data.config.notes[name])
|
||||
end
|
||||
end
|
||||
local start = tonumber(indices[1])
|
||||
local finish = tonumber(indices[2])
|
||||
|
||||
---@param channel string
|
||||
---@param index number
|
||||
---@param note Note
|
||||
local function PrintNote(channel, index, note)
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Printing note at index %d for: %s", ModuleName, index, note.source))
|
||||
print(string.format("[%s] [%s][%d] %s: %s", ModuleName, note.source, index, note.date, note.note))
|
||||
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))
|
||||
)
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if not finish then finish = start end
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Deleting note range %s to %s for: %s", ModuleName, start, finish, name))
|
||||
end
|
||||
|
||||
-- Here, because we are deleting random notes, we lose the "iterative" index property
|
||||
-- Ie it's not longer 1..100, it might be 1..47, 50, 68..100
|
||||
-- Which means that we cannot use ipairs, bad!
|
||||
for i = start, finish do
|
||||
if not Heimdall_Data.config.notes[name] then Heimdall_Data.config.notes[name] = {} end
|
||||
if not Heimdall_Data.config.notes[name][i] then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Note at index %s does not exist", ModuleName, i))
|
||||
end
|
||||
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])
|
||||
end
|
||||
Heimdall_Data.config.notes[name][i] = nil
|
||||
end
|
||||
end
|
||||
Heimdall_Data.config.notes[name] = Compact(Heimdall_Data.config.notes[name])
|
||||
end
|
||||
end
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = "C",
|
||||
data = channel,
|
||||
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)
|
||||
end
|
||||
---@param name string
|
||||
---@param args string[]
|
||||
local function PrintNotes(channel, name, args)
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Print note command received for: %s", ModuleName, name))
|
||||
end
|
||||
local range = args[3]
|
||||
if not range then
|
||||
|
||||
---@param channel string
|
||||
---@param index number
|
||||
---@param note Note
|
||||
local function PrintNote(channel, index, note)
|
||||
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] Printing note at index %d for: %s", ModuleName, index, note.source))
|
||||
print(string.format("[%s] [%s][%d] %s: %s", ModuleName, note.source, index, note.date, note.note))
|
||||
end
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = "C",
|
||||
data = channel,
|
||||
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)
|
||||
end
|
||||
---@param name string
|
||||
---@param args string[]
|
||||
local function PrintNotes(channel, name, args)
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Print note command received for: %s", ModuleName, name))
|
||||
end
|
||||
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
|
||||
)
|
||||
)
|
||||
)
|
||||
end
|
||||
local notes = Heimdall_Data.config.notes[name] or {}
|
||||
local start = math.max(1, #notes - Heimdall_Data.config.noter.lastNotes + 1)
|
||||
local finish = #notes
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Printing notes from %d to %d for: %s", ModuleName, start, finish, name))
|
||||
end
|
||||
for i = start, finish do
|
||||
PrintNote(channel, i, notes[i])
|
||||
end
|
||||
return
|
||||
end
|
||||
if range then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Range received for print note: %s", ModuleName, range))
|
||||
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)
|
||||
end
|
||||
local start = tonumber(indices[1])
|
||||
local finish = tonumber(indices[2])
|
||||
|
||||
if not start then
|
||||
end
|
||||
local notes = Heimdall_Data.config.notes[name] or {}
|
||||
local start = math.max(1, #notes - Heimdall_Data.config.noter.lastNotes + 1)
|
||||
local finish = #notes
|
||||
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] Printing notes from %d to %d for: %s", ModuleName, start, finish, name))
|
||||
end
|
||||
for i = start, finish do
|
||||
PrintNote(channel, i, notes[i])
|
||||
end
|
||||
return
|
||||
end
|
||||
if range then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Range received for print note: %s", ModuleName, range))
|
||||
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)
|
||||
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)))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if not finish then finish = start end
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Printing note range %s to %s for: %s", ModuleName, start, finish, name))
|
||||
end
|
||||
|
||||
for i = start, finish do
|
||||
if not Heimdall_Data.config.notes[name] then Heimdall_Data.config.notes[name] = {} end
|
||||
if not Heimdall_Data.config.notes[name][i] then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Note at index %s does not exist", ModuleName, i))
|
||||
end
|
||||
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])
|
||||
end
|
||||
PrintNote(channel, i, Heimdall_Data.config.notes[name][i])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@param name string
|
||||
---@param sender string
|
||||
---@param args string[]
|
||||
local function AddNote(name, sender, args)
|
||||
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)
|
||||
end
|
||||
local msgparts = {}
|
||||
for i = 3, #args do
|
||||
msgparts[#msgparts + 1] = args[i]
|
||||
end
|
||||
local msg = table.concat(msgparts, " ")
|
||||
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Adding note for: %s from: %s", ModuleName, name, sender))
|
||||
print(string.format("[%s] Note: %s", ModuleName, msg))
|
||||
end
|
||||
|
||||
local note = {
|
||||
source = sender,
|
||||
date = date("%Y-%m-%dT%H:%M:%S"),
|
||||
note = msg,
|
||||
}
|
||||
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Adding note", ModuleName))
|
||||
shared.dumpTable(note)
|
||||
end
|
||||
table.insert(Heimdall_Data.config.notes[name], note)
|
||||
end
|
||||
|
||||
-- Here's the plan:
|
||||
-- Implement a "note" command, that will do everything
|
||||
-- Saying "note <name> <note>" will add a note to the list for the character
|
||||
-- Saying "note <name>" will list last N notes
|
||||
-- Saying "note <name> i" will list the i-th note
|
||||
-- Saying "note <name> i..j" will list notes from i to j
|
||||
-- Saying "note <name> delete i" will delete the i-th note
|
||||
-- Saying "note <name> delete i..j" will delete notes from i to j
|
||||
local noterChannelFrame = CreateFrame("Frame")
|
||||
noterChannelFrame:RegisterEvent("CHAT_MSG_CHANNEL")
|
||||
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)
|
||||
--end
|
||||
if not Heimdall_Data.config.noter.enabled then
|
||||
--if Heimdall_Data.config.noter.debug then
|
||||
-- print(string.format("[%s] Module disabled, ignoring event", ModuleName))
|
||||
--end
|
||||
return
|
||||
end
|
||||
local channelId = select(6, ...)
|
||||
local _, channelname = GetChannelName(channelId)
|
||||
local ok = false
|
||||
for _, channel in pairs(Heimdall_Data.config.noter.channels) do
|
||||
if channelname == channel then
|
||||
ok = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not ok then
|
||||
--if Heimdall_Data.config.noter.debug then
|
||||
-- print(string.format("[%s] Channel %s does not match the master channel %s", ModuleName, channelname, Heimdall_Data.config.noter.masterChannel))
|
||||
--end
|
||||
return
|
||||
end
|
||||
|
||||
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)
|
||||
end
|
||||
|
||||
if not msg or msg == "" then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Empty message, ignoring", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if not finish then finish = start end
|
||||
local args = { strsplit(" ", msg) }
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Printing note range %s to %s for: %s", ModuleName, start, finish, name))
|
||||
print(string.format("[%s] Arguments received: %s", ModuleName, table.concat(args, ", ")))
|
||||
shared.dumpTable(args)
|
||||
end
|
||||
|
||||
for i = start, finish do
|
||||
if not Heimdall_Data.config.notes[name] then Heimdall_Data.config.notes[name] = {} end
|
||||
if not Heimdall_Data.config.notes[name][i] then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Note at index %s does not exist", ModuleName, i))
|
||||
end
|
||||
local command = args[1]
|
||||
if command == "note" then
|
||||
local name = strtrim(string.lower(args[2] or ""))
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
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 note == "delete" then
|
||||
DeleteNotes(name, args)
|
||||
elseif string.find(note, "^[%d%.]*$") then
|
||||
PrintNotes(channelname, name, args)
|
||||
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])
|
||||
end
|
||||
PrintNote(channel, i, Heimdall_Data.config.notes[name][i])
|
||||
AddNote(name, sender, args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
---@param name string
|
||||
---@param sender string
|
||||
---@param args string[]
|
||||
local function AddNote(name, sender, args)
|
||||
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)
|
||||
end
|
||||
local msgparts = {}
|
||||
for i = 3, #args do
|
||||
msgparts[#msgparts + 1] = args[i]
|
||||
end
|
||||
local msg = table.concat(msgparts, " ")
|
||||
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Adding note for: %s from: %s", ModuleName, name, sender))
|
||||
print(string.format("[%s] Note: %s", ModuleName, msg))
|
||||
end
|
||||
|
||||
local note = {
|
||||
source = sender,
|
||||
date = date("%Y-%m-%dT%H:%M:%S"),
|
||||
note = msg,
|
||||
}
|
||||
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Adding note", ModuleName))
|
||||
shared.dumpTable(note)
|
||||
end
|
||||
table.insert(Heimdall_Data.config.notes[name], note)
|
||||
end
|
||||
|
||||
-- Here's the plan:
|
||||
-- Implement a "note" command, that will do everything
|
||||
-- Saying "note <name> <note>" will add a note to the list for the character
|
||||
-- Saying "note <name>" will list last N notes
|
||||
-- Saying "note <name> i" will list the i-th note
|
||||
-- Saying "note <name> i..j" will list notes from i to j
|
||||
-- Saying "note <name> delete i" will delete the i-th note
|
||||
-- Saying "note <name> delete i..j" will delete notes from i to j
|
||||
local noterChannelFrame = CreateFrame("Frame")
|
||||
noterChannelFrame:RegisterEvent("CHAT_MSG_CHANNEL")
|
||||
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)
|
||||
--end
|
||||
if not Heimdall_Data.config.noter.enabled then
|
||||
--if Heimdall_Data.config.noter.debug then
|
||||
-- print(string.format("[%s] Module disabled, ignoring event", ModuleName))
|
||||
--end
|
||||
return
|
||||
end
|
||||
local channelId = select(6, ...)
|
||||
local _, channelname = GetChannelName(channelId)
|
||||
local ok = false
|
||||
for _, channel in pairs(Heimdall_Data.config.noter.channels) do
|
||||
if channelname == channel then
|
||||
ok = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not ok then
|
||||
--if Heimdall_Data.config.noter.debug then
|
||||
-- print(string.format("[%s] Channel %s does not match the master channel %s", ModuleName, channelname, Heimdall_Data.config.noter.masterChannel))
|
||||
--end
|
||||
return
|
||||
end
|
||||
|
||||
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)
|
||||
end
|
||||
|
||||
if not msg or msg == "" then
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
print(string.format("[%s] Empty message, ignoring", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
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)
|
||||
end
|
||||
local command = args[1]
|
||||
if command == "note" then
|
||||
local name = strtrim(string.lower(args[2] or ""))
|
||||
if Heimdall_Data.config.noter.debug then
|
||||
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 note == "delete" then
|
||||
DeleteNotes(name, args)
|
||||
elseif string.find(note, "^[%d%.]*$") then
|
||||
PrintNotes(channelname, name, args)
|
||||
else
|
||||
AddNote(name, sender, args)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
print("[Heimdall] Commander module loaded")
|
||||
end
|
||||
print("[Heimdall] Commander module loaded")
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -2,223 +2,226 @@ local _, shared = ...
|
||||
---@cast shared HeimdallShared
|
||||
local ModuleName = "Spotter"
|
||||
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
shared.Spotter = {}
|
||||
function shared.Spotter.Init()
|
||||
local function FormatHP(hp)
|
||||
if hp > 1e9 then
|
||||
return string.format("%.1fB", hp / 1e9)
|
||||
elseif hp > 1e6 then
|
||||
return string.format("%.1fM", hp / 1e6)
|
||||
elseif hp > 1e3 then
|
||||
return string.format("%.1fK", hp / 1e3)
|
||||
else
|
||||
return hp
|
||||
end
|
||||
end
|
||||
|
||||
---@type table<string, number>
|
||||
local throttleTable = {}
|
||||
|
||||
---@param unit string
|
||||
---@param name string
|
||||
---@param faction string
|
||||
---@param hostile boolean
|
||||
---@return boolean
|
||||
---@return string? error
|
||||
local function ShouldNotify(unit, name, faction, hostile)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Checking notification criteria for %s (%s)", ModuleName, name, faction))
|
||||
---@class Spotter
|
||||
shared.Spotter = {
|
||||
Init = function()
|
||||
local function FormatHP(hp)
|
||||
if hp > 1e9 then
|
||||
return string.format("%.1fB", hp / 1e9)
|
||||
elseif hp > 1e6 then
|
||||
return string.format("%.1fM", hp / 1e6)
|
||||
elseif hp > 1e3 then
|
||||
return string.format("%.1fK", hp / 1e3)
|
||||
else
|
||||
return hp
|
||||
end
|
||||
end
|
||||
|
||||
if shared.AgentTracker.IsAgent(name) then
|
||||
---@type table<string, number>
|
||||
local throttleTable = {}
|
||||
|
||||
---@param unit string
|
||||
---@param name string
|
||||
---@param faction string
|
||||
---@param hostile boolean
|
||||
---@return boolean
|
||||
---@return string? error
|
||||
local function ShouldNotify(unit, name, faction, hostile)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Skipping agent: %s", ModuleName, name))
|
||||
print(string.format("[%s] Checking notification criteria for %s (%s)", ModuleName, name, faction))
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.spotter.stinky then
|
||||
if shared.IsStinky(name) then
|
||||
if shared.AgentTracker.IsAgent(name) then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Notifying - Found stinky: %s", ModuleName, name))
|
||||
print(string.format("[%s] Skipping agent: %s", ModuleName, name))
|
||||
end
|
||||
return true
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.spotter.alliance then
|
||||
if faction == "Alliance" then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Notifying - Found Alliance player: %s", ModuleName, name))
|
||||
if Heimdall_Data.config.spotter.stinky then
|
||||
if shared.IsStinky(name) then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Notifying - Found stinky: %s", ModuleName, name))
|
||||
end
|
||||
return true
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.spotter.hostile then
|
||||
if hostile then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Notifying - Found hostile player: %s", ModuleName, name))
|
||||
if Heimdall_Data.config.spotter.alliance then
|
||||
if faction == "Alliance" then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Notifying - Found Alliance player: %s", ModuleName, name))
|
||||
end
|
||||
return true
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Using everyone setting: %s",
|
||||
ModuleName,
|
||||
tostring(Heimdall_Data.config.spotter.everyone)
|
||||
if Heimdall_Data.config.spotter.hostile then
|
||||
if hostile then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Notifying - Found hostile player: %s", ModuleName, name))
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Using everyone setting: %s",
|
||||
ModuleName,
|
||||
tostring(Heimdall_Data.config.spotter.everyone)
|
||||
)
|
||||
)
|
||||
)
|
||||
end
|
||||
return Heimdall_Data.config.spotter.everyone
|
||||
end
|
||||
|
||||
---@param unit string
|
||||
---@return string?
|
||||
local function NotifySpotted(unit)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Processing spotted unit: %s", ModuleName, unit))
|
||||
end
|
||||
|
||||
if not unit then return string.format("Could not find unit %s", tostring(unit)) end
|
||||
if not UnitIsPlayer(unit) then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Ignoring non-player unit: %s", ModuleName, unit))
|
||||
end
|
||||
return nil
|
||||
return Heimdall_Data.config.spotter.everyone
|
||||
end
|
||||
|
||||
local name = UnitName(unit)
|
||||
if not name then return string.format("Could not find name for unit %s", tostring(unit)) end
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Processing player: %s", ModuleName, name))
|
||||
end
|
||||
|
||||
local time = GetTime()
|
||||
if throttleTable[name] and time - throttleTable[name] < Heimdall_Data.config.spotter.throttleTime then
|
||||
---@param unit string
|
||||
---@return string?
|
||||
local function NotifySpotted(unit)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
local remainingTime = Heimdall_Data.config.spotter.throttleTime - (time - throttleTable[name])
|
||||
print(string.format("[%s] Player %s throttled for %.1f more seconds", ModuleName, name, remainingTime))
|
||||
print(string.format("[%s] Processing spotted unit: %s", ModuleName, unit))
|
||||
end
|
||||
return string.format("Throttled %s", tostring(name))
|
||||
end
|
||||
throttleTable[name] = time
|
||||
|
||||
local race = UnitRace(unit)
|
||||
if not race then return string.format("Could not find race for unit %s", tostring(unit)) end
|
||||
local faction = shared.raceMap[race]
|
||||
if not faction then return string.format("Could not find faction for race %s", tostring(race)) end
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Player %s is %s (%s)", ModuleName, name, race, faction))
|
||||
end
|
||||
|
||||
local hostile = UnitCanAttack("player", unit)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Player %s is %s", ModuleName, name, hostile and "hostile" or "friendly"))
|
||||
end
|
||||
|
||||
local doNotify = ShouldNotify(unit, name, faction, hostile)
|
||||
if not doNotify then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Skipping notification for %s", ModuleName, name))
|
||||
if not unit then return string.format("Could not find unit %s", tostring(unit)) end
|
||||
if not UnitIsPlayer(unit) then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Ignoring non-player unit: %s", ModuleName, unit))
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return string.format("Not notifying for %s", tostring(name))
|
||||
end
|
||||
|
||||
local hp = UnitHealth(unit)
|
||||
if not hp then return string.format("Could not find hp for unit %s", tostring(unit)) end
|
||||
local maxHp = UnitHealthMax(unit)
|
||||
if not maxHp then return string.format("Could not find maxHp for unit %s", tostring(unit)) end
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Player %s health: %s/%s", ModuleName, name, FormatHP(hp), FormatHP(maxHp)))
|
||||
end
|
||||
|
||||
local class = UnitClass(unit)
|
||||
if not class then return string.format("Could not find class for unit %s", tostring(unit)) end
|
||||
|
||||
local zone, subzone = GetZoneText() or "Unknown", GetSubZoneText() or "Unknown"
|
||||
if Heimdall_Data.config.spotter.zoneOverride then
|
||||
zone = Heimdall_Data.config.spotter.zoneOverride or ""
|
||||
subzone = ""
|
||||
end
|
||||
|
||||
local x, y = GetPlayerMapPosition("player")
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Player %s coordinates: %.2f, %.2f", ModuleName, name, x * 100, y * 100))
|
||||
end
|
||||
|
||||
local pvpOn = UnitIsPVP(unit)
|
||||
local stinky = shared.IsStinky(name) or false
|
||||
SetMapToCurrentZone()
|
||||
SetMapByID(GetCurrentMapAreaID())
|
||||
local areaId = tostring(GetCurrentMapAreaID())
|
||||
|
||||
for _, channel in pairs(Heimdall_Data.config.spotter.channels) do
|
||||
local name = UnitName(unit)
|
||||
if not name then return string.format("Could not find name for unit %s", tostring(unit)) end
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Processing channel: %s", ModuleName, channel))
|
||||
print(string.format("[%s] Processing player: %s", ModuleName, name))
|
||||
end
|
||||
local locale = shared.GetLocaleForChannel(channel)
|
||||
local text = string.format(
|
||||
shared._L("spotterSpotted", locale),
|
||||
hostile and shared._L("hostile", locale) or shared._L("friendly", locale),
|
||||
name,
|
||||
shared._L(class, locale),
|
||||
stinky and string.format("(%s)", "!!!!") or "",
|
||||
shared._L(race, locale),
|
||||
shared._L(faction, locale),
|
||||
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),
|
||||
areaId,
|
||||
x * 100,
|
||||
y * 100
|
||||
)
|
||||
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = "C",
|
||||
data = channel,
|
||||
message = text,
|
||||
}
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Queuing spotter message", ModuleName))
|
||||
shared.dumpTable(msg)
|
||||
local time = GetTime()
|
||||
if throttleTable[name] and time - throttleTable[name] < Heimdall_Data.config.spotter.throttleTime then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
local remainingTime = Heimdall_Data.config.spotter.throttleTime - (time - throttleTable[name])
|
||||
print(
|
||||
string.format("[%s] Player %s throttled for %.1f more seconds", ModuleName, name, remainingTime)
|
||||
)
|
||||
end
|
||||
return string.format("Throttled %s", tostring(name))
|
||||
end
|
||||
table.insert(shared.messenger.queue, msg)
|
||||
end
|
||||
end
|
||||
throttleTable[name] = time
|
||||
|
||||
local frame = CreateFrame("Frame")
|
||||
frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
||||
frame:RegisterEvent("UNIT_TARGET")
|
||||
frame:SetScript("OnEvent", function(self, event, unit)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Event received: %s for unit: %s", ModuleName, event, unit or "target"))
|
||||
end
|
||||
|
||||
if not Heimdall_Data.config.spotter.enabled then
|
||||
local race = UnitRace(unit)
|
||||
if not race then return string.format("Could not find race for unit %s", tostring(unit)) end
|
||||
local faction = shared.raceMap[race]
|
||||
if not faction then return string.format("Could not find faction for race %s", tostring(race)) end
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Module disabled, ignoring event", ModuleName))
|
||||
print(string.format("[%s] Player %s is %s (%s)", ModuleName, name, race, faction))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if event == "UNIT_TARGET" then unit = "target" end
|
||||
|
||||
local err = NotifySpotted(unit)
|
||||
if err then
|
||||
local hostile = UnitCanAttack("player", unit)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Error processing unit %s: %s", ModuleName, unit, err))
|
||||
print(string.format("[%s] Player %s is %s", ModuleName, name, hostile and "hostile" or "friendly"))
|
||||
end
|
||||
|
||||
local doNotify = ShouldNotify(unit, name, faction, hostile)
|
||||
if not doNotify then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Skipping notification for %s", ModuleName, name))
|
||||
end
|
||||
return string.format("Not notifying for %s", tostring(name))
|
||||
end
|
||||
|
||||
local hp = UnitHealth(unit)
|
||||
if not hp then return string.format("Could not find hp for unit %s", tostring(unit)) end
|
||||
local maxHp = UnitHealthMax(unit)
|
||||
if not maxHp then return string.format("Could not find maxHp for unit %s", tostring(unit)) end
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Player %s health: %s/%s", ModuleName, name, FormatHP(hp), FormatHP(maxHp)))
|
||||
end
|
||||
|
||||
local class = UnitClass(unit)
|
||||
if not class then return string.format("Could not find class for unit %s", tostring(unit)) end
|
||||
|
||||
local zone, subzone = GetZoneText() or "Unknown", GetSubZoneText() or "Unknown"
|
||||
if Heimdall_Data.config.spotter.zoneOverride then
|
||||
zone = Heimdall_Data.config.spotter.zoneOverride or ""
|
||||
subzone = ""
|
||||
end
|
||||
|
||||
local x, y = GetPlayerMapPosition("player")
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Player %s coordinates: %.2f, %.2f", ModuleName, name, x * 100, y * 100))
|
||||
end
|
||||
|
||||
local pvpOn = UnitIsPVP(unit)
|
||||
local stinky = shared.IsStinky(name) or false
|
||||
SetMapToCurrentZone()
|
||||
SetMapByID(GetCurrentMapAreaID())
|
||||
local areaId = tostring(GetCurrentMapAreaID())
|
||||
|
||||
for _, channel in pairs(Heimdall_Data.config.spotter.channels) do
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Processing channel: %s", ModuleName, channel))
|
||||
end
|
||||
local locale = shared.GetLocaleForChannel(channel)
|
||||
local text = string.format(
|
||||
shared._L("spotterSpotted", locale),
|
||||
hostile and shared._L("hostile", locale) or shared._L("friendly", locale),
|
||||
name,
|
||||
shared._L(class, locale),
|
||||
stinky and string.format("(%s)", "!!!!") or "",
|
||||
shared._L(race, locale),
|
||||
shared._L(faction, locale),
|
||||
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),
|
||||
areaId,
|
||||
x * 100,
|
||||
y * 100
|
||||
)
|
||||
|
||||
---@type Message
|
||||
local msg = {
|
||||
channel = "C",
|
||||
data = channel,
|
||||
message = text,
|
||||
}
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Queuing spotter message", ModuleName))
|
||||
shared.dumpTable(msg)
|
||||
end
|
||||
table.insert(shared.messenger.queue, msg)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
if Heimdall_Data.config.spotter.debug then print(string.format("[%s] Module initialized", ModuleName)) end
|
||||
print("[Heimdall] Spotter loaded")
|
||||
end
|
||||
local frame = CreateFrame("Frame")
|
||||
frame:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
||||
frame:RegisterEvent("UNIT_TARGET")
|
||||
frame:SetScript("OnEvent", function(self, event, unit)
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Event received: %s for unit: %s", ModuleName, event, unit or "target"))
|
||||
end
|
||||
|
||||
if not Heimdall_Data.config.spotter.enabled then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Module disabled, ignoring event", ModuleName))
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if event == "UNIT_TARGET" then unit = "target" end
|
||||
|
||||
local err = NotifySpotted(unit)
|
||||
if err then
|
||||
if Heimdall_Data.config.spotter.debug then
|
||||
print(string.format("[%s] Error processing unit %s: %s", ModuleName, unit, err))
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
if Heimdall_Data.config.spotter.debug then print(string.format("[%s] Module initialized", ModuleName)) end
|
||||
print("[Heimdall] Spotter loaded")
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -1,72 +1,74 @@
|
||||
local addonname, shared = ...
|
||||
local _, shared = ...
|
||||
---@cast shared HeimdallShared
|
||||
---@cast addonname string
|
||||
local ModuleName = "StinkyCache"
|
||||
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
shared.StinkyCache = {}
|
||||
function shared.StinkyCache.Init()
|
||||
shared.stinkyCache = {
|
||||
stinkies = {},
|
||||
}
|
||||
---@class StinkyCache
|
||||
shared.StinkyCache = {
|
||||
Init = function()
|
||||
shared.stinkyCache = {
|
||||
stinkies = {},
|
||||
}
|
||||
|
||||
---@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
|
||||
)
|
||||
)
|
||||
end
|
||||
local messageParts = { "isstinky", name }
|
||||
local message = table.concat(messageParts, "|")
|
||||
SendAddonMessage(
|
||||
Heimdall_Data.config.addonPrefix,
|
||||
message,
|
||||
"WHISPER",
|
||||
Heimdall_Data.config.stinkyCache.commander
|
||||
)
|
||||
return
|
||||
end
|
||||
|
||||
local addonMessageFrame = CreateFrame("Frame")
|
||||
addonMessageFrame:RegisterEvent("CHAT_MSG_ADDON")
|
||||
addonMessageFrame:SetScript("OnEvent", function(self, event, msg, sender, ...)
|
||||
if sender == Heimdall_Data.config.stinkyCache.commander then
|
||||
---@param name string
|
||||
local function AskCommander(name)
|
||||
if Heimdall_Data.config.stinkyCache.debug then
|
||||
print(
|
||||
string.format(
|
||||
"[%s] Received stinky from commander %s: %s",
|
||||
"[%s] Asking commander %s about %s",
|
||||
ModuleName,
|
||||
Heimdall_Data.config.stinkyCache.commander,
|
||||
msg
|
||||
name
|
||||
)
|
||||
)
|
||||
end
|
||||
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 command, name = parts[1], parts[2]
|
||||
if parts[1] == "isstinky" then local res = Heimdall_Data.config.stinkies[parts[2]] end
|
||||
local messageParts = { "isstinky", name }
|
||||
local message = table.concat(messageParts, "|")
|
||||
SendAddonMessage(
|
||||
Heimdall_Data.config.addonPrefix,
|
||||
message,
|
||||
"WHISPER",
|
||||
Heimdall_Data.config.stinkyCache.commander
|
||||
)
|
||||
return
|
||||
end
|
||||
end)
|
||||
|
||||
setmetatable(shared.stinkyCache.stinkies, {
|
||||
__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
|
||||
return rawget(self, key)
|
||||
end,
|
||||
})
|
||||
print("[Heimdall] StinkyCache module loaded")
|
||||
end
|
||||
local addonMessageFrame = CreateFrame("Frame")
|
||||
addonMessageFrame:RegisterEvent("CHAT_MSG_ADDON")
|
||||
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
|
||||
)
|
||||
)
|
||||
end
|
||||
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 command, name = parts[1], parts[2]
|
||||
if parts[1] == "isstinky" then local res = Heimdall_Data.config.stinkies[parts[2]] end
|
||||
end
|
||||
end)
|
||||
|
||||
setmetatable(shared.stinkyCache.stinkies, {
|
||||
__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
|
||||
return rawget(self, key)
|
||||
end,
|
||||
})
|
||||
print("[Heimdall] StinkyCache module loaded")
|
||||
end,
|
||||
}
|
||||
|
||||
1264
Modules/Whoer.lua
1264
Modules/Whoer.lua
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user