C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins
{
[Info("SteamGroups", "Wulf/lukespragg", "0.2.0", ResourceId = 2085)]
[Description("Automatically adds members of Steam group(s) to permissions group")]
class SteamGroups : CovalencePlugin
{
// Do NOT edit this file, instead edit SteamGroups.json in oxide/config
#region Initialization
int updateInterval;
string permGroup;
List<object> steamGroups;
protected override void LoadDefaultConfig()
{
Config["PermissionsGroup"] = permGroup = GetConfig("PermissionsGroup", "steam");
Config["SteamGroups"] = steamGroups = GetConfig("SteamGroups", new List<object> { "CitizenSO", "OxideMod" });
Config["UpdateInterval"] = updateInterval = GetConfig("UpdateInterval", 300);
SaveConfig();
}
void OnServerInitialized()
{
LoadDefaultConfig();
UpdateMembers();
timer.Every(updateInterval, UpdateMembers);
}
#endregion
#region Steam Members
static readonly Regex IdPattern = new Regex(@"<steamID64>(?<steamid>.+)</steamID64>");
HashSet<string> members = new HashSet<string>();
void UpdateMembers()
{
if (string.IsNullOrEmpty(permGroup) || steamGroups.Count < 1)
{
PrintWarning("Plugin is not configured, please check the config");
return;
}
foreach (var group in steamGroups)
{
var url = "http://steamcommunity.com/{0}/{1}/memberslistxml/?xml=1";
ulong result;
url = string.Format(url, ulong.TryParse(group.ToString(), out result) ? "gid" : "groups", group);
// Get Steam group members
webrequest.EnqueueGet(url, (code, response) =>
{
if (code != 200 || response == null)
{
Puts($"Checking for Steam group members failed! ({code})");
Puts("Retrying in 5 seconds...");
timer.Once(5f, UpdateMembers);
return;
}
var newMembers = 0;
foreach (Match match in IdPattern.Matches(response))
{
var id = match.Groups["steamid"].Value;
// Create group if it doesn't already exist
if (!permission.GroupExists(permGroup)) permission.CreateGroup(permGroup, permGroup, 0);
// Add Steam ID to permissions group if needed
if (!permission.UserHasGroup(id, permGroup))
{
permission.AddUserGroup(id, permGroup);
//Puts($"{id} from '{group}' added to '{permGroup}' group");
}
// Check if list contains Steam ID, else add
if (members.Contains(id)) continue;
members.Add(id);
newMembers++;
}
//Puts($"{IdPattern.Matches(response).Count} members in group '{group}'");
if (newMembers > 0) Puts($"{newMembers} new member{(newMembers == 1 ? "" : "s")} from group '{group}'");
// Remove user if no longer in Steam group
foreach (var user in permission.GetUsersInGroup(permGroup))
{
var id = Regex.Replace(user, "[^0-9]", "");
if (!members.Contains(id)) permission.RemoveUserGroup(id, permGroup);
}
}, this);
}
}
[Command("steammembers")]
void UpdateCommand(IPlayer player, string command, string[] args) => UpdateMembers();
#endregion
#region API Calls
bool InSteamGroup(string id) => members.Contains(id);
#endregion
#region Helpers
T GetConfig<T>(string name, T value) => Config[name] == null ? value : (T)Convert.ChangeType(Config[name], typeof(T));
#endregion
}
}