From 67a8908d9f41894abb30b57a837a0d22a71a6ff0 Mon Sep 17 00:00:00 2001 From: Och Noe Date: Sun, 10 May 2020 10:08:15 +0200 Subject: first useable version - colour names possible, even for fading - mi/mw use server commands --- README.md | 7 ++ colournames.lua | 173 ++++++++++++++++++++++++++++++++++ init.lua | 282 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 462 insertions(+) create mode 100644 README.md create mode 100644 colournames.lua create mode 100644 init.lua diff --git a/README.md b/README.md new file mode 100644 index 0000000..a937710 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# colour_chat +A minetest CSM mod for changing the colour of text sent to the server. + +### Usage +Use .set_colour to set the colour of chat sent to the server, you can +use either HTML named colours or HTML hexdecimal colour codes. Use +.rainbow to generate rainbow text diff --git a/colournames.lua b/colournames.lua new file mode 100644 index 0000000..d9e9ec9 --- /dev/null +++ b/colournames.lua @@ -0,0 +1,173 @@ + +-- This list of colour names was extracted and converted from +-- https://drafts.csswg.org/css-color/#named-colors + + +local colournames = {} + +colournames["aliceblue"] = "#F0F8FF" +colournames["antiquewhite"] = "#FAEBD7" +colournames["aqua"] = "#00FFFF" +colournames["aquamarine"] = "#7FFFD4" +colournames["azure"] = "#F0FFFF" +colournames["beige"] = "#F5F5DC" +colournames["bisque"] = "#FFE4C4" +colournames["black"] = "#000000" +colournames["blanchedalmond"] = "#FFEBCD" +colournames["blue"] = "#0000FF" +colournames["blueviolet"] = "#8A2BE2" +colournames["brown"] = "#A52A2A" +colournames["burlywood"] = "#DEB887" +colournames["cadetblue"] = "#5F9EA0" +colournames["chartreuse"] = "#7FFF00" +colournames["chocolate"] = "#D2691E" +colournames["coral"] = "#FF7F50" +colournames["cornflowerblue"] = "#6495ED" +colournames["cornsilk"] = "#FFF8DC" +colournames["crimson"] = "#DC143C" +colournames["cyan"] = "#00FFFF" +colournames["darkblue"] = "#00008B" +colournames["darkcyan"] = "#008B8B" +colournames["darkgoldenrod"] = "#B8860B" +colournames["darkgray"] = "#A9A9A9" +colournames["darkgreen"] = "#006400" +colournames["darkgrey"] = "#A9A9A9" +colournames["darkkhaki"] = "#BDB76B" +colournames["darkmagenta"] = "#8B008B" +colournames["darkolivegreen"] = "#556B2F" +colournames["darkorange"] = "#FF8C00" +colournames["darkorchid"] = "#9932CC" +colournames["darkred"] = "#8B0000" +colournames["darksalmon"] = "#E9967A" +colournames["darkseagreen"] = "#8FBC8F" +colournames["darkslateblue"] = "#483D8B" +colournames["darkslategray"] = "#2F4F4F" +colournames["darkslategrey"] = "#2F4F4F" +colournames["darkturquoise"] = "#00CED1" +colournames["darkviolet"] = "#9400D3" +colournames["deeppink"] = "#FF1493" +colournames["deepskyblue"] = "#00BFFF" +colournames["dimgray"] = "#696969" +colournames["dimgrey"] = "#696969" +colournames["dodgerblue"] = "#1E90FF" +colournames["firebrick"] = "#B22222" +colournames["floralwhite"] = "#FFFAF0" +colournames["forestgreen"] = "#228B22" +colournames["fuchsia"] = "#FF00FF" +colournames["gainsboro"] = "#DCDCDC" +colournames["ghostwhite"] = "#F8F8FF" +colournames["gold"] = "#FFD700" +colournames["goldenrod"] = "#DAA520" +colournames["gray"] = "#808080" +colournames["green"] = "#008000" +colournames["greenyellow"] = "#ADFF2F" +colournames["grey"] = "#808080" +colournames["honeydew"] = "#F0FFF0" +colournames["hotpink"] = "#FF69B4" +colournames["indianred"] = "#CD5C5C" +colournames["indigo"] = "#4B0082" +colournames["ivory"] = "#FFFFF0" +colournames["khaki"] = "#F0E68C" +colournames["lavender"] = "#E6E6FA" +colournames["lavenderblush"] = "#FFF0F5" +colournames["lawngreen"] = "#7CFC00" +colournames["lemonchiffon"] = "#FFFACD" +colournames["lightblue"] = "#ADD8E6" +colournames["lightcoral"] = "#F08080" +colournames["lightcyan"] = "#E0FFFF" +colournames["lightgoldenrodyellow"] = "#FAFAD2" +colournames["lightgray"] = "#D3D3D3" +colournames["lightgreen"] = "#90EE90" +colournames["lightgrey"] = "#D3D3D3" +colournames["lightpink"] = "#FFB6C1" +colournames["lightsalmon"] = "#FFA07A" +colournames["lightseagreen"] = "#20B2AA" +colournames["lightskyblue"] = "#87CEFA" +colournames["lightslategray"] = "#778899" +colournames["lightslategrey"] = "#778899" +colournames["lightsteelblue"] = "#B0C4DE" +colournames["lightyellow"] = "#FFFFE0" +colournames["lime"] = "#00FF00" +colournames["limegreen"] = "#32CD32" +colournames["linen"] = "#FAF0E6" +colournames["magenta"] = "#FF00FF" +colournames["maroon"] = "#800000" +colournames["mediumaquamarine"] = "#66CDAA" +colournames["mediumblue"] = "#0000CD" +colournames["mediumorchid"] = "#BA55D3" +colournames["mediumpurple"] = "#9370DB" +colournames["mediumseagreen"] = "#3CB371" +colournames["mediumslateblue"] = "#7B68EE" +colournames["mediumspringgreen"] = "#00FA9A" +colournames["mediumturquoise"] = "#48D1CC" +colournames["mediumvioletred"] = "#C71585" +colournames["midnightblue"] = "#191970" +colournames["mintcream"] = "#F5FFFA" +colournames["mistyrose"] = "#FFE4E1" +colournames["moccasin"] = "#FFE4B5" +colournames["navajowhite"] = "#FFDEAD" +colournames["navy"] = "#000080" +colournames["oldlace"] = "#FDF5E6" +colournames["olive"] = "#808000" +colournames["olivedrab"] = "#6B8E23" +colournames["orange"] = "#FFA500" +colournames["orangered"] = "#FF4500" +colournames["orchid"] = "#DA70D6" +colournames["palegoldenrod"] = "#EEE8AA" +colournames["palegreen"] = "#98FB98" +colournames["paleturquoise"] = "#AFEEEE" +colournames["palevioletred"] = "#DB7093" +colournames["papayawhip"] = "#FFEFD5" +colournames["peachpuff"] = "#FFDAB9" +colournames["peru"] = "#CD853F" +colournames["pink"] = "#FFC0CB" +colournames["plum"] = "#DDA0DD" +colournames["powderblue"] = "#B0E0E6" +colournames["purple"] = "#800080" +colournames["rebeccapurple"] = "#663399" +colournames["red"] = "#FF0000" +colournames["rosybrown"] = "#BC8F8F" +colournames["royalblue"] = "#4169E1" +colournames["saddlebrown"] = "#8B4513" +colournames["salmon"] = "#FA8072" +colournames["sandybrown"] = "#F4A460" +colournames["seagreen"] = "#2E8B57" +colournames["seashell"] = "#FFF5EE" +colournames["sienna"] = "#A0522D" +colournames["silver"] = "#C0C0C0" +colournames["skyblue"] = "#87CEEB" +colournames["slateblue"] = "#6A5ACD" +colournames["slategray"] = "#708090" +colournames["slategrey"] = "#708090" +colournames["snow"] = "#FFFAFA" +colournames["springgreen"] = "#00FF7F" +colournames["steelblue"] = "#4682B4" +colournames["tan"] = "#D2B48C" +colournames["teal"] = "#008080" +colournames["thistle"] = "#D8BFD8" +colournames["tomato"] = "#FF6347" +colournames["turquoise"] = "#40E0D0" +colournames["violet"] = "#EE82EE" +colournames["wheat"] = "#F5DEB3" +colournames["white"] = "#FFFFFF" +colournames["whitesmoke"] = "#F5F5F5" +colournames["yellow"] = "#FFFF00" +colournames["yellowgreen"] = "#9ACD32" + + +function colourname2hex(colname) + if not colname then return "" end + if colname == "" then return "" end + if colname:sub(1,1) == "#" then + if #colname == 7 then + -- let's guess it's a hexcode as colour + return colname + end + end + if colournames[colname] then + return colournames[colname] + end + -- be safe and return nothing + return "" +end + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..e55419d --- /dev/null +++ b/init.lua @@ -0,0 +1,282 @@ +local modstorage = core.get_mod_storage() + +local register_on_message = core.register_on_sending_chat_message +if core.register_on_sending_chat_messages then + register_on_message = core.register_on_sending_chat_messages +end + +local function rgb_to_hex(rgb) + local hexadecimal = '#' + + for key, value in pairs(rgb) do + local hex = '' + + while(value > 0)do + local index = math.fmod(value, 16) + 1 + value = math.floor(value / 16) + hex = string.sub('0123456789ABCDEF', index, index) .. hex + end + + if(string.len(hex) == 0)then + hex = '00' + + elseif(string.len(hex) == 1)then + hex = '0' .. hex + end + + hexadecimal = hexadecimal .. hex + end + + return hexadecimal +end + +local function color_from_hue(hue) + local h = hue / 60 + local c = 255 + local x = (1 - math.abs(h%2 - 1)) * 255 + + local i = math.floor(h); + if (i == 0) then + return rgb_to_hex({c, x, 0}) + elseif (i == 1) then + return rgb_to_hex({x, c, 0}) + elseif (i == 2) then + return rgb_to_hex({0, c, x}) + elseif (i == 3) then + return rgb_to_hex({0, x, c}); + elseif (i == 4) then + return rgb_to_hex({x, 0, c}); + else + return rgb_to_hex({c, 0, x}); + end +end + +local function pastel_from_hue(hue) + local h = hue / 60 + local c = 255 + local d = 192 + local x = (1 - math.abs(h%2 - 1)) * 255 + + local i = math.floor(h); + if (i == 0) then + return rgb_to_hex({c, x, d}) + elseif (i == 1) then + return rgb_to_hex({x, c, d}) + elseif (i == 2) then + return rgb_to_hex({d, c, x}) + elseif (i == 3) then + return rgb_to_hex({d, x, c}); + elseif (i == 4) then + return rgb_to_hex({x, d, c}); + else + return rgb_to_hex({c, d, x}); + end +end + +function hex2rgb(hex) -- added - found on github + hex = hex:gsub("#","") + return {tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6))} +end + +local function color_step(pos, col1, col2) -- added - gets a color between colors + local rgb1 = hex2rgb(col1) + local rgb2 = hex2rgb(col2) + local rgb = {} + for i, v in pairs(rgb1) do + rgb[i] = rgb1[i]+(rgb2[i]-rgb1[i])*(pos/255) + end + return rgb_to_hex(rgb) +end + +local function canTalk() + if core.get_privilege_list then + return core.get_privilege_list().shout + else + return true + end +end + +local function say(message) + if not canTalk() then + minetest.display_chat_message("You need 'shout' in order to talk") + return + end + minetest.send_chat_message(message) + if minetest.get_server_info().protocol_version < 29 then + local name = minetest.localplayer:get_name() + minetest.display_chat_message("<"..name.."> " .. message) + end +end + +function fade(parameter) + local col1 = string.sub(parameter, 1, 7) + local col2 = string.sub(parameter, 9, 15) + local message = string.sub(parameter, 17) + if not canTalk() then + return false, "You need 'shout' in order to use this command" + end + if col1 == col2 then + say(core.get_color_escape_sequence(col1) .. message) + return true + end + local step = 255 / message:len() + local pos = 0 + local output = "" + for i = 1, message:len() do + local char = message:sub(i,i) + if char:match("%s") then + output = output .. char + else + output = output .. core.get_color_escape_sequence(color_step(pos, col1, col2)) .. char + end + pos = pos + step + end + say(output) + return true +end + +register_on_message(function(message) + if message:sub(1,1) == "/" or modstorage:get_string("colour") == "" or modstorage:get_string("colour") == "white" then + return false + end + + fade(modstorage:get_string("colour") .. " " .. message) + return true +end) + +core.register_chatcommand("set_colour", { + description = core.gettext("Change chat colour"), + func = function(colour) + if colour:len() == 7 then + modstorage:set_string("colour", colour.." "..colour) + else + modstorage:set_string("colour", colour) + end + return true, "Chat colour changed." + end, +}) + +core.register_chatcommand("get_colour", { + description = core.gettext("Display chat colour"), + func = function() + local cc = modstorage:get_string("colour") + return true, "Current chat colour: " .. cc + end, + }) + + +core.register_chatcommand("rainbow", { + description = core.gettext("rainbow text"), + func = function(param) + if not canTalk() then + return false, "You need 'shout' in order to use this command" + end + local step = 360 / param:len() + local hue = 0 + -- iterate the whole 360 degrees + local output = "" + for i = 1, param:len() do + local char = param:sub(i,i) + if char:match("%s") then + output = output .. char + else + output = output .. core.get_color_escape_sequence(colour_from_hue(hue)) .. char + end + hue = hue + step + end + say(output) + return true +end, +}) + +core.register_chatcommand("fade", { -- added - fades between any two colors + description = core.gettext("fade message between two colors"), + func = fade, +}) + +core.register_chatcommand("pastel", { + description = core.gettext("pastel rainbow text"), + func = function(param) + if not canTalk() then + return false, "You need 'shout' in order to use this command" + end + local step = 360 / param:len() + local hue = 0 + -- iterate the whole 360 degrees + local output = "" + for i = 1, param:len() do + local char = param:sub(i,i) + if char:match("%s") then + output = output .. char + else + output = output .. core.get_color_escape_sequence(pastel_from_hue(hue)) .. char + end + hue = hue + step + end + say(output) + return true +end, +}) + +core.register_chatcommand("mw", { + description = core.gettext("moderator warning"), + func = function(param) + if not canTalk() then + return false, "You need 'shout' in order to use this comand" + end + local output = "" + output = core.get_color_escape_sequence("#ffdf00") .. "MODERATOR WARNING: " + output = output .. core.get_color_escape_sequence("#ff7fff") ..param + say(output) + return true +end, +}) + + +core.register_chatcommand("mi", { + description = core.gettext("moderator info"), + func = function(param) + if not canTalk() then + return false, "You need 'shout' in order to use this command" + end + local output = "" + output = core.get_color_escape_sequence("#d0ff00") .. "MODERATOR INFO: " + output = output .. core.get_color_escape_sequence("#dfdfff") .. param + say(output) + return true +end, +}) + + + +core.register_chatcommand("rainbow", { + description = core.gettext("rainbow text"), + func = function(param) + if not canTalk() then + return false, "You need 'shout' in order to use this command" + end + local step = 360 / param:len() + local hue = 0 + -- iterate the whole 360 degrees + local output = "" + for i = 1, param:len() do + local char = param:sub(i,i) + if char:match("%s") then + output = output .. char + else + output = output .. core.get_color_escape_sequence(color_from_hue(hue)) .. char + end + hue = hue + step + end + say(output) + return true +end, +}) + +core.register_chatcommand("say", { + description = core.gettext("Send text without applying colour to it"), + func = function(text) + say(text) + return true + end, +}) -- cgit v1.2.3