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