from flask import Flask, request, jsonify import apprise import os from loguru import logger app = Flask(__name__) DISCORD_WEBHOOK_URL = os.environ.get('DISCORD_WEBHOOK_URL') DISCORD_WEBHOOK_ID = DISCORD_WEBHOOK_URL.split('/')[-2] DISCORD_WEBHOOK_TOKEN = DISCORD_WEBHOOK_URL.split('/')[-1] @app.route('/linear/issue', methods=['POST']) def linear_issue(): """ https://developers.linear.app/docs/graphql/webhooks#the-webhook-payload """ if request.headers.get('Linear-Event') != 'issue': logger.error('Invalid event type: %s', request.headers.get('Linear-Event')) return jsonify({'message': 'Invalid event type'}), 400 data = request.json logger.info('Received issue webhook: %s', data) if data['action'] != 'update': logger.warning('Ignoring issue action: %s', data['action']) return jsonify({'message': 'Ignoring issue action'}), 200 # Send Discord message apobj = apprise.Apprise() apobj.add(f'discord://{DISCORD_WEBHOOK_ID}/{DISCORD_WEBHOOK_TOKEN}/?avatar=No&format=markdown') apobj.asset.app_id = None apobj.notify(body='Issue status changed') # if data['updatedFrom'].get('statusId') != data['issue']['statusId']: # logger.info('Issue status changed: %s', data['issue']['status']['name']) # # Send Discord message with embeded content # # set apprise format to markdown # apobj.notify( # body=f'Issue status changed: **{data["issue"]["status"]["name"]}**', # title=data['issue']['title'], # body_format=apprise.AppriseFormat.MARKDOWN # ) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)