local addonname, shared = ... ---@cast addonname string local _L = { ["EN"] = { ["NO_MESSAGE"] = "Yapper found no message to yap", ["NO_CHANNEL"] = "Yapper found no channel to yap in", ["NO_CHANNEL_ID"] = "Yapper found no channel id for %s", ["NO_INTERVAL"] = "Yapper has no interval set", ["YAPPER_TOGGLE"] = "Yapper is now %s", ["YAPPER_INTERVAL_SET"] = "Yapper interval set to %d", ["YAPPER_MESSAGE_SET"] = "Yapper message set to %s", ["YAPPER_CHANNEL_SET"] = "Yapper channel set to %s with data %s", ["YAPPER_CHANNEL_SET_NIL"] = "Yapper channel set to nil", ["YAPPER_LANGUAGE_SET"] = "Yapper language set to %s", ["YAPPER_LANGUAGE_NOT_FOUND"] = "Yapper language not found", ["YAPPER_ENABLED"] = "enabled", ["YAPPER_DISABLED"] = "disabled", ["NO_WHISPER_TARGET"] = "Yapper found no whisper target" }, ["RU"] = { ["NO_MESSAGE"] = "Болтун не нашел сообщение для болтовни", ["NO_CHANNEL"] = "Болтун не нашел канал для болтовни", ["NO_CHANNEL_ID"] = "Болтун не нашел ID канала для %s", ["NO_INTERVAL"] = "У Болтуна не установлен интервал", ["YAPPER_TOGGLE"] = "Болтун теперь %s", ["YAPPER_INTERVAL_SET"] = "Интервал Болтуна установлен на %d", ["YAPPER_MESSAGE_SET"] = "Сообщение Болтуна установлено на %s", ["YAPPER_CHANNEL_SET"] = "Канал Болтуна установлен на %s с данными %s", ["YAPPER_CHANNEL_SET_NIL"] = "Канал Болтуна установлен в nil", ["YAPPER_LANGUAGE_SET"] = "Язык Болтуна установлен на %s", ["YAPPER_LANGUAGE_NOT_FOUND"] = "Язык Болтуна не найден", ["YAPPER_ENABLED"] = "включен", ["YAPPER_DISABLED"] = "выключен", ["NO_WHISPER_TARGET"] = "Болтун не нашел цель для болтовни" } } local function GetOrDefault(table, keys, default) local value = default if not table then return value end if not keys then return value end local traverse = table for i = 1, #keys do local key = keys[i] if traverse[key] ~= nil then traverse = traverse[key] else break end if i == #keys then value = traverse end end return value end local function GetChannelId(channelName) local channels = { GetChannelList() } for i = 1, #channels, 2 do local id = channels[i] local name = channels[i + 1] if name == channelName then return id end end end ---@class YapperConfig ---@field message string ---@field interval number ---@field channel string ---@field channelData any ---@field enabled boolean ---@field language string ---@cast shared { config: YapperConfig} local timer = nil local function Yap() if not shared.config.enabled then return end if not shared.config.message then print(string.format(_L[shared.config.language]["NO_MESSAGE"], tostring(shared.config.message))) shared.config.enabled = false return end if not shared.config.channel then print(string.format(_L[shared.config.language]["NO_CHANNEL"], tostring(shared.config.channel))) shared.config.enabled = false return end local data = shared.config.channelData if shared.config.channel == "CHANNEL" and not tonumber(shared.config.channelData) then data = GetChannelId(shared.config.channelData) if data == nil then print(string.format(_L[shared.config.language]["NO_CHANNEL_ID"], shared.config.channelData)) shared.config.enabled = false return end end if shared.config.channel == "WHISPER" and not shared.config.channelData then print(string.format(_L[shared.config.language]["NO_WHISPER_TARGET"], shared.config.channelData)) shared.config.enabled = false return end SendChatMessage(shared.config.message, shared.config.channel, nil, data) if not shared.config.interval or shared.config.interval <= 0 then print(string.format(_L[shared.config.language]["NO_INTERVAL"], tostring(shared.config.interval))) shared.config.enabled = false return end timer = C_Timer.NewTimer(shared.config.interval, Yap) end local function init() if not shared.config.enabled then return end if timer and not timer:IsCancelled() then timer:Cancel() end Yap() end local loadedFrame = CreateFrame("Frame") loadedFrame:RegisterEvent("ADDON_LOADED") loadedFrame:SetScript("OnEvent", function(self, event, addonName) if addonName == addonname then if not YapperConfig then YapperConfig = {} end shared.config = { message = GetOrDefault(YapperConfig, { "message" }, ""), interval = GetOrDefault(YapperConfig, { "interval" }, 1), channel = GetOrDefault(YapperConfig, { "channel" }, "SAY"), channelData = GetOrDefault(YapperConfig, { "channelData" }, nil), enabled = GetOrDefault(YapperConfig, { "enabled" }, false), language = GetOrDefault(YapperConfig, { "language" }, "EN"), } end end) local logoutFrame = CreateFrame("Frame") logoutFrame:RegisterEvent("PLAYER_LOGOUT") logoutFrame:SetScript("OnEvent", function(self, event) shared.config.enabled = false YapperConfig = shared.config end) SlashCmdList["YAPPER_MAIN_CMD"] = function(input) if input == "" or input == nil then shared.config.enabled = not shared.config.enabled print(string.format(_L[shared.config.language]["YAPPER_TOGGLE"], shared.config.enabled and _L[shared.config.language]["YAPPER_ENABLED"] or _L[shared.config.language]["YAPPER_DISABLED"])) init() return end if tonumber(input) then shared.config.interval = tonumber(input) print(string.format(_L[shared.config.language]["YAPPER_INTERVAL_SET"], shared.config.interval)) init() return end shared.config.message = input print(string.format(_L[shared.config.language]["YAPPER_MESSAGE_SET"], shared.config.message)) init() end SLASH_YAPPER_MAIN_CMD1 = "/yap" SlashCmdList["YAPPER_CHANNEL_CMD"] = function(input) if input == "" or input == nil then shared.config.channel = nil shared.config.channelData = nil print(_L[shared.config.language]["YAPPER_CHANNEL_SET_NIL"]) return end local data = { strsplit(" ", input) } if #data == 1 then shared.config.channel = string.upper(data[1]) shared.config.channelData = nil print(string.format(_L[shared.config.language]["YAPPER_CHANNEL_SET"], tostring(shared.config.channel), tostring(shared.config.channelData))) return end shared.config.channel = string.upper(data[1]) shared.config.channelData = data[2] print(string.format(_L[shared.config.language]["YAPPER_CHANNEL_SET"], tostring(shared.config.channel), tostring(shared.config.channelData))) end SLASH_YAPPER_CHANNEL_CMD1 = "/yapc" SlashCmdList["YAPPER_LANGUAGE_CMD"] = function(input) input = string.upper(input) if input == "" or input == nil then input = "EN" end if _L[input] == nil then print(_L[shared.config.language]["YAPPER_LANGUAGE_NOT_FOUND"]) return end shared.config.language = input print(string.format(_L[shared.config.language]["YAPPER_LANGUAGE_SET"], shared.config.language)) end SLASH_YAPPER_LANGUAGE_CMD1 = "/yapl"