155 lines
4.9 KiB
Lua
155 lines
4.9 KiB
Lua
local addonname, shared = ...
|
|
---@cast shared HeimdallShared
|
|
---@cast addonname string
|
|
local ModuleName = "Noter"
|
|
|
|
---@class Note
|
|
---@field source string
|
|
---@field for string
|
|
---@field date string
|
|
---@field note string
|
|
|
|
---@diagnostic disable-next-line: missing-fields
|
|
shared.Noter = {}
|
|
function shared.Noter.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
|
|
|
|
-- 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)
|
|
--if Heimdall_Data.config.noter.debug then
|
|
-- print(string.format("[%s] Channel received: %s", ModuleName, channelname))
|
|
--end
|
|
if channelname ~= Heimdall_Data.config.noter.masterChannel then
|
|
--if Heimdall_Data.config.noter.debug then
|
|
-- print(string.format("[%s] Channel %s does not match 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]))
|
|
if Heimdall_Data.config.noter.debug then
|
|
print(string.format("[%s] Note command received for: %s", ModuleName, name))
|
|
end
|
|
local note = strtrim(args[3])
|
|
if note == "delete" then
|
|
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))
|
|
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])
|
|
|
|
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
|
|
|
|
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
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
print("[Heimdall] Commander module loaded")
|
|
end
|