From 5b58bff9d050184ba1c9b9e2edb352cbcf608d11 Mon Sep 17 00:00:00 2001
From: cheapie <no-email-for-you@example.com>
Date: Sat, 14 Sep 2024 16:25:05 -0500
Subject: Add luacheck configuration, some minor cleanup, and a few small fixes

---
 .luacheckrc |   9 +++++
 init.lua    | 113 ++++++++++++++++++++++++++++++++----------------------------
 2 files changed, 69 insertions(+), 53 deletions(-)
 create mode 100644 .luacheckrc

diff --git a/.luacheckrc b/.luacheckrc
new file mode 100644
index 0000000..97738ca
--- /dev/null
+++ b/.luacheckrc
@@ -0,0 +1,9 @@
+max_line_length = 160
+
+globals = {
+	"newplayer",
+}
+
+read_globals = {
+	"minetest",
+}
diff --git a/init.lua b/init.lua
index b74026e..679dae6 100644
--- a/init.lua
+++ b/init.lua
@@ -1,18 +1,10 @@
 newplayer = {}
 
-if type(minetest.colorize) == "function" then
-	newplayer.colorize = minetest.colorize
-else
-	newplayer.colorize = function(color,text)
-		return text
-	end
-end
-
-local f = io.open(minetest.get_worldpath()..DIR_DELIM.."newplayer-keywords.txt","r")
-if f then
-	local d = f:read("*all")
+local keywordfile = io.open(minetest.get_worldpath().."/newplayer-keywords.txt","r")
+if keywordfile then
+	local d = keywordfile:read("*all")
 	newplayer.keywords = minetest.deserialize(d)
-	f:close()
+	keywordfile:close()
 else
 	newplayer.keywords = {}
 end
@@ -21,29 +13,30 @@ newplayer.assigned_keywords = {}
 
 newplayer.hudids = {}
 
-local f = io.open(minetest.get_worldpath()..DIR_DELIM.."newplayer-rules.txt","r")
-if f then
-	local d = f:read("*all")
+local rulesfile = io.open(minetest.get_worldpath().."/newplayer-rules.txt","r")
+if rulesfile then
+	local d = rulesfile:read("*all")
 	newplayer.rules = minetest.formspec_escape(d)
-	f:close()
+	rulesfile:close()
 else
-	newplayer.rules = "Rules file not found!\n\nThe file should be named \"newplayer-rules.txt\" and placed in the following location:\n\n"..minetest.get_worldpath()..DIR_DELIM
+	local worldpath = minetest.formspec_escape(minetest.get_worldpath())
+	newplayer.rules = "Rules file not found!\n\nThe file should be named \"newplayer-rules.txt\" and placed in the following location:\n\n"..worldpath
 end
 
 function newplayer.savekeywords()
-	local f = io.open(minetest.get_worldpath()..DIR_DELIM.."newplayer-keywords.txt","w")
+	local f = io.open(minetest.get_worldpath().."/newplayer-keywords.txt","w")
 	local d = minetest.serialize(newplayer.keywords)
 	f:write(d)
 	f:close()
 end
 
 local editformspec1 = "size[13,9]"..
-	"label[0,-0.1;Editing Server Rules]"..
-	"textarea[0.25,0.5;12.5,7;rules;;"
+                      "label[0,-0.1;Editing Server Rules]"..
+                      "textarea[0.25,0.5;12.5,7;rules;;"
 -- the rules get inserted between these two on demand
 local editformspec2 = "]"..
-	"button_exit[0.5,8.1;2,1;save;Save]"..
-	"button_exit[5,8.1;2,1;quit;Cancel]"
+                      "button_exit[0.5,8.1;2,1;save;Save]"..
+                      "button_exit[5,8.1;2,1;quit;Cancel]"
 
 function newplayer.showrulesform(name)
 
@@ -56,10 +49,11 @@ function newplayer.showrulesform(name)
 
 	newplayer.rules_formspec_buffer = ""
 
-	while charpos < #newplayer.rules do
+	while charpos <= #newplayer.rules + 1 do
 		charpos = charpos + 1
 		linelen = linelen + 1
 		local c = string.sub(newplayer.rules, charpos, charpos)
+		if charpos > #newplayer.rules then c = "\n" end
 		if c == " " or c == "\t" or c == "\n" or c == "\r" then lastbreak = charpos end
 		if linelen > 70 or c == "\n" or c == "\r" then
 			newplayer.rules_formspec_buffer = newplayer.rules_formspec_buffer..","..string.sub(newplayer.rules, strstart, lastbreak-1)
@@ -70,25 +64,29 @@ function newplayer.showrulesform(name)
 		end
 	end
 
