var plugin = { author: 'RaidMax', version: 1.2, name: 'VPN Detection Plugin', manager: null, logger: null, vpnExceptionIds: [], checkForVpn: function (origin) { var exempt = false; // prevent players that are exempt from being kicked this.vpnExceptionIds.forEach(function (id) { if (id === origin.ClientId) { exempt = true; return false; } }); if (exempt) { return; } var usingVPN = false; try { var cl = new System.Net.Http.HttpClient(); var re = cl.GetAsync('https://api.xdefcon.com/proxy/check/?ip=' + origin.IPAddressString).Result; var co = re.Content; var parsedJSON = JSON.parse(co.ReadAsStringAsync().Result); co.Dispose(); re.Dispose(); cl.Dispose(); usingVPN = parsedJSON.success && parsedJSON.proxy; } catch (e) { this.logger.WriteWarning('There was a problem checking client IP for VPN ' + e.message); } if (usingVPN) { this.logger.WriteInfo(origin + ' is using a VPN (' + origin.IPAddressString + ')'); origin.Kick(_localization.LocalizationIndex["SERVER_KICK_VPNS_NOTALLOWED"], _IW4MAdminClient); } }, onEventAsync: function (gameEvent, server) { // join event if (gameEvent.Type === 4) { this.checkForVpn(gameEvent.Origin); } }, onLoadAsync: function (manager) { this.manager = manager; this.logger = manager.GetLogger(0); }, onUnloadAsync: function () { }, onTickAsync: function (server) { } };