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; }