44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
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)
|