Spaces:
Build error
Build error
| # 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 botbuilder.core import ( | |
| BotFrameworkAdapterSettings, | |
| BotFrameworkHttpClient, | |
| ConversationState, | |
| MemoryStorage, | |
| TurnContext, | |
| UserState, | |
| BotFrameworkAdapter, | |
| ) | |
| from botbuilder.core.integration import ( | |
| aiohttp_error_middleware, | |
| ) | |
| from botbuilder.schema import Activity, ActivityTypes | |
| from botframework.connector.auth import ( | |
| SimpleCredentialProvider, | |
| ) | |
| from bots import ParentBot | |
| from config import DefaultConfig | |
| from dialogs import MainDialog | |
| CONFIG = DefaultConfig() | |
| STORAGE = MemoryStorage() | |
| CONVERSATION_STATE = ConversationState(STORAGE) | |
| USER_STATE = UserState(STORAGE) | |
| CREDENTIAL_PROVIDER = SimpleCredentialProvider(CONFIG.APP_ID, CONFIG.APP_PASSWORD) | |
| CLIENT = BotFrameworkHttpClient(CREDENTIAL_PROVIDER) | |
| # 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 = BotFrameworkAdapter(SETTINGS) | |
| # 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 = ParentBot(CLIENT, CONFIG, DIALOG, CONVERSATION_STATE, USER_STATE) | |
| # 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: | |
| await ADAPTER.process_activity(activity, auth_header, BOT.on_turn) | |
| return Response(status=201) | |
| except Exception as exception: | |
| raise exception | |
| APP = web.Application(middlewares=[aiohttp_error_middleware]) | |
| 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 | |