Source code for sirbot.plugins.github.plugin

import os
import logging

from gidgethub import ValidationFailure
from aiohttp.web import Response
from gidgethub.sansio import Event
from gidgethub.aiohttp import GitHubAPI
from gidgethub.routing import Router

LOG = logging.getLogger(__name__)


[docs]class GithubPlugin: """ Handle GitHub webhook. The webhook must be set to ``<root_url>/github`` in your github account. Register a new event handler with: .. code-block:: python GithubPlugin.router.add(handler, event_type) **Endpoints**: * ``/github``: Github webhook. **Variables**: * **router**: Instance of :class:`gidgethub.routing.Router`. * **api**: Instance of :class:`gidgethub.aiohttp.GitHubAPI`. """ __name__ = "github" def __init__(self, *, verify=None): self.api = None self.router = Router() self.verify = verify or os.environ["GITHUB_VERIFY"] def load(self, sirbot): LOG.info("Loading github plugin") self.api = GitHubAPI(session=sirbot.http_session, requester=sirbot.user_agent) sirbot.router.add_route("POST", "/github", dispatch)
async def dispatch(request): github = request.app.plugins["github"] payload = await request.read() try: event = Event.from_http(request.headers, payload, secret=github.verify) await github.router.dispatch(event, app=request.app) except ValidationFailure: LOG.debug( "Github webhook failed verification: %s, %s", request.headers, payload ) return Response(status=401) except Exception as e: LOG.exception(e) return Response(status=500) else: return Response(status=200)