-
Notifications
You must be signed in to change notification settings - Fork 23
Bans
The bans plugin provides an alternative to the default banning system. Bans are stored in the JSON file associated with the plugin. By default, this file is located in config://shine/plugins/Bans.json.
If you have a bans file from the default NS2 bans system or from DAK, Shine will automatically convert it on first run, just place it as Bans.json in the plugin config directory. It will also keep the vanilla bans file in sync with Shine's in case the mod ever fails to load due to Steam workshop problems, so that your bans are not completely lost.
Web bans files can either be the default NS2 BannedPlayers.json format or the Shine bans plugin config format (note that bans must be in the "Banned" sub-table for the Shine format, so just copy the bans config file to your website if you use the Shine format).
To add a ban for a player that's not in your server, you can either use the in-game command sh_banid, or add it to the file manually. A typical ban config file will look like this:
{
"DefaultBanTime": 60,
"GetBansFromWeb": false,
"BansURL": "",
"BansSubmitURL": "",
"BansSubmitArguments": {},
"GetBansWithPOST": false,
"MaxSubmitRetries": 3,
"SubmitTimeout": 5,
"CheckFamilySharing": false,
"BanSharerOnSharedBan": false,
"AlwaysBlockFamilySharedPlayers": false,
"Banned": {
"123456": {
"UnbanTime": 1357055089,
"Name": "Someone",
"BannedBy": "Person8880",
"Duration": 3600,
"Reason": "Griefing."
},
"8765432": {
"UnbanTime": 0,
"Name": "Someone else",
"BannedBy": "Person8880",
"Duration": 0,
"Reason": "Trolling."
},
},
"__Version": "1.6"
}
If you place bans in the "Banned" table in the same way as "123456" is, you can add bans without touching the game console. Note that the important parts are "UnbanTime" and "Duration". The rest of it is just extra information for you to see what the ban was for and who did it.
If you are loading bans from the web, you can use the default NS2 format to add bans or the format above.
The file should be called "Bans.json" and should be placed in the directory defined as your plugin config directory (default is config://shine/plugins).
Option | Description |
---|---|
DefaultBanTime | Time in minutes to ban by default if you do not give a time. |
GetBansFromWeb | If set to true, the ban list will be loaded from the URL given in BansURL. |
BansURL | URL to get ban data from is GetBansFromWeb is set to true. |
BansSubmitURL | URL to submit bans and unbans to. |
BansSubmitArguments | Extra arguments to send in the POST request. For example, a private key to authenticate. |
GetBansWithPOST | If set to true, then the bans data will be requested using POST and will send the extra keys in "BansSubmitArguments". |
MaxSubmitRetries | Sets how many times the plugin should retry sending a ban/unban request if it timed out. |
SubmitTimeout | How long, in seconds, with no response before we consider the ban/unban request to be timed out. |
CheckFamilySharing | If true and a Steam API key has been provided in BaseConfig.json , then the plugin will check connecting players to see if they're on a family shared account. If so, and the account sharing NS2 to them is banned, they will be kicked out. |
BanSharerOnSharedBan | If true and a Steam API key is provided, any player that is playing through family sharing and then banned will cause the account sharing the game to them to also be banned for the same duration. Combine this with CheckFamilySharing to prevent any further use of the main account to family share. |
AlwaysBlockFamilySharedPlayers | If true and CheckFamilySharing is enabled (with a Steam API key configured), any player that is playing through family sharing will be prevented from connecting to the server, regardless of whether the player sharing the game with them is banned or not. |
Command | Chat Command | Arguments | Description |
---|---|---|---|
sh_ban | !ban | <player> <duration> <reason> | Bans the given player for the given duration and reason. Both duration and reason are optional. |
sh_unban | !unban | <steamid> | Unbans the given Steam ID. |
sh_banid | !banid | <steamid> <duration> <reason> | Bans the given Steam ID for the given duration and reason. Player does not have to be in the server (though if they are they will be kicked out). |
sh_listbans | N/A | N/A | Lists all stored bans to your console. |
sh_forcebansync | N/A | N/A | Forces the plugin to request bans from your website. |
Permission | Description |
---|---|
sh_ban_family_share_immune | Makes a user immune to family sharing checks. This means that if CheckFamilySharing is true , the user will not be blocked from connecting if the player sharing the game to them is banned, nor will they be blocked if AlwaysBlockFamilySharedPlayers is true . |
To submit bans to your website, you need to setup a script that takes the input the bans plugin gives it, and returns a fixed result.
Bans will be made effective immediately upon running the ban command, it won't wait for the web server. However, if the web server returns a JSON response with:
{
"success": false
}
then the ban will be removed. Timeouts to the web server will make it retry. If it reaches the max retries with no response, it assumes the ban should stay and won't try again. You'll need to run the command again to get it to the web server if it didn't.
Ban data is submitted as follows:
http://www.yoursite.com/submit.php?bandata={JSON data here}&unban=0&yourextrakeys=stuff
where bandata is the JSON format:
{
"Name": "Player's name",
"ID": 654321,
"Duration": 3600,
"UnbanTime": 9999999,
"BannedBy": "Me",
"BannerID": 123456,
"Reason": "Witty reason here.",
"Issued": 900000
}
The UnbanTime
and Issued
entries are timestamps.
For unbans, data is submitted as follows:
http://www.yoursite.com/submit.php?unbandata={JSON data here}&unban=1&yourextrakeys=stuff
where unbandata
is the JSON format:
{
"ID": 654321,
"UnbannerID": 123456
}
Note that "UnbannerID" may be 0 for automatic ban removals.
As for bans, return JSON:
{
"success": true
}
to allow the unban to pass, or set success
to false to get it to reinstate the ban.
Kindly provided by Turbine1991.
Example configuration:
{
"GetBansFromWeb": true,
"BansURL": "http://LOCATION/Bans.json",
"GetBansWithPOST": false,
"BansSubmitURL": "http://LOCATION/handle_ban.php",
"BansSubmitArguments": {"auth": "CHANGE THIS VALUE", "readable": 1, "filename": "Bans.json"},
"MaxSubmitRetries": 3,
"SubmitTimeout": 5,
"VanillaConfigUpToDate": true,
"DefaultBanTime": 60,
"Banned": {},
}
PHP script:
<?PHP
/*
Name: Simple ban handler by NoM.
Description: Handles ban and unban queries for writing a shared ban file using Shine. Please match the config auth key here.
Parameters:
auth - String - Mandatory.
filename - String - Optionally specify the name of the ban file, uses "Bans.json" by default. (omit quotes)
readable - Bool - Format the json output format nicely.
Requirements:
Shine
Have your existing Shine "Bans.json" in your web directory.
Enable write permissions to parent directory & "Bans.json".
Configure shine's "Bans.json", providing: "GetBansFromWeb", "BansURL", "BansSubmitURL", "BansSubmitArguments" (optional).
*/
$auth = 'CHANGE THIS VALUE';
// Sanity check
if (!isset($_REQUEST['auth']) || ($_REQUEST['auth'] !== $auth)) {
die('Invalid auth key.');
}
if (!isset($_REQUEST['unban']) || (!isset($_REQUEST['bandata']) && !isset($_REQUEST['unbandata']))) {
die('Missing ban values.');
}
// Retrieve data
$filename = isset($_REQUEST['filename'])? $_REQUEST['filename']: 'Bans.json';
// Handle unban or ban
$request_unban = intval($_REQUEST['unban']);
$ban_action_data = ($request_unban)? json_decode($_REQUEST['unbandata'], true): json_decode($_REQUEST['bandata'], true);
$bans_file_readable = isset($_REQUEST['readable']);
$lock_file = fopen($filename.'.lock', 'w+');
// Lock to prevent concurrent access to the bans file, which could leave it inconsistent.
if (!flock($lock_file, LOCK_EX)) {
die('Unable to acquire lock.');
}
$bans_file = file_get_contents($filename);
// Store the entire data file in object form; Also maintains table integrity
$bans_config_data = json_decode($bans_file, true);
// Retrieve a reference to the actual bans table (shine stores bans in a sub-table)
$bans_data = &$bans_config_data['Banned'];
// Handle data operation
$ban_check_id = $ban_action_data['ID'];
if ($request_unban) {
if (isset($bans_data[$ban_check_id])) {
unset($bans_data[$ban_check_id]);
}
} else {
unset($ban_action_data['ID']);
$bans_data[$ban_check_id] = $ban_action_data;
}
// Set json write format flag (readable or efficient output)
$json_format = ($bans_file_readable)? JSON_PRETTY_PRINT: 0;
// Write & backup
$filename_temp = $filename.'.temp';
$filename_old = $filename.'.old';
$file_ban = fopen($filename_temp, 'w');
fwrite($file_ban, json_encode($bans_config_data, $json_format));
fclose($file_ban);
rename($filename, $filename_old);
rename($filename_temp, $filename);
// Normalise permissions
chmod($filename, 0664);
// Release lock to allow other processes to update the file again.
flock($lock_file, LOCK_UN);
fclose($lock_file);
// Print result as raw json
echo '{"success":true}';
?>