owncastcom.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/home/deadtom/python/.xmpp-venv/bin/python
  2. import config
  3. import logging
  4. from slixmpp import ClientXMPP
  5. import time
  6. import requests
  7. import json
  8. import sys
  9. import os
  10. logging.basicConfig(filename=config.log_file, level=logging.INFO)
  11. sender_jids = []
  12. for sender in config.senders: # Put together list of sender JIDs
  13. sender_jids.append(sender)
  14. def get_now(): # This creates and returns a time stamp for the log
  15. now = str(time.strftime("%Y/%m/%d %H:%M:%S"))
  16. return now
  17. def send_ownchat(msg, auth_bearer, api_url):
  18. logging.info(f'Sending message to Owncast server.')
  19. msg_body = {'body': msg}
  20. headers = {'Authorization': auth_bearer}
  21. response = requests.post(f'{api_url}/api/integrations/chat/send', data=json.dumps(msg_body),
  22. headers=headers)
  23. return response.json()
  24. class CommandBot(ClientXMPP):
  25. def __init__(self, jid, password):
  26. ClientXMPP.__init__(self, jid, password)
  27. self.add_event_handler("session_start", self.session_start)
  28. self.add_event_handler("message", self.message)
  29. self.add_event_handler("disconnected", self.do_reconnect)
  30. def session_start(self, event):
  31. self.send_presence()
  32. self.get_roster()
  33. def do_reconnect(self, event): # Try to reconnect if disconnected
  34. logging.info('Disconnected. Reconnecting...')
  35. time.sleep(1)
  36. os.execv(__file__, sys.argv)
  37. sys.exit()
  38. def message(self, msg):
  39. if msg['type'] in ('chat', 'normal'):
  40. self.msg = msg
  41. self.cmd = self.msg['body'] # Get the body out of the message
  42. self.cmd = self.cmd.lower() # Convert it to lower case to avoid problems looking up available commands
  43. self.sender = self.msg['from'] # Get sender
  44. self.sender = str(self.sender) # Convert to string so split() can work with it
  45. self.sender = self.sender.split('/')[0] # Only save the information before the forward slash
  46. time.sleep(1)
  47. if self.sender in sender_jids: # Check if the sender is on the list
  48. logging.info(f'Recieved message from \"{self.sender}\".')
  49. self.auth_bearer = config.senders[sender][0]
  50. self.api_url = config.senders[sender][1]
  51. self.send = send_ownchat(self.msg['body'], self.auth_bearer, self.api_url)
  52. self.result = self.send
  53. logging.info(f'Recieved response \"{self.result}\" from Owncast server.')
  54. else: # If not, say so
  55. logging.info(f'{self.sender} sent a command, but is not in the senders list.')
  56. self.msg.reply('Access denied. You are not on the list.').send()
  57. try:
  58. if __name__ == '__main__':
  59. xmpp = CommandBot(config.user, config.passwd)
  60. xmpp.connect()
  61. xmpp.process(forever=True)
  62. except KeyboardInterrupt: # Catch ctrl-alt-del
  63. print('\nExiting program...')
  64. sys.exit()
  65. except Exception as error: # Log/print all other errors
  66. print(error)
  67. logging.info(f'ERROR:{error}')
  68. sys.exit()