Files
wow-Yapper/Yapper.lua

210 lines
7.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"