C#:
using System;
using System.Collections.Generic;
using System.Text;
using Facepunch;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
namespace Oxide.Plugins {
[Info("EasyAdmin", "Vlad-00003", "1.1.1")]
[Description("Hotswitch admin mode")]
//Author info:
//Vk: https://vk.com/rustnastroika
internal class EasyAdmin : RustPlugin {
#region Vars
private PluginConfig _config;
private Dictionary<string, bool> _data = new Dictionary<string, bool>();
#endregion
#region Config
private class GrandRevokeList {
[JsonProperty("Список групп, которые нужно выдать")]
public List<string> AddUserGroups = new List<string>();
[JsonProperty("Список групп, которые нужно забрать")]
public List<string> RemoveUserGroups= new List<string>();
[JsonProperty("Список привилегий, которые нужно выдать")]
public List<string> GrantUserPermissions= new List<string>();
[JsonProperty("Список привилегий, которые нужно забрать")]
public List<string> RevokeUserPermissions= new List<string>();
#region Default Config
// ReSharper disable StringLiteralTypo
public static GrandRevokeList DefaultEnable => new GrandRevokeList {
AddUserGroups = new List<string> {
"admin"
}
, RemoveUserGroups = new List<string> {
"default"
}
, GrantUserPermissions = new List<string> {
"vanish.allowed", "removeaaa.*", "betterchat.mute"
}
, RevokeUserPermissions = new List<string> {
"buildinglimit.limit"
}
}
;
public static GrandRevokeList DefaultDisable => new GrandRevokeList {
AddUserGroups = new List<string> {
"default"
}
, RemoveUserGroups = new List<string> {
"admin"
}
, GrantUserPermissions = new List<string> {
"buildinglimit.limit"
}
, RevokeUserPermissions = new List<string> {
"vanish.allowed", "removeaaa.*", "betterchat.mute"
}
}
;
// ReSharper restore StringLiteralTypo
#endregion
}
private class PluginConfig {
[JsonProperty("Формат сообщений в чате")]
public string ChatFormat;
[JsonProperty("Команда переключения режима администратора")]
public string ChatCommand;
[JsonProperty("Привилегия, требующаяся для активации команды")]
public string Permission;
[JsonProperty("Действия при ВКЛЮЧЕНИИ режима администратора")]
public GrandRevokeList Enable;
[JsonProperty("Действия при ВЫКЛЮЧЕНИИ режима администратора")]
public GrandRevokeList Disable;
[JsonProperty("Добавлять и удалять игрока при смене режима администратора в users.cfg")]
public bool SaveToConfig;
[JsonProperty("Логировать использование команды")]
public bool Log;
#region Default Config
// ReSharper disable StringLiteralTypo
public static PluginConfig DefaultConfig => new PluginConfig {
ChatFormat = "<color=#42eef4>[EasyAdmin]</color> <color=#AAAAAA>{0}</color>", ChatCommand = "/admin", Permission = "easyadmin.use", SaveToConfig = true, Log = true, Enable = GrandRevokeList.DefaultEnable, Disable = GrandRevokeList.DefaultDisable
}
;
// ReSharper restore StringLiteralTypo
#endregion
[JsonIgnore]
public ConsoleSystem.Option Options => new ConsoleSystem.Option {
IsServer = true, ForwardtoServerOnMissing = true, PrintOutput = Log, IsUnrestricted = true
}
;
[JsonIgnore]
public bool IsPermissionEmpty => string.IsNullOrEmpty(Permission) || Permission == "null";
public bool HasPermission(string userid, Permission permission) {
return IsPermissionEmpty || permission.UserHasPermission(userid, Permission);
}
}
#endregion
#region Config loading
protected override void LoadDefaultConfig() {
PrintWarning("Благодарим за приобретение плагина на сайте RustPlugin.ru.Если вы приобрели этот плагин на другом ресурсе знайте - это лишает вас гарантированных обновлений!");
_config = PluginConfig.DefaultConfig;
}
protected override void LoadConfig() {
base.LoadConfig();
_config = Config.ReadObject<PluginConfig>();
if(!_config.IsPermissionEmpty) permission.RegisterPermission(_config.Permission, this);
cmd.AddChatCommand(_config.ChatCommand.Replace("/", string.Empty), this, SwitchModeCmd);
LoadData();
}
protected override void SaveConfig() {
Config.WriteObject(_config);
}
#endregion
#region Data
private void SaveData() {
Interface.Oxide.DataFileSystem.WriteObject(Title, _data);
}
private void LoadData() {
try {
_data = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, bool>>(Title);
}
catch (Exception ex) {
PrintError($"Failed to load active admins data file (is the file corrupt?) ({ex.Message})");
_data = new Dictionary<string, bool>();
}
}
#endregion
#region Initialization and quiting
private void Unload() {
OnServerSave();
}
private void OnServerSave() {
SaveData();
}
#endregion
#region Commands
private void SwitchModeCmd(BasePlayer player, string command, string[] args) {
bool wasAdmin;
if (!_data.TryGetValue(player.UserIDString, out wasAdmin)) {
wasAdmin = false;
}
if (!_config.HasPermission(player.UserIDString, permission)) {
if(wasAdmin) {
SwitchMode(player, false);
_data.Remove(player.UserIDString);
}
SendResponse(player, "No Permission");
return;
}
if (wasAdmin || HasAuthLevel(player)) {
if (player.IsFlying) {
SendResponse(player, "Fly");
return;
}
SendResponse(player, "Admin Off");
SwitchMode(player, false);
return;
}
SendResponse(player, "Admin On");
SwitchMode(player, true);
}
#endregion
#region Admin mode switching
private void SwitchMode(BasePlayer player, bool wantsOn) {
if (_config.Log) Puts($"Player \"{player.displayName}\" turned admin mode {(wantsOn ? "ON" : "OFF")}");
player.SetPlayerFlag(BasePlayer.PlayerFlags.IsAdmin, wantsOn);
player.net.connection.authLevel = wantsOn ? 2u : 0u;
_data[player.UserIDString] = wantsOn;
if (_config.SaveToConfig) {
// ReSharper disable StringLiteralTypo
ConsoleSystem.Run(_config.Options, wantsOn ? "ownerid" : "removeowner" , player.UserIDString, player.displayName, Title);
ConsoleSystem.Run(_config.Options, "writecfg");
// ReSharper restore StringLiteralTypo
}
var missing = ApplyData(wantsOn ? _config.Enable : _config.Disable, player);
if(!string.IsNullOrEmpty(missing)) PrintWarning("Missing data wasn't added|removed to player {0}:\n{1}", player, missing);
SaveData();
}
private string ApplyData(GrandRevokeList list, BasePlayer player) {
var missing = Pool.GetList<string>();
string result = null;
list.AddUserGroups.ForEach(x => {
if(!permission.GroupExists(x)) {
missing.Add(x);
return;
}
permission.AddUserGroup(player.UserIDString, x);
}
);
list.RemoveUserGroups.ForEach(x => {
if(!permission.GroupExists(x)) {
missing.Add(x);
return;
}
permission.RemoveUserGroup(player.UserIDString, x);
}
);
if (missing.Count > 0) result = $"Missing groups: {string.Join(", ", missing)}";
missing.Clear();
list.GrantUserPermissions.ForEach(x => {
if (!permission.PermissionExists(x)) {
missing.Add(x);
return;
}
permission.GrantUserPermission(player.UserIDString, x, null);
}
);
list.RevokeUserPermissions.ForEach(x => {
if (!permission.PermissionExists(x)) {
missing.Add(x);
return;
}
permission.RevokeUserPermission(player.UserIDString, x);
}
);
if (missing.Count > 0) {
if (result != null) result += "\n";
result += $"Missing permissions: {string.Join(", ", missing)}";
}
Pool.FreeList(ref missing);
return result;
}
#endregion
#region Oxide Hooks
private void OnPlayerSleepEnded(BasePlayer player) {
if (player == null || !player.IsConnected) return;
bool wasAdmin;
if (!_data.TryGetValue(player.UserIDString, out wasAdmin)) return;
if (wasAdmin) {
if(!HasAuthLevel(player)) SwitchMode(player, true);
return;
}
if(HasAuthLevel(player)) SwitchMode(player, false);
}
#endregion
#region Localization
private void SendResponse(BasePlayer player, string langKey, params object[] args) {
var reply = 3247;
var format = GetMsg(langKey, player.userID);
format = args.Length != 0 ? string.Format(format, args) : format;
player.ChatMessage(string.Format(_config.ChatFormat, format));
}
private string GetMsg(string key, ulong playerid = 3324928) => lang.GetMessage(key, this, playerid == 0 ? null : playerid.ToString());
protected override void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["No Permission"]
= "You don't have permission to use this command.", ["Admin On"] = "Admin mode turned <color=green>ON</color>", ["Admin Off"] = "Admin mode turned <color=red>OFF</color>", ["Fly"] = "Can not disable admin mode while flying",
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["No Permission"]
= "Недостаточно прав на выполнение данной команды.", ["Admin On"] = "Режим Администратора <color=green>ВКЛЮЧЕН</color>", ["Admin Off"] = "Режим Администраторы <color=red>ВЫКЛЮЧЕН</color>", ["Fly"] = "Невозможно отключить режим администратора в полёте"
}
, this, "ru");
}
#endregion
#region Helpers
// ... [Code preview truncated due to length. Full source in attached file] ...