import asyncio
import simpleobsws
import json

loop = asyncio.get_event_loop()
ws = simpleobsws.obsws(host='127.0.0.1', port=4444, password='MYSecurePassword', loop=loop) # Every possible argument has been passed, but none are required. See lib code for defaults.


async def default_request():
    await ws.connect() # Make the connection to OBS-Websocket
    result = await ws.call('GetVersion') # We get the current OBS version. More request data is not required
    print(result) # Print the raw json output of the GetVersion request
    await asyncio.sleep(1)
    requests = result['available-requests'].split(',')

    #data = {'source':'test_source', 'volume':0.5}
    #result = await ws.call('SetVolume', data) # Make a request with the given data
    #print(result)
    await ws.disconnect() # Clean things up by disconnecting. Only really required in a few specific situations, but good practice if you are done making requests or listening to events.
    return requests

async def make_custom_request(request, data=None):
    await ws.connect() # Make the connection to OBS-Websocket
    #result = await ws.call(request) # We get the current OBS version. More request data is not required
    #print(result) # Print the raw json output of the GetVersion request
    await asyncio.sleep(1)
    if not data==None:
        #data = {'source':'tinycam', 'volume':0.5}
        result = await ws.call(request, data=data) # Make a request with the given data
        print(result)
        await ws.disconnect() # Clean things up by disconnecting. Only really required in a few specific situations, but good practice if you are done making requests or listening to events.



async def on_event(data):
    print('New event! Type: {} | Raw Data: {}'.format(data['update-type'], data)) # Print the event data. Note that `update-type` is also provided in the data

async def on_switchscenes(data):
    print("\n===========================================\n\n")
    print('Scene switched to "{}". It has these sources: {}'.format(data['scene-name'], data['sources']))



def getRequests():
    return loop.run_until_complete(default_request())

def makeRequest(request, data):
    loop.run_until_complete(make_custom_request(request, data))



def listenForData():
    print("\n\nListener:")

    loop = asyncio.get_event_loop()
    ws = simpleobsws.obsws(host='127.0.0.1', port=4444, password='MYSecurePassword', loop=loop) # Every possible argument has been passed, but none are required. See lib code for defaults.
    loop.run_until_complete(ws.connect())
    ws.register(on_event) # By not specifying an event to listen to, all events are sent to this callback.
    ws.register(on_switchscenes, 'SwitchScenes')
    loop.run_forever()



if __name__ == "__main__":
    #print("\n\nRequests:")
    #loop.run_until_complete(get_requests())

    #makeRequest("ToggleStudioMode")
    #listenForData()
    pass
