|
|
|
@ -1,5 +1,7 @@
|
|
|
|
|
# Twisted/Klein imports
|
|
|
|
|
from twisted.logger import Logger
|
|
|
|
|
from twisted.internet import reactor
|
|
|
|
|
from twisted.internet.task import LoopingCall, deferLater
|
|
|
|
|
|
|
|
|
|
# Other library imports
|
|
|
|
|
from httpx import ReadTimeout, ReadError, RemoteProtocolError
|
|
|
|
@ -9,6 +11,12 @@ log = Logger("util.global")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def xmerge_attrs(init_map):
|
|
|
|
|
"""
|
|
|
|
|
Given a dictionary of strings and classes, set all corresponding class.<string> attributes
|
|
|
|
|
on each class, to every other class.
|
|
|
|
|
"a": A(), "b": B() -> A.b = B_instance, B.a = A_instance
|
|
|
|
|
:param init_map: dict of class names to classes
|
|
|
|
|
"""
|
|
|
|
|
for classname, object_instance in init_map.items():
|
|
|
|
|
# notify, Notify
|
|
|
|
|
for classname_inside, object_instance_inside in init_map.items():
|
|
|
|
@ -17,6 +25,26 @@ def xmerge_attrs(init_map):
|
|
|
|
|
setattr(object_instance, classname_inside, object_instance_inside)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def setup_call_loops(token_setting, function_init, function_continuous, delay, function_post_start=None):
|
|
|
|
|
"""
|
|
|
|
|
Setup the loops for dealing with access, refresh and auth tokens for various providers.
|
|
|
|
|
:param token_setting: the setting for whether to do the initial authentication
|
|
|
|
|
:param function_init: the initial authentication function
|
|
|
|
|
:param function_continuous: the ongoing authentication function (refresh_token -> access_token)
|
|
|
|
|
:param delay: time in seconds to wait between calls to function_continuous
|
|
|
|
|
:param function_post_start: an optional function to run after the access token is obtained
|
|
|
|
|
"""
|
|
|
|
|
if token_setting == "1":
|
|
|
|
|
deferLater(reactor, 1, function_init)
|
|
|
|
|
else:
|
|
|
|
|
deferLater(reactor, 1, function_continuous, True)
|
|
|
|
|
if function_post_start:
|
|
|
|
|
deferLater(reactor, 4, function_post_start)
|
|
|
|
|
|
|
|
|
|
lc = LoopingCall(function_continuous)
|
|
|
|
|
lc.start(delay)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def convert(data):
|
|
|
|
|
"""
|
|
|
|
|
Recursively convert a dictionary.
|
|
|
|
@ -48,7 +76,19 @@ def last_online_recent(date):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def handle_exceptions(func):
|
|
|
|
|
"""
|
|
|
|
|
Wrapper helper to handle Agora API errors.
|
|
|
|
|
:param func: function to wrap
|
|
|
|
|
:rtype: func
|
|
|
|
|
:return: the wrapped function
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def inner_function(*args, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
Inner wrapper helper.
|
|
|
|
|
:rtype: any or bool
|
|
|
|
|
:return: False or the normal return
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
rtrn = func(*args, **kwargs)
|
|
|
|
|
except (ReadTimeout, ReadError, RemoteProtocolError):
|
|
|
|
|