shared/openai-slackbot/openai_slackbot/handlers.py (47 lines of code) (raw):
import abc
import typing as t
from logging import getLogger
from openai_slackbot.clients.slack import SlackClient
logger = getLogger(__name__)
class BaseHandler(abc.ABC):
def __init__(self, slack_client: SlackClient) -> None:
self._slack_client = slack_client
async def maybe_handle(self, args):
await args.ack()
logging_extra = self.logging_extra(args)
try:
should_handle = await self.should_handle(args)
logger.info(
f"Handler: {self.__class__.__name__}, should handle: {should_handle}",
extra=logging_extra,
)
if should_handle:
await self.handle(args)
except Exception:
logger.exception("Failed to handle event", extra=logging_extra)
@abc.abstractmethod
async def should_handle(self, args) -> bool:
...
@abc.abstractmethod
async def handle(self, args):
...
@abc.abstractmethod
def logging_extra(self, args) -> t.Dict[str, t.Any]:
...
class BaseMessageHandler(BaseHandler):
def logging_extra(self, args) -> t.Dict[str, t.Any]:
fields = {}
for field in ["type", "subtype", "channel", "ts"]:
fields[field] = args.event.get(field)
return fields
class BaseActionHandler(BaseHandler):
@abc.abstractproperty
def action_id(self) -> str:
...
async def should_handle(self, args) -> bool:
return True
def logging_extra(self, args) -> t.Dict[str, t.Any]:
return {
"action_type": args.body.get("type"),
"action": args.body.get("actions", [])[0],
}