+	newplayer.rules_formspec_buffer = string.sub(newplayer.rules_formspec_buffer,2,-1)
+
 	if #newplayer.keywords > 0 then
 		newplayer.assigned_keywords[name] = newplayer.keywords[math.random(1,#newplayer.keywords)]
-		newplayer.rules_subbed = string.gsub(newplayer.rules_formspec_buffer,"@KEYWORD",newplayer.assigned_keywords[name])
+		local keyword = minetest.formspec_escape(newplayer.assigned_keywords[name])
+		newplayer.rules_subbed = string.gsub(newplayer.rules_formspec_buffer,"@KEYWORD",keyword)
 	else
 		newplayer.rules_subbed = newplayer.rules_formspec_buffer
 	end
 	if #newplayer.keywords > 0 and minetest.check_player_privs(name,{interact=true}) and not minetest.check_player_privs(name,{server=true}) then
-		newplayer.rules_subbed_interact = string.gsub(newplayer.rules_formspec_buffer,"@KEYWORD",minetest.formspec_escape("[Hidden because you already have interact]"))
+		local hiddenmsg = minetest.formspec_escape("[Hidden because you already have interact]")
+		newplayer.rules_subbed_interact = string.gsub(newplayer.rules_formspec_buffer,"@KEYWORD",hiddenmsg)
 	else
 		newplayer.rules_subbed_interact = newplayer.rules_formspec_buffer
-	end		
+	end
 	local form_interact = "size[13,9]"..
-				"label[0,-0.1;Server Rules]"..
-				"textlist[0.25,0.5;12.5,6.25;rules;"..newplayer.rules_subbed_interact.."]"
+	                      "label[0,-0.1;Server Rules]"..
+	                      "textlist[0.25,0.5;12.5,6.25;rules;"..newplayer.rules_subbed_interact.."]"
 	local form_nointeract = "size[13,9]"..
-				"label[0,-0.1;Server Rules]"..
-				"textlist[0.25,0.5;12.5,6.25;rules;"..newplayer.rules_subbed.."]"..
-				"button[1,8;2,1;yes;I agree]"..
-				"button[5,8;2,1;no;I do not agree]"
+	                        "label[0,-0.1;Server Rules]"..
+	                        "textlist[0.25,0.5;12.5,6.25;rules;"..newplayer.rules_subbed.."]"..
+	                        "button[1,8;2,1;yes;I agree]"..
+	                        "button[5,8;2,1;no;I do not agree]"
 	if #newplayer.keywords > 0 then
 		form_nointeract = form_nointeract.."field[0.5,7.6;8,1;keyword;Enter keyword from rules above:;]"
 	end
@@ -131,7 +129,10 @@ minetest.register_on_player_receive_fields(function(player,formname,fields)
 	local name = player:get_player_name()
 	if formname == "newplayer:rules_nointeract" then
 		if fields.yes then
-			if  #newplayer.keywords == 0 or (not newplayer.assigned_keywords[name]) or string.lower(fields.keyword) == string.lower(newplayer.assigned_keywords[name]) then
+			if #newplayer.keywords == 0
+			   or (not newplayer.assigned_keywords[name])
+			   or string.lower(fields.keyword) == string.lower(newplayer.assigned_keywords[name])
+			then
 				local privs = minetest.get_player_privs(name)
 				privs.interact = true
 				local extraprivs = minetest.settings:get("newplayer.extra_privs")
@@ -151,7 +152,7 @@ minetest.register_on_player_receive_fields(function(player,formname,fields)
 					minetest.chat_send_player(name,"Teleporting to spawn...")
 					player:setpos(spawn)
 				else
-					minetest.chat_send_player(name,newplayer.colorize("#FF0000","ERROR: ").."The spawn point is not set!")
+					minetest.chat_send_player(name,minetest.colorize("#FF0000","ERROR: ").."The spawn point is not set!")
 				end
 				local form =    "size[5,3]"..
 						"label[1,0;Thank you for agreeing]"..
@@ -181,11 +182,11 @@ minetest.register_on_player_receive_fields(function(player,formname,fields)
 	elseif formname == "newplayer:editrules" then
 		if minetest.check_player_privs(name, {server=true}) then
 			if fields.save then
-				local f = io.open(minetest.get_worldpath()..DIR_DELIM.."newplayer-rules.txt","w")
+				local f = io.open(minetest.get_worldpath().."/newplayer-rules.txt","w")
 				f:write(fields.rules)
 				f:close()
 				newplayer.rules = minetest.formspec_escape(fields.rules)
-				minetest.chat_send_player(name,newplayer.colorize("#55FF55","Success: ").."Rules/keyword updated.")
+				minetest.chat_send_player(name,minetest.colorize("#55FF55","Success: ").."Rules/keyword updated.")
 			end
 		else
 			minetest.chat_send_player(name,"You hacker you... nice try!")
@@ -231,9 +232,12 @@ minetest.register_chatcommand("set_no_interact_spawn",{
 		local player = minetest.get_player_by_name(name)
 		if not player then return end
 		local pos = player:get_pos()
-		minetest.setting_set("spawnpoint_no_interact",string.format("%s,%s,%s",pos.x,pos.y,pos.z))
-		minetest.setting_save()
-		return true, newplayer.colorize("#55FF55","Success: ").."Spawn point for players without interact set to: "..newplayer.colorize("#00FFFF",minetest.pos_to_string(pos))
+		minetest.settings:set("spawnpoint_no_interact",string.format("%s,%s,%s",pos.x,pos.y,pos.z))
+		minetest.settings:write()
+		local message = minetest.colorize("#55FF55","Success: ")..
+		                "Spawn point for players without interact set to: "..
+		                minetest.colorize("#00FFFF",minetest.pos_to_string(pos))
+		return true, message
 	end}
 )
 
@@ -245,9 +249,12 @@ minetest.register_chatcommand("set_interact_spawn",{
 		local player = minetest.get_player_by_name(name)
 		if not player then return end
 		local pos = player:get_pos()
-		minetest.setting_set("spawnpoint_interact",string.format("%s,%s,%s",pos.x,pos.y,pos.z))
-		minetest.setting_save()
-		return true, newplayer.colorize("#55FF55","Success: ").."Spawn point for players with interact set to: "..newplayer.colorize("#00FFFF",minetest.pos_to_string(pos))
+		minetest.settings:set("spawnpoint_interact",string.format("%s,%s,%s",pos.x,pos.y,pos.z))
+		minetest.settings:write()
+		local message = minetest.colorize("#55FF55","Success: ")..
+		                "Spawn point for players with interact set to: "..
+		                minetest.colorize("#00FFFF",minetest.pos_to_string(pos))
+		return true, message
 	end}
 )
 
@@ -255,12 +262,12 @@ minetest.register_chatcommand("getkeywords",{
 	params = "",
 	description = "Gets the list of keywords used to obtain the interact privilege",
 	privs = {server=true},
-	func = function(name)
-		local out = ""
+	func = function()
+		local out
 		if #newplayer.keywords > 0 then
 			out = "Currently configured keywords:"
 			for _,kw in pairs(newplayer.keywords) do
-				out = out.."\n"..newplayer.colorize("#00FFFF",kw)
+				out = out.."\n"..minetest.colorize("#00FFFF",kw)
 			end
 		else
 			out = "No keywords are currently set."
@@ -273,9 +280,9 @@ minetest.register_chatcommand("addkeyword",{
 	params = "<keyword>",
 	description = "Add a keyword to the list of keywords used to obtain the interact privilege",
 	privs = {server=true},
-	func = function(name,param)
+	func = function(_,param)
 		if (not param) or param == "" then
-			return true, newplayer.colorize("#FF0000","ERROR: ").."No keyword supplied"
+			return true, minetest.colorize("#FF0000","ERROR: ").."No keyword supplied"
 		end
 		table.insert(newplayer.keywords,param)
 		newplayer.savekeywords()
@@ -287,18 +294,18 @@ minetest.register_chatcommand("delkeyword",{
 	params = "<keyword>",
 	description = "Remove a keyword from the list of keywords used to obtain the interact privilege",
 	privs = {server=true},
-	func = function(name,param)
+	func = function(_,param)
 		if (not param) or param == "" then
-			return true, newplayer.colorize("#FF0000","ERROR: ").."No keyword supplied"
+			return true, minetest.colorize("#FF0000","ERROR: ").."No keyword supplied"
 		end
 		for k,v in pairs(newplayer.keywords) do
 			if v == param then
 				newplayer.keywords[k] = nil
 				newplayer.savekeywords()
-				return true, "Keyword "..newplayer.colorize("#00FFFF",param).." removed"
+				return true, "Keyword "..minetest.colorize("#00FFFF",param).." removed"
 			end
 		end
-		return true, newplayer.colorize("#FF0000","ERROR: ").."Keyword "..newplayer.colorize("#00FFFF",param).." not found"
+		return true, minetest.colorize("#FF0000","ERROR: ").."Keyword "..minetest.colorize("#00FFFF",param).." not found"
 	end}
 )
 
@@ -315,7 +322,7 @@ minetest.register_chatcommand("spawn",{
 				player:set_pos(pos)
 				return true, "Teleporting to spawn..."
 			else
-				return true, newplayer.colorize("#FF0000","ERROR: ").."The spawn point is not set!"
+				return true, minetest.colorize("#FF0000","ERROR: ").."The spawn point is not set!"
 			end
 		else
 			local pos = minetest.setting_get_pos("spawnpoint_no_interact")
@@ -323,7 +330,7 @@ minetest.register_chatcommand("spawn",{
 				player:set_pos(pos)
 				return true, "Teleporting to spawn..."
 			else
-				return true, newplayer.colorize("#FF0000","ERROR: ").."The spawn point is not set!"
+				return true, minetest.colorize("#FF0000","ERROR: ").."The spawn point is not set!"
 			end
 		end
 	end}
-- 
cgit v1.2.3