123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- # 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}')
|