예제 #1
0
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                string replyText = null;

                var optOutRequst = false;

                if (activity.Value != null && ((dynamic)activity.Value).optout == true)
                {
                    optOutRequst = true;
                }

                try
                {
                    var senderAadId = activity.From.AsTeamsChannelAccount().Properties["aadObjectId"].ToString();

                    if (optOutRequst || string.Equals(activity.Text, "optout", StringComparison.InvariantCultureIgnoreCase))
                    {
                        await MeetupBot.OptOutUser(activity.GetChannelData <TeamsChannelData>().Tenant.Id, senderAadId, activity.ServiceUrl);

                        replyText = Resources.OptOutConfirmation;
                    }
                    else if (string.Equals(activity.Text, "optin", StringComparison.InvariantCultureIgnoreCase))
                    {
                        await MeetupBot.OptInUser(activity.GetChannelData <TeamsChannelData>().Tenant.Id, senderAadId, activity.ServiceUrl);

                        replyText = Resources.OptInConfirmation;
                    }
                    else
                    {
                        replyText = Resources.IDontKnow;
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.TraceError(ex.ToString());
                    replyText = Resources.ErrorOccured;
                }

                using (var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl)))
                {
                    var replyActivity = activity.CreateReply(replyText);

                    await connectorClient.Conversations.ReplyToActivityAsync(replyActivity);
                }
            }
            else
            {
                await HandleSystemMessage(activity);
            }

            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }
예제 #2
0
        private async Task <Activity> HandleSystemMessage(Activity message)
        {
            System.Diagnostics.Trace.TraceInformation("Processing system message");

            try
            {
                var channelData = message.GetChannelData <TeamsChannelData>();

                if (message.Type == ActivityTypes.ConversationUpdate)
                {
                    // conversation-update fires whenever a new 1:1 gets created between us and someone else as well
                    // only process the Teams ones.
                    var teamsChannelData = message.GetChannelData <TeamsChannelData>();

                    if (teamsChannelData.Team == null || string.IsNullOrEmpty(teamsChannelData.Team.Id))
                    {
                        // conversation-update is for 1:1 chat. Just ignore.
                        return(null);
                    }

                    string memberAddedId = string.Empty;

                    if (message.MembersAdded.Count > 0)
                    {
                        memberAddedId = message.MembersAdded.First().Id;
                    }

                    string memberRemovedId = string.Empty;
                    if (message.MembersRemoved.Count > 0)
                    {
                        memberRemovedId = message.MembersRemoved.First().Id;
                    }

                    string myId = message.Recipient.Id;

                    if (memberAddedId.Equals(myId))
                    {
                        // we were just added to team
                        await MeetupBot.SaveAddedToTeam(message.ServiceUrl, message.Conversation.Id, channelData.Tenant.Id);

                        // TODO: post activity.from has who added the bot. Can record it in schema.
                    }
                    else if (memberRemovedId.Equals(myId))
                    {
                        // we were just removed from a team
                        await MeetupBot.SaveRemoveFromTeam(message.ServiceUrl, message.Conversation.Id, channelData.Tenant.Id);
                    }
                    else if (!string.IsNullOrEmpty(memberAddedId)) // If I wasn't added or removed, then someome else must have been added to team
                    {
                        // someone else was added
                        // send them a welcome message
                        await MeetupBot.WelcomeUser(message.ServiceUrl, memberAddedId, channelData.Tenant.Id, channelData.Team.Id);
                    }
                }

                return(null);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.TraceError(ex.Message);
                throw;
            }
        }