def apply_conversation_reference(activity: Activity, reference: ConversationReference, is_incoming: bool = False) -> Activity: """ Updates an activity with the delivery information from a conversation reference. Calling this after get_conversation_reference on an incoming activity will properly address the reply to a received activity. :param activity: :param reference: :param is_incoming: :return: """ activity.channel_id = reference.channel_id activity.service_url = reference.service_url activity.conversation = reference.conversation if is_incoming: activity.from_property = reference.user activity.recipient = reference.bot if reference.activity_id: activity.id = reference.activity_id else: activity.from_property = reference.bot activity.recipient = reference.user if reference.activity_id: activity.reply_to_id = reference.activity_id return activity
async def process_activity(self, activity: Activity, logic: Callable[[TurnContext], Awaitable]): self._conversation_lock.acquire() try: # ready for next reply if activity.type is None: activity.type = ActivityTypes.message activity.channel_id = self.template.channel_id activity.from_property = self.template.from_property activity.recipient = self.template.recipient activity.conversation = self.template.conversation activity.service_url = self.template.service_url activity.id = str((self._next_id)) self._next_id += 1 finally: self._conversation_lock.release() activity.timestamp = activity.timestamp or datetime.utcnow() await self.run_pipeline(TurnContext(self, activity), logic)