local addonname, shared = ... ---@cast shared HeimdallShared ---@cast addonname string local ModuleName = "Commander" local helpMessages = { ru = { "1) who - пишет вам никнеймы текущих врагов в отслеживаемых локациях по порядку и локацию.", "2) classes = пишет какие классы. (например 1 паладин 1 прист 1 рога.", "3) howmany - общее число врагов (например дуротар 4 . оргримар 2 ) ", "4) + - автоматическое приглашение в группу с дуельным рогой для сброса кд и общего сбора. ", "5) ++ - автоматическое приглашение в группу альянса. (если нужен рефрак)", }, en = { "1) who - reports currently tracked stinkies in orgrimmar and durotar", "2) classes - reports stinkies grouped by class", "3) howmany - reports stinkies grouped by zone", "4) + - automatically invites to group with duel rogue for cd reset", "5) ++ - automatically invites to alliance group", } } ---@diagnostic disable-next-line: missing-fields shared.Commander = {} function shared.Commander.Init() ---@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 = "" 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 return ret end ---@param arr table ---@return string[] local function Count(arr) local ret = {} for _, player in pairs(arr) do if Heimdall_Data.config.who.zoneNotifyFor[player.zone] then ret[player.zone] = (ret[player.zone] or 0) + 1 end end local text = {} for zone, count in pairs(ret) do text[#text + 1] = string.format("%s: %d", zone, count) end return text end ---@param arr table ---@return string[] local function CountPartitioned(arr) local count = Count(arr) local text = {} for _, line in pairs(Partition(strjoin(", ", unpack(count)), 200)) do text[#text + 1] = line end return text end ---@param arr table ---@return string[] local function Who(arr) local ret = {} for _, player in pairs(arr) do if Heimdall_Data.config.who.zoneNotifyFor[player.zone] then 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 print(string.format("[%s] Command result: %s", ModuleName, strjoin(", ", unpack(ret)))) end return ret end ---@param arr table ---@return string[] local function WhoPartitioned(arr) local who = Who(arr) local text = {} for _, line in pairs(Partition(strjoin(", ", unpack(who)), 200)) do text[#text + 1] = "who: " .. line end return text end ---@param arr table ---@return string[] local function CountClass(arr) local ret = {} for _, player in pairs(arr) do if Heimdall_Data.config.who.zoneNotifyFor[player.zone] then ret[player.class] = (ret[player.class] or 0) + 1 end end local text = {} for class, count in pairs(ret) do text[#text + 1] = string.format("%s: %d", class, count) end if Heimdall_Data.config.commander.debug then print(string.format("[%s] Message text: %s", ModuleName, strjoin(", ", unpack(text)))) end return text end ---@param arr table ---@return string[] local function CountClassPartitioned(arr) local countClass = CountClass(arr) local text = {} for _, line in pairs(Partition(strjoin(", ", unpack(countClass)), 200)) do text[#text + 1] = line end return text end local function CountClassPartitionedStinkies() if Heimdall_Data.config.commander.debug then print(string.format("[%s] Executing: CountClassPartitionedStinkies", ModuleName)) end local res = CountClassPartitioned(HeimdallStinkies) 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)) end local res = WhoPartitioned(HeimdallStinkies) 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)) end local res = CountPartitioned(HeimdallStinkies) if #res == 0 then return { "No stinkies found" } end return res end local function HelpRu() if Heimdall_Data.config.commander.debug then print(string.format("[%s] Executing: HelpRu", ModuleName)) end return helpMessages.ru end local function HelpEn() if Heimdall_Data.config.commander.debug then print(string.format("[%s] Executing: HelpEn", ModuleName)) end return helpMessages.en end local groupInviteFrame = CreateFrame("Frame") groupInviteFrame:SetScript("OnEvent", function(self, event, ...) if Heimdall_Data.config.commander.debug then print(string.format("[%s] Event received", ModuleName)) end 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 _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 groupInviteFrame:RegisterEvent("PARTY_INVITE_REQUEST") 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 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 not target then return end FollowUnit(target) return {} end ---@class Command ---@field keywordRe string ---@field commanderOnly boolean ---@field callback fun(...: any): string[] local commands = { { keywordRe = "^who$", commanderOnly = false, callback = WhoPartitionedStinkies }, { keywordRe = "^howmany$", commanderOnly = false, callback = CountPartitionedStinkies }, { keywordRe = "^classes$", commanderOnly = false, callback = CountClassPartitionedStinkies }, { keywordRe = "^help$", commanderOnly = false, callback = HelpRu }, { keywordRe = "^helpen$", commanderOnly = false, callback = HelpEn }, { keywordRe = "^joingroup$", commanderOnly = false, callback = JoinGroup }, { keywordRe = "^leavegroup$", commanderOnly = false, callback = LeaveGroup }, { keywordRe = "^follow$", commanderOnly = false, callback = FollowTarget }, } local commanderChannelFrame = CreateFrame("Frame") commanderChannelFrame:RegisterEvent("CHAT_MSG_CHANNEL") 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) -- end if not Heimdall_Data.config.commander.enabled then -- if Heimdall_Data.config.commander.debug then -- print(string.format("[%s] Module disabled, ignoring event", ModuleName)) -- end return end local channelId = select(6, ...) local _, channelname = GetChannelName(channelId) -- if Heimdall_Data.config.commander.debug then -- print(string.format("[%s] Channel received: %s", ModuleName, channelname)) -- end if channelname ~= Heimdall_Data.config.commander.masterChannel then return end 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) end for _, command in ipairs(commands) do local enabled = Heimdall_Data.config.commander.commands[command.keywordRe] == true or false 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 msg:match(command.keywordRe) then local messages = command.callback({ strsplit(" ", msg) }) if Heimdall_Data.config.commander.debug then print(string.format("[%s] Messages to send: %s", ModuleName, strjoin(", ", unpack(messages)))) end for _, message in ipairs(messages) do ---@type Message local msg = { channel = "CHANNEL", data = channelname, message = message } table.insert(shared.messenger.queue, msg) end end end end end) print("[Heimdall] Commander module loaded") end