예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
                    }
                }
            }
        }
예제 #3
0
        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();
        }
예제 #4
0
        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;
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
        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;
        }
예제 #8
0
        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;
        }
예제 #9
0
        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;
        }