add unban subnet command and subnet list interaction

This commit is contained in:
RaidMax 2022-10-24 18:54:48 -05:00
parent 973ea83ab9
commit dbca3675ba
2 changed files with 85 additions and 4 deletions

View File

@ -1,5 +1,6 @@
const cidrRegex = /^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/; const cidrRegex = /^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/;
const validCIDR = input => cidrRegex.test(input); const validCIDR = input => cidrRegex.test(input);
const subnetBanlistKey = 'Webfront::Nav::Admin::SubnetBanlist';
let subnetList = []; let subnetList = [];
const commands = [{ const commands = [{
@ -26,7 +27,36 @@ const commands = [{
gameEvent.Origin.Tell(`Added ${input} to subnet banlist`); gameEvent.Origin.Tell(`Added ${input} to subnet banlist`);
} }
}]; },
{
name: 'unbansubnet',
description: 'unbans an IPv4 subnet',
alias: 'ubs',
permission: 'SeniorAdmin',
targetRequired: false,
arguments: [{
name: 'subnet in IPv4 CIDR notation',
required: true
}],
execute: (gameEvent) => {
const input = String(gameEvent.Data).trim();
if (!validCIDR(input)) {
gameEvent.Origin.Tell('Invalid CIDR input');
return;
}
if (!subnetList.includes(input)) {
gameEvent.Origin.Tell('Subnet is not banned');
return;
}
subnetList = subnetList.filter(item => item !== input);
_configHandler.SetValue('SubnetBanList', subnetList);
gameEvent.Origin.Tell(`Removed ${input} from subnet banlist`);
}
}];
convertIPtoLong = ip => { convertIPtoLong = ip => {
let components = String(ip).match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/); let components = String(ip).match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
@ -66,7 +96,7 @@ isSubnetBanned = (ip, list) => {
const plugin = { const plugin = {
author: 'RaidMax', author: 'RaidMax',
version: 1.0, version: 1.1,
name: 'Subnet Banlist Plugin', name: 'Subnet Banlist Plugin',
manager: null, manager: null,
logger: null, logger: null,
@ -86,7 +116,8 @@ const plugin = {
this.manager = manager; this.manager = manager;
this.logger = manager.GetLogger(0); this.logger = manager.GetLogger(0);
this.configHandler = _configHandler; this.configHandler = _configHandler;
this.subnetList = []; subnetList = [];
this.interactionRegistration = _serviceResolver.ResolveService('IInteractionRegistration');
const list = this.configHandler.GetValue('SubnetBanList'); const list = this.configHandler.GetValue('SubnetBanList');
if (list !== undefined) { if (list !== undefined) {
@ -105,9 +136,58 @@ const plugin = {
this.banMessage = 'You are not allowed to join this server.'; this.banMessage = 'You are not allowed to join this server.';
this.configHandler.SetValue('BanMessage', this.banMessage); this.configHandler.SetValue('BanMessage', this.banMessage);
} }
this.interactionRegistration.RegisterScriptInteraction(subnetBanlistKey, plugin.name, (targetId, game, token) => {
const helpers = importNamespace('SharedLibraryCore.Helpers');
const interactionData = new helpers.InteractionData();
interactionData.Name = 'Subnet Banlist'; // navigation link name
interactionData.Description = `List of banned subnets (${subnetList.length} Total)`; // alt and title
interactionData.DisplayMeta = 'oi-circle-x'; // nav icon
interactionData.InteractionId = subnetBanlistKey;
interactionData.MinimumPermission = 3; // moderator
interactionData.InteractionType = 2; // 1 is RawContent for apis etc..., 2 is
interactionData.Source = plugin.name;
interactionData.ScriptAction = (sourceId, targetId, game, meta, token) => {
let table = '<table class="table bg-dark-dm bg-light-lm">';
const unbanSubnetInteraction = {
InteractionId: 'command',
Data: 'unbansubnet',
ActionButtonLabel: 'Unban',
Name: 'Unban Subnet'
};
subnetList.forEach(subnet => {
unbanSubnetInteraction.Data += ' ' + subnet
table += `<tr>
<td>
<p>${subnet}</p>
</td>
<td>
<a href="#" class="profile-action no-decoration float-right" data-action="DynamicAction"
data-action-meta="${encodeURI(JSON.stringify(unbanSubnetInteraction))}">
<div class="btn">
<i class="oi oi-circle-x mr-5 font-size-12"></i>
<span class="text-truncate">Unban Subnet</span>
</div>
</a>
</td>
</tr>`;
});
table += '</table>';
return table;
}
return interactionData;
});
}, },
onUnloadAsync: () => { onUnloadAsync: () => {
this.interactionRegistration.UnregisterInteraction(subnetBanlistKey);
}, },
onTickAsync: server => { onTickAsync: server => {

View File

@ -98,7 +98,8 @@ $(document).ready(function () {
let actionKeys = actionId === undefined ? '' : `?id=${actionId}`; let actionKeys = actionId === undefined ? '' : `?id=${actionId}`;
if (actionMeta !== undefined) { if (actionMeta !== undefined) {
actionKeys = actionKeys + '&meta=' + JSON.stringify(actionMeta); const and = actionKeys === '' ? '?' : '&';
actionKeys = actionKeys + and + 'meta=' + JSON.stringify(actionMeta);
} }
showLoader(); showLoader();