#!/home/deadtom/python/.xmpp-venv/bin/python

import config
import logging
from slixmpp import ClientXMPP
import time
import requests
import json
import sys
import os

logging.basicConfig(filename=config.log_file, level=logging.INFO)


sender_jids = []
for sender in config.senders:  # Put together list of sender JIDs
    sender_jids.append(sender)


def get_now():  # This creates and returns a time stamp for the log
    now = str(time.strftime("%Y/%m/%d %H:%M:%S"))
    return now


def send_ownchat(msg, auth_bearer, api_url):
    logging.info(f'Sending message to Owncast server.')
    msg_body = {'body': msg}
    headers = {'Authorization': auth_bearer}
    response = requests.post(f'{api_url}/api/integrations/chat/send', data=json.dumps(msg_body),
                             headers=headers)
    return response.json()


class CommandBot(ClientXMPP):

    def __init__(self, jid, password):
        ClientXMPP.__init__(self, jid, password)
        self.add_event_handler("session_start", self.session_start)
        self.add_event_handler("message", self.message)
        self.add_event_handler("disconnected", self.do_reconnect)

    def session_start(self, event):
        self.send_presence()
        self.get_roster()

    def do_reconnect(self, event):  # Try to reconnect if disconnected
        logging.info('Disconnected. Reconnecting...')
        time.sleep(1)
        os.execv(__file__, sys.argv)
        sys.exit()

    def message(self, msg):
        if msg['type'] in ('chat', 'normal'):
            self.msg = msg
            self.cmd = self.msg['body']  # Get the body out of the message
            self.cmd = self.cmd.lower()  # Convert it to lower case to avoid problems looking up available commands
            self.sender = self.msg['from']  # Get sender
            self.sender = str(self.sender)  # Convert to string so split() can work with it
            self.sender = self.sender.split('/')[0]  # Only save the information before the forward slash
            time.sleep(1)
            if self.sender in sender_jids:  # Check if the sender is on the list
                logging.info(f'Recieved message from  \"{self.sender}\".')
                self.auth_bearer = config.senders[sender][0]
                self.api_url = config.senders[sender][1]
                self.send = send_ownchat(self.msg['body'], self.auth_bearer, self.api_url)
                self.result = self.send
                logging.info(f'Recieved response \"{self.result}\" from Owncast server.')
            else:  # If not, say so
                logging.info(f'{self.sender} sent a command, but is not in the senders list.')
                self.msg.reply('Access denied. You are not on the list.').send()


try:
    if __name__ == '__main__':
        xmpp = CommandBot(config.user, config.passwd)
        xmpp.connect()
        xmpp.process(forever=True)
except KeyboardInterrupt:  # Catch ctrl-alt-del
    print('\nExiting program...')
    sys.exit()
except Exception as error:  # Log/print all other errors
    print(error)
    logging.info(f'ERROR:{error}')
    sys.exit()