/// <summary> /// Initializes a new instance of the <see cref="UserService"/> class. /// </summary> /// <param name="soulseekClient"></param> /// <param name="stateMutator"></param> /// <param name="optionsMonitor"></param> public UserService( ISoulseekClient soulseekClient, IStateMutator <State> stateMutator, IOptionsMonitor <Options> optionsMonitor) { Client = soulseekClient; StateMutator = stateMutator; OptionsMonitor = optionsMonitor; OptionsMonitor.OnChange(options => Configure(options)); // updates may be sent unsolicited from the server, so update when we get them. // binding these events will cause multiple redundant round trips when initially watching a user // or when explicitly requesting via GetStatus/GetStatistics. this is wasteful, but there's no functional side effect. Client.UserStatisticsChanged += (_, userStatistics) => UpdateStatistics(userStatistics.Username, userStatistics.ToStatistics()); Client.UserStatusChanged += (sender, userStatus) => { UpdateStatus(userStatus.Username, userStatus.ToStatus()); // the server doesn't send statistics events by itself, so when a user status changes, fetch stats at the same time. _ = GetStatisticsAsync(userStatus.Username); }; Client.Connected += (_, _) => Reset(); Client.LoggedIn += (_, _) => Configure(OptionsMonitor.CurrentValue, force: true); Configure(OptionsMonitor.CurrentValue); }
public PeerMessageHandler( ISoulseekClient soulseekClient, IDiagnosticFactory diagnosticFactory = null) { SoulseekClient = (SoulseekClient)soulseekClient; Diagnostic = diagnosticFactory ?? new DiagnosticFactory(this, SoulseekClient.Options.MinimumDiagnosticLevel, (e) => DiagnosticGenerated?.Invoke(this, e)); }
/// <summary> /// Initializes a new instance of the <see cref="ConversationsController"/> class. /// </summary> /// <param name="soulseekClient"></param> /// <param name="applicationStateMonotor"></param> /// <param name="tracker"></param> public ConversationsController( ISoulseekClient soulseekClient, IStateMonitor <State> applicationStateMonotor, IConversationTracker tracker) { Client = soulseekClient; ApplicationStateMonitor = applicationStateMonotor; Tracker = tracker; }
public ServerController( ISoulseekClient soulseekClient, IOptionsSnapshot <Options> optionsSnapshot, IStateSnapshot <State> stateSnapshot) { Client = soulseekClient; OptionsSnapshot = optionsSnapshot; StateSnapshot = stateSnapshot; }
public RoomsController( ISoulseekClient soulseekClient, IRoomService roomService, IStateMonitor <State> applicationStateMonitor, IRoomTracker tracker) { Client = soulseekClient; ApplicationStateMonitor = applicationStateMonitor; Tracker = tracker; RoomService = roomService; }
public DownloadService( IOptionsMonitor <Options> optionsMonitor, ISoulseekClient soulseekClient, IDbContextFactory <TransfersDbContext> contextFactory, IFTPService ftpClient) { Client = soulseekClient; OptionsMonitor = optionsMonitor; ContextFactory = contextFactory; FTP = ftpClient; }
/// <summary> /// Initializes a new instance of the <see cref="SearchService"/> class. /// </summary> /// <param name="searchHub"></param> /// <param name="optionsMonitor"></param> /// <param name="soulseekClient"></param> /// <param name="contextFactory">The database context to use.</param> public SearchService( IHubContext <SearchHub> searchHub, IOptionsMonitor <Options> optionsMonitor, ISoulseekClient soulseekClient, IDbContextFactory <SearchDbContext> contextFactory) { SearchHub = searchHub; OptionsMonitor = optionsMonitor; Client = soulseekClient; ContextFactory = contextFactory; }
public UploadService( IUserService userService, ISoulseekClient soulseekClient, IOptionsMonitor <Options> optionsMonitor, IShareService shareService, IDbContextFactory <TransfersDbContext> contextFactory) { Users = userService; Client = soulseekClient; Shares = shareService; ContextFactory = contextFactory; OptionsMonitor = optionsMonitor; Governor = new UploadGovernor(userService, optionsMonitor); Queue = new UploadQueue(userService, optionsMonitor); }
private static readonly int ReconnectMaxDelayMilliseconds = 300000; // 5 minutes /// <summary> /// Initializes a new instance of the <see cref="ConnectionWatchdog"/> class. /// </summary> /// <param name="soulseekClient"></param> /// <param name="optionsMonitor"></param> /// <param name="state"></param> public ConnectionWatchdog( ISoulseekClient soulseekClient, IOptionsMonitor <Options> optionsMonitor, IStateMonitor <State> state) { Client = soulseekClient; Options = optionsMonitor; State = state; WatchdogTimer = new System.Timers.Timer() { Interval = 100, AutoReset = true, Enabled = false, }; WatchdogTimer.Elapsed += (sender, args) => _ = AttemptReconnect(); }
/// <summary> /// Initializes a new instance of the <see cref="RoomService"/> class. /// </summary> /// <param name="soulseekClient"></param> /// <param name="optionsMonitor"></param> /// <param name="stateMutator"></param> /// <param name="roomTracker"></param> public RoomService( ISoulseekClient soulseekClient, IOptionsMonitor <Options> optionsMonitor, IStateMutator <State> stateMutator, IRoomTracker roomTracker) { Client = soulseekClient; StateMutator = stateMutator; OptionsMonitor = optionsMonitor; RoomTracker = roomTracker; Client.LoggedIn += Client_LoggedIn; Client.RoomJoined += Client_RoomJoined; Client.RoomLeft += Client_RoomLeft; Client.RoomMessageReceived += Client_RoomMessageReceived; }
/// <summary> /// Initializes a new instance of the <see cref="PeerConnectionManager"/> class. /// </summary> /// <param name="soulseekClient">The ISoulseekClient instance to use.</param> /// <param name="connectionFactory">The IConnectionFactory instance to use.</param> /// <param name="diagnosticFactory">The IDiagnosticFactory instance to use.</param> internal PeerConnectionManager( ISoulseekClient soulseekClient, IConnectionFactory connectionFactory = null, IDiagnosticFactory diagnosticFactory = null) { SoulseekClient = (SoulseekClient)soulseekClient; ConcurrentMessageConnectionLimit = SoulseekClient.Options.ConcurrentPeerMessageConnectionLimit; if (SoulseekClient.Listener != null) { SoulseekClient.Listener.Accepted += Listener_Accepted; } ConnectionFactory = connectionFactory ?? new ConnectionFactory(); Diagnostic = diagnosticFactory ?? new DiagnosticFactory(this, SoulseekClient.Options.MinimumDiagnosticLevel, (e) => DiagnosticGenerated?.Invoke(this, e)); MessageSemaphore = new SemaphoreSlim(ConcurrentMessageConnectionLimit, ConcurrentMessageConnectionLimit); MessageConnections = new ConcurrentDictionary <string, (SemaphoreSlim Semaphore, IMessageConnection Connection)>(); }
public Application( OptionsAtStartup optionsAtStartup, IOptionsMonitor <Options> optionsMonitor, IManagedState <State> state, ISoulseekClient soulseekClient, IConnectionWatchdog connectionWatchdog, ITransferService transferService, IBrowseTracker browseTracker, IConversationTracker conversationTracker, IRoomTracker roomTracker, IRoomService roomService, IUserService userService, IShareService shareService, IPushbulletService pushbulletService, IHubContext <ApplicationHub> applicationHub, IHubContext <LogsHub> logHub) { Console.CancelKeyPress += (_, args) => { ShuttingDown = true; Log.Warning("Received SIGINT"); }; foreach (var signal in new[] { PosixSignal.SIGINT, PosixSignal.SIGQUIT, PosixSignal.SIGTERM }) { PosixSignalRegistration.Create(signal, context => { ShuttingDown = true; Log.Fatal("Received {Signal}", signal); }); } OptionsAtStartup = optionsAtStartup; OptionsMonitor = optionsMonitor; OptionsMonitor.OnChange(async options => await OptionsMonitor_OnChange(options)); PreviousOptions = OptionsMonitor.CurrentValue; CompiledSearchResponseFilters = OptionsAtStartup.Filters.Search.Request.Select(f => new Regex(f, RegexOptions.Compiled)); State = state; State.OnChange(state => State_OnChange(state)); Shares = shareService; Shares.StateMonitor.OnChange(state => ShareState_OnChange(state)); Transfers = transferService; BrowseTracker = browseTracker; ConversationTracker = conversationTracker; Pushbullet = pushbulletService; RoomService = roomService; Users = userService; ApplicationHub = applicationHub; LogHub = logHub; Program.LogEmitted += (_, log) => LogHub.EmitLogAsync(log); Client = soulseekClient; Client.DiagnosticGenerated += Client_DiagnosticGenerated; Client.TransferStateChanged += Client_TransferStateChanged; Client.TransferProgressUpdated += Client_TransferProgressUpdated; Client.BrowseProgressUpdated += Client_BrowseProgressUpdated; Client.UserStatusChanged += Client_UserStatusChanged; Client.PrivateMessageReceived += Client_PrivateMessageRecieved; Client.PrivateRoomMembershipAdded += (e, room) => Log.Information("Added to private room {Room}", room); Client.PrivateRoomMembershipRemoved += (e, room) => Log.Information("Removed from private room {Room}", room); Client.PrivateRoomModerationAdded += (e, room) => Log.Information("Promoted to moderator in private room {Room}", room); Client.PrivateRoomModerationRemoved += (e, room) => Log.Information("Demoted from moderator in private room {Room}", room); Client.PublicChatMessageReceived += Client_PublicChatMessageReceived; Client.RoomMessageReceived += Client_RoomMessageReceived; Client.Disconnected += Client_Disconnected; Client.Connected += Client_Connected; Client.LoggedIn += Client_LoggedIn; Client.StateChanged += Client_StateChanged; Client.DistributedNetworkStateChanged += Client_DistributedNetworkStateChanged; Client.DownloadDenied += (e, args) => Log.Information("Download of {Filename} from {Username} was denied: {Message}", args.Filename, args.Username, args.Message); Client.DownloadFailed += (e, args) => Log.Information("Download of {Filename} from {Username} failed", args.Filename, args.Username); ConnectionWatchdog = connectionWatchdog; }
public FilesController(IConfiguration configuration, ISoulseekClient client) { OutputDirectory = configuration.GetValue <string>("OUTPUT_DIR"); Client = client; }
/// <summary> /// Initializes a new instance of the <see cref="UsersController"/> class. /// </summary> /// <param name="soulseekClient"></param> /// <param name="browseTracker"></param> /// <param name="userService"></param> public UsersController(ISoulseekClient soulseekClient, IBrowseTracker browseTracker, IUserService userService) { Client = soulseekClient; BrowseTracker = browseTracker; Users = userService; }
public RoomsController(ISoulseekClient client, IRoomTracker tracker) { Client = client; Tracker = tracker; }
/// <summary> /// Initializes a new instance of the <see cref="TransfersController"/> class. /// </summary> /// <param name="configuration"></param> /// <param name="client"></param> /// <param name="tracker"></param> public TransfersController(IConfiguration configuration, ISoulseekClient client, ITransferTracker tracker) { OutputDirectory = configuration.GetValue <string>("OUTPUT_DIR"); Client = client; Tracker = tracker; }
/// <summary> /// Initializes a new instance of the <see cref="UserController"/> class. /// </summary> /// <param name="client"></param> /// <param name="browseTracker"></param> public UserController(ISoulseekClient client, IBrowseTracker browseTracker) { Client = client; BrowseTracker = browseTracker; }
public ServerController(ISoulseekClient client) { Client = client; }
public PublicChatController(ISoulseekClient client) { Client = client; }
public DistributedConnectionManager(ISoulseekClient soulseekClient) { SoulseekClient = (SoulseekClient)soulseekClient; }
/// <summary> /// Initializes a new instance of the <see cref="ConversationsController"/> class. /// </summary> /// <param name="client"></param> /// <param name="tracker"></param> public ConversationsController(ISoulseekClient client, IConversationTracker tracker) { Client = client; Tracker = tracker; }
public SearchController(ISoulseekClient client) { Client = client; }
public BrowseController(ISoulseekClient client) { Client = client; }
/// <summary> /// Initializes a new instance of the <see cref="TransfersController"/> class. /// </summary> /// <param name="options"></param> /// <param name="client"></param> /// <param name="tracker"></param> public TransfersController(IOptionsSnapshot <Options> options, ISoulseekClient client, ITransferTracker tracker) { OutputDirectory = options.Value.Directories.Downloads; Client = client; Tracker = tracker; }
/// <summary> /// Initializes a new instance of the <see cref="SearchesController"/> class. /// </summary> /// <param name="client"></param> /// <param name="tracker"></param> public SearchesController(ISoulseekClient client, ISearchTracker tracker) { Client = client; Tracker = tracker; }
public ApplicationController(ISoulseekClient client, IHostApplicationLifetime lifetime) { Client = client; Lifetime = lifetime; }