Files
coa-chatter/Modules/SplitText.lua
T

99 lines
2.6 KiB
Lua

local mod = Chatter:NewModule("Message Splitting", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Message Split"]
function mod:Info()
return L["Allows you to type messages longer than normal, and splits message that are too long."]
end
local function ChatEdit_SendText(editBox, addHistory, doParse)
if doParse then
ChatEdit_ParseText(editBox, 1);
end
local type = editBox:GetAttribute("chatType");
local text = editBox:GetText();
if ( strfind(text, "%s*[^%s]+") ) then
if ( type == "WHISPER") then
local target = editBox:GetAttribute("tellTarget");
ChatEdit_SetLastToldTarget(target);
SendChatMessage(text, type, editBox.language, target);
elseif ( type == "CHANNEL") then
SendChatMessage(text, type, editBox.language, editBox:GetAttribute("channelTarget"));
else
SendChatMessage(text, type, editBox.language);
end
if ( addHistory ) then
ChatEdit_AddHistory(editBox);
end
end
end
local MAX = 256
local getChunk
do
local buf = {}
function getChunk(text, start)
local stack = 0
local first = nil
buf = wipe(buf)
if start > #text then return nil end
for i = start, start + MAX - 1 do
local byte = text:sub(i, i)
local bit = text:sub(i, i+1)
if bit == "|c" or bit == "|H" then
first = first or i
stack = stack + 1
elseif (bit == "|r" or bit == "|h") and stack > 0 and first then
stack = stack - 1
if stack == 0 then
tinsert(buf, text:sub(first, i))
first = nil
end
elseif (byte == " " or byte == "") and stack == 0 and first then
tinsert(buf, text:sub(first or 1, i))
first = nil
else
first = first or i
end
end
if #buf == 0 then return nil end
local str = table.concat(buf, "")
return start + #str, str
end
end
function mod:OnEnterPressed(editBox)
local text = editBox:GetText()
if #text <= 255 then
ChatEdit_OnEnterPressed(editBox)
return
end
local first = true
for start, chunk in getChunk, text, 1 do
editBox:SetText(chunk)
ChatEdit_SendText(editBox, true, first);
first = false
end
local type = editBox:GetAttribute("chatType");
if ( ChatTypeInfo[type].sticky == 1 ) then
editBox:SetAttribute("stickyType", type);
end
ChatEdit_OnEscapePressed(editBox);
end
function mod:OnEnable()
ChatFrameEditBox:SetMaxLetters(2048)
ChatFrameEditBox:SetMaxBytes(2048)
self:RawHookScript(ChatFrameEditBox, "OnEnterPressed")
end
function mod:OnDisable()
ChatFrameEditBox:SetMaxLetters(256)
ChatFrameEditBox:SetMaxBytes(256)
end