Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
 public PeerMessageHandler(
     ISoulseekClient soulseekClient,
     IDiagnosticFactory diagnosticFactory = null)
 {
     SoulseekClient = (SoulseekClient)soulseekClient;
     Diagnostic     = diagnosticFactory ??
                      new DiagnosticFactory(this, SoulseekClient.Options.MinimumDiagnosticLevel, (e) => DiagnosticGenerated?.Invoke(this, e));
 }
Beispiel #3
0
 /// <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;
 }
Beispiel #4
0
 public ServerController(
     ISoulseekClient soulseekClient,
     IOptionsSnapshot <Options> optionsSnapshot,
     IStateSnapshot <State> stateSnapshot)
 {
     Client          = soulseekClient;
     OptionsSnapshot = optionsSnapshot;
     StateSnapshot   = stateSnapshot;
 }
Beispiel #5
0
 public RoomsController(
     ISoulseekClient soulseekClient,
     IRoomService roomService,
     IStateMonitor <State> applicationStateMonitor,
     IRoomTracker tracker)
 {
     Client = soulseekClient;
     ApplicationStateMonitor = applicationStateMonitor;
     Tracker     = tracker;
     RoomService = roomService;
 }
Beispiel #6
0
 public DownloadService(
     IOptionsMonitor <Options> optionsMonitor,
     ISoulseekClient soulseekClient,
     IDbContextFactory <TransfersDbContext> contextFactory,
     IFTPService ftpClient)
 {
     Client         = soulseekClient;
     OptionsMonitor = optionsMonitor;
     ContextFactory = contextFactory;
     FTP            = ftpClient;
 }
Beispiel #7
0
 /// <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;
 }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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();
        }
Beispiel #10
0
        /// <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;
        }
Beispiel #11
0
        /// <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)>();
        }
Beispiel #12
0
        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;
        }
Beispiel #13
0
 public FilesController(IConfiguration configuration, ISoulseekClient client)
 {
     OutputDirectory = configuration.GetValue <string>("OUTPUT_DIR");
     Client          = client;
 }
Beispiel #14
0
 /// <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;
 }
Beispiel #15
0
 public RoomsController(ISoulseekClient client, IRoomTracker tracker)
 {
     Client  = client;
     Tracker = tracker;
 }
Beispiel #16
0
 /// <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;
 }
Beispiel #18
0
 public ServerController(ISoulseekClient client)
 {
     Client = client;
 }
Beispiel #19
0
 public PublicChatController(ISoulseekClient client)
 {
     Client = client;
 }
Beispiel #20
0
 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;
 }
Beispiel #22
0
 public SearchController(ISoulseekClient client)
 {
     Client = client;
 }
Beispiel #23
0
 public BrowseController(ISoulseekClient client)
 {
     Client = client;
 }
Beispiel #24
0
 /// <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;
 }
Beispiel #25
0
 /// <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;
 }
Beispiel #26
0
 public ApplicationController(ISoulseekClient client, IHostApplicationLifetime lifetime)
 {
     Client   = client;
     Lifetime = lifetime;
 }