async def enrich(ip, **params): if state.geodata: try: location = state.geodata.get_location(ip, detailed=True) if location and 'info' in location: return handle_location(**pdict.from_dict(location['info'])) return response.error('Database not ready') except Exception: logger.exception('mmgeo error') return response.error('Error while quering database')
async def enrich(ua, **params): """ Detect device type using User-Agent string https://github.com/selwin/python-user-agents """ try: parsed = parse(ua) res = Prodict( os_family=parsed.os.family, os_version=list(v if isinstance(v, int) else 0 for v in parsed.os.version), browser_family=parsed.browser.family, browser_version=list(v if isinstance( v, int) else 0 for v in parsed.browser.version,), device_family=parsed.device.family, device_brand=parsed.device.brand, device_model=parsed.device.model) res.is_bot = int(parsed.is_bot) res.is_tables = int(parsed.is_tablet) res.is_mob = int(parsed.is_mobile) res.is_pc = int(parsed.is_pc) return res except Exception: logger.exception('handle ex') return response.error()
async def enrich(**params): try: ip = params.get('ip', None) if not state.db: raise HTTPServiceUnavailable() if ip: location = state.db.get(ip) if location: return handle_location(**location) return {} except Exception: logger.exception('mmgeo error.', location=location) return response.error()
async def request_handler(request, handler): # get query query = dict(**request.query) # url params if request.method == 'POST': if request.content_type == 'application/json': raw = await request.text() if raw: query.update(json_loads(raw)) else: post = await request.post() query.update(post) # url params query.update(request.match_info) try: result = await handler(**query) # Handling stream responses if isinstance(result, types.AsyncGeneratorType): try: stream = StreamResponse() await stream.prepare(request) async for block in result: await stream.write(block) await stream.write_eof() return stream # Halt handling except asyncio.CancelledError: logger.warn('halted response') return stream # regilar response else: return json_response(result, request=request) except ReceivedErrorResponse as e: return json_response(response.error(e.message), request=request) except Exception as e: logger.exception("exc") return json_response(response.error(str(e)), request=request)
async def error(**params): return response.error('Some F*cking error')
async def redirback(uid, data, **params): """ """ logger.debug('fb login', u=uid, d=data, p=params) code = data.get('code') redir_state = data.get('state') if not code: return response.error('Code is absent') if not redir_state: return response.error('Invalid state') credentials = await client.exchange_code(code) if not credentials: return response.error('Couldn\'t get credentials') me = await client.me(credentials) if not me: return response.error('Couldn\'t get user info (me)') token_debug = await client.debug_token(credentials.get('access_token')) logger.debug('debug token; me resp', debresp=token_debug, meresp=me) stored_data = await id_get_redir_data(redir_state) if not stored_data or not stored_data.get('redir_data'): logger.warn('absent redir state', uid=uid, data=data) redir_data = stored_data.get('redir_data') source_sids = redir_data.get('sids') if not source_sids: logger.error('Invalid state contents', state=redir_data) return response.error('Invalid state contents') base_vars = { 'ctime': msec(), 'source': 'fbauth', 'event_id': params.get('id') } fb_params = {'access_token': credentials.get('access_token'), **base_vars} logger.debug('redir data', r=redir_data) source_sids_with_params = [( v, { **base_vars }, ) for k, v in source_sids.items()] uid_id = ( 'uid', uid, ) uid_id_with_params = ( uid_id, base_vars, ) fb_id = ( 'fb', me.get('id'), ) fb_id_with_params = ( fb_id, fb_params, ) additional_ids = [uid_id_with_params, fb_id_with_params] # save fb-to-phone,tg await id_update(fb_id, source_sids_with_params) # save uid-to-fb-tg-phone uid_sids = [*source_sids_with_params, fb_id_with_params] logger.debug('uid sids', uid_id=uid_id, usids=uid_sids) await id_update(uid_id, uid_sids) # save phone-to-uid,fb if source_sids.get('phone'): await id_update(source_sids['phone'], additional_ids) profile = await id_lookup(source_sids['phone']) logger.debug('new profile', profile) if source_sids.get('tg'): await bot_chat_event(sid_chat=source_sids['tg'], name='fblogin', data=me) return response.redirect(cfg.urls.alena_success.url)