C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
// For development use only!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins
{
[Info("Developer", "Wulf/lukespragg", "0.1.0", ResourceId = 0)]
[Description("Adds Steam group members to the Rust developers list")]
class Developer : CovalencePlugin
{
// Do NOT edit this file, instead edit Developer.json in oxide/config
#region Configuration
List<object> groups;
protected override void LoadDefaultConfig()
{
Config["Groups"] = groups = GetConfig("Groups", new List<object> { "OxideMod" });
SaveConfig();
}
#endregion
#region Developers List
readonly FieldInfo developers = typeof(DeveloperList).GetField("developerIDs", BindingFlags.NonPublic | BindingFlags.Static);
ulong[] developerIds;
List<ulong> list;
void OnServerInitialized()
{
#if !RUST
throw new NotSupportedException("This plugin does not support this game");
#endif
LoadDefaultConfig();
timer.Once(3f, () =>
{
// Get developer list
developerIds = (ulong[])developers.GetValue(null);
list = developerIds.ToList();
Puts($"{list.Count} developers listed");
// Add group members
timer.Once(1f, AddDevelopers);
});
}
static readonly Regex Members = new Regex(@"<steamID64>(?<id>.+)</steamID64>");
void AddDevelopers()
{
foreach (var group in groups)
{
// Get Steam group members
webrequest.EnqueueGet($"http://steamcommunity.com/groups/{group}/memberslistxml/?xml=1", (code, response) =>
{
if (code != 200 || response == null)
{
Puts("Checking for Steam group members failed! (" + code + ")");
Puts("Retrying in 5 seconds...");
timer.Once(5f, AddDevelopers);
return;
}
if (Members.Matches(response).Count == 0) timer.Once(10f, AddDevelopers);
foreach (Match match in Members.Matches(response))
{
// Convert Steam ID to ulong format
var id = ulong.Parse(match.Groups["id"].ToString());
// Check if list contains Steam ID
if (developerIds.Contains(id)) continue;
// Add Steam ID to list
Puts($"Added {id} to developers list");
list.Add(id);
developers.SetValue(null, list.ToArray());
Puts($"{list.Count.ToString()} developers listed");
}
}, this);
}
}
#endregion
#region Chat/Console Command
static readonly Regex Persona = new Regex(@"<steamID><!\[CDATA\[(.*)\]\]></steamID>");
[Command("developers", "global.developers")]
void ListDevelopers(IPlayer player, string command, string[] args)
{
if (list == null || list.Count == 0)
{
player.Reply("No developers listed!");
return;
}
foreach (var developer in list)
{
// Get Steam username from ID
webrequest.EnqueueGet($"http://steamcommunity.com/profiles/{developer}?xml=1", (code, response) =>
{
if (code != 200 || response == null)
{
player.Reply("Checking for Steam username failed! (" + code + ")");
return;
}
// Show the developer info
player.Reply($"{developer.ToString()} ({Persona.Match(response).Groups[1]})");
}, this);
}
player.Reply($"{list.Count} developers listed");
}
#endregion
#region Helpers
T GetConfig<T>(string name, T value) => Config[name] == null ? value : (T)Convert.ChangeType(Config[name], typeof(T));
#endregion
}
}