1
0
cuberite-2a/MCServer/Plugins/Core/console.lua
Alexander Harkness 0355be903f Merge all the latest stuff from Core.
Squashed commit of the following:

commit b6ecb378ca6f213b4676ca17efcb5baa64f2f132
Merge: b273df1 1a6f70f
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Sat Aug 10 06:05:32 2013 -0700

    Merge pull request #13 from mc-server/give-console

    Added a console command for giving players items.

commit b273df17c759eba82342466cf6e2291d84b77ab3
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Sat Aug 10 08:27:14 2013 +0100

    Hopefully fixed the /i command not working.

    I had not defined the newSplit variable before using it.

commit 8a74037cc092d048364299f18e07c02c85ae3737
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Thu Aug 8 10:18:48 2013 +0100

    Fixed the contributors not being on their own lines.

commit 0f61781047fbe3a4986dde3079be4fc1fb9ff14d
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 18:26:12 2013 +0100

    Fix the README - fixes #15

commit cc438b3229cdb730d308479c59491b5e66130118
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 18:01:48 2013 +0100

    Alpha-sort the console commands.

commit aa22f647c27d50b3ccf7e763927bd24329da3a56
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 18:00:44 2013 +0100

    Alpha-sort the commands when they are bound.

commit 5d9367fcdeeb8a5e1485aac539147edb7a0cd0ab
Merge: a485101 01ccfaa
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 09:41:38 2013 -0700

    Merge pull request #14 from mc-server/ireplace

    Told the player receiving items what they are getting, and fixed the console log.

commit 01ccfaa340afa8a4b909a923702da48b8b5f0d4a
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 17:39:36 2013 +0100

    Told the player reveiving items what they are getting, and fixed the console log.

commit 1a6f70f25ffa4c12a0d738c97435ae2c30cdb6a9
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 17:35:48 2013 +0100

    Added a console command for giving players items.

commit a4851010b2ff29bb55feb6331ea6ddec28532a0f
Merge: 0ffbd4a ba923e4
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 09:01:47 2013 -0700

    Merge pull request #12 from mc-server/ireplace

    Re-implement the /i command and make /give conform to the vanilla standards

commit ba923e4764b6a3064be6aacea86e059828b2d0e6
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 16:59:53 2013 +0100

    Added /item and made /i an alias of it.

commit 25652d2d5390d46a9cfe8bc80ab702b831bb49ed
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 16:46:14 2013 +0100

    Kept the stuff alpha-sorted.

commit 7fc56322420c0f99c1d0f0e6ba5df6169ef57fcc
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 16:45:09 2013 +0100

    Removed some extra semicolons.

commit 06b1adbcde3d4d610f9d3646ac3dd912b4071ea7
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Wed Aug 7 16:44:06 2013 +0100

    Cleaned up the code a little and fixed the messed up stuff that tried to make sure a player was good.

commit 0ffbd4adb80edf51cf7eb5117b0287c7ed286add
Author: tonibm19 <tonibm19@gmail.com>
Date:   Wed Aug 7 13:52:02 2013 +0200

    Fixed typo

commit b9503b977bdfeed8795fcacd8c6d15bc2e6a723a
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Tue Aug 6 18:23:51 2013 +0100

    Re-implement the /i command and make /give conform to the vanilla standards.

    This commit is experimental and may fail. Please test it!

commit f4ac029a0f1903fc9e49365117a81293303c8811
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Fri Aug 2 23:23:15 2013 +0100

    Miscellaneous Changes

    Reduced ban/unban code size a little.
    Clarified console commands.
    Added commented code to onjoin when bugs are fixed.
    Removed embarrassing server wide messages.

commit da84f4977522ab48ead4af7a71efd43cdd4e3d0a
Merge: cc77056 a631484
Author: bearbin <bearbin@gmail.com>
Date:   Thu Aug 1 10:58:05 2013 -0700

    Merge pull request #10 from mc-server/tabmix

    Fix the inconsistency of spaces and tabs.

