-- colouring information format is:
-- "!c!f:b !c!f:b !c!f:b"
-- c = colour name
-- f = foreground colour
-- v = background colour
ESC = format("%c[",27)
chattr = {
reset = 0,
bright = 1,
dim = 2,
underline = 4,
blink = 5,
reverse = 7,
hidden = 8,
fg = {
black = 30,
red = 31,
green = 32,
yellow = 33,
blue = 34,
magenta = 35,
cyan = 36,
white = 37
},
bg = {
black = 40,
red = 41,
green = 42,
yellow = 43,
blue = 44,
magenta = 45,
cyan = 46,
white = 47
}
}
function migrateColours(user)
if (strfind(users[user].colours or "", ",")) then
-- they have an old-style colour string - convert it to a new one.
log(" Migrating " .. user .. "'s colouring settings to new format.")
local o, c = users[user].colours;
c = format("!talk!%s:%s", getOldColour(o, "talk"), getOldColour(o, "talkback"));
c = c .. format("!tell!%s:%s", getOldColour(o, "tell"), getOldColour(o, "tellback"));
c = c .. format("!list!%s:%s", getOldColour(o, "list"), getOldColour(o, "listback"));
c = c .. format("!listname!%s:%s", getOldColour(o, "listname"), getOldColour(o, "listnameback"));
c = c .. format("!shout!%s:%s", getOldColour(o, "shout"), getOldColour(o, "shoutback"));
c = c .. format("!message!%s:%s", getOldColour(o, "message"), getOldColour(o, "messageback"));
c = c .. format("!nick!%s:%s", getOldColour(o, "nick"), getOldColour(o, "nickback"));
users[user].colours = c;
end
end
function setColouring(conn, tag, fg, bg)
if (not strfind(conn.colours, "!" .. tag .. "!", 1, 1)) then
conn.colours = conn.colours .. format("!%s!%s:%s", tag, fg, bg);
else
conn.colours = gsub(conn.colours, format("!%s%%![^%%!]+", tag), format("!%s!%s:%s", tag, fg, bg));
end;
if (conn.status > 1) then
users[strlower(conn.realUser)].colours = conn.colours;
end;
end
function getColouringName(conn, tag, dfg, dbg)
-- return the english name of the fore and background colours, or
-- return the defaults if they've not been set yet.
local null, null, fg = strfind(conn.colours, "!" .. tag .. "!([^%:]+)%:");
local null, null, bg = strfind(conn.colours, "!" .. tag .. "![^%:]+%:([^%!]+)");
fg = fg or dfg or "white";
bg = bg or dbg or "none";
local rfg, rbg = "", "";
local c, b = gsub(fg, "^br", "");
if (b == 1) then rfg = "Br" end
rfg = rfg .. strupper(strsub(c, 1, 1)) .. strsub(c, 2, -1); -- we can assume this for now.
c, b = gsub(bg, "^br", "");
if (b == 1) then rbg = "Br" end
rbg = rbg .. strupper(strsub(c, 1, 1)) .. strsub(c, 2, -1); -- we can assume this for now.
return rfg, rbg;
end
function attrib(...)
local t = ESC;
if (arg ~= nil) then
for i = 1, getn(arg) do t = t .. ";" .. arg[i]; end
end
return t .. "m";
end
function getColour(conn, tag, dfg, dbg)
-- return the control codes to apply this colour.
local c = conn.colours;
local r = attrib(chattr.reset);
local null, null, fg = strfind(c, "!" .. tag .. "!([^%:]+)%:");
local null, null, bg = strfind(c, "!" .. tag .. "![^%:]+%:([^%!]+)");
fg = fg or dfg or "white";
bg = bg or dbg or "none";
local t = { [1] = chattr.reset };
getColourInsert(t, fg);
getColourInsert(t, bg, 1);
return call(attrib, t);
end
function getColourInsert(t, f, back)
if (strsub(f, 1, 2) == "br") then
if (not back) then
tinsert(t, chattr.bright);
end;
f = gsub(f, "^br", "");
end;
if (f == "black" and back) then tinsert(t, chattr.bg.black)
elseif (f == "black") then tinsert(t, chattr.fg.black)
elseif (f == "red" and back) then tinsert(t, chattr.bg.red)
elseif (f == "red") then tinsert(t, chattr.fg.red)
elseif (f == "green" and back) then tinsert(t, chattr.bg.green)
elseif (f == "green") then tinsert(t, chattr.fg.green)
elseif (f == "yellow" and back) then tinsert(t, chattr.bg.yellow)
elseif (f == "yellow") then tinsert(t, chattr.fg.yellow)
elseif (f == "magenta" and back) then tinsert(t, chattr.bg.magenta)
elseif (f == "magenta") then tinsert(t, chattr.fg.magenta)
elseif (f == "blue" and back) then tinsert(t, chattr.bg.blue)
elseif (f == "blue") then tinsert(t, chattr.fg.blue);
elseif (f == "cyan" and back) then tinsert(t, chattr.bg.cyan)
elseif (f == "cyan") then tinsert(t, chattr.fg.cyan)
elseif (f == "white" and back) then tinsert(t, chattr.bg.white)
elseif (f == "white") then tinsert(t, chattr.fg.white)
end;
end;
function getOldColour(s, type)
local c = s;
if (strfind(c, type, 1, 1) == nil) then
if (strfind(type, "back", 1, 1)) then
c = c .. type .. "='none',"
else
c = c .. type .. "='white',"
end;
end;
local f = strsub(c, strfind(c, type .. "=") + strlen(type .. "=") + 1, strlen(c));
f = strsub(f, 1, strfind(f, "'") - 1);
local b = (strsub(f, 1, 2) == "br");
do
return f;
end;
local r;
if (b) then
f = gsub(f, "br", "");
r = "Br";
else
r = "";
end;
if (f == "black") then r = r .. "Black";
elseif (f == "red") then r = r .. "Red";
elseif (f == "green") then r = r .. "Green";
elseif (f == "yellow") then r = r .. "Yellow";
elseif (f == "blue") then r = r .. "Blue";
elseif (f == "magenta") then r = r .. "Magenta";
elseif (f == "cyan") then r = r .. "Cyan";
elseif (f == "white") then r = r .. "White";
else r = r .. "None";
end;
return r;
end;