From 97aa36c7263e473b409a8276552aa0155ae6f08b Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 9 Jul 2019 23:55:56 +0100 Subject: [PATCH] Initial commit --- .gitignore | 96 ++++++++++++++++++++++++++++++++++++++++ .luacheckrc | 12 +++++ actions.lua | 81 ++++++++++++++++++++++++++++++++++ api.lua | 73 +++++++++++++++++++++++++++++++ gui.lua | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++ init.lua | 5 +++ mod.conf | 3 ++ 7 files changed, 393 insertions(+) create mode 100644 .gitignore create mode 100644 .luacheckrc create mode 100644 actions.lua create mode 100644 api.lua create mode 100644 gui.lua create mode 100644 init.lua create mode 100644 mod.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f908bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ + +# Created by https://www.gitignore.io/api/lua,code,linux,windows +# Edit at https://www.gitignore.io/?templates=lua,code,linux,windows + +### Code ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Lua ### +# Compiled Lua sources +luac.out + +# luarocks build files +*.src.rock +*.zip +*.tar.gz + +# Object files +*.o +*.os +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo +*.def +*.exp + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/lua,code,linux,windows diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..37bc099 --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,12 @@ +unused_args = false +allow_defined_top = true + +globals = { + "classroom", +} + +read_globals = { + "minetest", + "sfinv", + "vector", +} diff --git a/actions.lua b/actions.lua new file mode 100644 index 0000000..b243ce7 --- /dev/null +++ b/actions.lua @@ -0,0 +1,81 @@ +classroom.register_action("bring", { + title = "Bring", + description = "Teleport players to your location", + online_required = true, + func = function(runner, players) + local pos = runner:get_pos() + + for _, name in pairs(players) do + local player = minetest.get_player_by_name(name) + player:set_pos(pos) + end + end, +}) + +classroom.register_action("look", { + title = "Look", + description = "Make players look at you", + online_required = true, + func = function(runner, players) + local pos = runner:get_pos() + + for _, name in pairs(players) do + local player = minetest.get_player_by_name(name) + local pos2 = player:get_pos() + player:set_look_horizontal(vector.angle(pos, pos2)) + end + end, +}) + +classroom.register_action("mute", { + title = "Mute", + description = "Revoke shout from players", + online_required = false, + func = function(runner, players) + for _, name in pairs(players) do + print("Muting " .. name) + local privs = minetest.get_player_privs(name) + privs.shout = nil + minetest.set_player_privs(name, privs) + end + end, +}) + +classroom.register_action("unmute", { + title = "Unmute", + description = "Grant shout to players", + online_required = false, + func = function(runner, players) + for _, name in pairs(players) do + local privs = minetest.get_player_privs(name) + privs.shout = true + minetest.set_player_privs(name, privs) + end + end, +}) + +classroom.register_action("fly", { + title = "Fly", + description = "Grant fly to players", + online_required = false, + func = function(runner, players) + for _, name in pairs(players) do + local privs = minetest.get_player_privs(name) + privs.fly = true + minetest.set_player_privs(name, privs) + end + end, +}) + +classroom.register_action("nofly", { + title = "NoFly", + description = "Revoke fly from players", + online_required = false, + func = function(runner, players) + for _, name in pairs(players) do + local privs = minetest.get_player_privs(name) + privs.fly = nil + minetest.set_player_privs(name, privs) + end + end, +}) diff --git a/api.lua b/api.lua new file mode 100644 index 0000000..38a2ed0 --- /dev/null +++ b/api.lua @@ -0,0 +1,73 @@ +local _groups = {} +local _action_by_name = {} + +function classroom.get_students() + local students = {} + for _, player in pairs(minetest.get_connected_players()) do + students[#students + 1] = player:get_player_name() + end + + return students +end + +function classroom.get_group_students(name) + local group = classroom.get_group(name) + if not group then + return nil + end + + local students = {} + for _, student in pairs(group.students) do + if minetest.get_player_by_name(group.students) then + students[#students + 1] = student + end + end + + return students +end + +function classroom.get_all_groups() + return _groups +end + +function classroom.get_group(name) + return _groups[name] +end + +function classroom.create_group(name) + if _groups[name] then + return nil + end + + local group = { + name = name, + students = {}, + } + + _groups[name] = group + + return group +end + +function classroom.register_action(name, def) + _action_by_name[name] = def +end + +function classroom.get_actions() + return _action_by_name +end + +function classroom.get_students_by_selector(selector) + if selector == "*" then + return classroom.get_students() + elseif selector:sub(1, 6) == "group:" then + return classroom.get_group_students(selector:sub(7)) + else + return { selector } + end +end + +function classroom.run_action(aname, runner, selector, params) + local action = _action_by_name[aname] + action.func(runner, classroom.get_students_by_selector(selector)) +end diff --git a/gui.lua b/gui.lua new file mode 100644 index 0000000..994d973 --- /dev/null +++ b/gui.lua @@ -0,0 +1,123 @@ +local infos = { + { + title = "Shout?", + type = "priv", + privs = { shout = true }, + }, + { + title = "Fly?", + type = "priv", + privs = { fly = true }, + }, + { + title = "Fast?", + type = "priv", + privs = { fast = true }, + }, +} + +local function get_group(context) + if context and context.groupname then + return classroom.get_group_students(context.groupname) + else + return classroom.get_students() + end +end + +sfinv.register_page("edu", { + title = "Classroom", + get = function(self, player, context) + local fs = { + "tablecolumns[color;text" + } + + context.select_toggle = context.select_toggle or "all" + + for i, col in pairs(infos) do + fs[#fs + 1] = ";color;text,align=center" + if i == 1 then + fs[#fs + 1] = ",padding=2" + end + end + + fs[#fs + 1] = "]" + fs[#fs + 1] = "tabheader[0.3,1.1;group;All,Group 1;1]" + fs[#fs + 1] = "table[0,0.8;5,8;kids;,Name" + for _, col in pairs(infos) do + fs[#fs + 1] = ",," .. col.title + end + + for _, student in pairs(get_group(context)) do + fs[#fs + 1] = ",," + fs[#fs + 1] = minetest.formspec_escape(student) + + for _, col in pairs(infos) do + local color, value + if col.type == "priv" then + local has_priv = minetest.check_player_privs(student, col.privs) + color = has_priv and "green" or "red" + value = has_priv and "Yes" or "No" + end + + fs[#fs + 1] = "," + fs[#fs + 1] = color + fs[#fs + 1] = "," + fs[#fs + 1] = minetest.formspec_escape(value) + end + end + fs[#fs + 1] = ";2]" + + + fs[#fs + 1] = "container[5.25,0]" + + local x = 0 + local y = 0.8 + for aname, action in pairs(classroom.get_actions()) do + fs[#fs + 1] = "button[" + fs[#fs + 1] = tostring(x) + fs[#fs + 1] = "," + fs[#fs + 1] = tostring(y) + fs[#fs + 1] = ";1,1;action_" + fs[#fs + 1] = aname + fs[#fs + 1] = ";" + fs[#fs + 1] = minetest.formspec_escape(action.title) + fs[#fs + 1] = "]" + + fs[#fs + 1] = "tooltip[action_" + fs[#fs + 1] = aname + fs[#fs + 1] = ";" + fs[#fs + 1] = minetest.formspec_escape(action.description) + fs[#fs + 1] = "]" + + if x < 1.5 then + x = x + 0.9 + else + x = 0 + y = y + 0.8 + end + end + fs[#fs + 1] = "container_end[]" + + return sfinv.make_formspec(player, context, table.concat(fs, ""), false) + end, + on_player_receive_fields = function(self, player, context, fields) + for aname, action in pairs(classroom.get_actions()) do + if fields["action_" .. aname] then + local selector + if context.select_toggle == "all" then + selector = "*" + elseif context.select_toggle == "group" then + selector = "group:" .. context.groupname + elseif context.select_toggle == "selected" then + error("Unimplemented") + else + error("Unknown selector") + end + + classroom.run_action(aname, player, selector) + sfinv.set_player_inventory_formspec(player) + return true + end + end + end, +}) diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..66406b0 --- /dev/null +++ b/init.lua @@ -0,0 +1,5 @@ +classroom = {} + +dofile(minetest.get_modpath("classroom") .. "/api.lua") +dofile(minetest.get_modpath("classroom") .. "/gui.lua") +dofile(minetest.get_modpath("classroom") .. "/actions.lua") diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..743193d --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = classroom +description = Classroom Manager +optional_depends = sfinv