Removed executors. All traffic goes through RPC
This commit is contained in:
@ -1,8 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using Aurora.Executors;
|
||||
using Aurora.Proto.Party;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Linq;
|
||||
using Xamarin.Forms;
|
||||
using Grpc.Core;
|
||||
using Aurora.Services;
|
||||
using Aurora.Proto.General;
|
||||
using Aurora.Proto.Party;
|
||||
using Aurora.Proto.Playback;
|
||||
using Aurora.Proto.Events;
|
||||
|
||||
namespace Aurora.Design.Views.Party
|
||||
{
|
||||
@ -16,13 +23,17 @@ namespace Aurora.Design.Views.Party
|
||||
public class PartyViewModel : BaseViewModel
|
||||
{
|
||||
private PartyState _state;
|
||||
|
||||
private BaseExecutor _executor;
|
||||
|
||||
private string _hostname;
|
||||
|
||||
private ObservableCollection<PartyMember> _members;
|
||||
|
||||
//Client fields
|
||||
private Channel _channel;
|
||||
private RemotePartyService.RemotePartyServiceClient _remotePartyClient;
|
||||
private RemotePlaybackService.RemotePlaybackServiceClient _remotePlaybackClient;
|
||||
private RemoteEventService.RemoteEventServiceClient _remoteEventsClient;
|
||||
private Task _eventsTask;
|
||||
CancellationTokenSource _eventCancellationTokenSource;
|
||||
|
||||
|
||||
public PartyViewModel()
|
||||
{
|
||||
@ -34,15 +45,12 @@ namespace Aurora.Design.Views.Party
|
||||
};
|
||||
|
||||
|
||||
State(PartyState.SelectingHost);
|
||||
SetState(PartyState.SelectingHost);
|
||||
}
|
||||
|
||||
~PartyViewModel()
|
||||
{
|
||||
if (_executor != null)
|
||||
{
|
||||
_executor.Close();
|
||||
}
|
||||
Task.Run(ServerService.Instance.Stop);
|
||||
}
|
||||
|
||||
#region Properties
|
||||
@ -80,24 +88,13 @@ namespace Aurora.Design.Views.Party
|
||||
|
||||
#endregion Properties
|
||||
|
||||
|
||||
private void State(PartyState state)
|
||||
{
|
||||
_state = state;
|
||||
OnPropertyChanged("IsSelectingHost");
|
||||
OnPropertyChanged("IsNotSelectingHost");
|
||||
}
|
||||
|
||||
#region Commands
|
||||
private void OnJoinExecute()
|
||||
{
|
||||
_executor = BaseExecutor.CreateExecutor<ClientExecutor>();
|
||||
_executor.Connect(this.Hostname);
|
||||
InitializeClients(Hostname, SettingsService.Instance.DefaultPort.ToString());
|
||||
JoinParty();
|
||||
|
||||
SetupMembersCollection();
|
||||
OnPropertyChanged("Members");
|
||||
|
||||
State(PartyState.Connecting);
|
||||
SetState(PartyState.Connecting);
|
||||
}
|
||||
|
||||
private bool CanJoinExecute()
|
||||
@ -107,16 +104,13 @@ namespace Aurora.Design.Views.Party
|
||||
|
||||
private void OnHostExecute()
|
||||
{
|
||||
|
||||
//Instantiate and initialize all executors
|
||||
_executor = BaseExecutor.CreateExecutor<HostExecutor>();
|
||||
_executor.Connect(this.Hostname);
|
||||
|
||||
SetupMembersCollection();
|
||||
OnPropertyChanged("Members");
|
||||
ServerService.Instance.Start();
|
||||
string localHost = ServerService.GetLocalIPAddress();
|
||||
InitializeClients(localHost, SettingsService.Instance.DefaultPort.ToString());
|
||||
JoinParty();
|
||||
|
||||
//Change state
|
||||
State(PartyState.Connecting);
|
||||
SetState(PartyState.Connecting);
|
||||
}
|
||||
|
||||
private bool CanHostExecute()
|
||||
@ -127,41 +121,123 @@ namespace Aurora.Design.Views.Party
|
||||
|
||||
#endregion Commands
|
||||
|
||||
private void SetupMembersCollection()
|
||||
{
|
||||
if (_executor != null)
|
||||
{
|
||||
foreach (PartyMember member in _executor.PartyMembers)
|
||||
{
|
||||
_members.Add(member);
|
||||
}
|
||||
#region Private Methods
|
||||
|
||||
//Setup events
|
||||
_executor.PartyMembers.CollectionChanged += (sender, e) =>
|
||||
private void InitializeClients(string hostname, string port)
|
||||
{
|
||||
_channel = new Channel(string.Format("{0}:{1}", hostname, port), ChannelCredentials.Insecure);
|
||||
|
||||
_remotePartyClient = new RemotePartyService.RemotePartyServiceClient(_channel);
|
||||
_remotePlaybackClient = new RemotePlaybackService.RemotePlaybackServiceClient(_channel);
|
||||
_remoteEventsClient = new RemoteEventService.RemoteEventServiceClient(_channel);
|
||||
|
||||
//Assign but don't start task
|
||||
_eventsTask = new Task(GetEvents);
|
||||
_eventCancellationTokenSource = new CancellationTokenSource();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Join the remote party.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async void JoinParty()
|
||||
{
|
||||
await _remotePartyClient.JoinPartyAsync(new JoinPartyRequest
|
||||
{
|
||||
UserName = SettingsService.Instance.Username,
|
||||
});
|
||||
|
||||
RefreshMembers();
|
||||
|
||||
//Subscribe to events
|
||||
SubscribeRequest req = new SubscribeRequest();
|
||||
req.EventTypes.Add(EventType.PartyMemberJoined);
|
||||
req.EventTypes.Add(EventType.PartyMemberLeft);
|
||||
try
|
||||
{
|
||||
_remoteEventsClient.SubscribeToEvents(req);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error subscribing to events: " + ex.Message);
|
||||
}
|
||||
|
||||
|
||||
_eventsTask.Start();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Refresh members list.
|
||||
/// </summary>
|
||||
private void RefreshMembers()
|
||||
{
|
||||
MembersResponse response = _remotePartyClient.GetPartyMembers(new Empty());
|
||||
//Add members
|
||||
foreach (PartyMember member in response.Members)
|
||||
{
|
||||
Members.Add(member);
|
||||
}
|
||||
|
||||
//Remove out of date members
|
||||
// foreach (PartyMember member in Members)
|
||||
// {
|
||||
// if (!response.Members.Contains(member))
|
||||
// {
|
||||
// Members.Remove(member);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
private void SetState(PartyState state)
|
||||
{
|
||||
_state = state;
|
||||
OnPropertyChanged("IsSelectingHost");
|
||||
OnPropertyChanged("IsNotSelectingHost");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asynchronous function for processing events off of the event stream.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async void GetEvents()
|
||||
{
|
||||
using (AsyncServerStreamingCall<BaseEvent> eventStream = _remoteEventsClient.GetEvents(new Empty()))
|
||||
{
|
||||
while (!_eventCancellationTokenSource.Token.IsCancellationRequested)
|
||||
{
|
||||
switch (e.Action)
|
||||
if (await eventStream.ResponseStream.MoveNext(_eventCancellationTokenSource.Token))
|
||||
{
|
||||
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
|
||||
{
|
||||
foreach (PartyMember member in e.NewItems)
|
||||
//Convert derived event type
|
||||
BaseEvent e = eventStream.ResponseStream.Current;
|
||||
switch (e.DerivedEventCase)
|
||||
{
|
||||
case BaseEvent.DerivedEventOneofCase.None:
|
||||
{
|
||||
Members.Add(member);
|
||||
OnPropertyChanged("Members");
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
|
||||
{
|
||||
foreach (PartyMember member in e.OldItems)
|
||||
case BaseEvent.DerivedEventOneofCase.PartyMemberJoinedEvent:
|
||||
{
|
||||
Members.Remove(member);
|
||||
OnPropertyChanged("Members");
|
||||
PartyMemberJoinedEvent derivedEvent = e.PartyMemberJoinedEvent;
|
||||
Members.Add(derivedEvent.Member);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BaseEvent.DerivedEventOneofCase.PartyMemberLeftEvent:
|
||||
{
|
||||
PartyMemberJoinedEvent derivedEvent = e.PartyMemberJoinedEvent;
|
||||
var found = Members.Where(x => x.Id == derivedEvent.Member.Id);
|
||||
foreach (PartyMember member in found)
|
||||
{
|
||||
Members.Remove(member);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user