commit a6314849c2b474b6e17a245c91a2ac74c7acf7bf
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Thu Aug 1 16:47:15 2013 +0100

    Changed everything to use the correct system of tabs.

commit cc7705645b6b387c618c9448fa6b0d5c789370c6
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Wed Jul 31 16:56:41 2013 +0100

    Rewrote Info Messages + Implemented #7 [SEE DESC]

    Standardisation of info messages: [INFO] [WARNING] [JOIN] [LEAVE]
    [FATALITY] with colours Green, Gold, Red, Rose, and Yellow.
    Individual worlds have individual LimitWorld setting, with individual
    WebAdmin setting as well.

commit 16cae4cdc0ec067e7e71fa5c5a3ba8c248ce063b
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Mon Jul 29 14:47:45 2013 +0100

    Fix of nil value in SpawnProtect

commit 7c33f75e7da7fc104112c17fcb53bc9f06fe09fc
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Mon Jul 29 13:19:11 2013 +0100

    Fixed potential SpawnProtect nil value issue

    Now detects if PROTECTRADIUS is zero, and if so, cancels checks.

commit 0c4a9d427620ab04ca01b5f31ed9b90530353d96
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Mon Jul 29 13:07:50 2013 +0100

    Enhanced SpawnProtect greatly (thanks xoft)

    Wow. Who knew ~30 lines of code could become one?

commit 17f5ef4fed0b6f32900cc7473563848466139655
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Mon Jul 29 11:11:22 2013 +0100

    Removed Development LOGINFOs

commit 02034bf2d67f2ae62092b0688d81338f7b0788df
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Mon Jul 29 10:40:57 2013 +0100

    Implemented Issue #5 Enhancement [SEE DESC]

    Made spawn protection configurable in each world's world file. World has
    to be listed in settings.ini!

commit ccc73db8c51e45372069ec0a42f437cfb25253b1
Merge: 6bf4b40 21c7c68
Author: Alexander Harkness <bearbin@gmail.com>
Date:   Sun Jul 28 14:00:15 2013 +0100

    Merge branch 'master' of github.com:tigerw/MCSCore into tigerw-master

    Conflicts:
    	main.lua

commit 21c7c68d20782a7dfd0d8f9ce0996397549dd425
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sun Jul 28 12:55:50 2013 +0100

    Default WorldLimiter = Off

commit 141298481f3adef30b68d0c4200204aa264cb3e2
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sun Jul 28 12:47:24 2013 +0100

    Fixed Potential WorldLimit & OnDisable Bugs

    Changed WorldLimiter if detection from nil value to config boolean.
    Changed OnDisable to use hardcoded name as Plugin:GetName was apparently
    a nil value. ??

commit 6bf4b40a0e27677afa6df9cb3521266e6b99c4f7
Merge: 1ca4217 bfd6c5f
Author: bearbin <bearbin@gmail.com>
Date:   Sat Jul 27 11:44:18 2013 -0700

    Merge pull request #3 from tonibm19/master

    Added /me command

commit bfd6c5f2a47cda4ac98a7225736e2669eaf61849
Author: tonibm19 <tonibm19@gmail.com>
Date:   Sat Jul 27 20:35:22 2013 +0200

    Added /me command

commit d25abaf44a6f5828b90297ff80003d2cd2a90be5
Author: tonibm19 <tonibm19@gmail.com>
Date:   Sat Jul 27 20:30:31 2013 +0200

    Added /me command

commit 9047f7778aa1cdd42d22c4dcf925db792b4d684e
Author: tonibm19 <tonibm19@gmail.com>
Date:   Sat Jul 27 20:29:24 2013 +0200

    added /me command

commit 1ca42172391d41ba71c65a3f15d3a96d15a80496
Merge: 52a6f4e 7a40336
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sat Jul 27 09:01:45 2013 -0700

    Merge pull request #2 from tigerw/master

    Fixed /give descriptor & removed webadmin

