def auth(): from app.telegram.handlers import bot error = request.args.get('error') if error: if error in ('access_denied', 'invalid_scope'): return redirect(bot().link('error_' + error)) return error code = request.args.get('code') state = request.args.get('state') if not code: return 'code was not passed' if not state: return 'state was not passed' user = User.query.filter(User.state == state, User.is_active == True).one_or_none() if not user: return 'user was not found' data = dict( client_id=app.config['TODOIST']['CLIENT_ID'], client_secret=app.config['TODOIST']['CLIENT_SECRET'], code=code, ) response = requests.post(app.config['TODOIST']['URL'], data=data) if response.status_code != 200: return response.text result = response.json() if 'error' in result and result['error']: return result['error'] user.auth = result['access_token'] user.state = '' user.first_init_api() db.session.commit() return redirect(bot().link())
def webhook(hashsum): if hashsum != app.config['BOT_HASHSUM']: abort(403) from app.telegram.handlers import bot update = Update.de_json(request.json, bot()) bot().dispatcher.process_update(update) return 'Ok'
def callback(client_id): if client_id != app.config['TODOIST']['CLIENT_ID']: return 'wrong client_id' if 'X-Todoist-Hmac-SHA256' not in request.headers: return 'no signature' signature = request.headers['X-Todoist-Hmac-SHA256'] password = request.data salt = app.config['TODOIST']['CLIENT_SECRET'].encode() my_signature = base64.b64encode( hmac.new(salt, request.data, hashlib.sha256).digest()).decode() if signature != my_signature: logging.warning('Wrong signature my: {} got: {} data: {}'.format( my_signature, signature, request.data)) return 'wrong signature' data = request.json if not data: return 'empty json' if data['event_name'] != 'reminder:fired': return 'wrong event_name' user = User.query.filter(User.todoist_id == data['user_id'], User.is_active == True).one_or_none() if not user: return 'user was not found' user.init_api() assert isinstance(user.api, TodoistAPI) item = user.api.items.get_by_id(data['event_data']['item_id']) if not item: return 'item not found' from app.telegram.handlers import bot result = bot().notification(user, item) if not result: return 'bot was blocked' return 'Ok!'
def send_message(self, text, **kwargs): from app.telegram.handlers import bot try: return bot().send_message(self.tg_id, text, **kwargs) except Unauthorized: self.is_active = False db.session.commit() return False
def get_webhook_info(): return bot().get_webhook_info()
def delete_webhook(): return bot().delete_webhook()
def set_webhook(): url = url_for('telegram.webhook', hashsum=app.config['BOT_HASHSUM'], _external=True, _scheme='https') return bot().set_webhook(url, allowed_updates=allowed_updates)
def get_updates(): updater = Updater(bot=bot(), workers=1) for attr in ('handlers', 'groups', 'error_handlers'): setattr(updater.dispatcher, attr, getattr(bot().dispatcher, attr)) updater.start_polling(timeout=60, allowed_updates=allowed_updates) updater.idle()
def first_init_api(self): self.init_api() if not self.is_authorized(): return from app.telegram.handlers import bot bot().base_welcome(self)