From 330f06e7441f683ffdad2b3fe81b7af23a86a3dd Mon Sep 17 00:00:00 2001
From: Tai Kedzierski <dch.tai@gmail.com>
Date: Tue, 29 Jan 2019 22:52:55 +0000
Subject: [PATCH] working towns

---
 README.md          |  5 ++--
 lua/commands.lua   |  1 -
 lua/guestlists.lua | 62 ++++++++++++++++++++++++++++++----------------
 3 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/README.md b/README.md
index 9cdda2a..275a791 100644
--- a/README.md
+++ b/README.md
@@ -24,9 +24,10 @@ Randomized spawning typically causes players to spawn far from eachother. If pla
 The player issuing the invite (host) must typically pay a levvy when adding another player.
 
 * `/spawn add <player>` - allow another player to visit your spawn directly (levvy must be paid), or lift their exile (no levvy to pay)
-* `/spawn exile <player>` - revoke rights to visit you
+* `/spawn kick <targetplayer> [<hostplayer>]`
+    * revoke rights to visit you
     * if the exiled player gets close to your spawn, they are kicked back to their own spawn
-* `/spawn kick <targetplayer> <hostplayer>` - if you are a guest of `hostplayer`, you can exile `targetplayer` on their behalf
+    * if you are an explicit guest of `hostplayer` (not just a town visitor), you can exile `targetplayer` on their behalf
 * `/spawn visit <player>` - visit a player's spawn
 * `/spawn guests` - see who you have added to your spawn
 * `/spawn hosts` - see whose spawns you may visit
diff --git a/lua/commands.lua b/lua/commands.lua
index 2a1505e..6fa7528 100644
--- a/lua/commands.lua
+++ b/lua/commands.lua
@@ -56,7 +56,6 @@ minetest.register_chatcommand("spawn", {
                 ["hosts"] = function() rspawn.guestlists:listhosts(playername) end,
                 ["add"] = function(commandername,targetname) rspawn.guestlists:addplayer(commandername,targetname) end,
                 ["visit"] = function(commandername,targetname) rspawn.guestlists:visitplayer(targetname, commandername) end,
-                ["exile"] = function(commandername,targetname) rspawn.guestlists:exileplayer(commandername, targetname) end,
                 ["kick"] = function(commandername, params) rspawn.guestlists:kickplayer(commandername, params) end,
                 ["town"] = function(commandername,mode) rspawn.guestlists:townset(commandername, mode) end,
                 }) do
diff --git a/lua/guestlists.lua b/lua/guestlists.lua
index fe2ed8a..da9579e 100644
--- a/lua/guestlists.lua
+++ b/lua/guestlists.lua
@@ -103,26 +103,29 @@ function rspawn:consume_levvy(player)
     return false
 end
 
+local function d(stuff)
+    minetest.debug(dump(stuff))
+end
+
 -- Visitation rights check
 
 local function canvisit(hostname, guestname)
     local host_glist = rspawn.playerspawns["guest lists"][hostname] or {}
     local town_lists = rspawn.playerspawns["town lists"] or {}
 
-    return (
-        -- Guest not explicitly banned
-        (
-            not host_glist[guestname] or
-            host_glist[guestname] ~= GUEST_BAN
-        )
-        and
-        -- Host is open town, and guest is not banned
-        (
-            town_lists[hostname] and
-            town_lists[hostname]["town status"] == "on" and
-            town_lists[hostname][guestname] ~= GUEST_BAN
-        )
-    )
+    local explicitly_banned = host_glist[guestname] == GUEST_BAN
+
+    local explicitly_banned_from_town = town_lists[hostname] and
+        town_lists[hostname][guestname] == GUEST_BAN
+
+    local open_town = town_lists[hostname] and town_lists[hostname]["town status"] == "on"
+
+    if explicitly_banned or explicitly_banned_from_town then
+        return false
+    elseif open_town then
+        return true
+    end
+    return false
 end
 
 -- Operational functions (to be invoked by /command)
@@ -146,12 +149,13 @@ function rspawn.guestlists:addplayer(hostname, guestname)
     minetest.chat_send_player(hostname, guestname.." is allowed to visit your spawn.")
     rspawn.playerspawns["guest lists"][hostname] = guestlist
     rspawn:spawnsave()
+    minetest.log("action", "rspawn - "..hostname.." adds "..guestname.." to their spawn")
 end
 
-function rspawn.guestlists:exileplayer(hostname, guestname, callername)
+function rspawn.guestlists:exileplayer(hostname, guestname, notifyname)
     if hostname == guestname then
         minetest.chat_send_player(hostname, "Cannot ban yourself!")
-        return
+        return false
     end
     local guestlist = rspawn.playerspawns["guest lists"][hostname] or {}
 
@@ -160,22 +164,36 @@ function rspawn.guestlists:exileplayer(hostname, guestname, callername)
         rspawn.playerspawns["guest lists"][hostname] = guestlist
 
     else
-        minetest.chat_send_player(callername or hostname, guestname.." is not in accepted guests list for "..hostname)
-        return
+        minetest.chat_send_player(notifyname or hostname, guestname.." is not in accepted guests list for "..hostname)
+        return false
     end
 
-    minetest.chat_send_player(guestname, hostname.." banishes you!")
+    minetest.chat_send_player(guestname, "You may no longer visit "..hostname)
+    minetest.log("action", "rspawn - "..hostname.." exiles "..guestname)
     rspawn:spawnsave()
+    return true
 end
 
 function rspawn.guestlists:kickplayer(callername, params)
     params = params:split(" ")
+    local guestname = params[1]
     local hostname = params[2]
-    local target = params[1]
 
     -- Caller is an explicit non-exiled guest
-    if rspawn.playerspawns[hostname] and rspawn.playerspawns[hostname][callername] == GUEST_ALLOW then
-        rspawb.guestlists:exileplayer(hostname, guestname)
+    if hostname then
+        if rspawn.playerspawns["guest lists"][hostname] and rspawn.playerspawns["guest lists"][hostname][callername] == GUEST_ALLOW then
+            if rspawn.guestlists:exileplayer(hostname, guestname, callername) then
+                minetest.chat_send_player(callername, "Evicted "..guestname.." from "..hostname.."'s spawn")
+                minetest.log("action", "rspawn - "..callername.." evicts "..guestname.." on behalf of "..hostname)
+            end
+        else
+            minetest.chat_send_player(callername, "You are not permitted to act on behalf of "..hostname)
+        end
+    else
+        if rspawn.guestlists:exileplayer(callername, guestname) then
+            minetest.chat_send_player(callername, "Evicted "..guestname.." from "..callername.."'s spawn")
+            minetest.log("action", "rspawn - "..callername.." evicts "..guestname)
+        end
     end
 end