/// <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); }
/// <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; }
public State() { this.mutator = StateMutator.For(this.GetType()); this.Version = 0; }
protected State() { mutator = StateMutator.For(GetType()); Version = InitialVersion; }