hooks.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from flask import Flask, jsonify, current_app, request
  2. import config
  3. import requests
  4. import logging
  5. import time
  6. import socket
  7. import slixmpp
  8. import sys
  9. import asyncio
  10. logging.basicConfig(filename=config.owncast_logfile, level=logging.INFO)
  11. app = Flask(__name__)
  12. def get_now(): # Create a timestamp for logging
  13. now = str(time.strftime("%Y/%m/%d %H:%M:%S"))
  14. return now
  15. class SendMsgBot(slixmpp.ClientXMPP):
  16. def __init__(self, jid, password, recipient, message):
  17. slixmpp.ClientXMPP.__init__(self, config.jid, config.password)
  18. self.recipient = recipient
  19. self.msg = message
  20. self.add_event_handler("session_start", self.start)
  21. async def start(self, event):
  22. self.send_presence()
  23. await self.get_roster()
  24. self.send_message(mto=self.recipient, mbody=self.msg, mtype='chat')
  25. self.disconnect()
  26. def xmpp_chat(ownchat_msg): # Send messages to XMPP
  27. xmpp = SendMsgBot(config.jid, config.password, config.to, ownchat_msg)
  28. xmpp.register_plugin('xep_0030') # Service Discovery
  29. xmpp.register_plugin('xep_0199') # XMPP Ping
  30. xmpp.connect()
  31. asyncio.get_event_loop().run_until_complete(xmpp.disconnected)
  32. @app.route('/user_left/', methods=["POST"]) # Notify XMPP that a user left
  33. def left():
  34. logging.info(f'{get_now()} - user_left request')
  35. raw_data = request.get_json(force=True) # Get the raw data
  36. event_data = raw_data['eventData']
  37. logging.info(f'{get_now()} - {raw_data}')
  38. response = requests.get(f'{config.api_url}/api/status')
  39. response = response.json()
  40. if response['online'] is True: # Check if we are currently streaming, if so, send notification
  41. chatter_name = event_data['user']['displayName']
  42. ownchat_msg = f'{chatter_name} left the chat.'
  43. logging.info(f'{get_now()} - {ownchat_msg}')
  44. xmpp_chat(ownchat_msg)
  45. else: # If not currently streaming, do nothing.
  46. logging.info(f'{get_now()} - We are not streaming, so not sending XMPP message.')
  47. return jsonify({"Data": raw_data, })
  48. @app.route('/user_joined/', methods=["POST"]) # Notify XMPP that a user joined
  49. def joined():
  50. logging.info(f'{get_now()} - user_joined request')
  51. raw_data = request.get_json(force=True) # Get the raw data
  52. event_data = raw_data['eventData']
  53. chatter_name = event_data['user']['displayName']
  54. ownchat_msg = f'{chatter_name} joined the chat.'
  55. logging.info(f'{get_now()} - {ownchat_msg}')
  56. logging.info(f'{get_now()} - {raw_data}')
  57. xmpp_chat(ownchat_msg)
  58. return jsonify({"Data": raw_data, })
  59. @app.route('/name_changed/', methods=["POST"]) # Notify XMPP that a user changed their name
  60. def changed():
  61. logging.info(f'{get_now()} - name_changed request')
  62. raw_data = request.get_json(force=True) # Get the raw data
  63. event_data = raw_data['eventData']
  64. chatter_old_name = event_data['user']['previousNames']
  65. chatter_new_name = event_data['user']['displayName']
  66. last_name = len(chatter_old_name) - 1 # Get last name in previousNames list
  67. chatter_old_name = event_data['user']['previousNames'][last_name]
  68. ownchat_msg = f'{chatter_old_name} changed their name to {chatter_new_name}'
  69. logging.debug(f'{get_now()} - {type}\n{raw_data}')
  70. logging.info(f'{get_now()} - {ownchat_msg}')
  71. xmpp_chat(ownchat_msg)
  72. return jsonify({"Data": raw_data, })
  73. @app.route('/message_sent/', methods=["POST"]) # Notify XMPP that a user sent a message
  74. def sent():
  75. logging.info(f'----------------------------------------------------------------------------')
  76. logging.info(f'{get_now()} - message_sent request')
  77. raw_data = request.get_json(force=True) # Get the raw data
  78. event_data = raw_data['eventData']
  79. chatter_name = event_data['user']['displayName']
  80. chatter_id = event_data['user']['id']
  81. chat_msg = event_data['rawBody']
  82. ownchat_msg = f'{chatter_name}: {chat_msg}'
  83. logging.info(f'{get_now()} - Chat message: \"{ownchat_msg}\".')
  84. xmpp_chat(ownchat_msg)
  85. return jsonify({"Data": raw_data, })
  86. if __name__ == '__main__':
  87. try:
  88. app.run()
  89. except Exception as main_error:
  90. logging.info(f'{get_now()} - {main_error}')