From 8ba15919ffb276b510ddf952b0176e0efc96283e Mon Sep 17 00:00:00 2001
From: Tuxilio <mail@tuxil.io>
Date: Sun, 1 Dec 2024 12:05:38 +0100
Subject: [PATCH] First working version

---
 README.md            |   4 --
 init.lua             |  85 +++++++++++++++++++++++++++++++------------
 mod.conf             |   1 +
 settingtypes.txt     |   1 +
 textures/black.png   | Bin 0 -> 550 bytes
 textures/blue.png    | Bin 0 -> 560 bytes
 textures/cyan.png    | Bin 0 -> 560 bytes
 textures/gray.png    | Bin 0 -> 560 bytes
 textures/green.png   | Bin 0 -> 558 bytes
 textures/magenta.png | Bin 0 -> 560 bytes
 textures/red.png     | Bin 0 -> 556 bytes
 textures/white.png   | Bin 0 -> 560 bytes
 textures/yellow.png  | Bin 0 -> 558 bytes
 13 files changed, 64 insertions(+), 27 deletions(-)
 create mode 100644 settingtypes.txt
 create mode 100644 textures/black.png
 create mode 100644 textures/blue.png
 create mode 100644 textures/cyan.png
 create mode 100644 textures/gray.png
 create mode 100644 textures/green.png
 create mode 100644 textures/magenta.png
 create mode 100644 textures/red.png
 create mode 100644 textures/white.png
 create mode 100644 textures/yellow.png

diff --git a/README.md b/README.md
index a046345..bd63bdb 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1 @@
 # Luanti LED Tree
-
-You have to add the mod to the trusted mods in minetest.conf:
-
-secure.http_mods = ledtree
diff --git a/init.lua b/init.lua
index 17e9b2e..7615935 100644
--- a/init.lua
+++ b/init.lua
@@ -2,40 +2,79 @@
 --
 -- SPDX-License-Identifier: GPL-3.0-or-later
 
-local HTTPApiTable = core.request_http_api()
+local modname = core.get_current_modname()
+local modpath = core.get_modpath(modname)
 
 local data = {
-    url = "https://mqtt.felix-zauberer.de:443",
+    url = "mqtt.felix-zauberer.de",
     clientId = "ledtree_luanti",
     username = "kalle1",
-    token = "eZcKn1zBE6KtbeFnZ33lV1EKnr9Bcn8B",
+    password = "eZcKn1zBE6KtbeFnZ33lV1EKnr9Bcn8B",
 }
 
-change_color = function(led_id)
-    local request = {
-        url = data.url,
-        method = 'POST',
-        timeout = 15,
-        username = data.username,
-        clientId = data.clientId,
-        extra_headers = {
-            "Authorization: Bearer "..data.token,
-        }
-    }
-    HTTPApiTable.fetch(request, function(response)
-        print(dump(request))
-        if response.code ~= 200 then
-            return false
-        else
-            return true
-        end
-    end)
+local mqttBaseTopic = core.settings:get("ledtree_base_topic") or "ledtree"
+
+local client = mqtt.connect(data.url, data.clientId, data.username, data.password)
+
+local change_color = function(player, led_id)
+    local formspec = "size[3,3]" ..
+                     "image_button[0,0;1,1;red.png;red;red;false;false;]" ..
+                     "image_button[1,0;1,1;green.png;gren;green;false;false;]" ..
+                     "image_button[2,0;1,1;blue.png;blue;blue;false;false;]" ..
+                     "image_button[0,1;1,1;yellow.png;yellow;yellow;false;false;]" ..
+                     "image_button[1,1;1,1;cyan.png;cyan;cyan;false;false;]" ..
+                     "image_button[2,1;1,1;magenta.png;magenta;magenta;false;false;]" ..
+                     "image_button[0,2;1,1;white.png;white;white;false;false;]" ..
+                     "image_button[1,2;1,1;black.png;black;black;false;false;]" ..
+                     "image_button[2,2;1,1;gray.png;gray;gray;false;false;]"
+
+    core.show_formspec(player:get_player_name(), "ledtree:colorpicker", formspec)
+end
+
+local function send_mqtt(id, rgb)
+    mqtt.publish(client, mqttBaseTopic.."/led/"..id, "["..rgb.."]")
 end
 
 for id=1, 10, 1 do
     core.register_node("ledtree:led"..id, {
         description = "LED"..id,
         --tiles = "",
-        on_rightclick = change_color(id),
+        on_rightclick = function(pos, node, player, itemstack, pointed_thing)
+            change_color(player, id)
+        end,
     })
 end
+
+core.register_on_player_receive_fields(function(player, formname, fields)
+    if formname == "ledtree:colorpicker" then
+        for color, _ in pairs(fields) do
+            if color then
+                local rgb = ""
+                if color == "red" then
+                    rgb = "255,0,0"
+                elseif color == "green" then
+                    rgb = "0,255,0"
+                elseif color == "blue" then
+                    rgb = "0,0,255"
+                elseif color == "yellow" then
+                    rgb = "255,255,0"
+                elseif color == "cyan" then
+                    rgb = "0,255,255"
+                elseif color == "magenta" then
+                    rgb = "255,0,255"
+                elseif color == "white" then
+                    rgb = "255,255,255"
+                elseif color == "black" then
+                    rgb = "0,0,0"
+                elseif color == "gray" then
+                    rgb = "128,128,128"
+                end
+
+                if rgb ~= "" then
+                    core.chat_send_player(player:get_player_name(), "RGB: " .. rgb)
+                    send_mqtt(1, rgb)
+                end
+            end
+        end
+    end
+end)
diff --git a/mod.conf b/mod.conf
index d7d6ed5..77503c3 100644
--- a/mod.conf
+++ b/mod.conf
@@ -1,4 +1,5 @@
 name = ledtree
 title = Teckids LED-Weihnachtsbaum
 description = Teckids LED-Weihnachtsbaum
