async def get_channel_messages(self, req: Request) -> Response: channel_id = req.match_info['channel_id'] try: return utils.resp(self.messages[channel_id]) except KeyError: return utils.not_found({ 'message': 'Channel id not found', 'success': False, })
async def auth_exchange(self, req: Request) -> Response: try: code = req.rel_url.query['code'] except KeyError: return utils.bad_req('No code') async with aiohttp.ClientSession() as session: post_req = session.post(endpoints.oauth2_token(), data={ 'code': code, 'client_id': self.settings.client_id, 'client_secret': self.settings.client_secret, 'redirect_uri': self.settings.redirect_uri, 'grant_type': constants.oauth2_grant_type, }) async with post_req as resp: data: Mapping[str, any] = await resp.json() if req.remote not in self.clients: self.add_client(req.remote, None) try: access_token = data['access_token'] self.clients[req.remote].access_token = access_token except KeyError: return utils.resp('Code already exchanged', False) get_req = session.get(endpoints.my_channel(), headers={ 'Authorization': f'Bearer {access_token}', }) async with get_req as resp: data: Mapping[str, any] = await resp.json() print('Authenticated') return utils.resp(data)
async def auth_check(self, req: Request) -> Response: try: client = self.clients[req.remote] async with aiohttp.ClientSession() as session: get_req = session.get( endpoints.oauth2_check(client.access_token)) async with get_req as resp: body = await resp.json() if body['aud'] == self.settings.client_id: return utils.resp({ 'logged_in': True, }) except KeyError: pass return utils.resp({ 'logged_in': False, 'success': True, })
async def auth_logout(self, req: Request) -> Response: try: token = self.clients[req.remote].access_token self.clients[req.remote].access_token = None async with aiohttp.ClientSession() as session: get_req = session.get(endpoints.oauth2_revoke(token)) async with get_req as _: print('Revoked access token') pass except KeyError: pass return utils.resp({ 'logged_out': True, })
async def send_message(self, req: Request) -> Response: try: data: Mapping[str, any] = json.loads(await req.text()) except KeyError: return utils.bad_req('Invalid JSON sent') if 'content' not in data: return utils.bad_req('No content sent') try: client: Client = self.clients[req.remote] except KeyError: return utils.bad_req('Unknown client') if not client or client.livestream_id is None: return utils.bad_req('You are not watching a channel') if client.access_token is None: return utils.bad_req('You are not authenticated') msg: Mapping[str, object] = { 'snippet': { 'liveChatId': client.livestream_id, 'textMessageDetails': { 'messageText': data['content'] }, 'type': 'textMessageEvent', }, } async with aiohttp.ClientSession() as session: post_req = session.post(endpoints.messages(), json=msg, headers={ 'Authorization': f'Bearer {client.access_token}', }) async with post_req as resp: return utils.resp(await resp.json())
def latest_success(repo_name): tag = flask.request.args.get('tag', None) result = data.get_latest_successful(repo_name, tag) return utils.resp(app, result)
def get_summary(id): result = data.get_summary(id) return utils.resp(app, result)
def latest_summary(): result = data.latest_status() return utils.resp(app, result)
def home(): return utils.resp(app, 'stackbrew')
async def index(self, req: Request) -> Response: return utils.resp('index')
async def get_channels(self, req: Request) -> Response: async with aiohttp.ClientSession() as session: get_req = session.get(endpoints.channels(self.settings.yt_key)) async with get_req as resp: return utils.resp(await resp.json())