# Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. import logging import sys import traceback from datetime import datetime from aiohttp import web from aiohttp.web import Request, Response from aiohttp.web_response import json_response from botbuilder.core import ( BotFrameworkAdapterSettings, ConversationState, MemoryStorage, UserState, TurnContext, BotFrameworkAdapter, ) from botbuilder.schema import Activity, ActivityTypes from adapter_with_error_handler import AdapterWithErrorHandler from bots import ChildBot from dialogs import MainDialog from config import DefaultConfig CONFIG = DefaultConfig() STORAGE = MemoryStorage() CONVERSATION_STATE = ConversationState(STORAGE) USER_STATE = UserState(STORAGE) # Create adapter. # See https://aka.ms/about-bot-adapter to learn more about how bots work. SETTINGS = BotFrameworkAdapterSettings(CONFIG.APP_ID, CONFIG.APP_PASSWORD) ADAPTER = AdapterWithErrorHandler(SETTINGS, CONVERSATION_STATE, USER_STATE) # Catch-all for errors. async def on_error(context: TurnContext, error: Exception): # This check writes out errors to console log .vs. app insights. # NOTE: In production environment, you should consider logging this to Azure # application insights. print(f"\n [on_turn_error] unhandled error: {error}", file=sys.stderr) traceback.print_exc() # Send a message to the user await context.send_activity("The bot encountered an error or bug.") await context.send_activity( "To continue to run this bot, please fix the bot source code." ) # Send a trace activity if we're talking to the Bot Framework Emulator if context.activity.channel_id == "emulator": # Create a trace activity that contains the error object trace_activity = Activity( label="TurnError", name="on_turn_error Trace", timestamp=datetime.utcnow(), type=ActivityTypes.trace, value=f"{error}", value_type="https://www.botframework.com/schemas/error", ) # Send a trace activity, which will be displayed in Bot Framework Emulator await context.send_activity(trace_activity) ADAPTER.on_turn_error = on_error DIALOG = MainDialog(CONFIG) # Create the Bot BOT = ChildBot(DIALOG, USER_STATE, CONVERSATION_STATE, CONFIG) # Listen for incoming requests on /api/messages async def messages(req: Request) -> Response: # Main bot message handler. if "application/json" in req.headers["Content-Type"]: body = await req.json() else: return Response(status=415) activity = Activity().deserialize(body) auth_header = req.headers["Authorization"] if "Authorization" in req.headers else "" try: response = await ADAPTER.process_activity(activity, auth_header, BOT.on_turn) if response: return json_response(data=response.body, status=response.status) return Response(status=201) except Exception as exception: raise exception """async def options(req: Request) -> Response: return Response(status=200)""" APP = web.Application() APP.router.add_post("/api/messages", messages) if __name__ == "__main__": try: logging.basicConfig(level=logging.DEBUG) web.run_app(APP, host="localhost", port=CONFIG.PORT) except Exception as error: raise error