hooks.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. # File name: Hooks.py
  2. # Date created: 09/16/2022
  3. # Date last modified: 2/10/2025
  4. # Python Version: 3.11.2
  5. # Copyright © 2025 DeadTOm
  6. # TODO: Make routes for various chat and video links
  7. try:
  8. from config import *
  9. from flask import Flask, jsonify, current_app, request
  10. import requests
  11. import logging
  12. import time
  13. import socket
  14. import slixmpp
  15. import sys
  16. except Exception as import_error: # Log any errors loading modules, and try to keep running
  17. fail_log = open(owncast_logfile, 'a')
  18. fail_log.write(f'------{import_error}------\n')
  19. fail_log.close()
  20. logging.basicConfig(filename=owncast_logfile, level=logging.INFO)
  21. testing = 0 # Are we testing? 1 for testing. 0 for live.
  22. app = Flask(__name__)
  23. def get_now(): # This creates and returns a time stamp
  24. now = str(time.strftime("%Y/%m/%d %H:%M:%S"))
  25. return now
  26. logging.info(f'\n\n\n\n{get_now()} - Webhook called.\n')
  27. class SendMsgBot(slixmpp.ClientXMPP):
  28. def __init__(self, jid, password, recipient, message):
  29. slixmpp.ClientXMPP.__init__(self, jid, password)
  30. self.recipient = recipient
  31. self.msg = message
  32. self.add_event_handler("session_start", self.start)
  33. async def start(self, event):
  34. self.send_presence()
  35. await self.get_roster()
  36. self.send_message(mto=self.recipient, mbody=self.msg, mtype='chat')
  37. self.disconnect()
  38. def xmpp_chat(ownchat_msg):
  39. xmpp = SendMsgBot(jid, password, to, ownchat_msg)
  40. xmpp.register_plugin('xep_0030') # Service Discovery
  41. xmpp.register_plugin('xep_0199') # XMPP Ping
  42. xmpp.connect()
  43. xmpp.process(forever=False)
  44. def set_hashtags(title): # Sets up hash tags to be appended to social media
  45. logging.info(f'{get_now()} - Examining stream title \"{title}\" to apply hashtags.')
  46. check_title = title.lower()
  47. default_tags = '#Owncast '
  48. tags = ''
  49. # tag_dict located in config.py
  50. for tag in tag_dict.keys(): # Iterate through each dict entry, and check for hashtag triggers
  51. if tag in check_title:
  52. print(f'Found {tag}, adding {tag_dict[tag]} to hashtags.')
  53. tags = f'{tags}{tag_dict[tag]} '
  54. tags = f'{tags}#Owncast'
  55. logging.info(f'{get_now()} - Adding {tags} to title.')
  56. return tags
  57. @app.route('/user_left/', methods=["POST"])
  58. def left():
  59. logging.info(f'{get_now()} - user_left request')
  60. raw_data = request.get_json(force=True) # Get the raw data
  61. event_data = raw_data['eventData']
  62. logging.info(f'{get_now()} - {raw_data}')
  63. response = requests.get(f'{api_url}/api/status')
  64. response = response.json()
  65. if response['online'] is True: # Check if we are currently streaming, if so, send notification
  66. chatter_name = event_data['user']['displayName']
  67. ownchat_msg = f'{chatter_name} left the chat.'
  68. logging.info(f'{get_now()} - {ownchat_msg}')
  69. xmpp_chat(ownchat_msg)
  70. else: # If not currently streaming, do nothing.
  71. logging.info(f'{get_now()} - We are not streaming, so not sending XMPP message.')
  72. return jsonify({"Data": raw_data, })
  73. @app.route('/user_joined/', methods=["POST"])
  74. def joined():
  75. logging.info(f'{get_now()} - user_joined request')
  76. raw_data = request.get_json(force=True) # Get the raw data
  77. event_data = raw_data['eventData']
  78. chatter_name = event_data['user']['displayName']
  79. ownchat_msg = f'{chatter_name} joined the chat.'
  80. logging.info(f'{get_now()} - {ownchat_msg}')
  81. logging.info(f'{get_now()} - {raw_data}')
  82. xmpp_chat(ownchat_msg)
  83. return jsonify({"Data": raw_data, })
  84. @app.route('/name_changed/', methods=["POST"])
  85. def changed():
  86. logging.info(f'{get_now()} - name_changed request')
  87. raw_data = request.get_json(force=True) # Get the raw data
  88. event_data = raw_data['eventData']
  89. chatter_old_name = event_data['user']['previousNames']
  90. chatter_new_name = event_data['user']['displayName']
  91. last_name = len(chatter_old_name) - 1 # Get last name in previousNames list
  92. chatter_old_name = event_data['user']['previousNames'][last_name]
  93. ownchat_msg = f'{chatter_old_name} changed their name to {chatter_new_name}'
  94. logging.debug(f'{get_now()} - {type}\n{raw_data}')
  95. logging.info(f'{get_now()} - {ownchat_msg}')
  96. xmpp_chat(ownchat_msg)
  97. return jsonify({"Data": raw_data, })
  98. @app.route('/message_sent/', methods=["POST"])
  99. def sent():
  100. logging.info(f'----------------------------------------------------------------------------')
  101. logging.info(f'{get_now()} - message_sent request')
  102. raw_data = request.get_json(force=True) # Get the raw data
  103. event_data = raw_data['eventData']
  104. chatter_name = event_data['user']['displayName']
  105. chatter_id = event_data['user']['id']
  106. chat_msg = event_data['rawBody']
  107. ownchat_msg = f'{chatter_name}: {chat_msg}'
  108. logging.info(f'{get_now()} - Chat message: \"{ownchat_msg}\".')
  109. xmpp_chat(ownchat_msg)
  110. return jsonify({"Data": raw_data, })
  111. if __name__ == '__main__':
  112. try:
  113. app.run()
  114. except Exception as main_error:
  115. logging.info(f'{get_now()} - {main_error}')