Ching 8e100f7170
All checks were successful
continuous-integration/drone Build is passing
feat: 增加 linear webhook 接口和 discord 通知
2024-03-20 17:05:24 +08:00

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)