# File name: Hooks.py # Date created: 09/16/2022 # Date last modified: 2/10/2025 # Python Version: 3.11.2 # Copyright © 2025 DeadTOm # TODO: Make routes for various chat and video links try: from config import * from flask import Flask, jsonify, current_app, request import requests import logging import time import socket import slixmpp import sys except Exception as import_error: # Log any errors loading modules, and try to keep running fail_log = open(owncast_logfile, 'a') fail_log.write(f'------{import_error}------\n') fail_log.close() logging.basicConfig(filename=owncast_logfile, level=logging.INFO) testing = 0 # Are we testing? 1 for testing. 0 for live. app = Flask(__name__) def get_now(): # This creates and returns a time stamp now = str(time.strftime("%Y/%m/%d %H:%M:%S")) return now logging.info(f'\n\n\n\n{get_now()} - Webhook called.\n') class SendMsgBot(slixmpp.ClientXMPP): def __init__(self, jid, password, recipient, message): slixmpp.ClientXMPP.__init__(self, jid, password) self.recipient = recipient self.msg = message self.add_event_handler("session_start", self.start) async def start(self, event): self.send_presence() await self.get_roster() self.send_message(mto=self.recipient, mbody=self.msg, mtype='chat') self.disconnect() def xmpp_chat(ownchat_msg): xmpp = SendMsgBot(jid, password, to, ownchat_msg) xmpp.register_plugin('xep_0030') # Service Discovery xmpp.register_plugin('xep_0199') # XMPP Ping xmpp.connect() xmpp.process(forever=False) def set_hashtags(title): # Sets up hash tags to be appended to social media logging.info(f'{get_now()} - Examining stream title \"{title}\" to apply hashtags.') check_title = title.lower() default_tags = '#Owncast ' tags = '' # tag_dict located in config.py for tag in tag_dict.keys(): # Iterate through each dict entry, and check for hashtag triggers if tag in check_title: print(f'Found {tag}, adding {tag_dict[tag]} to hashtags.') tags = f'{tags}{tag_dict[tag]} ' tags = f'{tags}#Owncast' logging.info(f'{get_now()} - Adding {tags} to title.') return tags @app.route('/user_left/', methods=["POST"]) def left(): logging.info(f'{get_now()} - user_left request') raw_data = request.get_json(force=True) # Get the raw data event_data = raw_data['eventData'] logging.info(f'{get_now()} - {raw_data}') response = requests.get(f'{api_url}/api/status') response = response.json() if response['online'] is True: # Check if we are currently streaming, if so, send notification chatter_name = event_data['user']['displayName'] ownchat_msg = f'{chatter_name} left the chat.' logging.info(f'{get_now()} - {ownchat_msg}') xmpp_chat(ownchat_msg) else: # If not currently streaming, do nothing. logging.info(f'{get_now()} - We are not streaming, so not sending XMPP message.') return jsonify({"Data": raw_data, }) @app.route('/user_joined/', methods=["POST"]) def joined(): logging.info(f'{get_now()} - user_joined request') raw_data = request.get_json(force=True) # Get the raw data event_data = raw_data['eventData'] chatter_name = event_data['user']['displayName'] ownchat_msg = f'{chatter_name} joined the chat.' logging.info(f'{get_now()} - {ownchat_msg}') logging.info(f'{get_now()} - {raw_data}') xmpp_chat(ownchat_msg) return jsonify({"Data": raw_data, }) @app.route('/name_changed/', methods=["POST"]) def changed(): logging.info(f'{get_now()} - name_changed request') raw_data = request.get_json(force=True) # Get the raw data event_data = raw_data['eventData'] chatter_old_name = event_data['user']['previousNames'] chatter_new_name = event_data['user']['displayName'] last_name = len(chatter_old_name) - 1 # Get last name in previousNames list chatter_old_name = event_data['user']['previousNames'][last_name] ownchat_msg = f'{chatter_old_name} changed their name to {chatter_new_name}' logging.debug(f'{get_now()} - {type}\n{raw_data}') logging.info(f'{get_now()} - {ownchat_msg}') xmpp_chat(ownchat_msg) return jsonify({"Data": raw_data, }) @app.route('/message_sent/', methods=["POST"]) def sent(): logging.info(f'----------------------------------------------------------------------------') logging.info(f'{get_now()} - message_sent request') raw_data = request.get_json(force=True) # Get the raw data event_data = raw_data['eventData'] chatter_name = event_data['user']['displayName'] chatter_id = event_data['user']['id'] chat_msg = event_data['rawBody'] ownchat_msg = f'{chatter_name}: {chat_msg}' logging.info(f'{get_now()} - Chat message: \"{ownchat_msg}\".') xmpp_chat(ownchat_msg) return jsonify({"Data": raw_data, }) if __name__ == '__main__': try: app.run() except Exception as main_error: logging.info(f'{get_now()} - {main_error}')