From 6f354e7e109dab466d926cb64cd2820eb39d3c22 Mon Sep 17 00:00:00 2001 From: Tyler Liu Date: Mon, 11 Dec 2023 17:58:02 -0800 Subject: [PATCH 1/4] Fix the fax demo --- dev-notes.md | 2 +- requirements.txt | 2 +- ringcentral/demos/demo_fax.py | 23 +++++++++++------------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/dev-notes.md b/dev-notes.md index cc48f7a..c0c7dcf 100644 --- a/dev-notes.md +++ b/dev-notes.md @@ -42,7 +42,7 @@ Edit `.env` to specify credentials Run a demo file like this: ``` -python demo_sms.py +python3 ringcentral/demos/demo_fax.py ``` diff --git a/requirements.txt b/requirements.txt index 38c35f7..e22396f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ observable==0.3.* pubnub==4.* pycryptodome==3.* requests==2.* -websockets==11.* \ No newline at end of file +websockets==11.* diff --git a/ringcentral/demos/demo_fax.py b/ringcentral/demos/demo_fax.py index 5fc21a5..8bfb0df 100644 --- a/ringcentral/demos/demo_fax.py +++ b/ringcentral/demos/demo_fax.py @@ -1,8 +1,10 @@ import os,time,ssl from dotenv import load_dotenv -from ringcentral import SDK import certifi import urllib.request +import sys +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) # Add the project root to sys.path +from ringcentral import SDK load_dotenv() #env = dotenv_values(".env") @@ -23,17 +25,14 @@ def send_fax(): 'coverPageText': "This is a demo Fax page from Python" }) - with open('test.txt', "r") as f: - content = f.read() - #attachment = ('test.jpg', content) - attachment = ( - 'test.png', - urllib.request.urlopen('https://www.ringcentral.com/content/dam/rc-2018/en_us/images/logo.jpg', - context=ssl.create_default_context(cafile=certifi.where())).read(), - 'image/png' - ) - builder.add(attachment) - request = builder.request('/restapi/v1.0/account/~/extension/~/fax') + attachment = ( + 'test.png', + urllib.request.urlopen('https://www.ringcentral.com/content/dam/rc-2018/en_us/images/logo.jpg', + context=ssl.create_default_context(cafile=certifi.where())).read(), + 'image/png' + ) + builder.add(attachment) + request = builder.request('/restapi/v1.0/account/~/extension/~/fax') resp = platform.send_request(request) jsonObj = resp.json() print ("Fax sent. Message id: " + str(jsonObj.id)) From 38deab1caeeef03fe4570c56853854c5cc199303 Mon Sep 17 00:00:00 2001 From: Tyler Liu Date: Mon, 11 Dec 2023 18:08:43 -0800 Subject: [PATCH 2/4] No more password flow --- README.md | 5 +++-- ringcentral/demos/demo_fax.py | 2 +- ringcentral/test/testcase.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f239d87..c4f2cc7 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,8 @@ from ringcentral import SDK sdk = SDK('CLIENT_ID', 'CLIENT_SECRET', 'SERVER') platform = sdk.platform() -platform.login('USERNAME', 'EXTENSION', 'PASSWORD') +platform.login(jwt='JWT_TOKEN') +``` res = platform.get('/account/~/extension/~') print('User loaded ' + res.json().name) @@ -110,7 +111,7 @@ database.append({"Customer":"Lukas","Payment":"Due","PhoneNumber":"xxxxxxxxxxx"} sdk = SDK('CLIENT_ID', 'CLIENT_SECRET', 'SERVER') platform = sdk.platform() -platform.login('USERNAME', 'EXTENSION', 'PASSWORD') +platform.login(jwt='JWT_TOKEN') def sendSMS(message, number): params = {'from': {'phoneNumber': 'USERNAME'},'to': [{'phoneNumber': number}],'text': message} diff --git a/ringcentral/demos/demo_fax.py b/ringcentral/demos/demo_fax.py index 8bfb0df..d8940ea 100644 --- a/ringcentral/demos/demo_fax.py +++ b/ringcentral/demos/demo_fax.py @@ -58,7 +58,7 @@ def check_fax_message_status(messageId): # Authenticate a user using a personal JWT token def login(): try: - platform.login( jwt=os.environ.get('RINGCENTRAL_JWT_TOKEN') ) + platform.login(jwt=os.environ.get('RINGCENTRAL_JWT_TOKEN') ) send_fax() except Exception as e: print ("Unable to authenticate to platform. Check credentials." + str(e)) diff --git a/ringcentral/test/testcase.py b/ringcentral/test/testcase.py index 803a849..6a5418f 100644 --- a/ringcentral/test/testcase.py +++ b/ringcentral/test/testcase.py @@ -18,7 +18,7 @@ def get_sdk(self, mock): sdk = SDK('whatever', 'whatever', 'https://whatever', redirect_uri='https://whatever-redirect') self.authentication_mock(mock) - sdk.platform().login('18881112233', None, 'password') + sdk.platform().login(jwt='jwt-token') matcher = re.compile('pubsub\.pubnub\.com') From 857d1b683be5cf73c964c959a09aa55afcb61481 Mon Sep 17 00:00:00 2001 From: Tyler Liu Date: Mon, 11 Dec 2023 18:18:46 -0800 Subject: [PATCH 3/4] Avoid running pubnub test to avoid warnings --- .../{subscription_test.py => subscription_test_deprecated.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ringcentral/deprecated_pubnub_subscription/{subscription_test.py => subscription_test_deprecated.py} (100%) diff --git a/ringcentral/deprecated_pubnub_subscription/subscription_test.py b/ringcentral/deprecated_pubnub_subscription/subscription_test_deprecated.py similarity index 100% rename from ringcentral/deprecated_pubnub_subscription/subscription_test.py rename to ringcentral/deprecated_pubnub_subscription/subscription_test_deprecated.py From 88fea17744751760d723b938e751a7cbb2d8e9ad Mon Sep 17 00:00:00 2001 From: Tyler Liu Date: Mon, 11 Dec 2023 19:39:20 -0800 Subject: [PATCH 4/4] Heartbeat --- ringcentral/demos/demo_web_socket.py | 11 +++++++---- ringcentral/websocket/web_socket_client.py | 13 ++++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ringcentral/demos/demo_web_socket.py b/ringcentral/demos/demo_web_socket.py index 4fa4428..b248d24 100644 --- a/ringcentral/demos/demo_web_socket.py +++ b/ringcentral/demos/demo_web_socket.py @@ -1,17 +1,20 @@ from dotenv import load_dotenv -from ringcentral import SDK -from ringcentral.websocket.events import WebSocketEvents import json import uuid import os import asyncio +import sys +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) # Add the project root to sys.path +from ringcentral import SDK +from ringcentral.websocket.events import WebSocketEvents def on_message(message): print("\n WebSocket message:\n") print(json.loads(message)) - print("\n User email:\n") - print(json.loads(message)[1]["contact"]["email"]) + if(len(json.loads(message)) > 1): + print("\n User email:\n") + print(json.loads(message)[1]["contact"]["email"]) def on_created(web_socket_client): diff --git a/ringcentral/websocket/web_socket_client.py b/ringcentral/websocket/web_socket_client.py index 440a1c1..e158f89 100644 --- a/ringcentral/websocket/web_socket_client.py +++ b/ringcentral/websocket/web_socket_client.py @@ -6,7 +6,7 @@ from .events import WebSocketEvents import json import asyncio - +import uuid class WebSocketClient(Observable): def __init__(self, platform): @@ -48,6 +48,17 @@ async def open_connection(self, ws_uri, ws_access_token): self._web_socket = connection_info self._is_ready = True self.trigger(WebSocketEvents.connectionCreated, self) + + # heartbeat every 10 minutes + async def timer_function(): + while True: + if self._done: + timer.cancel() + break + await asyncio.sleep(600) + await self.send_message([{"type": "Heartbeat", "messageId": str(uuid.uuid4())}]) + timer = asyncio.create_task(timer_function()) + await asyncio.sleep(0) while True: message = await websocket.recv()