Rate limit requests made by steam:queue-users-recent-apps

Fixes #32
This commit is contained in:
ilumos 2020-05-13 23:21:52 +01:00
parent 68d6001838
commit 6ad33cf140
4 changed files with 146 additions and 12 deletions

1
.gitignore vendored
View file

@ -6,3 +6,4 @@ database.sqlite
.DS_Store
.swp
*.txt
*.bucket

View file

@ -11,16 +11,17 @@
"keywords": ["lanager", "lan", "party", "lancache", "steamcache"],
"license": "AGPL-3.0",
"require": {
"illuminate/console": "5.5.*",
"illuminate/support": "5.5.*",
"illuminate/container": "5.5.*",
"illuminate/events": "5.5.*",
"illuminate/database": "5.5.*",
"illuminate/translation": "5.5.*",
"bandwidth-throttle/token-bucket": "^2.0",
"guzzlehttp/guzzle": "^6.3",
"illuminate/console": "5.5.*",
"illuminate/container": "5.5.*",
"illuminate/database": "5.5.*",
"illuminate/events": "5.5.*",
"illuminate/support": "5.5.*",
"illuminate/translation": "5.5.*",
"symfony/process": "^3.3",
"vlucas/phpdotenv": "^2.4",
"syntax/steam-api": "2.0.*"
"syntax/steam-api": "2.0.*",
"vlucas/phpdotenv": "^2.4"
},
"autoload": {
"psr-4": {"Zeropingheroes\\LancacheAutofill\\": "src/"}

117
composer.lock generated
View file

@ -4,8 +4,64 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "a67ae95addd33b471f75b6722fe32b6e",
"content-hash": "bc39ae19d7d209f1f067847f7f22e792",
"packages": [
{
"name": "bandwidth-throttle/token-bucket",
"version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/bandwidth-throttle/token-bucket.git",
"reference": "a0c31a4d0fbcf0c1a68c895fc91bf71455bcec08"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bandwidth-throttle/token-bucket/zipball/a0c31a4d0fbcf0c1a68c895fc91bf71455bcec08",
"reference": "a0c31a4d0fbcf0c1a68c895fc91bf71455bcec08",
"shasum": ""
},
"require": {
"ext-bcmath": "*",
"malkusch/lock": "^1",
"php": ">=5.6"
},
"require-dev": {
"ext-redis": "^2.2.4|^3",
"mikey179/vfsstream": "^1.5.0",
"php-mock/php-mock-phpunit": "^1",
"phpunit/phpunit": "^5",
"predis/predis": "^1"
},
"type": "library",
"autoload": {
"psr-4": {
"bandwidthThrottle\\tokenBucket\\": "classes/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"WTFPL"
],
"authors": [
{
"name": "Markus Malkusch",
"email": "markus@malkusch.de",
"homepage": "http://markus.malkusch.de",
"role": "Developer"
}
],
"description": "Implementation of the Token Bucket algorithm.",
"homepage": "https://github.com/bandwidth-throttle/token-bucket",
"keywords": [
"bandwidth",
"rate limit",
"rate limiting",
"throttle",
"throttling",
"token bucket"
],
"time": "2017-10-13T19:09:01+00:00"
},
{
"name": "doctrine/inflector",
"version": "v1.3.0",
@ -629,6 +685,65 @@
],
"time": "2018-11-23T23:41:29+00:00"
},
{
"name": "malkusch/lock",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/malkusch/lock.git",
"reference": "5555f291092a0ed5ab4f02d8be7031b877d8d165"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/malkusch/lock/zipball/5555f291092a0ed5ab4f02d8be7031b877d8d165",
"reference": "5555f291092a0ed5ab4f02d8be7031b877d8d165",
"shasum": ""
},
"require": {
"php": ">=5.6",
"psr/log": "^1"
},
"require-dev": {
"ext-redis": "^2.2.4|^3",
"kriswallsmith/spork": "^0.3",
"mikey179/vfsstream": "^1.5.0",
"php-mock/php-mock-phpunit": "^1",
"phpunit/phpunit": "^5",
"predis/predis": "~1.0",
"zetacomponents/system-information": "~1.1"
},
"type": "library",
"autoload": {
"psr-4": {
"malkusch\\lock\\": "classes/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"WTFPL"
],
"authors": [
{
"name": "Markus Malkusch",
"email": "markus@malkusch.de",
"homepage": "http://markus.malkusch.de",
"role": "Developer"
}
],
"description": "Mutex library for exclusive code execution.",
"homepage": "https://github.com/malkusch/lock",
"keywords": [
"cas",
"flock",
"lock",
"memcache",
"mutex",
"redis",
"redlock",
"semaphore"
],
"time": "2016-08-05T11:03:36+00:00"
},
{
"name": "monolog/monolog",
"version": "1.24.0",

View file

@ -5,6 +5,10 @@ namespace Zeropingheroes\LancacheAutofill\Commands\Steam;
use Illuminate\Console\Command;
use Zeropingheroes\LancacheAutofill\Models\SteamQueueItem;
use Steam;
use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\BlockingConsumer;
use bandwidthThrottle\tokenBucket\storage\FileStorage;
class QueueUsersRecentApps extends Command
{
@ -56,10 +60,22 @@ class QueueUsersRecentApps extends Command
return trim($steamId);
});
$users = Steam::user($steamIds[0])->GetPlayerSummaries($steamIds);
// Rate limit requests to 200 requests every 5 minutes, to match Steam's rate limit
$storage = new FileStorage(base_path('steam-api.bucket')); // store state in base directory
$rate = new Rate(40, Rate::MINUTE); // add 40 tokens every minute (= 200 over 5 minutes)
$bucket = new TokenBucket(200, $rate, $storage); // bucket can never have more than 200 tokens saved up
$consumer = new BlockingConsumer($bucket); // if no tokens are available, block further execution until there are tokens
$bucket->bootstrap(200); // fill the bucket with 200 tokens initially
$chunkedSteamIds = array_chunk($steamIds, 10);
$users = [];
foreach($chunkedSteamIds as $chunkOf100SteamIds) {
$consumer->consume(1);
$users = array_merge($users, Steam::user($chunkOf100SteamIds[0])->GetPlayerSummaries($chunkOf100SteamIds));
}
foreach ($users as $user) {
$this->info('');
if ($user->communityVisibilityState != 3) {
@ -67,6 +83,7 @@ class QueueUsersRecentApps extends Command
continue;
}
$consumer->consume(1);
$apps = Steam::player($user->steamId)->GetRecentlyPlayedGames();
if (empty($apps)) {