Skip to content

Commit 861188d

Browse files
committed
Add Throttling when resource ratelimit is reached
1 parent 6f0e048 commit 861188d

128 files changed

Lines changed: 170 additions & 143 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

APIHelper/New-APIHelperFunction.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ $($HelpParameters -Join "`r`n")
5858
`$ResourceUrl = `$ResourceUrl -Replace `$UrlParameter.Value, `$UrlParameterValue
5959
}
6060
61-
If (-Not `$OAuthSettings) { `$OAuthSettings = Get-TwitterOAuthSettings -Resource `$Resource }
61+
`$OAuthSettings = Get-TwitterOAuthSettings -Resource `$Resource
6262
Invoke-TwitterAPI -Method `$Method -ResourceUrl `$ResourceUrl -Parameters `$Parameters -OAuthSettings `$OAuthSettings
6363
6464
}

PSTwitterAPI/public/helper/Get-TwitterApplication_RateLimitStatus.ps1 renamed to PSTwitterAPI/public/Get-TwitterApplication_RateLimitStatus.ps1

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@
2828
#>
2929
[CmdletBinding()]
3030
Param(
31-
[string]$resources
31+
[string]$resources,
32+
[hashtable]$OAuthSettings
3233
)
3334
Begin {
3435

3536
[hashtable]$Parameters = $PSBoundParameters
3637
$CmdletBindingParameters | ForEach-Object { $Parameters.Remove($_) }
38+
$Parameters.Remove('OAuthSettings')
3739

3840
[string]$Method = 'GET'
3941
[string]$Resource = '/application/rate_limit_status'
@@ -49,7 +51,7 @@
4951
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
5052
}
5153

52-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
54+
If (!$OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
5355
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Parameters $Parameters -OAuthSettings $OAuthSettings
5456

5557
}
Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,52 @@
11
function Get-TwitterOAuthSettings {
22

33
[CmdletBinding()]
4-
Param($Resource, $AccessToken)
4+
Param($Resource, $AccessToken, [switch]$Quiet)
55

66
If ($Resource) {
77

8-
$AccessToken = $Script:OAuthCollection.RateLimitStatus |
9-
Where-Object { $_.resource -eq "/$Resource" } |
10-
Sort-Object @{expression="remaining";Descending=$true}, @{expression="reset";Ascending=$true} |
11-
Select-Object -First 1 -Expand AccessToken
8+
# Get the next available OAuth with available resources
9+
$RateLimitStatus = $Script:OAuthCollection.RateLimitStatus |
10+
Where-Object { $_.resource -eq "$Resource" } |
11+
Sort-Object @{expression="remaining";Descending=$true}, @{expression="reset";Ascending=$true} |
12+
Select-Object -First 1 |
13+
ForEach-Object { $_.remaining += -1; Return $_ }
14+
15+
Write-Verbose "resource: $($RateLimitStatus.resource), limit: $($RateLimitStatus.limit), remaining: $($RateLimitStatus.remaining), reset: $($RateLimitStatus.reset)"
1216

13-
}
17+
$AccessToken = $RateLimitStatus.AccessToken
1418

15-
If ($AccessToken) {
19+
If ($RateLimitStatus.remaining -lt 0) {
1620

17-
$OAuthSettings = $Script:OAuthCollection.Where({$_.AccessToken -eq $AccessToken}) | Select-Object -First 1
21+
# Refresh the RateLimitStatus so we throttle an accurate value
22+
$OAuthSettings = $Script:OAuthCollection.Where({$_.AccessToken -eq $AccessToken}) | Select-Object -First 1
23+
$OAuthSettings = Set-TwitterOAuthSettings -ApiKey $OAuthSettings.ApiKey -ApiSecret $OAuthSettings.ApiSecret -AccessToken $OAuthSettings.AccessToken -AccessTokenSecret $OAuthSettings.AccessTokenSecret -PassThru -Force
1824

19-
} Else {
25+
$RateLimitStatus = $OAuthSettings.RateLimitStatus | Where-Object { $_.resource -eq "$Resource" } |
26+
ForEach-Object { $_.remaining += -1; Return $_ }
27+
28+
If ($RateLimitStatus.remaining -lt 0) {
29+
30+
# Throttle... you're going way too fast cowboy!
31+
$SleepSeconds = $RateLimitStatus.reset - (Get-Eposh).TotalSeconds + 1
32+
Write-Warning "Throttling for ${SleepSeconds} seconds."
33+
Start-Sleep -Seconds $SleepSeconds
34+
35+
}
36+
37+
}
2038

21-
$OAuthSettings = $Script:OAuthCollection | Get-Random
2239

2340
}
2441

42+
43+
If ($AccessToken) {
44+
$OAuthSettings = $Script:OAuthCollection.Where({$_.AccessToken -eq $AccessToken}) | Select-Object -First 1
45+
} Else {
46+
$OAuthSettings = $Script:OAuthCollection | Select-Object -First 1
47+
}
48+
49+
2550
If ($OAuthSettings) {
2651
Write-Verbose "Using AccessToken '$($OAuthSettings.AccessToken)'"
2752
$OAuthSettings = @{
@@ -30,11 +55,11 @@ function Get-TwitterOAuthSettings {
3055
AccessToken = $OAuthSettings.AccessToken
3156
AccessTokenSecret = $OAuthSettings.AccessTokenSecret
3257
}
33-
} Else {
34-
$OAuthSettings = $null
35-
Write-Warning "No OAuthSettings was found. Use 'Set-TwitterOAuthSettings' to set PSTwitterAPI ApiKey & Token."
58+
Return $OAuthSettings
3659
}
3760

38-
Return $OAuthSettings
61+
If ($Quiet.IsPresent -eq $false) {
62+
Throw "No OAuthSettings was found. Use 'Set-TwitterOAuthSettings' to set PSTwitterAPI ApiKey & Token."
63+
}
3964

4065
}

PSTwitterAPI/public/Send-TwitterDirectMessages_EventsNew.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
5252
}
5353

54-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
54+
$OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource
5555
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Body $Body -OAuthSettings $OAuthSettings
5656

5757
}

PSTwitterAPI/public/Set-TwitterOAuthSettings.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function Set-TwitterOAuthSettings {
1111
)
1212
Process {
1313

14-
If ($OAuthSettings = Get-TwitterOAuthSettings -AccessToken $AccessToken -ErrorAction SilentlyContinue) {
14+
If ($OAuthSettings = Get-TwitterOAuthSettings -AccessToken $AccessToken -Quiet) {
1515
If ($Force) {
1616
[void]$Script:OAuthCollection.Remove($OAuthSettings)
1717
} Else {
@@ -26,7 +26,7 @@ function Set-TwitterOAuthSettings {
2626
AccessTokenSecret = $AccessTokenSecret
2727
}
2828

29-
$RateLimitStatus = Get-TwitterApplication_RateLimitStatus
29+
$RateLimitStatus = Get-TwitterApplication_RateLimitStatus -OAuthSettings $OAuthSettings
3030
If ($RateLimitStatus.rate_limit_context.access_token -ne $AccessToken) { Throw 'RateLimitStatus was returned for the wrong AccessToken.'}
3131

3232
$OAuthSettings['RateLimitStatus'] = ConvertFrom-RateLimitStatus -RateLimitStatus $RateLimitStatus

PSTwitterAPI/public/helper/Get-TwitterAccount_Settings.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
3838
}
3939

40-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
40+
$OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource
4141
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Parameters $Parameters -OAuthSettings $OAuthSettings
4242

4343
}

PSTwitterAPI/public/helper/Get-TwitterAccount_VerifyCredentials.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
5656
}
5757

58-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
58+
$OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource
5959
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Parameters $Parameters -OAuthSettings $OAuthSettings
6060

6161
}

PSTwitterAPI/public/helper/Get-TwitterBlocks_Ids.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ The response from the API will include a previous_cursor and next_cursor to allo
4646
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
4747
}
4848

49-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
49+
$OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource
5050
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Parameters $Parameters -OAuthSettings $OAuthSettings
5151

5252
}

PSTwitterAPI/public/helper/Get-TwitterBlocks_List.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ The response from the API will include a previous_cursor and next_cursor to allo
5050
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
5151
}
5252

53-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
53+
$OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource
5454
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Parameters $Parameters -OAuthSettings $OAuthSettings
5555

5656
}

PSTwitterAPI/public/helper/Get-TwitterCollections_Entries.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
$ResourceUrl = $ResourceUrl -Replace $UrlParameter.Value, $UrlParameterValue
5656
}
5757

58-
If (-Not $OAuthSettings) { $OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource }
58+
$OAuthSettings = Get-TwitterOAuthSettings -Resource $Resource
5959
Invoke-TwitterAPI -Method $Method -ResourceUrl $ResourceUrl -Parameters $Parameters -OAuthSettings $OAuthSettings
6060

6161
}

0 commit comments

Comments
 (0)