diff --git a/app/Console/Commands/MempoolSpace/CacheRecommendedFees.php b/app/Console/Commands/MempoolSpace/CacheRecommendedFees.php new file mode 100644 index 00000000..3910bd6e --- /dev/null +++ b/app/Console/Commands/MempoolSpace/CacheRecommendedFees.php @@ -0,0 +1,49 @@ +json(); + + $result = $client->completions() + ->create([ + 'model' => 'text-davinci-003', + 'prompt' => sprintf('Erstelle einen Wetterbericht für den Bitcoin Mempool mit folgenden Gebühren: fastestFee: %s sat/vB, halfHourFee: %s sat/vB, hourFee: %s sat/vB, economyFee: %s sat/vB, minimumFee: %s sat/vB. Fasse mit maximal 400 Zeichen zusammen und schreibe im Stile eines Wetterberichtes aus dem Fernsehen um.', + $result['fastestFee'], + $result['halfHourFee'], + $result['hourFee'], + $result['economyFee'], + $result['minimumFee'] + ), + 'max_tokens' => 400, + 'temperature' => 1 + ]); + + cache()->put('mempool-weather', $result['choices'][0]['text'], now()->addMinutes(62)); + } +} diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php new file mode 100644 index 00000000..53c27951 --- /dev/null +++ b/app/Console/Commands/Test.php @@ -0,0 +1,50 @@ +json(); + + $result = $client->completions() + ->create([ + 'model' => 'text-davinci-003', + 'prompt' => sprintf('Erstelle einen Wetterbericht für den Bitcoin Mempool mit folgenden Gebühren: fastestFee: %s sat/vB, halfHourFee: %s sat/vB, hourFee: %s sat/vB, economyFee: %s sat/vB, minimumFee: %s sat/vB. Fasse mit maximal 400 Zeichen zusammen und schreibe im Stile eines Wetterberichtes aus dem Fernsehen um.', + $result['fastestFee'], + $result['halfHourFee'], + $result['hourFee'], + $result['economyFee'], + $result['minimumFee'] + ), + 'max_tokens' => 400, + 'temperature' => 1 + ]); + + cache()->put('mempool-weather', $result['choices'][0]['text'], now()->addMinutes(60)); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 38e19d44..107bde7f 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -4,6 +4,7 @@ namespace App\Console; use App\Console\Commands\Database\CleanupLoginKeys; use App\Console\Commands\Feed\ReadAndSyncPodcastFeeds; +use App\Console\Commands\MempoolSpace\CacheRecommendedFees; use App\Console\Commands\Nostr\PublishUnpublishedItems; use App\Console\Commands\OpenBooks\SyncOpenBooks; use Illuminate\Console\Scheduling\Schedule; @@ -22,6 +23,7 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule): void { + $schedule->command(CacheRecommendedFees::class)->hourly(); $schedule->call(new PruneStaleAttachments) ->daily(); $schedule->command(SyncOpenBooks::class) diff --git a/app/Http/Livewire/Banner/MempoolWeather.php b/app/Http/Livewire/Banner/MempoolWeather.php new file mode 100644 index 00000000..0e03c0a5 --- /dev/null +++ b/app/Http/Livewire/Banner/MempoolWeather.php @@ -0,0 +1,40 @@ +has('mempool-weather')) { + $this->weather = cache()->get('mempool-weather'); + } else { + Artisan::call('test'); + $this->weather = cache()->get('mempool-weather'); + } + $result = Http::get('https://mempool.space/api/v1/fees/recommended'); + $result = $result->json(); + $this->fastestFee = $result['fastestFee']; + $this->halfHourFee = $result['halfHourFee']; + $this->hourFee = $result['hourFee']; + $this->economyFee = $result['economyFee']; + $this->minimumFee = $result['minimumFee']; + } + + public function render() + { + return view('livewire.banner.mempool-weather'); + } +} diff --git a/composer.json b/composer.json index 4e53054f..2c1fa505 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,7 @@ "maatwebsite/excel": "^3.1", "nova/start": "*", "oneduo/nova-time-field": "^1.0", + "openai-php/client": "^0.4.1", "podcastindex/podcastindex-php": "^1.0", "pusher/pusher-php-server": "^7.2.2", "qcod/laravel-gamify": "dev-master#6c0a55cf5351be5e7b4f31aa2499984853d895cf", diff --git a/composer.lock b/composer.lock index 0a136c14..c1d6eb01 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "10cbc0cb01e1977c4c976223bd697558", + "content-hash": "b2f000a7c7d14f41df877996099dbe51", "packages": [ { "name": "akuechler/laravel-geoly", @@ -5853,6 +5853,96 @@ }, "time": "2022-11-18T17:20:22+00:00" }, + { + "name": "openai-php/client", + "version": "v0.4.1", + "source": { + "type": "git", + "url": "https://github.com/openai-php/client.git", + "reference": "b16dbad9ac6507f7d9a3ec365b906f659e50e2b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openai-php/client/zipball/b16dbad9ac6507f7d9a3ec365b906f659e50e2b9", + "reference": "b16dbad9ac6507f7d9a3ec365b906f659e50e2b9", + "shasum": "" + }, + "require": { + "php": "^8.1.0", + "php-http/discovery": "^1.15.2", + "php-http/multipart-stream-builder": "^1.2.0", + "psr/http-client": "^1.0.1", + "psr/http-client-implementation": "^1.0.1", + "psr/http-factory-implementation": "*", + "psr/http-message": "^1.0.1" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.5.0", + "laravel/pint": "^1.7.0", + "nunomaduro/collision": "^7.3.3", + "pestphp/pest": "^2.2.3", + "pestphp/pest-plugin-arch": "^2.0.2", + "pestphp/pest-plugin-mock": "^2.0.0", + "phpstan/phpstan": "^1.10.8", + "rector/rector": "^0.14.8", + "symfony/var-dumper": "^6.2.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/OpenAI.php" + ], + "psr-4": { + "OpenAI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + }, + { + "name": "Sandro Gehri" + } + ], + "description": "OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API", + "keywords": [ + "GPT-3", + "api", + "client", + "codex", + "dall-e", + "language", + "natural", + "openai", + "php", + "processing", + "sdk" + ], + "support": { + "issues": "https://github.com/openai-php/client/issues", + "source": "https://github.com/openai-php/client/tree/v0.4.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2023-03-24T11:41:32+00:00" + }, { "name": "openspout/openspout", "version": "v4.13.0", @@ -6549,6 +6639,68 @@ }, "time": "2015-12-19T14:08:53+00:00" }, + { + "name": "php-http/multipart-stream-builder", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "11c1d31f72e01c738bbce9e27649a7cca829c30e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/11c1d31f72e01c738bbce9e27649a7cca829c30e", + "reference": "11c1d31f72e01c738bbce9e27649a7cca829c30e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.7", + "php-http/message-factory": "^1.0.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\MultipartStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], + "support": { + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.2.0" + }, + "time": "2021-05-21T08:32:01+00:00" + }, { "name": "php-http/promise", "version": "1.1.0", diff --git a/config/services.php b/config/services.php index d1d2888b..8dcc1463 100644 --- a/config/services.php +++ b/config/services.php @@ -2,6 +2,10 @@ return [ + 'open-ai' => [ + 'apiKey' => env('OPEN_AI_API_KEY'), + ], + 'horizon' => [ 'secret' => env('HORIZON_SECRET'), ], @@ -19,10 +23,10 @@ return [ */ 'mailgun' => [ - 'domain' => env('MAILGUN_DOMAIN'), - 'secret' => env('MAILGUN_SECRET'), + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), - 'scheme' => 'https', + 'scheme' => 'https', ], 'postmark' => [ @@ -30,16 +34,16 @@ return [ ], 'ses' => [ - 'key' => env('AWS_ACCESS_KEY_ID'), + 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], 'twitter' => [ - 'oauth' => 2, - 'client_id' => env('TWITTER_CLIENT_ID'), + 'oauth' => 2, + 'client_id' => env('TWITTER_CLIENT_ID'), 'client_secret' => env('TWITTER_CLIENT_SECRET'), - 'redirect' => env('TWITTER_REDIRECT_URI'), + 'redirect' => env('TWITTER_REDIRECT_URI'), ], ]; diff --git a/resources/views/livewire/banner/mempool-weather.blade.php b/resources/views/livewire/banner/mempool-weather.blade.php new file mode 100644 index 00000000..6b67f589 --- /dev/null +++ b/resources/views/livewire/banner/mempool-weather.blade.php @@ -0,0 +1,220 @@ +