formatting changes (blackening)
This commit is contained in:
parent
bf13265261
commit
016df8873b
2
LICENSE
2
LICENSE
@ -1,7 +1,7 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2015 Sipcentric Ltd.
|
Copyright (c) 2015 Sipcentric Ltd.
|
||||||
Copyright (c) 2022 Faelix Limited
|
Copyright (c) 2022 Faelix Limited.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python3
|
0 #!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# sipcentric/__init__.py
|
# sipcentric/__init__.py
|
||||||
@ -20,9 +20,13 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class Sipcentric(object):
|
class Sipcentric(object):
|
||||||
|
def __init__(
|
||||||
def __init__(self, username, password, base='https://pbx.sipcentric.com/api/v1', customer='me'):
|
self,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
base="https://pbx.sipcentric.com/api/v1",
|
||||||
|
customer="me",
|
||||||
|
):
|
||||||
self.username = username # Account username
|
self.username = username # Account username
|
||||||
self.password = password # Account password
|
self.password = password # Account password
|
||||||
self.base = base # Base API URL (default: https://pbx.sipcentric.com/api/v1)
|
self.base = base # Base API URL (default: https://pbx.sipcentric.com/api/v1)
|
||||||
@ -42,220 +46,182 @@ class Sipcentric(object):
|
|||||||
self.sounds = Sounds(self)
|
self.sounds = Sounds(self)
|
||||||
self.outgoingCallerIds = OutgoingCallerIds(self)
|
self.outgoingCallerIds = OutgoingCallerIds(self)
|
||||||
|
|
||||||
self.Stream = Stream(self)
|
self.stream = Stream(self)
|
||||||
|
|
||||||
def _request(self, uri, method='GET', data=None, params=None):
|
|
||||||
|
|
||||||
url = self.base + '/customers/' + self.customer + '/' + uri
|
|
||||||
|
|
||||||
|
def _request(self, uri, method="GET", data=None, params=None):
|
||||||
|
url = self.base + "/customers/" + self.customer + "/" + uri
|
||||||
auth = requests.auth.HTTPBasicAuth(self.username, self.password) # Basic auth
|
auth = requests.auth.HTTPBasicAuth(self.username, self.password) # Basic auth
|
||||||
|
|
||||||
if method == 'GET':
|
if method == "GET":
|
||||||
|
|
||||||
if params:
|
if params:
|
||||||
r = requests.get(url, auth=auth, params=params, verify=True, timeout=3.000)
|
r = requests.get(
|
||||||
|
url, auth=auth, params=params, verify=True, timeout=3.000
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
r = requests.get(url, auth=auth, verify=True, timeout=3.000)
|
r = requests.get(url, auth=auth, verify=True, timeout=3.000)
|
||||||
|
|
||||||
elif method == 'POST':
|
elif method == "POST":
|
||||||
|
headers = {"content-type": "application/json"}
|
||||||
headers = {'content-type': 'application/json'}
|
|
||||||
|
|
||||||
if params:
|
if params:
|
||||||
r = requests.post(url, auth=auth, headers=headers, data=json.dumps(data), params=params, verify=True, timeout=3.000)
|
r = requests.post(
|
||||||
|
url,
|
||||||
|
auth=auth,
|
||||||
|
headers=headers,
|
||||||
|
data=json.dumps(data),
|
||||||
|
params=params,
|
||||||
|
verify=True,
|
||||||
|
timeout=3.000,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
r = requests.post(url, auth=auth, headers=headers, data=json.dumps(data), verify=True, timeout=3.000)
|
r = requests.post(
|
||||||
|
url,
|
||||||
|
auth=auth,
|
||||||
|
headers=headers,
|
||||||
|
data=json.dumps(data),
|
||||||
|
verify=True,
|
||||||
|
timeout=3.000,
|
||||||
|
)
|
||||||
|
|
||||||
if (r.status_code == 200) or (r.status_code == 201):
|
if (r.status_code == 200) or (r.status_code == 201):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
response = r.json()
|
response = r.json()
|
||||||
return response
|
return response
|
||||||
|
|
||||||
except:
|
except:
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
elif r.status_code == 401:
|
elif r.status_code == 401:
|
||||||
|
raise AuthenticationException(
|
||||||
raise AuthenticationException('We couldn\'t authenticate you with the API. Make sure you are using the correct credentials from the \'Web Users\' section of the control panel. If you dont have an account, sign up for one at https://my.nimvelo.com/signup')
|
"We couldn't authenticate you with the API. Make sure you are using the correct credentials from the 'Web Users' section of the control panel. If you dont have an account, sign up for one at https://my.nimvelo.com/signup"
|
||||||
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
if r.json():
|
if r.json():
|
||||||
|
raise Exception("HTTP Error " + str(r.status_code), r.json())
|
||||||
raise Exception('HTTP Error ' + str(r.status_code), r.json())
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
raise Exception(
|
||||||
raise Exception('HTTP Error ' + str(r.status_code), 'Something went wrong with the request')
|
"HTTP Error " + str(r.status_code),
|
||||||
|
"Something went wrong with the request",
|
||||||
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class Account(object):
|
class Account(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = '' # Not needed for the base of the customer
|
self.uri = "" # Not needed for the base of the customer
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class CallBundles(object):
|
class CallBundles(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'callbundles'
|
self.uri = "callbundles"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class Recordings(object):
|
class Recordings(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'recordings'
|
self.uri = "recordings"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class PhoneBook(object):
|
class PhoneBook(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'phonebook'
|
self.uri = "phonebook"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class TimeIntervals(object):
|
class TimeIntervals(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'timeintervals'
|
self.uri = "timeintervals"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class Endpoints(object):
|
class Endpoints(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'endpoints'
|
self.uri = "endpoints"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class PhoneNumbers(object):
|
class PhoneNumbers(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'phonenumbers'
|
self.uri = "phonenumbers"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class Sms(object):
|
class Sms(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'sms'
|
self.uri = "sms"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
def post(self, to=None, _from=None, body=None):
|
def post(self, to=None, _from=None, body=None):
|
||||||
|
data = {"type": "smsmessage", "to": to, "from": _from, "body": body}
|
||||||
data = {
|
return self.parent._request(self.uri, method="POST", data=data)
|
||||||
'type': 'smsmessage',
|
|
||||||
'to': to,
|
|
||||||
'from': _from,
|
|
||||||
'body': body
|
|
||||||
}
|
|
||||||
|
|
||||||
return self.parent._request(self.uri, method='POST', data=data)
|
|
||||||
|
|
||||||
|
|
||||||
class CreditStatus(object):
|
class CreditStatus(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'creditstatus'
|
self.uri = "creditstatus"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class Calls(object):
|
class Calls(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'calls'
|
self.uri = "calls"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class Sounds(object):
|
class Sounds(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'sounds'
|
self.uri = "sounds"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class OutgoingCallerIds(object):
|
class OutgoingCallerIds(object):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.uri = 'outgoingcallerids'
|
self.uri = "outgoingcallerids"
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
|
|
||||||
return self.parent._request(self.uri)
|
return self.parent._request(self.uri)
|
||||||
|
|
||||||
|
|
||||||
class AuthenticationException(Exception):
|
class AuthenticationException(Exception):
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
logging.error('Do not run directly, import module first!')
|
logging.error("Do not run directly, import module first!")
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
@ -10,108 +10,96 @@ import multiprocessing
|
|||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import simplejson as json
|
import simplejson as json
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Stream(object):
|
class Stream(object):
|
||||||
'''Allows you to connect to the Nimvelo (Sipcentric) streaming API
|
"""Allows you to connect to the Nimvelo (Sipcentric) streaming API
|
||||||
and register callbacks to your own functions.
|
and register callbacks to your own functions.
|
||||||
'''
|
"""
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
|
||||||
self.process = multiprocessing.Process(target=self.__run)
|
self.process = multiprocessing.Process(target=self.__run)
|
||||||
|
|
||||||
self.username = self.parent.username # Account username
|
self.username = self.parent.username # Account username
|
||||||
self.password = self.parent.password # Account password
|
self.password = self.parent.password # Account password
|
||||||
self.base = self.parent.base + '/stream' # Base streaming URL (default: https://pbx.sipcentric.com/api/v1/stream)
|
self.base = (
|
||||||
|
self.parent.base + "/stream"
|
||||||
|
) # Base streaming URL (default: https://pbx.sipcentric.com/api/v1/stream)
|
||||||
self.heartbeat = None
|
self.heartbeat = None
|
||||||
|
|
||||||
self.eventsCallback = None
|
self.eventsCallback = None
|
||||||
self.incomingcallCallback = None
|
self.incomingcallCallback = None
|
||||||
self.smsreceivedCallback = None
|
self.smsreceivedCallback = None
|
||||||
|
|
||||||
def __proccess(self, event):
|
def __proccess(self, event):
|
||||||
|
|
||||||
event = json.loads(event)
|
event = json.loads(event)
|
||||||
|
logger.info("Processing event")
|
||||||
logger.info('Processing event')
|
|
||||||
logger.debug(event)
|
logger.debug(event)
|
||||||
|
|
||||||
if event['event'] == 'heartbeat':
|
if event["event"] == "heartbeat":
|
||||||
|
|
||||||
self.heartbeat = time.time()
|
self.heartbeat = time.time()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
elif event['event'] == 'incomingcall':
|
elif event["event"] == "incomingcall":
|
||||||
|
|
||||||
if self.incomingcallCallback:
|
if self.incomingcallCallback:
|
||||||
self.incomingcallCallback(event['values'])
|
self.incomingcallCallback(event["values"])
|
||||||
return True
|
return True
|
||||||
|
|
||||||
elif event['event'] == 'smsreceived':
|
elif event["event"] == "smsreceived":
|
||||||
|
|
||||||
if self.smsreceivedCallback:
|
if self.smsreceivedCallback:
|
||||||
self.smsreceivedCallback(event['values'])
|
self.smsreceivedCallback(event["values"])
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if self.eventsCallback:
|
if self.eventsCallback:
|
||||||
|
|
||||||
self.eventsCallback(event)
|
self.eventsCallback(event)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def __run(self):
|
def __run(self):
|
||||||
|
stream = "" # Used as a buffer for the stream data
|
||||||
stream = '' # Used as a buffer for the stream data
|
|
||||||
data = False # Data is not JSON until we detect it
|
data = False # Data is not JSON until we detect it
|
||||||
level = 0 # JSON object depth
|
level = 0 # JSON object depth
|
||||||
|
|
||||||
r = requests.get(self.base, verify=True, auth=(self.username, self.password), stream=True)
|
r = requests.get(
|
||||||
|
self.base, verify=True, auth=(self.username, self.password), stream=True
|
||||||
|
)
|
||||||
|
|
||||||
for i in r.iter_content():
|
for i in r.iter_content():
|
||||||
if i == '{':
|
if i == "{":
|
||||||
stream += i
|
stream += i
|
||||||
level += 1
|
level += 1
|
||||||
data = True
|
data = True
|
||||||
|
|
||||||
elif i == '}':
|
elif i == "}":
|
||||||
stream += i
|
stream += i
|
||||||
data = False
|
data = False
|
||||||
level -= 1
|
level -= 1
|
||||||
|
|
||||||
if level <= 0:
|
if level <= 0:
|
||||||
self.__proccess(stream)
|
self.__proccess(stream)
|
||||||
stream = ''
|
stream = ""
|
||||||
|
|
||||||
elif data is True:
|
elif data is True:
|
||||||
stream += i
|
stream += i
|
||||||
|
|
||||||
def register(self, type, callback):
|
def register(self, type, callback):
|
||||||
|
|
||||||
# Register a function to a callback in the class
|
# Register a function to a callback in the class
|
||||||
if type == 'incomingcall':
|
if type == "incomingcall":
|
||||||
self.incomingcallCallback = callback
|
self.incomingcallCallback = callback
|
||||||
elif type == 'smsreceived':
|
elif type == "smsreceived":
|
||||||
self.smsreceivedCallback = callback
|
self.smsreceivedCallback = callback
|
||||||
elif type == 'events':
|
elif type == "events":
|
||||||
self.eventsCallback = callback
|
self.eventsCallback = callback
|
||||||
|
|
||||||
logger.info('Callback registered')
|
logger.info("Callback registered")
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
|
|
||||||
# Start multiprocessing thread
|
# Start multiprocessing thread
|
||||||
self.process.start()
|
self.process.start()
|
||||||
logger.info('Connected')
|
logger.info("Connected")
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
|
|
||||||
# Terminate multiprocessing thread
|
# Terminate multiprocessing thread
|
||||||
self.process.terminate()
|
self.process.terminate()
|
||||||
logger.info('Disconnected')
|
logger.info("Disconnected")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user