C#:
// Author: Kaidoz
// Filename: NoSteamHelper.cs
// Last update: 2019.10.07 19:20
using System;
using System.Collections.Generic;
using ConVar;
using Network;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Core.RemoteConsole;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("NoSteamHelper", "Kaidoz", "1.1.0")]
[Description("")]
internal class NoSteamHelper : RustPlugin
{
#region Variables
private readonly Dictionary<string, string> DiscordHeaders = new Dictionary<string, string>
{
{ "Content-Type", "application/json" }
};
public static ConfigData configData;
public static NoSteamHelper Instance;
#endregion Variables
#region Class
public class ConfigData
{
[JsonProperty("Other")]
public Other other;
[JsonProperty("Players")]
public Players players;
[JsonProperty("Block VPN Config")]
public BlockVPN blockVpn;
//[JsonProperty("Trust System")]
[JsonIgnore]
public TrustSystem trustSystem;
public class Other
{
[JsonProperty("Enable visibility nosteam players in servers list(DANGER! Risk get ban)")]
public bool FakeOnline { get; set; }
}
public class Players
{
[JsonProperty("Block vpn for nosteam players")]
public bool BlockVpn { get; set; }
[JsonProperty("Block smurf accounts for nosteam players")]
public bool BlockSmurf { get; set; }
}
public class BlockVPN
{
[JsonProperty("Api key(http://proxycheck.io)")]
public string Key { get; set; }
}
public class TrustSystem
{
[JsonProperty("Trust system")]
public bool Enabled { get; set; }
[JsonProperty("Violation sensitivity")]
public float VioSens { get; set; }
[JsonProperty("Command for ban")]
public string CmdBan { get; set; }
[JsonProperty("Min score for ban")]
public int minValue { get; set; }
[JsonProperty("Discord")]
public DiscordMsg discordMsg { get; set; }
public class DiscordMsg
{
[JsonProperty("Discord messages")]
public bool Enabled { get; set; }
[JsonProperty("Discord WebHook(FAQ shorturl.at/gCFG0)")]
public string discordWebHook { get; set; }
[JsonProperty("Discord msg")]
public string discordMsg { get; set; }
}
}
}
#endregion Class
#region Data
public static List<DataPlayer> _players = new List<DataPlayer>();
private static Dictionary<string, bool> _checkedIps = new Dictionary<string, bool>();
#endregion Data
#region API
private object IsPlayerNoSteam(ulong steamid)
{
DataPlayer dataPlayer;
var result = DataPlayer.FindPlayer(steamid, out dataPlayer);
if (result == false)
{
return false;
}
if (dataPlayer.IsSteam())
return null;
return false;
}
#endregion API
private void InitData()
{
_players =
Interface.Oxide.DataFileSystem.ReadObject<List<DataPlayer>>("NoSteamHelper/Players");
}
private static void SaveDataPlayers()
{
Interface.Oxide.DataFileSystem.WriteObject("NoSteamHelper/Players", _players);
}
private static void SaveDataIps()
{
Interface.Oxide.DataFileSystem.WriteObject("NoSteamHelper/CheckedIps", _checkedIps);
}
protected override void LoadDefaultConfig()
{
var config = new ConfigData
{
other = new ConfigData.Other()
{
FakeOnline = false
},
players = new ConfigData.Players()
{
BlockSmurf = true,
BlockVpn = false
},
blockVpn = new ConfigData.BlockVPN()
{
Key = "Your key"
},
trustSystem = new ConfigData.TrustSystem()
{
Enabled = false,
VioSens = 1f,
CmdBan = "{steamid}",
discordMsg = new ConfigData.TrustSystem.DiscordMsg()
{
Enabled = false
}
}
};
SaveConfig(config);
}
private void LoadConfigVariables() => configData = Config.ReadObject<ConfigData>();
private void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
/*private void DeleteConfig()
{
Config.Clear
}*/
public class DataPlayer
{
public bool Steam;
public ulong SteamId;
public string LastIp;
public TrustData trustData;
public DataPlayer(ulong id, bool steam, string lastip)
{
SteamId = id;
Steam = steam;
LastIp = lastip;
trustData = new TrustData();
}
public static void AddPlayer(ulong id, bool steam, string lastip)
{
_players.Add(new DataPlayer(id, steam, lastip));
SaveDataPlayers();
}
public void ChangeSteam(bool steam)
{
Steam = steam;
SaveDataPlayers();
}
public static bool FindPlayer(ulong steamid, out DataPlayer dataPlayer)
{
dataPlayer = null;
foreach (var player in _players)
if (player.SteamId == steamid)
{
dataPlayer = player;
return true;
}
return false;
}
public bool IsSteam()
{
if (SteamId == 76561198874259939)
return false;
return Steam;
}
public void ChangeTrustScore(double score)
{
this.trustData.trustScore += score;
if ((this.trustData.lastDetect - DateTime.Now).TotalDays > 1)
this.trustData.trustScore = 100f;
if (this.trustData.trustScore <= configData.trustSystem.minValue)
{
this.trustData.lastDetect = DateTime.Now;
string cmd = configData.trustSystem.CmdBan.Replace("{steamid}", this.SteamId.ToString());
Instance.SendConsoleCommand(cmd);
}
}
public class TrustData
{
public double trustScore;
public DateTime lastDetect;
public TrustData()
{
this.trustScore = 100;
this.lastDetect = DateTime.MinValue;
}
}
}
#region TrustSystem
private void API_ArkanOnNoRecoilViolation(BasePlayer player, int NRViolationsNum, string json)
{
if (json != null)
{
DataPlayer dataPlayer = null;
if (DataPlayer.FindPlayer(player.userID, out dataPlayer) && !dataPlayer.IsSteam())
{
double score = NRViolationsNum * 0.5 * configData.trustSystem.VioSens * 10;
dataPlayer.ChangeTrustScore(-score);
SendMsgDiscord("Detect: ArkanOnNoRecoilViolation" + Environment.NewLine
+ "User: " + player.UserIDString + Environment.NewLine
+ "Score: " + dataPlayer.trustData.trustScore + Environment.NewLine
+ "Last detect: " + dataPlayer.trustData.lastDetect);
}
}
}
private void API_ArkanOnAimbotViolation(BasePlayer player, int AIMViolationsNum, string json)
{
if (json != null)
{
DataPlayer dataPlayer = null;
if (DataPlayer.FindPlayer(player.userID, out dataPlayer) && !dataPlayer.IsSteam())
{
double score = AIMViolationsNum * 0.5 * configData.trustSystem.VioSens * 10;
dataPlayer.ChangeTrustScore(-score);
SendMsgDiscord("Detect: ArkanOnAimbotViolation" + Environment.NewLine
+ "User: " + player.UserIDString + Environment.NewLine
+ "Score: " + dataPlayer.trustData.trustScore + Environment.NewLine
+ "Last detect: " + dataPlayer.trustData.lastDetect);
}
}
}
private void API_ArkanOnInRockViolation(BasePlayer player, int IRViolationsNum, string json)
{
if (json != null)
{
DataPlayer dataPlayer = null;
if (DataPlayer.FindPlayer(player.userID, out dataPlayer) && !dataPlayer.IsSteam())
{
double score = IRViolationsNum * 0.5 * configData.trustSystem.VioSens * 10;
dataPlayer.ChangeTrustScore(-score);
SendMsgDiscord("Detect: ArkanOnInRockViolation" + Environment.NewLine
+ "User: " + player.UserIDString + Environment.NewLine
+ "Score: " + dataPlayer.trustData.trustScore + Environment.NewLine
+ "Last detect: " + dataPlayer.trustData.lastDetect);
}
}
}
#endregion TrustSystem
#region Discord
#region Class
private class ContentType
{
public string content;
public string username;
public string avatar_url;
public ContentType(string text, string name = null, string avatar = null)
{
content = text;
username = name;
avatar_url = avatar;
}
}
#endregion Class
private void SendMsgDiscord(string msg)
{
bool disabled = !configData.trustSystem.discordMsg.Enabled;
if (disabled)
return;
List<string> messages = new List<string>();
string message = string.Empty;
for (var i = 0; i < msg.Length; i++)
{
var current = msg[i];
message += current;
if (i >= 1500)
{
messages.Add(message);
message = string.Empty;
}
}
if (!string.IsNullOrEmpty(message))
{
messages.Add(message);
}
foreach (var _msg in messages)
{
var contentType = new ContentType(_msg);
SendMsgDiscord(contentType);
}
}
private void SendMsgDiscord(ContentType contentType)
{
webrequest.Enqueue(configData.trustSystem.discordMsg.discordWebHook, JsonConvert.SerializeObject(contentType), (code, response) => { }, this, RequestMethod.POST, DiscordHeaders);
}
private void SendMessage(string message)
{
//Server.Command("");
}
#endregion Discord
#region VPN
private bool IsVpnConnection(Connection connection)
{
bool status = false;
string ip = connection.ipaddress;
ip = ip.Substring(0, ip.IndexOf(":"));
if (_checkedIps.ContainsKey(ip))
return _checkedIps[ip];
webrequest.EnqueueGet($"http://proxycheck.io/v2/{ip}?key={configData.blockVpn.Key}&vpn=1", (code, response) =>
{
status = CheckResult(code, response, ip);
}, this);
_checkedIps.Add(ip, status);
SaveDataIps();
return status;
}
private bool CheckResult(int code, string response, string ip)
{
if (response.Contains("yes"))
return true;
if (response.Contains("error"))
{
Puts(response.Replace("{", ip + " {"));
}
return false;
}
#endregion VPN
#region Hooks
private void OnServerInitialized(bool loaded)
{
Instance = this;
LoadConfigVariables();
SaveConfig();
}
private void Init()
{
InitData();
}
private object IsShowCracked()
{
if (!configData.other.FakeOnline)
return null;
return true;
}
private object CanNewConnection(Connection connection, bool isSteam)
{
DataPlayer dataPlayer;
if (!CheckIsValidPlayer(connection))
return "Steam Auth Failed.";
if (configData.players.BlockVpn && IsVpnConnection(connection))
return "VPN Detected";
var result = DataPlayer.FindPlayer(connection.userid, out dataPlayer);
if (result)
{
if (dataPlayer.IsSteam() && !isSteam)
return "Dont try get access to another player";
if (!dataPlayer.IsSteam() && isSteam)
dataPlayer.ChangeSteam(isSteam);
}
else
DataPlayer.AddPlayer(connection.userid, isSteam, connection.ipaddress);
bool isNoSteam = !isSteam;
if (configData.players.BlockVpn)
{
ulong steamid = 0UL;
if (isNoSteam && IsSmurf(connection, ref steamid))
return "Your primary account: " + steamid;
}
return null;
}
private void OnPlayerDisconnected(BasePlayer player, string reason)
{
}
private bool IsSmurf(Connection connection, ref ulong userid)
{
foreach (var player in _players)
{
bool isNoSteam = !player.IsSteam();
if (isNoSteam)
{
if (player.SteamId != connection.userid &&
player.LastIp == connection.ipaddress)
{
userid = player.SteamId;
return true;
}
}
}
return false;
}
private bool CheckIsValidPlayer(Connection connection)
{
string IpAddress = connection.ipaddress.Split(':')[0];
foreach (var player in BasePlayer.activePlayerList)
{
if (player.Connection.ipaddress.Split(':')[0] == IpAddress)
{
return true;
}
}
return true;
}
private void SendConsoleCommand(string cmd)
{
Server.Command(cmd);
}
#endregion Hooks
}
}