using System; using System.Linq; using java.io; using java.lang; using java.nio.file; using java.time; using java.util; using java.util.concurrent; using LuckPerms.Torch.Extensions; using me.lucko.luckperms.common.plugin.bootstrap; using me.lucko.luckperms.common.plugin.classpath; using me.lucko.luckperms.common.plugin.logging; using me.lucko.luckperms.common.plugin.scheduler; using net.luckperms.api.platform; using NLog; using Sandbox.Game.Multiplayer; using Torch.API; using Torch.API.Managers; using Torch.API.Plugins; using Torch.Server.Managers; namespace LuckPerms.Torch.Impl; public class LpTorchBootstrap : LuckPermsBootstrap { private SchedulerAdapter? _schedulerAdapter; private ClassPathAppender? _classPathAppender; private readonly PluginLogger _pluginLogger; public CountDownLatch LoadLatch { get; } = new(1); public CountDownLatch EnableLatch { get; } = new(1); private readonly ITorchServer _torch; private readonly ITorchPlugin _torchPlugin; private readonly string _configDir; public LpTorchPlugin Plugin { get; } public LpTorchBootstrap(ITorchServer torch, ITorchPlugin torchPlugin, ILogger logger, string configDir) { _pluginLogger = new NLogPluginLogger(logger); _torch = torch; _torchPlugin = torchPlugin; _configDir = configDir; Plugin = new(this, torch); } public ITorchPlugin GetTorchPlugin() => _torchPlugin; public Path getDataDirectory() => Paths.get(_configDir, "data"); public string identifyClassLoader(ClassLoader classLoader) => classLoader.toString(); public Collection getPlayerList() => Sync.Players?.GetAllPlayers() .Select(b => Sync.Players.TryGetPlayerIdentity(b)?.DisplayName).Where(b => b is not null).ToCollection() ?? Collections.EMPTY_LIST; public Platform.Type getType() => Platform.Type.STANDALONE; // meh public SchedulerAdapter getScheduler() => _schedulerAdapter ??= new LpSchedulerAdapter(this, _torch); public Path getConfigDirectory() => Paths.get(_configDir); public bool isPlayerOnline(UUID uuid) => _torch.CurrentSession?.Managers.GetManager().Players .ContainsKey(uuid.GetSteamId()) ?? false; public string getVersion() => _torchPlugin.Version.TrimStart('v'); public string getServerBrand() => "Torch"; public string getServerVersion() => _torch.TorchVersion.ToString(); public int getPlayerCount() => _torch.CurrentSession?.Managers.GetManager().Players.Count ?? 0; public Instant getStartupTime() => Instant.ofEpochMilli((DateTimeOffset.Now - _torch.ElapsedPlayTime).ToUnixTimeMilliseconds()); public ClassPathAppender getClassPathAppender() => _classPathAppender ??= new LpClassPathAppender(); public InputStream? getResourceStream(string path) { var normalizedPath = path.Replace('/', '.'); using var dotnetStream = typeof(LpTorchBootstrap).Assembly.GetManifestResourceStream(normalizedPath); return dotnetStream?.GetInputStream(); } public PluginLogger getPluginLogger() => _pluginLogger; public Optional lookupUniqueId(string str) { if (Sync.Players?.GetAllIdentities().FirstOrDefault(b => b.DisplayName == str)?.IdentityId is { } identityId && Sync.Players.TryGetSteamId(identityId) is { } steamId and > 0) return Optional.of(steamId.GetUuid()); return Optional.empty(); } public Optional lookupUsername(UUID uuid) { if (Sync.Players?.TryGetPlayerIdentity(uuid.GetSteamId())?.DisplayName is { } displayName) return Optional.of(displayName); return Optional.empty(); } public Collection getOnlinePlayers() { return _torch.CurrentSession?.Managers.GetManager().Players.Select(b => b.Key.GetUuid()) .ToCollection() ?? Collections.EMPTY_LIST; } public CountDownLatch getLoadLatch() => LoadLatch; public CountDownLatch getEnableLatch() => EnableLatch; public string getServerName() => _torch.Managers.GetManager().DedicatedConfig.ServerName; public Optional getPlayer(UUID uuid) => _torch.CurrentSession?.Managers.GetManager().Players.TryGetValue(uuid.GetSteamId(), out var player) ?? false ? Optional.of(player) : Optional.empty(); }