/// <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; }
/// <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); }
/// <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 }
/// <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; }
/// <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) { }
/// <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)
/// <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; }
/// <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; }
public ExtendedPluginBaseLoadData(string name, NameValueCollection settings, DarkRiftInfo serverInfo, DarkRiftThreadHelper threadHelper, WriteEventHandler writeEventHandler) : base(name, settings, serverInfo, threadHelper) { WriteEventHandler = writeEventHandler; }