/// <summary>
 ///     Creates a new downstream connected server group
 /// </summary>
 /// <param name="name">The name of the group.</param>
 /// <param name="visibility">The groups visibility.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 /// <param name="logger">The logger to use.</param>
 /// <param name="remoteServerLogger">The logger to pass to created remote servers.</param>
 /// <param name="metricsCollector">The metrics collector to use.</param>
 /// <param name="remoteServerMetricsCollector">The metrics collector to pass to created remote servers.</param>
 internal DownstreamServerGroup(string name, ServerVisibility visibility, DarkRiftThreadHelper threadHelper, Logger logger, Logger remoteServerLogger, MetricsCollector metricsCollector, MetricsCollector remoteServerMetricsCollector)
     : base(name, visibility, threadHelper, logger, metricsCollector)
 {
     this.threadHelper                 = threadHelper;
     this.logger                       = logger;
     this.remoteServerLogger           = remoteServerLogger;
     this.remoteServerMetricsCollector = remoteServerMetricsCollector;
 }
Example #2
0
        /// <summary>
        ///     Creates a new timer that will invoke the callback a single time.
        /// </summary>
        /// <param name="threadHelper">The thread helper to use.</param>
        /// <param name="delay">The delay in milliseconds before invoking the callback.</param>
        /// <param name="callback">The callback to invoke.</param>
        internal Timer(DarkRiftThreadHelper threadHelper, int delay, Action <Timer> callback)
        {
            this.threadHelper = threadHelper;
            this.IsOneShot    = true;
            this.Callback     = callback;
            this.IntialDelay  = delay;

            timer = new System.Threading.Timer(InvokeCallback, null, delay, Timeout.Infinite);
        }