commit 7a40336437525c447adae3d9800e75b39c0300c4
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sat Jul 27 17:00:38 2013 +0100

    Fixed /give descriptor & removed webadmin

commit 52a6f4e35bdea2ae9f33977928b6693f5800e515
Merge: f5d56ff 2af1da8
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sat Jul 27 08:51:45 2013 -0700

    Merge pull request #1 from tigerw/master

    Added TPA (tonibm9's fork)

commit 2af1da8a3cd8e94674b22805662b83de87ac4a95
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sat Jul 27 16:38:10 2013 +0100

    Added TPA (tonibm9's fork)

    With code from STR_Warrior.

commit f5d56ffeb02fef4735e846661fa71d15622d25b9
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Sat Jul 27 15:51:18 2013 +0100

    Integrated SpawnProtect & Bugfixes [SEE DESC.]

    Integrated bearbin's SpawnProtect. Fixed config file bugs. Improved
    SpawnProtect to use settings.ini. Variable cleanup (SHOW_PLUGIN_NAMES).
    File and filename cleanup.

commit 56dc51c00af4514253c04e38b5ccc9fbed2f0022
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Fri Jul 26 23:14:40 2013 +0100

    Update README.md

    Added info.

commit acd7e2849dcd7f3ee7bdc6b0f9b777ee1d9cbb3c
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Fri Jul 26 19:37:59 2013 +0100

    Implemented Block Property checking for Collisions

    Used g_BlockIsSolid, instead of checking data values.

commit 246d423ff9660a2b00a1c51e6276ec74eb3419de
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Fri Jul 26 15:49:55 2013 +0100

    Updated Files

    Buildpermandcollision: updated collision code to check for torches and
    redstone torches.
    Help: attempt at always showing page number
    Web_serversettings: attempt at introducing a check for Maximum Players
    (must be above zero).

commit 868f99ab49edeee78f4fc1c212c6bf614b860378
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Thu Jul 25 19:46:08 2013 +0100

    Update README.md

    Extended 'GUI Redesign' section.

commit e0df40bd082bdeb5c6823b485bc5001103a77502
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Thu Jul 25 19:43:00 2013 +0100

    Update README.md

    Added features and fixes and instructions for use.

commit 332d8221f753f1a38d6c21bfc30af5890f48e3bb
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Thu Jul 25 19:35:27 2013 +0100

    Uploaded All Files

    All Core files, both modified and unmodified.

commit 3dd191f6bed71c863ee264856fbc3660e52cf88b
Author: Tiger Wang <ziwei.tiger@hotmail.co.uk>
Date:   Thu Jul 25 04:59:50 2013 -0700

    Initial commit
2013-08-10 16:00:11 +01:00

361 lines
12 KiB
Lua

-- Implements things related to console commands
function InitConsoleCommands()
local PluginMgr = cPluginManager:Get();
-- Please keep the list alpha-sorted
PluginMgr:BindConsoleCommand("ban", HandleConsoleBan, " ~ Bans a player by name");
PluginMgr:BindConsoleCommand("banlist ips", HandleConsoleBanList, " - Lists all players banned by IP");
PluginMgr:BindConsoleCommand("banlist", HandleConsoleBanList, " - Lists all players banned by name");
PluginMgr:BindConsoleCommand("getversion", HandleConsoleVersion, " - Gets server version reported to 1.4+ clients");
PluginMgr:BindConsoleCommand("help", HandleConsoleHelp, " - Lists all commands");
PluginMgr:BindConsoleCommand("give", HandleConsoleGive, " - Gives items to the specified player.")
PluginMgr:BindConsoleCommand("list", HandleConsoleList, " - Lists all players in a machine-readable format");
PluginMgr:BindConsoleCommand("listgroups", HandleConsoleListGroups, " - Shows a list of all the groups");
PluginMgr:BindConsoleCommand("numchunks", HandleConsoleNumChunks, " - Shows number of chunks currently loaded");
PluginMgr:BindConsoleCommand("players", HandleConsolePlayers, " - Lists all connected players");
PluginMgr:BindConsoleCommand("rank", HandleConsoleRank, " ~ Add a player to a group");
PluginMgr:BindConsoleCommand("reload", HandleConsoleReload, " - Reloads all plugins");
PluginMgr:BindConsoleCommand("save-all", HandleConsoleSaveAll, " - Saves all chunks");
PluginMgr:BindConsoleCommand("say", HandleConsoleSay, " - Sends a chat message to all players");
PluginMgr:BindConsoleCommand("setversion", HandleConsoleVersion, " ~ Sets server version reported to 1.4+ clients");
PluginMgr:BindConsoleCommand("unban", HandleConsoleUnban, " ~ Unbans a player by name");
PluginMgr:BindConsoleCommand("unload", HandleConsoleUnload, " - Unloads all unused chunks");
end
function HandleConsoleGive(Split)
-- Make sure there are a correct number of arguments.
if #Split ~= 3 and #Split ~= 4 and #Split ~= 5 then
return true, "Usage: give <player> <item> [amount] [meta]"
end
-- Get the item from the arguments and check it's valid.
local Item = cItem()
if #Split == 5 then
local FoundItem = StringToItem(Split[3] .. ":" .. Split[5], Item)
else
local FoundItem = StringToItem(Split[3], Item)
end
if not IsValidItem(Item.m_ItemType) then -- StringToItem does not check if item is valid
FoundItem = false
end
if not FoundItem then
return true, "Invalid item id or name!"
end
-- Work out how many items the user wants.
local ItemAmount = 1
if #Split > 3 then
ItemAmount = tonumber(Split[4])
if ItemAmount == nil or ItemAmount < 1 or ItemAmount > 512 then
return true, "Invalid amount!"
end
end
Item.m_ItemCount = ItemAmount
-- Get the playername from the split.
local playerName = Split[2]
local function giveItems(newPlayer)
local ItemsGiven = newPlayer:GetInventory():AddItem(Item)
if ItemsGiven == ItemAmount then
newPlayer:SendMessage(cChatColor.Green .. "[INFO] " .. cChatColor.White .. "There you go!" )
LOG("Gave " .. newPlayer:GetName() .. " " .. Item.m_ItemCount .. " times " .. Item.m_ItemType .. ":" .. Item.m_ItemDamage)
else
Player:SendMessage( cChatColor.Rose .. "[INFO] " .. cChatColor.White .. "Not enough space in inventory, only gave " .. ItemsGiven)
return true, "Only " .. Item.m_ItemCount .. " out of " .. ItemsGiven .. "items could be delivered.")
end
end
-- Finally give the items to the player.
itemStatus = cRoot:Get():FindAndDoWithPlayer(playerName, giveItems)
-- Check to make sure that giving items was successful.
if not itemStatus then
return true, "There was no player that matched your query."
end
return true
end
end
function HandleConsoleBan(Split)
if (#Split < 2) then
return true, "Usage: ban [Player] <Reason>";
end
local Reason = cChatColor.Red .. "You have been banned." .. cChatColor.White .. " Did you do something illegal?"
if( #Split > 2 ) then
Reason = table.concat(Split, " ", 3)
end
if KickPlayer(Split[2], Reason) == false then
BannedPlayersIni:DeleteValue("Banned", Split[2])
BannedPlayersIni:SetValueB("Banned", Split[2], true)
BannedPlayersIni:WriteFile()
LOGINFO("Could not find player, but banned anyway" )
else
BannedPlayersIni:DeleteValue("Banned", Split[2])
BannedPlayersIni:SetValueB("Banned", Split[2], true)
BannedPlayersIni:WriteFile()
LOGINFO("Successfully kicked and banned player" )
end
return true
end
function HandleConsoleUnban(Split)
if( #Split < 2 ) then
return true, "Usage: unban [Player]"
end
if( BannedPlayersIni:GetValueB("Banned", Split[2], false) == false ) then
return true, Split[2] .. " is not banned!"
end
BannedPlayersIni:SetValueB("Banned", Split[2], false, false)
BannedPlayersIni:WriteFile()
local Server = cRoot:Get():GetServer()
return true, "Unbanned " .. Split[2]
end
function HandleConsoleBanList(Split)
if (#Split == 1) then
return true, BanListByName();
end
if (string.lower(Split[2]) == "ips") then
return true, BanListByIPs();
end
return true, "Unknown banlist subcommand";
end
function HandleConsoleHelp(Split)
local Commands = {}; -- {index => {"Command", "HelpString"} }
local MaxLength = 0;
local AddToTable = function(Command, HelpString)
table.insert(Commands, { Command, HelpString });
local CmdLen = Command:len();
if (CmdLen > MaxLength) then
MaxLength = CmdLen;
end
end
cPluginManager:Get():ForEachConsoleCommand(AddToTable);
-- Sort the table:
local CompareCommands = function(a, b)
return a[1] < b[1]; -- compare command strings
end
table.sort(Commands, CompareCommands);
local Out = "";
Out = "'-' denotes no prefix, '~' denotes that a value is required.\n"
for i, Command in ipairs(Commands) do
Out = Out .. Command[1] .. string.rep(" ", MaxLength - Command[1]:len()); -- Align to a table
Out = Out .. Command[2] .. "\n";
end
return true, Out;
end
function HandleConsoleList(Split)
-- Get a list of all players, one playername per line
local Out = "";
cRoot:Get():ForEachWorld(
function (a_World)
a_World:ForEachPlayer(
function (a_Player)
Out = Out .. a_Player:GetName() .. "\n";
end
);
end
);
return true, Out;
end
function HandleConsoleListGroups(Split)
-- Read the groups.ini file:
local GroupsIni = cIniFile("groups.ini");
if (not(GroupsIni:ReadFile())) then
return true, "No groups found";
end
-- Read the groups:
Number = GroupsIni:NumKeys();
Groups = {};
for i = 0, Number do
table.insert(Groups, GroupsIni:KeyName(i))
end
-- Output the groups, concatenated to a string:
local Out = "Groups:\n"
Out = Out .. table.concat(Groups, ", ");
return true, Out;
end
function HandleConsoleNumChunks(Split)
local Output = {};
local AddNumChunks = function(World)
Output[World:GetName()] = World:GetNumChunks();
end;
cRoot:Get():ForEachWorld(AddNumChunks);
local Total = 0;
local Out = "";
for name, num in pairs(Output) do
Out = Out .. " " .. name .. ": " .. num .. " chunks\n";
Total = Total + num;
end
Out = Out .. "Total: " .. Total .. " chunks\n";
return true, Out;
end
function HandleConsolePlayers(Split)
local PlayersInWorlds = {}; -- "WorldName" => [players array]
local AddToTable = function(Player)
local WorldName = Player:GetWorld():GetName();
if (PlayersInWorlds[WorldName] == nil) then
PlayersInWorlds[WorldName] = {};
end
table.insert(PlayersInWorlds[WorldName], Player:GetName() .. " @ " .. Player:GetIP());
end
cRoot:Get():ForEachPlayer(AddToTable);
local Out = "";
for WorldName, Players in pairs(PlayersInWorlds) do
Out = Out .. "World " .. WorldName .. ":\n";
for i, PlayerName in ipairs(Players) do
Out = Out .. " " .. PlayerName .. "\n";
end
end
return true, Out;
end
function HandleConsoleVersion(Split)
if (#Split == 1) then
-- Display current version:
local Version = cRoot:Get():GetPrimaryServerVersion();
return true, "Primary server version: #" .. Version .. ", " .. cRoot:GetProtocolVersionTextFromInt(Version);
end
-- Set new value as the version:
cRoot:Get():SetPrimaryServerVersion(tonumber(Split[2]));
local Version = cRoot:Get():GetPrimaryServerVersion();
return true, "Primary server version is now #" .. Version .. ", " .. cRoot:GetProtocolVersionTextFromInt(Version);
end
function HandleConsoleRank(Split)
if (Split[2] == nil) or (Split[3] == nil) then
return true, "Usage: /rank [Player] [Group]";
end
local Out = "";
-- Read the groups.ini file:
local GroupsIni = cIniFile("groups.ini")
if (not(GroupsIni:ReadFile())) then
Out = "Could not read groups.ini, creating anew!\n"
end
-- Find the group:
if (GroupsIni:FindKey(Split[3]) == -1) then
return true, Out .. "Group does not exist";
end
-- Read the users.ini file:
local UsersIni = cIniFile("users.ini");
if (not(UsersIni:ReadFile())) then
Out = Out .. "Could not read users.ini, creating anew!\n";
end
-- Write the new group value to users.ini:
UsersIni:DeleteKey(Split[2]);
UsersIni:GetValueSet(Split[2], "Groups", Split[3]);
UsersIni:WriteFile();
-- Reload the player's permissions:
cRoot:Get():ForEachWorld(
function (World)
World:ForEachPlayer(
function (Player)
if (Player:GetName() == Split[2]) then
Player:SendMessage(cChatColor.Yellow .. "[INFO] " .. cChatColor.White .. "You were moved to group " .. Split[3]);
Player:LoadPermissionsFromDisk();
end
end
);
end
)
return true, Out .. "Player " .. Split[2] .. " was moved to " .. Split[3];
end
function HandleConsoleReload(Split)
Server = cRoot:Get():GetServer();
Server:SendMessage(cChatColor.Rose .. "[WARNING] " .. cChatColor.White .. "Reloading all plugins!");
cPluginManager:Get():ReloadPlugins();
return true;
end
function HandleConsoleSaveAll(Split)
Server = cRoot:Get():GetServer();
Server:SendMessage(cChatColor.Rose .. "[WARNING] " .. cChatColor.White .. "Saving all chunks!");
cRoot:Get():SaveAllChunks();
return true;
end
function HandleConsoleSay(Split)
table.remove(Split, 1);
local Message = "";
for i, Text in ipairs(Split) do
Message = Message .. " " .. Text;
end
Message = Message:sub(2); -- Cut off the first space
cRoot:Get():GetServer():BroadcastChat(cChatColor.Gold .. "[SERVER] " .. cChatColor.Yellow .. Message);
return true;
end
function HandleConsoleUnload(Split)
local UnloadChunks = function(World)
World:UnloadUnusedChunks();
end
local Out = "Num loaded chunks before: " .. cRoot:Get():GetTotalChunkCount() .. "\n";
cRoot:Get():ForEachWorld(UnloadChunks);
Out = Out .. "Num loaded chunks after: " .. cRoot:Get():GetTotalChunkCount();
return true, Out;
end
-- Helper functions:
--- Returns the list of players banned by name, separated by ", "
function BanListByName()
local NumValues = BannedPlayersIni:NumValues("Banned");
local Banned = {};
local KeyID = BannedPlayersIni:FindKey("Banned");
for i = 1, NumValues do
local PlayerName = BannedPlayersIni:ValueName(KeyID, i - 1);
if (BannedPlayersIni:GetValueB("Banned", PlayerName)) then
-- Player listed AND banned
table.insert(Banned, PlayerName);
end
end
return table.concat(Banned, ", ");
end
--- Returns the list of players banned by IP, separated by ", "
function BanListByIPs()
-- TODO: No IP ban implemented yet
return "";
end