C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Oxide.Plugins
{
[Info("WipeAddon", "King", "1.0.1")]
public class WipeAddon : RustPlugin
{
#region [Vars]
private const String IgnorePermission = "WipeAddon.ignore";
private const Boolean LanguageEn = false;
private Boolean WipeServer = false;
private TimeSpan WipeTime = new TimeSpan();
private static StringBuilder sb = null;
#endregion
#region [Data]
private void SaveData()
{
Interface.Oxide.DataFileSystem.WriteObject($"{Name}", WipeServer);
}
private void LoadData()
{
try
{
WipeServer = Interface.Oxide.DataFileSystem.ReadObject<Boolean>($"{Name}");
}
catch (Exception e)
{
PrintError(e.ToString());
}
if (WipeServer == null) WipeServer = false;
}
#endregion
#region [Oxide-Api]
private void OnNewSave() =>
WipeServer = true;
private void Init()
{
LoadData();
Unsubscribe(nameof(CanUserLogin));
Unsubscribe(nameof(OnPlayerConnected));
if (!permission.PermissionExists(IgnorePermission))
permission.RegisterPermission(IgnorePermission, this);
sb = new StringBuilder();
}
private void OnServerInitialized()
{
if (WipeServer)
{
WipeTime = new TimeSpan(config.Hours, config.Minutes, 0);
DateTime Time = DateTime.Now;
if (Time.TimeOfDay >= WipeTime)
{
Interface.Oxide.UnloadPlugin(this.Name);
return;
}
Subscribe(nameof(CanUserLogin));
Subscribe(nameof(OnPlayerConnected));
foreach(BasePlayer player in BasePlayer.activePlayerList)
OnPlayerConnected(player);
PrintWarning(LanguageEn ? "The server is closed to players." : "Сервер закрыт для игроков.");
ServerMgr.Instance.InvokeRepeating(TimeHandle, 1f, 1f);
}
}
private void Unload()
{
ServerMgr.Instance.CancelInvoke(TimeHandle);
SaveData();
sb = null;
}
#endregion
#region [Rust-Api]
private object CanUserLogin(String name, String id)
{
IPlayer player = covalence.Players.FindPlayerById(id);
if (player != null && !config.NoKickAdmin && player.IsAdmin || config.AdminList.Contains(UInt64.Parse(id)) || permission.UserHasPermission(id, IgnorePermission)) return null;
DateTime Time = DateTime.Now;
return $"{GetLang("KICK_TEXT", id, NumericalFormatter.FormatTime(WipeTime - Time.TimeOfDay, 5, lang.GetLanguage(id)))}";
}
private void OnPlayerConnected(BasePlayer player)
{
if (player == null || !config.NoKickAdmin && player.IsAdmin || config.AdminList.Contains(player.userID) || permission.UserHasPermission(player.UserIDString, IgnorePermission)) return;
DateTime Time = DateTime.Now;
player.Kick($"{GetLang("KICK_TEXT", player.UserIDString, NumericalFormatter.FormatTime(WipeTime - Time.TimeOfDay, 5, lang.GetLanguage(player.UserIDString)))}");
}
#endregion
#region [Functional]
private void TimeHandle()
{
DateTime Time = DateTime.Now;
if (Time.TimeOfDay >= WipeTime)
{
Unsubscribe(nameof(CanUserLogin));
Unsubscribe(nameof(OnPlayerConnected));
SaveRestore.SaveCreatedTime = Time;
rust.RunServerCommand("env.time 12");
PrintWarning(LanguageEn ? "The server is open to players." : "Сервер открыт для игроков.");
ServerMgr.Instance.CancelInvoke(TimeHandle);
Interface.Oxide.UnloadPlugin(Name);
}
}
#endregion
#region [Time]
public static class NumericalFormatter
{
public static String FormatTime(TimeSpan time, Int32 maxSubstr = 5, String language = "ru")
{
String result = String.Empty;
switch (language)
{
case "ru":
Int32 i = 0;
if (time.Days != 0 && i < maxSubstr)
{
if (!String.IsNullOrEmpty(result))
result += " ";
result += $"{Format(time.Days, " дней", " дня", " дней")}";
i++;
}
if (time.Hours != 0 && i < maxSubstr)
{
if (!String.IsNullOrEmpty(result))
result += " ";
result += $"{Format(time.Hours, " часов", " часа", " час")}";
i++;
}
if (time.Minutes != 0 && i < maxSubstr)
{
if (!String.IsNullOrEmpty(result))
result += " ";
result += $"{Format(time.Minutes, " минут", " минуты", " минуту")}";
i++;
}
if (time.Days == 0)
{
if (time.Seconds != 0 && i < maxSubstr)
{
if (!String.IsNullOrEmpty(result))
result += " ";
result += $"{Format(time.Seconds, " секунд", " секунды", " секунду")}";
i++;
}
}
if (String.IsNullOrEmpty(result))
result = "0 секунд";
break;
default:
result = String.Format("{0}{1}{2}{3}",
time.Duration().Days > 0
? $"{time.Days:0} day{(time.Days == 1 ? String.Empty : "s")}, "
: String.Empty,
time.Duration().Hours > 0
? $"{time.Hours:0} hour{(time.Hours == 1 ? String.Empty : "s")}, "
: String.Empty,
time.Duration().Minutes > 0
? $"{time.Minutes:0} minute{(time.Minutes == 1 ? String.Empty : "s")}, "
: String.Empty,
time.Duration().Seconds > 0
? $"{time.Seconds:0} second{(time.Seconds == 1 ? String.Empty : "s")}"
: String.Empty);
if (result.EndsWith(", "))
result = result.Substring(0, result.Length - 2);
if (String.IsNullOrEmpty(result))
result = "0 seconds";
break;
}
return result;
}
private static String Format(Int32 units, String form1, String form2, String form3)
{
var tmp = units % 10;
if (units >= 5 && units <= 20 || tmp >= 5 && tmp <= 9)
return $"{units}{form1}";
if (tmp >= 2 && tmp <= 4)
return $"{units}{form2}";
return $"{units}{form3}";
}
}
#endregion
#region [Lang]
private new void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<String, String>
{
["KICK_TEXT"] = "The server will work through: {0}"
}, this);
lang.RegisterMessages(new Dictionary<String, String>
{
["KICK_TEXT"] = "Сервер будет открыт через: {0}"
}, this, "ru");
}
public String GetLang(String LangKey, String userID = null, params object[] args)
{
sb?.Clear();
if (args != null)
{
sb?.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
return sb?.ToString();
}
return lang.GetMessage(LangKey, this, userID);
}
#endregion
#region [Api]
private Boolean IsBlocked() => WipeServer;
#endregion
#region [Config]
private PluginConfig config;
protected override void LoadDefaultConfig()
{
config = PluginConfig.DefaultConfig();
}
protected override void LoadConfig()
{
base.LoadConfig();
config = Config.ReadObject<PluginConfig>();
if (config.PluginVersion < Version)
UpdateConfigValues();
Config.WriteObject(config, true);
}
private void UpdateConfigValues()
{
PluginConfig baseConfig = PluginConfig.DefaultConfig();
if (config.PluginVersion < Version)
{
config.PluginVersion = Version;
/*if (Version == new VersionNumber(1, 0, 0))
{
}*/
PrintWarning("Config checked completed!");
}
config.PluginVersion = Version;
}
protected override void SaveConfig()
{
Config.WriteObject(config);
}
private class PluginConfig
{
[JsonProperty(LanguageEn ? "Allow players with admin rights to enter the server ?" : "Разрешить игрокам с правами администратра заходить на сервер ?" )]
public Boolean NoKickAdmin;
[JsonProperty(LanguageEn ? "Players who can access the server [SteamID]" : "Игроки которым можно заходить на сервер [SteamID]" )]
public List<UInt64> AdminList = new List<UInt64>();
[JsonProperty(LanguageEn ? "Time to open the server | Hours" : "Время когда открывать сервер | Часы" )]
public Int32 Hours;
[JsonProperty(LanguageEn ? "Time to open the server | Minutes " : "Время когда открывать сервер | Минуты" )]
public Int32 Minutes;
[JsonProperty("Config version")]
public VersionNumber PluginVersion = new VersionNumber();
public static PluginConfig DefaultConfig()
{
return new PluginConfig()
{
NoKickAdmin = true,
AdminList = new List<UInt64>()
{
765600000000,
765600000044,
765600000123
},
Hours = 14,
PluginVersion = new VersionNumber()
};
}
}
#endregion
}
}