aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-05-29 00:49:10 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-05-29 00:49:10 +0200
commit535595e9823f020b8f02ae657f259966814d1906 (patch)
tree1901448068b0868b9176736b4c2437ef97948d01
parente7841553c1c28affcb9a907ee35317754f4ca442 (diff)
downloadhydra-dragonfire-535595e9823f020b8f02ae657f259966814d1906.tar.xz
Add escape sequence library
-rw-r--r--.gitmodules3
-rw-r--r--builtin/escapes.lua50
m---------builtin/luax0
-rwxr-xr-xexample/chat-client.lua24
-rw-r--r--hydra.go20
5 files changed, 94 insertions, 3 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..dfc0099
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "builtin/luax"]
+ path = builtin/luax
+ url = https://github.com/EliasFleckenstein03/luax
diff --git a/builtin/escapes.lua b/builtin/escapes.lua
new file mode 100644
index 0000000..12ba174
--- /dev/null
+++ b/builtin/escapes.lua
@@ -0,0 +1,50 @@
+--[[ builtin/escapes.lua ]]--
+-- code taken from minetest/builtin/common/misc_helpers.lua with modifications
+
+local escapes = {}
+package.loaded["escapes"] = escapes
+
+escapes.ESCAPE_CHAR = string.char(0x1b)
+
+function escapes.get_color_escape_sequence(color)
+ return escapes.ESCAPE_CHAR .. "(c@" .. color .. ")"
+end
+
+function escapes.get_background_escape_sequence(color)
+ return escapes.ESCAPE_CHAR .. "(b@" .. color .. ")"
+end
+
+function escapes.colorize(color, message)
+ local lines = tostring(message):split("\n", true)
+ local color_code = escapes.get_color_escape_sequence(color)
+
+ for i, line in ipairs(lines) do
+ lines[i] = color_code .. line
+ end
+
+ return table.concat(lines, "\n") .. escapes.get_color_escape_sequence("#ffffff")
+end
+
+function escapes.strip_foreground_colors(str)
+ return (str:gsub(escapes.ESCAPE_CHAR .. "%(c@[^)]+%)", ""))
+end
+
+function escapes.strip_background_colors(str)
+ return (str:gsub(escapes.ESCAPE_CHAR .. "%(b@[^)]+%)", ""))
+end
+
+function escapes.strip_colors(str)
+ return (str:gsub(escapes.ESCAPE_CHAR .. "%([bc]@[^)]+%)", ""))
+end
+
+function escapes.strip_translations(str)
+ return (str
+ :gsub(escapes.ESCAPE_CHAR .. "%(T@[^)]+%)", "")
+ :gsub(escapes.ESCAPE_CHAR .. "[TFE]", ""))
+end
+
+function escapes.strip_all(str)
+ str = escapes.strip_colors(str)
+ str = escapes.strip_translations(str)
+ return str
+end
diff --git a/builtin/luax b/builtin/luax
new file mode 160000
+Subproject 130a68dc27f3461838be005b3cb7b8a115e2c21
diff --git a/example/chat-client.lua b/example/chat-client.lua
new file mode 100755
index 0000000..7acb9a6
--- /dev/null
+++ b/example/chat-client.lua
@@ -0,0 +1,24 @@
+#!/usr/bin/env hydra-dragonfire
+local escapes = require("escapes")
+local address, name, password = unpack(arg)
+local client = hydra.client(address)
+
+client:enable("auth")
+client.auth:username(name)
+client.auth:password(password or "")
+
+client:subscribe("chat_msg")
+client:connect()
+
+while not hydra.canceled() do
+ local pkt, interrupt = client:poll()
+
+ if pkt then
+ print(escapes.strip_all(pkt.text))
+ elseif not interrupt then
+ print("disconnected")
+ break
+ end
+end
+
+client:disconnect()
diff --git a/hydra.go b/hydra.go
index ee8cdb6..5deb1d4 100644
--- a/hydra.go
+++ b/hydra.go
@@ -13,8 +13,20 @@ import (
var lastTime = time.Now()
var canceled = false
+//go:embed builtin/luax/init.lua
+var builtinLuaX string
+
//go:embed builtin/vector.lua
-var vectorLibrary string
+var builtinVector string
+
+//go:embed builtin/escapes.lua
+var builtinEscapes string
+
+var builtinFiles = []string{
+ builtinLuaX,
+ builtinVector,
+ builtinEscapes,
+}
var hydraFuncs = map[string]lua.LGFunction{
"client": l_client,
@@ -86,8 +98,10 @@ func main() {
l.SetField(l.NewTypeMetatable("hydra.auth"), "__index", l.SetFuncs(l.NewTable(), authFuncs))
l.SetField(l.NewTypeMetatable("hydra.client"), "__index", l.NewFunction(l_client_index))
- if err := l.DoString(vectorLibrary); err != nil {
- panic(err)
+ for _, str := range builtinFiles {
+ if err := l.DoString(str); err != nil {
+ panic(err)
+ }
}
if err := l.DoFile(os.Args[1]); err != nil {