private async Task <Activity> HandleSystemMessage(Activity message) { if (message.Type == ActivityTypes.DeleteUserData) { // Implement user deletion here // If we handle user deletion, return a real message } else if (message.Type == ActivityTypes.ConversationUpdate) { // Handle conversation state changes, like members being added and removed // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info // Not available in all channels for (int i = 0; i < message.MembersAdded.Count; i++) { if (message.MembersAdded[i].Id == message.Recipient.Id) { // Bot is added. Let's send welcome message. var connectorClient = new ConnectorClient(new Uri(message.ServiceUrl)); ThumbnailCard card = RootDialog.GetHelpMessage(); var reply = message.CreateReply(); reply.TextFormat = TextFormatTypes.Xml; reply.Attachments.Add(card.ToAttachment()); await connectorClient.Conversations.ReplyToActivityAsync(reply); break; } } } else if (message.Type == ActivityTypes.ContactRelationUpdate) { // Handle add/remove from contact lists // Activity.From + Activity.Action represent what happened } else if (message.Type == ActivityTypes.Typing) { // Handle knowing that the user is typing } else if (message.Type == ActivityTypes.Ping) { } return(null); }