Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/tuyanet.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-04-07 17:58:50 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-04-07 17:58:50 +0300
commite0e54ef0c9f95fa670474e8e51a6e722af3c4134 (patch)
treec52d0fbfaeb3a3bbbade61abc321d045fbd52765
parent24dac332ee24c938b9c7da2c3e4636e1df5b8eb6 (diff)
Force access token refresh
-rw-r--r--TuyaApi.cs21
-rw-r--r--TuyaDevice.cs11
2 files changed, 18 insertions, 14 deletions
diff --git a/TuyaApi.cs b/TuyaApi.cs
index aa62616..a580298 100644
--- a/TuyaApi.cs
+++ b/TuyaApi.cs
@@ -111,8 +111,9 @@ namespace com.clusterrr.TuyaNet
/// <param name="body">Body of request if any.</param>
/// <param name="headers">Additional headers.</param>
/// <param name="noToken">Execute query without token.</param>
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
/// <returns>JSON string with response.</returns>
- public async Task<string> RequestAsync(Method method, string uri, string body = null, Dictionary<string, string> headers = null, bool noToken = false)
+ public async Task<string> RequestAsync(Method method, string uri, string body = null, Dictionary<string, string> headers = null, bool noToken = false, bool forceTokenRefresh = false)
{
while (uri.StartsWith("/")) uri = uri.Substring(1);
var urlHost = RegionToHost(region);
@@ -137,7 +138,7 @@ namespace com.clusterrr.TuyaNet
}
else
{
- await RefreshAccessTokenAsync();
+ await RefreshAccessTokenAsync(forceTokenRefresh);
payload = accessId + token.AccessToken + now;
}
@@ -193,9 +194,9 @@ namespace com.clusterrr.TuyaNet
/// <summary>
/// Request access token if it's expired or not requested yet.
/// </summary>
- private async Task RefreshAccessTokenAsync()
+ private async Task RefreshAccessTokenAsync(bool force = false)
{
- if ((token == null) || (tokenTime.AddSeconds(token.ExpireTime) >= DateTime.Now))
+ if (force || (token == null) || (tokenTime.AddSeconds(token.ExpireTime) >= DateTime.Now))
{
var uri = "v1.0/token?grant_type=1";
var response = await RequestAsync(Method.GET, uri, noToken: true);
@@ -208,11 +209,12 @@ namespace com.clusterrr.TuyaNet
/// Requests info about device by it's ID.
/// </summary>
/// <param name="deviceId">Device ID.</param>
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
/// <returns>Device info.</returns>
- public async Task<TuyaDeviceApiInfo> GetDeviceInfoAsync(string deviceId)
+ public async Task<TuyaDeviceApiInfo> GetDeviceInfoAsync(string deviceId, bool forceTokenRefresh = false)
{
var uri = $"v1.0/devices/{deviceId}";
- var response = await RequestAsync(Method.GET, uri);
+ var response = await RequestAsync(Method.GET, uri, forceTokenRefresh: forceTokenRefresh);
var device = JsonConvert.DeserializeObject<TuyaDeviceApiInfo>(response);
return device;
}
@@ -221,12 +223,13 @@ namespace com.clusterrr.TuyaNet
/// Requests info about all registered devices, requires ID of any registered device.
/// </summary>
/// <param name="anyDeviceId">ID of any registered device.</param>
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
/// <returns>Array of devices info.</returns>
- public async Task<TuyaDeviceApiInfo[]> GetAllDevicesInfoAsync(string anyDeviceId)
+ public async Task<TuyaDeviceApiInfo[]> GetAllDevicesInfoAsync(string anyDeviceId, bool forceTokenRefresh = false)
{
- var userId = (await GetDeviceInfoAsync(anyDeviceId)).UserId;
+ var userId = (await GetDeviceInfoAsync(anyDeviceId, forceTokenRefresh: forceTokenRefresh)).UserId;
var uri = $"v1.0/users/{userId}/devices";
- var response = await RequestAsync(Method.GET, uri);
+ var response = await RequestAsync(Method.GET, uri, forceTokenRefresh: false); // Token already refreshed
var devices = JsonConvert.DeserializeObject<TuyaDeviceApiInfo[]>(response);
return devices;
}
diff --git a/TuyaDevice.cs b/TuyaDevice.cs
index 83523b4..f5e0b78 100644
--- a/TuyaDevice.cs
+++ b/TuyaDevice.cs
@@ -169,7 +169,7 @@ namespace com.clusterrr.TuyaNet
client = new TcpClient(IP, Port);
var stream = client.GetStream();
await stream.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
- return await Receive(stream, nullRetries);
+ return await ReceiveAsync(stream, nullRetries);
}
catch (Exception ex) when (ex is IOException or TimeoutException)
{
@@ -191,7 +191,7 @@ namespace com.clusterrr.TuyaNet
throw lastException;
}
- private async Task<byte[]> Receive(NetworkStream stream, int nullRetries = 1)
+ private async Task<byte[]> ReceiveAsync(NetworkStream stream, int nullRetries = 1)
{
byte[] result;
byte[] buffer = new byte[1024];
@@ -225,7 +225,7 @@ namespace com.clusterrr.TuyaNet
{
try
{
- result = await Receive(stream, nullRetries - 1);
+ result = await ReceiveAsync(stream, nullRetries - 1);
}
catch { }
}
@@ -383,12 +383,13 @@ namespace com.clusterrr.TuyaNet
/// <summary>
/// Get current local key from Tuya Cloud API
/// </summary>
- public async Task RefreshLocalKeyAsync()
+ /// <param name="forceTokenRefresh">Refresh access token even it's not expired.</param>
+ public async Task RefreshLocalKeyAsync(bool forceTokenRefresh = false)
{
if (string.IsNullOrEmpty(accessId)) throw new ArgumentException("Access ID is not specified", "accessId");
if (string.IsNullOrEmpty(apiSecret)) throw new ArgumentException("API secret is not specified", "apiSecret");
var api = new TuyaApi(region, accessId, apiSecret);
- var deviceInfo = await api.GetDeviceInfoAsync(DeviceId);
+ var deviceInfo = await api.GetDeviceInfoAsync(DeviceId, forceTokenRefresh: forceTokenRefresh);
LocalKey = deviceInfo.LocalKey;
}