public async Task RequestRoleSwitch() { CodeEditorUser user = _groups.getUser(Context.ConnectionId); user.WantsChange = !user.WantsChange; string userGroup = _groups.FindKeys(Context.ConnectionId).First(); int userCount = _groups.GetConnections(userGroup).Count(); bool swapUsers = _groups.GetConnections(userGroup).All(u => u.WantsChange); if (swapUsers && userCount == 2) { foreach (var currentUser in _groups.GetConnections(userGroup)) { currentUser.SwitchRole(); currentUser.WantsChange = false; await Clients.Client(currentUser.ConnectionId).ReceiveRole(currentUser.Role); } } foreach (var group in _groups.FindKeys(Context.ConnectionId)) { await Clients.Group(group).ReceiveSwitchUpdate(user.WantsChange); } }
public void Remove(T key, string connectionId) { lock (_connections) { HashSet <CodeEditorUser> connections; if (!_connections.TryGetValue(key, out connections)) { return; } lock (connections) { CodeEditorUser user = null; foreach (var keyValuePair in _connections) { foreach (var editorUser in keyValuePair.Value) { if (editorUser.ConnectionId == connectionId) { user = editorUser; } } } connections.Remove(user); if (connections.Count == 0) { _connections.Remove(key); } } } }
public async override Task OnConnectedAsync() { string group = Context.GetHttpContext().Request.Query["group"]; CodeEditorUser user = new CodeEditorUser(Context.ConnectionId); if (string.IsNullOrEmpty(group) || group == "null") { string groupName = Convert.ToBase64String(guid.ToByteArray()); groupName = groupName.Replace("=", ""); groupName = groupName.Replace("+", ""); groupName = groupName.Replace("/", ""); user.Role = CodeEditorRole.Driver; user.GroupName = groupName; _groups.Add(groupName, user); await Groups.AddToGroupAsync(Context.ConnectionId, groupName); await Clients.Client(Context.ConnectionId).ReceiveGroup(groupName); } else { user.GroupName = group; if (CanJoinGroup(group)) { CodeEditorUser partner = _groups.GetConnections(group).First(); if (partner.Role == CodeEditorRole.Driver) { user.Role = CodeEditorRole.Navigator; } else { user.Role = CodeEditorRole.Driver; } _groups.Add(group, user); await Groups.AddToGroupAsync(Context.ConnectionId, group); } else { await Clients.Client(Context.ConnectionId).ReceiveError(); return; } } await Clients.Client(Context.ConnectionId).ReceiveRole(user.Role); ReadCodeResult code = await _queryDispatcher.DisptachAsync <ReadCodeQuery, ReadCodeResult>(new ReadCodeQuery(_groups.FindKeys(Context.ConnectionId).First())); await Clients.Client(Context.ConnectionId).ReceiveCodeUpdate(code.Lines); await base.OnConnectedAsync(); }
public void ConnectionMappingAddSingleTest() { ConnectionMapping <string> groups = new ConnectionMapping <string>(); string group = "group_1"; CodeEditorUser user = new CodeEditorUser("g1_connection_1"); groups.Add(group, user); Assert.True(groups.Count == 1); Assert.Single(groups.GetConnections(group)); Assert.Equal(user, groups.GetConnections(group).ElementAtOrDefault(0)); return; }
public CodeEditorUser getUser(string connectionId) { CodeEditorUser user = null; foreach (var keyValuePair in _connections) { foreach (var editorUser in keyValuePair.Value) { if (editorUser.ConnectionId == connectionId) { user = editorUser; } } } return(user); }
public void Add(T key, CodeEditorUser user) { lock (_connections) { HashSet <CodeEditorUser> connections; if (!_connections.TryGetValue(key, out connections)) { connections = new HashSet <CodeEditorUser>(); _connections.Add(key, connections); } lock (connections) { connections.Add(user); } } }
public void ConnectionMappingAddMultipleTest() { ConnectionMapping <string> groups = new ConnectionMapping <string>(); string firstGroup = "group_1"; CodeEditorUser g1FirstUser = new CodeEditorUser("g1_connection_1"); CodeEditorUser g1SecondUser = new CodeEditorUser("g1_connection_2"); string secondGroup = "group_2"; CodeEditorUser g2FirstUser = new CodeEditorUser("g2_connection_1"); groups.Add(firstGroup, g1FirstUser); groups.Add(firstGroup, g1SecondUser); groups.Add(secondGroup, g2FirstUser); Assert.True(groups.Count == 2); Assert.Equal(2, groups.GetConnections(firstGroup).ToList <CodeEditorUser>().Count); Assert.Equal(g1FirstUser, groups.GetConnections(firstGroup).ElementAtOrDefault(0)); Assert.Equal(g1SecondUser, groups.GetConnections(firstGroup).ElementAtOrDefault(1)); Assert.Equal(g2FirstUser, groups.GetConnections(secondGroup).ElementAtOrDefault(0)); return; }
public void ConnectionMappingRemoveTest() { ConnectionMapping <string> groups = new ConnectionMapping <string>(); string firstGroup = "group_1"; CodeEditorUser g1FirstUser = new CodeEditorUser("g1_connection_1"); CodeEditorUser g1SecondUser = new CodeEditorUser("g1_connection2"); groups.Add(firstGroup, g1FirstUser); groups.Add(firstGroup, g1SecondUser); Assert.True(groups.Count == 1); Assert.Equal(2, groups.GetConnections(firstGroup).ToList <CodeEditorUser>().Count); Assert.Equal(g1FirstUser, groups.GetConnections(firstGroup).ElementAtOrDefault(0)); Assert.Equal(g1SecondUser, groups.GetConnections(firstGroup).ElementAtOrDefault(1)); groups.Remove(firstGroup, "g1_connection_1"); Assert.True(groups.Count == 1); Assert.Single(groups.GetConnections(firstGroup).ToList <CodeEditorUser>()); Assert.Equal(g1SecondUser, groups.GetConnections(firstGroup).ElementAtOrDefault(0)); return; }
public void ConnectionMappingFindKeysTest() { ConnectionMapping <string> groups = new ConnectionMapping <string>(); string firstGroup = "group_1"; CodeEditorUser g1FirstUser = new CodeEditorUser("g1_connection_1"); g1FirstUser.GroupName = firstGroup; CodeEditorUser g1SecondUser = new CodeEditorUser("g1_connection_2"); g1SecondUser.GroupName = firstGroup; string secondGroup = "group_2"; CodeEditorUser g2FirstUser = new CodeEditorUser("g2_connection_1"); g2FirstUser.GroupName = secondGroup; groups.Add(firstGroup, g1FirstUser); groups.Add(firstGroup, g1SecondUser); groups.Add(secondGroup, g2FirstUser); Assert.Equal(firstGroup, groups.FindKeys("g1_connection_1").ElementAtOrDefault(0)); Assert.Equal(firstGroup, groups.FindKeys("g1_connection_2").ElementAtOrDefault(0)); Assert.Equal(secondGroup, groups.FindKeys("g2_connection_1").ElementAtOrDefault(0)); return; }