Inheritance: GablarskiMessage
		private async void OnJoinVoiceMessage (MessageEventArgs<JoinVoiceMessage> e)
		{
			var person = await GetPersonAsync (e.Connection);
			if (person == null) {
				await e.Connection.DisconnectAsync();
				return;
			}

			Group group;
			lock (SyncRoot) {
				if (!Groups.TryGetGroup (e.Message.GroupId, out group) || !group.Participants.Contains (person.Identity))
					return;
			}

			IConnection connection;
			lock (SyncRoot) {
				connection = GetConnection (group.OwnerId);
			}

			if (connection == null)
				return;

			var join = new JoinVoiceMessage {
				GroupId = e.Message.GroupId,
				Target = e.Message.Target
			};

			try {
				var response = await connection.SendFor<JoinVoiceResponseMessage> (join, responseTimeout: 30000);
				await e.Connection.SendResponseAsync (e.Message, response);
			} catch (OperationCanceledException) {
			}
		}
		public async Task<Target> RequestGroupVoiceAsync (Group group)
		{
			if (group == null)
				throw new ArgumentNullException ("group");

			var joinVoice = new JoinVoiceMessage {
				Target = ServerTarget,
				GroupId = group.Id
			};

			var response = await Connection.SendFor<JoinVoiceResponseMessage> (joinVoice, 30000).ConfigureAwait (false);
			return response.Target;
		}