Example #3
0
        /// <summary>
        ///     Creates a new timer that will invoke the callback repeatedly until stopped.
        /// </summary>
        /// <param name="threadHelper">The thread helper to use.</param>
        /// <param name="initialDelay">The delay in milliseconds before invoking the callback the first time.</param>
        /// <param name="repetitionPeriod">The delay in milliseconds between future invocations.</param>
        /// <param name="callback">The callback to invoke.</param>
        internal Timer(DarkRiftThreadHelper threadHelper, int initialDelay, int repetitionPeriod, Action <Timer> callback)
        {
            this.threadHelper     = threadHelper;
            this.IsOneShot        = false;
            this.Callback         = callback;
            this.IntialDelay      = initialDelay;
            this.RepetitionPeriod = repetitionPeriod;

            timer = new System.Threading.Timer(InvokeCallback, null, initialDelay, repetitionPeriod);
        }
 /// <summary>
 ///     Creates a new upstream connected server group
 /// </summary>
 /// <param name="name">The name of the group.</param>
 /// <param name="visibility">The groups visibility.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 /// <param name="serverRegistryConnectorManager">The server's registry connector manager</param>
 /// <param name="remoteServerManager">The remote server manager for the server.</param>
 /// <param name="reconnectAttempts">The number of times to attempt to reconnect to a server before considering it unconnectable.</param>
 /// <param name="logger">The logger to use.</param>
 /// <param name="remoteServerLogger">The logger to pass to created remote servers.</param>
 /// <param name="metricsCollector">The metrics collector to use.</param>
 /// <param name="remoteServerMetricsCollector">The metrics collector to pass to created remote servers.</param>
 internal UpstreamServerGroup(string name, ServerVisibility visibility, DarkRiftThreadHelper threadHelper, ServerRegistryConnectorManager serverRegistryConnectorManager, RemoteServerManager remoteServerManager, int reconnectAttempts, Logger logger, Logger remoteServerLogger, MetricsCollector metricsCollector, MetricsCollector remoteServerMetricsCollector)
     : base(name, visibility, threadHelper, logger, metricsCollector)
 {
     this.threadHelper = threadHelper;
     this.serverRegistryConnectorManager = serverRegistryConnectorManager;
     this.remoteServerManager            = remoteServerManager;
     this.reconnectAttempts            = reconnectAttempts;
     this.logger                       = logger;
     this.remoteServerLogger           = remoteServerLogger;
     this.remoteServerMetricsCollector = remoteServerMetricsCollector;
 }
        public ServerGroup(string name, ServerVisibility visibility, DarkRiftThreadHelper threadHelper, Logger logger, MetricsCollector metricsCollector)
        {
            this.Name       = name;
            this.Visibility = visibility;

            this.threadHelper = threadHelper;
            this.logger       = logger;

            serversConnectedGauge            = metricsCollector.Gauge("remote_servers_connected", "The number of servers connected to the server in this group.", "group").WithTags(name);
            serverJoinedEventTimeHistogram   = metricsCollector.Histogram("remote_server_joined_event_time", "The time taken to execute the ServerJoined event.", "group").WithTags(name);
            serverLeftEventTimeHistogram     = metricsCollector.Histogram("remote_server_left_event_time", "The time taken to execute the ServerLeft event.", "group").WithTags(name);
            serverJoinedEventFailuresCounter = metricsCollector.Counter("remote_server_joined_event_failures", "The number of failures executing the ServerJoined event.", "group").WithTags(name);
            serverLeftEventFailuresCounter   = metricsCollector.Counter("remote_server_left_event_failures", "The number of failures executing the ServerLeft event.", "group").WithTags(name);
        }
        /// <summary>
        ///     Creates a new remote server.
        /// </summary>
        /// <param name="id">The ID of the server.</param>
        /// <param name="host">The host connected to.</param>
        /// <param name="port">The port connected to.</param>
        /// <param name="group">The group the server belongs to.</param>
        /// <param name="threadHelper">The thread helper to use.</param>
        /// <param name="logger">The logger to use.</param>
        /// <param name="metricsCollector">The metrics collector to use.</param>
        internal DownstreamRemoteServer(ushort id, string host, ushort port, DownstreamServerGroup group, DarkRiftThreadHelper threadHelper, Logger logger, MetricsCollector metricsCollector)
        {
            this.ID           = id;
            this.Host         = host;
            this.Port         = port;
            this.serverGroup  = group;
            this.threadHelper = threadHelper;
            this.logger       = logger;

            messagesSentCounter                    = metricsCollector.Counter("messages_sent", "The number of messages sent to remote servers.");
            messagesReceivedCounter                = metricsCollector.Counter("messages_received", "The number of messages received from remote servers.");
            messageReceivedEventTimeHistogram      = metricsCollector.Histogram("message_received_event_time", "The time taken to execute the MessageReceived event.");
            messageReceivedEventFailuresCounter    = metricsCollector.Counter("message_received_event_failures", "The number of failures executing the MessageReceived event.");
            serverConnectedEventTimeHistogram      = metricsCollector.Histogram("remote_server_connected_event_time", "The time taken to execute the ServerConnected event.", "group").WithTags(group.Name);
            serverDisconnectedEventTimeHistogram   = metricsCollector.Histogram("remote_server_disconnected_event_time", "The time taken to execute the ServerDisconnected event.", "group").WithTags(group.Name);
            serverConnectedEventFailuresCounter    = metricsCollector.Counter("remote_server_connected_event_failures", "The number of failures executing the ServerConnected event.", "group").WithTags(group.Name);
            serverDisconnectedEventFailuresCounter = metricsCollector.Counter("remote_server_disconnected_event_failures", "The number of failures executing the ServerDisconnected event.", "group").WithTags(group.Name);
        }
        /// <summary>
        ///     Creates a new client manager.
        /// </summary>
        /// <param name="settings">The settings for this client manager.</param>
        /// <param name="networkListenerManager">The server's network listener manager.</param>
        /// <param name="threadHelper">The thread helper the client manager will use.</param>
        /// <param name="logger">The logger this client manager will use.</param>
        /// <param name="clientLogger">The logger clients will use.</param>
        internal ClientManager(ServerSpawnData.ServerSettings settings, NetworkListenerManager networkListenerManager, DarkRiftThreadHelper threadHelper, Logger logger, Logger clientLogger)
#endif
        {
            this.MaxStrikes             = settings.MaxStrikes;
            this.networkListenerManager = networkListenerManager;
            this.threadHelper           = threadHelper;
            this.logger       = logger;
            this.clientLogger = clientLogger;
#if PRO
            this.clientMetricsCollector = clientMetricsCollector;

            clientsConnectedGauge                  = metricsCollector.Gauge("clients_connected", "The number of clients connected to the server.");
            clientConnectedEventTimeHistogram      = metricsCollector.Histogram("client_connected_event_time", "The time taken to execute the ClientConnected event.");
            clientDisconnectedEventTimeHistogram   = metricsCollector.Histogram("client_disconnected_event_time", "The time taken to execute the ClientDisconnected event.");
            clientConnectedEventFailuresCounter    = metricsCollector.Counter("client_connected_event_failures", "The number of failures executing the ClientConnected event.");
            clientDisconnectedEventFailuresCounter = metricsCollector.Counter("client_disconnected_event_failures", "The number of failures executing the ClientDisconnected event.");
#endif
        }
Example #8
0
 /// <summary>
 ///     Creates new load data with the given properties.
 /// </summary>
 /// <param name="name">The name of the plugin.</param>
 /// <param name="settings">The settings to pass the plugin.</param>
 /// <param name="serverInfo">The runtime details about the server.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 /// <param name="logger">The logger this plugin will use.</param>
 /// <param name="resourceDirectory">The directory to place this plugin's resources.</param>
 /// <remarks>
 ///     This constructor ensures that the legacy <see cref="WriteEventHandler"/> field is initialised to <see cref="Logger.Log(string, LogType, Exception)"/> for backwards compatibility.
 /// </remarks>
 public PluginLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, Logger logger, string resourceDirectory)
     : base(name, settings, serverInfo, threadHelper, logger)
 {
     this.ResourceDirectory = resourceDirectory;
 }
