1
0
mirror of https://github.com/chylex/Discord-History-Tracker.git synced 2024-11-25 05:42:45 +01:00
Discord-History-Tracker/app/Server/Service/ServerUtils.cs
2022-02-21 22:27:29 +01:00

41 lines
1.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
namespace DHT.Server.Service {
public static class ServerUtils {
public static int FindAvailablePort(int min, int max) {
var properties = IPGlobalProperties.GetIPGlobalProperties();
var occupied = new HashSet<int>();
occupied.UnionWith(properties.GetActiveTcpListeners().Select(static tcp => tcp.Port));
occupied.UnionWith(properties.GetActiveTcpConnections().Select(static tcp => tcp.LocalEndPoint.Port));
for (int port = min; port < max; port++) {
if (!occupied.Contains(port)) {
return port;
}
}
return min;
}
private static Regex TokenFilter { get; } = new("[^25679bcdfghjkmnpqrstwxyz]", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
public static string GenerateRandomToken(int length) {
byte[] bytes = new byte[length * 3 / 2]; // Extra bytes compensate for filtered out characters.
var rng = new RNGCryptoServiceProvider();
string token = "";
while (token.Length < length) {
rng.GetBytes(bytes);
token = TokenFilter.Replace(Convert.ToBase64String(bytes), "");
}
return token[..length];
}
}
}