210 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
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"
 |