Example #9
0
        /// <summary>
        ///     Creates a new server manager.
        /// </summary>
        /// <param name="serverSettings">The server's main configuration.</param>
        /// <param name="serverRegistrySettings">The server's registry configuration.</param>
        /// <param name="clusterSpawnData">The cluster configuration</param>
        /// <param name="networkListenerManager">The server's network listener manager.</param>
        /// <param name="threadHelper">The server's thread helper.</param>
        /// <param name="serverRegistryConnectorManager">The server's registry connector manager.</param>
        /// <param name="logManager">The server's log manager.</param>
        /// <param name="logger">The logger to use.</param>
        /// <param name="metricsManager">The server's metrics manager.</param>
        internal RemoteServerManager(ServerSpawnData.ServerSettings serverSettings, ServerSpawnData.ServerRegistrySettings serverRegistrySettings, ClusterSpawnData clusterSpawnData, NetworkListenerManager networkListenerManager, DarkRiftThreadHelper threadHelper, ServerRegistryConnectorManager serverRegistryConnectorManager, LogManager logManager, Logger logger, MetricsManager metricsManager)
        {
            this.AdvertisedHost = serverRegistrySettings.AdvertisedHost;
            this.AdvertisedPort = serverRegistrySettings.AdvertisedPort;


            this.networkListenerManager         = networkListenerManager;
            this.serverRegistryConnectorManager = serverRegistryConnectorManager;
            this.logger = logger;
            this.Group  = serverSettings.ServerGroup;

            if (!string.IsNullOrEmpty(serverSettings.ServerGroup))
            {
                if (serverRegistrySettings.AdvertisedHost == null || serverRegistrySettings.AdvertisedPort == 0)
                {
                    throw new ArgumentException("Cannot start server clustering without an advertised host and port. Consider setting the 'advertisedHost' and 'advertisedPort' properties in configuration.");
                }

                // Find our group
                ClusterSpawnData.GroupsSettings.GroupSettings ourGroup = null;
                foreach (ClusterSpawnData.GroupsSettings.GroupSettings groupSettings in clusterSpawnData.Groups.Groups)
                {
                    if (groupSettings.Name == serverSettings.ServerGroup)
                    {
                        ourGroup = groupSettings;
                        break;
                    }
                }

                if (ourGroup == null)
                {
                    throw new ArgumentException($"The group specified to own this server '{serverSettings.ServerGroup}' is not present in the cluster configuration. Consider adding this group to the cluster configuration or moving the server to an existing group.");
                }

                this.Visibility = ourGroup.Visibility;

                // Build relationships to other groups
                foreach (ClusterSpawnData.GroupsSettings.GroupSettings groupSettings in clusterSpawnData.Groups.Groups)
                {
                    ClusterSpawnData.GroupsSettings.GroupSettings.ConnectsToSettings ourGroupConnectsTo = ourGroup.ConnectsTo.FirstOrDefault(c => c.Name == groupSettings.Name);
                    ClusterSpawnData.GroupsSettings.GroupSettings.ConnectsToSettings connectsToOurGroup = groupSettings.ConnectsTo.FirstOrDefault(c => c.Name == ourGroup.Name);

                    IModifiableServerGroup serverGroup;
                    if (ourGroupConnectsTo != null)
                    {
                        serverGroup = new UpstreamServerGroup(groupSettings.Name, groupSettings.Visibility, threadHelper, serverRegistryConnectorManager, this, serverSettings.ReconnectAttempts, logManager.GetLoggerFor(nameof(UpstreamServerGroup)), logManager.GetLoggerFor(nameof(UpstreamRemoteServer)), metricsManager.GetMetricsCollectorFor(nameof(UpstreamServerGroup)), metricsManager.GetMetricsCollectorFor(nameof(UpstreamRemoteServer)));
                    }
                    else if (connectsToOurGroup != null)
                    {
                        serverGroup = new DownstreamServerGroup(groupSettings.Name, groupSettings.Visibility, threadHelper, logManager.GetLoggerFor(nameof(DownstreamServerGroup)), logManager.GetLoggerFor(nameof(DownstreamRemoteServer)), metricsManager.GetMetricsCollectorFor(nameof(DownstreamServerGroup)), metricsManager.GetMetricsCollectorFor(nameof(DownstreamRemoteServer)));
                    }
                    else
                    {
                        continue;
                    }

                    groups.Add(groupSettings.Name, serverGroup);
                }
            }
        }
 public NetworkListenerLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, WriteEventHandler writeEventHandler)
     : base(name, settings, serverInfo, threadHelper, writeEventHandler)
 {
 }
 /// <summary>
 ///     Creates new load data for a <see cref="NetworkListener"/>.
 /// </summary>
 /// <param name="name">The name of the listener.</param>
 /// <param name="settings">The settings to pass the listener.</param>
 /// <param name="serverInfo">The runtime details about the server.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 /// <param name="logger">The logger this plugin will use.</param>
 /// <remarks>
 ///     This constructor ensures that the legacy <see cref="WriteEventHandler"/> field is initialised to <see cref="Logger.Log(string, LogType, Exception)"/> for backwards compatibility.
 /// </remarks>
 public NetworkListenerLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, Logger logger)
     : base(name, settings, serverInfo, threadHelper, logger)
 {
 }
 /// <summary>
 ///     Creates a new command engine.
 /// </summary>
 /// <param name="threadHelper">The thread helper the command engine will use.</param>
 /// <param name="pluginManager">The plugin manager this command engine will use to find handlers.</param>
 /// <param name="logger">The logger the command engine will use.</param>
 internal CommandEngine(DarkRiftThreadHelper threadHelper, PluginManager pluginManager, Logger logger)
 {
     this.threadHelper  = threadHelper;
     this.pluginManager = pluginManager;
     this.logger        = logger;
 }
 /// <summary>
 ///     Creates new load data for a <see cref="LogWriter"/>.
 /// </summary>
 /// <param name="name">The name of the log writer.</param>
 /// <param name="settings">The settings to pass the log writer.</param>
 /// <param name="serverInfo">The runtime details about the server.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 public LogWriterLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper)
     : base(name, settings, serverInfo, threadHelper)
 {
 }
