File size: 1,937 Bytes
92e41ba
c21d29c
92e41ba
 
c21d29c
 
 
 
92e41ba
 
 
 
 
 
 
 
 
 
 
 
 
c21d29c
 
 
 
 
 
 
 
 
 
 
 
92e41ba
c21d29c
92e41ba
8d8e85a
92e41ba
 
 
 
 
 
 
 
 
 
 
 
 
c21d29c
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from asyncio import all_tasks, CancelledError, create_task, current_task, get_running_loop, run
from loguru import logger
from signal import SIGINT, SIGTERM
from typing import Any, Callable

from ctp_slack_bot.containers import Container
from ctp_slack_bot.core.logging import setup_logging

async def handle_shutdown_signal() -> None:
    logger.info("Received shutdown signal.")
    for task in all_tasks():
        if task is not current_task() and not task.done():
            task.cancel()
            logger.trace("Cancelled task {}.", task.get_name())
    logger.info("Cancelled all tasks.")

def create_shutdown_signal_handler() -> Callable[[], None]:
    def shutdown_signal_handler() -> None:
        create_task(handle_shutdown_signal())
    return shutdown_signal_handler

async def main() -> None:
    # Setup logging.
    setup_logging()
    logger.info("Starting application…")

    # Set up dependency injection container.
    container = Container()
    container.wire(packages=['ctp_slack_bot'])

    # Kick off services which should be active from the start.
    container.content_ingestion_service()
    container.question_dispatch_service()
    container.schedule_service()

    # Start the Slack socket mode handler in the background.
    socket_mode_handler = await container.socket_mode_handler()
    slack_bolt_task = create_task(socket_mode_handler.start_async())
    shutdown_signal_handler = create_shutdown_signal_handler()
    loop = get_running_loop()
    loop.add_signal_handler(SIGINT, shutdown_signal_handler)
    loop.add_signal_handler(SIGTERM, shutdown_signal_handler)
    try:
        logger.info("Starting Slack Socket Mode handler…")
        await slack_bolt_task
    except CancelledError:
        logger.info("Shutting down application…")
    finally:
        await socket_mode_handler.close_async()
        await container.shutdown_resources()

if __name__ == "__main__":
    run(main())