+depends = mqtt
 author = Tuxilio <mail@tuxil.io>
diff --git a/settingtypes.txt b/settingtypes.txt
new file mode 100644
index 0000000..6c24e52
--- /dev/null
+++ b/settingtypes.txt
@@ -0,0 +1 @@
+ledtree_base_topic (Base topic (e.g. /[base_topic]/led/1)) string ledtree
diff --git a/textures/black.png b/textures/black.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9e1417a7650a8f614768d3ba8813b7a2d5518c6
GIT binary patch
literal 550
zcmV+>0@?kEP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYt*6j5qF0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
o5J^NqR4C75U>F6XU=+Xr00R&J0ceqJ!vFvP07*qoM6N<$f<5usuK)l5

literal 0
HcmV?d00001

diff --git a/textures/blue.png b/textures/blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..b070f2dd5f37fd10a3b20a476fc505aa876a0dc6
GIT binary patch
literal 560
zcmV-00?+-4P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYq@BFscw0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
y8c9S!R4C75WYGK1Knh@DAQ6me7}YRzGynj~v;j>ESnGNK0000<MNUMnLSTYrli)f4

literal 0
HcmV?d00001

diff --git a/textures/cyan.png b/textures/cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a7989147f98e8fdaee2d01ce9bb3b43f1ff20f3
GIT binary patch
literal 560
zcmV-00?+-4P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SY!XnYU@H0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
y8c9S!R4C75%&UCPKnh@DAQ6me7}YRzGynj%CIRk$qacw00000<MNUMnLSTZoe&GiI

literal 0
HcmV?d00001

diff --git a/textures/gray.png b/textures/gray.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f11ee97e6affeb88d069fbbbeaa308b84c1c65e
GIT binary patch
literal 560
zcmV-00?+-4P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYt}=ja=E0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
y8c9S!R4C75oH1ht11W%sfkZH>VN}D=(EtFYO9ANLjlw<v0000<MNUMnLSTZf#NqJ(

literal 0
HcmV?d00001

diff --git a/textures/green.png b/textures/green.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9c634be1dad16c9a4bad6f1b7dc655a9816ee70
GIT binary patch
literal 558
zcmV+}0@3}6P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYq$Tzxp<0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
w7)eAyR4C75jQ!6*5@2Fr7}YSUVYq4l09&yEeAfNpC;$Ke07*qoM6N<$g5N>mfB*mh

literal 0
HcmV?d00001

diff --git a/textures/magenta.png b/textures/magenta.png
new file mode 100644
index 0000000000000000000000000000000000000000..edf8e7203dce11c800b15a9f76b5b039fdb5c886
GIT binary patch
literal 560
zcmV-00?+-4P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SY$<NP7ut0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
y8c9S!R4C75{LXNbffT^RKq45`FsfnbXaE4c*#Yo0Vl{gJ0000<MNUMnLSTY_V&UNc

literal 0
HcmV?d00001

diff --git a/textures/red.png b/textures/red.png
new file mode 100644
index 0000000000000000000000000000000000000000..45b8162bdfe67026e12afb8f06126f83db8becfb
GIT binary patch
literal 556
zcmV+{0@MA8P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYk{?U>)B0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
u7D+@wR4C75{LerdU}6~6FsfnLY5)L0E&(60kity>0000<MNUMnLSTYpPvBVq

literal 0
HcmV?d00001

diff --git a/textures/white.png b/textures/white.png
new file mode 100644
index 0000000000000000000000000000000000000000..20fd88347972bc0420fb4d83fa18576559eca54b
GIT binary patch
literal 560
zcmV-00?+-4P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYk*`I&?30000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
y8c9S!R4C75{Qv(y11W%sfkZH>VN}D=(EtEdZ37*jE)}8x0000<MNUMnLSTXoFyf{F

literal 0
HcmV?d00001

diff --git a/textures/yellow.png b/textures/yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2ee4a7b914127fe51cb183ea9fa7848306ce0c2
GIT binary patch
literal 558
zcmV+}0@3}6P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmP!xqvQ$;Bi2Rn#3WT;LS#ELl9DionYs1;guFnQ@8G-*gu
zTpR`0f`dPcRR<SmT^(EnLGTB}*}+NCMM}IcDYS_3!sC6MchBLy`v9R?Wt!EK05sh;
zGpVGQ%dd)kuLvW65GE0qnPtpLQX0PXbx*xicQKyj-}h$?s0E7w0g*Vt4AUmwAfDN@
z4bJ<-5muH};&b8&lP*a7$aTfzH_j!O1)do(vzd9~2(eh|Vx@~&+0=-qiKD8fQ@)V%
zSmnIMS*zAr`=0!T;ex)h%yn9$NMR96kRU=q9TikzBSyPUiiHfFCw=@Qu3sXTLaquJ
zITlcZ2HEw4|H1FsTE+O3mlRF{y)TaQF$VPQ0<DJQd>=bb>jVfs16O*-Uuy!hpQJZB
zTJ#7Q+y*YLJDRcwT<!qFPljyDt`wvt6pO(78GTb87`g>QYu?=2=Qw=;vNWso4RCM>
zjF%{T-RIr?-E;f5r#-(P&MR`uGXGa<00009a7bBm001r{001r{0eGc9b^rhX2XskI
zMF;2%0SYr4I2Mp00000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN
w7)eAyR4C75{C|jnB*4VLFsflx!*JCA0FdYb;VpxYb^rhX07*qoM6N<$g1hkHy#N3J

literal 0
HcmV?d00001

-- 
GitLab