Example #14
0
 /// <summary>
 ///     Creates new load data with the given properties.
 /// </summary>
 /// <param name="name">The name of the connector.</param>
 /// <param name="settings">The settings to pass the connector.</param>
 /// <param name="serverInfo">The runtime details about the server.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 /// <param name="logger">The logger to use.</param>
 public ServerRegistryConnectorLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, Logger logger)
     : base(name, settings, serverInfo, threadHelper, logger)
 {
 }
 /// <summary>
 ///     Creates a new client manager.
 /// </summary>
 /// <param name="settings">The settings for this client manager.</param>
 /// <param name="networkListenerManager">The server's network listener manager. Used to implement obsolete functionality.</param>
 /// <param name="threadHelper">The thread helper the client manager will use.</param>
 /// <param name="logger">The logger this client manager will use.</param>
 /// <param name="clientLogger">The logger clients will use.</param>
 /// <param name="metricsCollector">The metrics collector to use.</param>
 /// <param name="clientMetricsCollector">The metrics collector clients will use.</param>
 internal ClientManager(ServerSpawnData.ServerSettings settings, NetworkListenerManager networkListenerManager, DarkRiftThreadHelper threadHelper, Logger logger, Logger clientLogger, MetricsCollector metricsCollector, MetricsCollector clientMetricsCollector)
Example #16
0
 /// <summary>
 ///     Creates new load data with the given properties.
 /// </summary>
 /// <param name="name">The name of the plugin.</param>
 /// <param name="settings">The settings to pass the plugin.</param>
 /// <param name="serverInfo">The runtime details about the server.</param>
 /// <param name="threadHelper">The server's thread helper.</param>
 public PluginBaseLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper)
 {
     this.Name         = name;
     this.Settings     = settings;
     this.ServerInfo   = serverInfo;
     this.ThreadHelper = threadHelper;
 }
Example #17
0
        /// <summary>
        ///     Creates new load data with the given properties.
        /// </summary>
        /// <param name="name">The name of the plugin.</param>
        /// <param name="settings">The settings to pass the plugin.</param>
        /// <param name="serverInfo">The runtime details about the server.</param>
        /// <param name="threadHelper">The server's thread helper.</param>
        /// <param name="logger">The logger this plugin will use.</param>
        /// <remarks>
        ///     This constructor ensures that the legacy <see cref="WriteEventHandler"/> field is initialised to <see cref="Logger.Log(string, LogType, Exception)"/> for backwards compatibility.
        /// </remarks>
        public ExtendedPluginBaseLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, Logger logger)
            : base(name, settings, serverInfo, threadHelper)
        {
#pragma warning disable CS0618 // Implementing obsolete functionality
            if (logger != null)
            {
                WriteEventHandler = logger.Log;
            }
#pragma warning restore CS0618

            Logger = logger;
        }
Example #18
0
 public ExtendedPluginBaseLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, WriteEventHandler writeEventHandler)
     : base(name, settings, serverInfo, threadHelper)
 {
     WriteEventHandler = writeEventHandler;
 }