diff --git a/.env.example b/.env.example index 7e3a0e6e87..c574f0a631 100644 --- a/.env.example +++ b/.env.example @@ -189,6 +189,14 @@ NTFY_AUTH_ENABLED=false NTFY_AUTH_USERNAME= NTFY_AUTH_PASSWORD= +# +# Pushover notification Application/API Token and User token. +# Used if you want to receive notifications over pushover. +# Both must be configured for this channel to work. +# +PUSHOVER_APP_TOKEN= +PUSHOVER_USER_TOKEN= + # Firefly III can send you the following messages. SEND_ERROR_MESSAGE=true diff --git a/app/Handlers/Events/AdminEventHandler.php b/app/Handlers/Events/AdminEventHandler.php index f6b5468355..88c5ab4a08 100644 --- a/app/Handlers/Events/AdminEventHandler.php +++ b/app/Handlers/Events/AdminEventHandler.php @@ -32,6 +32,7 @@ use FireflyIII\Notifications\Admin\VersionCheckResult; use FireflyIII\Notifications\Test\TestNotificationDiscord; use FireflyIII\Notifications\Test\TestNotificationEmail; use FireflyIII\Notifications\Test\TestNotificationNtfy; +use FireflyIII\Notifications\Test\TestNotificationPushover; use FireflyIII\Notifications\Test\TestNotificationSlack; use FireflyIII\Repositories\User\UserRepositoryInterface; use Illuminate\Support\Facades\Log; @@ -134,6 +135,9 @@ class AdminEventHandler case 'ntfy': $class = TestNotificationNtfy::class; break; + case 'pushover': + $class = TestNotificationPushover::class; + break; default: app('log')->error(sprintf('Unknown channel "%s" in sendTestNotification method.', $event->channel)); return; diff --git a/app/Http/Controllers/Admin/NotificationController.php b/app/Http/Controllers/Admin/NotificationController.php index a8fcc84e7e..d1fc043742 100644 --- a/app/Http/Controllers/Admin/NotificationController.php +++ b/app/Http/Controllers/Admin/NotificationController.php @@ -65,6 +65,12 @@ class NotificationController extends Controller $forcedAvailability['ntfy'] = false; } + // validate pushover + if('' === (string)config('services.pushover.token') || '' === (string)config('services.pushover.user_token')) { + Log::warning('No Pushover token, channel is disabled.'); + $forcedAvailability['pushover'] = false; + } + return view('admin.notifications.index', compact('title', 'subTitle', 'forcedAvailability', 'mainTitleIcon', 'subTitleIcon', 'channels', 'slackUrl', 'notifications')); } @@ -101,6 +107,7 @@ class NotificationController extends Controller break; case 'email': case 'slack': + case 'pushover': case 'ntfy': /** @var User $user */ $user = auth()->user(); diff --git a/app/Notifications/Test/TestNotificationPushover.php b/app/Notifications/Test/TestNotificationPushover.php new file mode 100644 index 0000000000..4c2ea8d0e5 --- /dev/null +++ b/app/Notifications/Test/TestNotificationPushover.php @@ -0,0 +1,115 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Notifications\Test; + +use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Messages\MailMessage; +use Illuminate\Notifications\Notification; +use Illuminate\Support\Facades\Log; +use NotificationChannels\Pushover\PushoverChannel; +use NotificationChannels\Pushover\PushoverMessage; +use Ntfy\Message; +use Wijourdil\NtfyNotificationChannel\Channels\NtfyChannel; + +//use Illuminate\Notifications\Slack\SlackMessage; + +/** + * Class TestNotification + */ +class TestNotificationPushover extends Notification +{ + use Queueable; + + private string $address; + + /** + * Create a new notification instance. + */ + public function __construct(string $address) + { + $this->address = $address; + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @return array + */ + public function toArray($notifiable) + { + return [ + ]; + } + + + public function toPushover(mixed $notifiable): PushoverMessage + { + Log::debug('Now in toPushover()'); + return PushoverMessage::create((string)trans('email.admin_test_message', ['channel' => 'Pushover'])) + ->title((string)trans('email.admin_test_subject')); + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @return MailMessage + */ + public function toMail($notifiable) + { + } + + /** + * Get the Slack representation of the notification. + * + * @param mixed $notifiable + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + */ + public function toSlack($notifiable) { + } + + /** + * Get the notification's delivery channels. + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param mixed $notifiable + * + * @return array + */ + public function via($notifiable) + { + return [PushoverChannel::class]; + } +} diff --git a/app/User.php b/app/User.php index 32f8346113..c11762991d 100644 --- a/app/User.php +++ b/app/User.php @@ -66,6 +66,7 @@ use Illuminate\Support\Collection; use Illuminate\Support\Str; use Laravel\Passport\HasApiTokens; use Laravel\Passport\Token; +use NotificationChannels\Pushover\PushoverReceiver; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** @@ -101,6 +102,12 @@ class User extends Authenticatable throw new NotFoundHttpException(); } + public function routeNotificationForPushover() + { + return PushoverReceiver::withUserKey((string) config('services.pushover.user_token')) + ->withApplicationToken((string) config('services.pushover.token')); + //return (string) config('services.pushover.token'); + } /** * Link to accounts. diff --git a/composer.json b/composer.json index c4f2819234..a7ab2de8c6 100644 --- a/composer.json +++ b/composer.json @@ -90,6 +90,7 @@ "jc5/recovery": "^2", "laravel-json-api/laravel": "^4.0", "laravel-json-api/non-eloquent": "^4.0", + "laravel-notification-channels/pushover": "^4.0", "laravel/framework": "^11", "laravel/passport": "^12", "laravel/sanctum": "^4", diff --git a/composer.lock b/composer.lock index 247d762df3..c70ae2e69d 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": "a2800d2f481f640d8cd058b3b31e8962", + "content-hash": "a739782c3c7121d1e9c0d31105b5974a", "packages": [ { "name": "bacon/bacon-qr-code", @@ -2546,6 +2546,68 @@ }, "time": "2024-06-20T19:46:31+00:00" }, + { + "name": "laravel-notification-channels/pushover", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/laravel-notification-channels/pushover.git", + "reference": "31ff8c124f54de69673145c90836dd6cf7a01223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-notification-channels/pushover/zipball/31ff8c124f54de69673145c90836dd6cf7a01223", + "reference": "31ff8c124f54de69673145c90836dd6cf7a01223", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0.1", + "illuminate/notifications": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "php": "^8.1" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": ">=0.1.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^8.0 || ^9.0", + "phpunit/phpunit": "^9.3 || ^10.5" + }, + "suggest": { + "ext-exif": "Required for image attachment support" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NotificationChannels\\Pushover\\PushoverServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NotificationChannels\\Pushover\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Casper Boone", + "email": "mail@casperboone.nl", + "homepage": "https://casperboone.nl", + "role": "Developer" + } + ], + "description": "Pushover notifications for Laravel.", + "homepage": "https://github.com/laravel-notification-channels/pushover", + "support": { + "issues": "https://github.com/laravel-notification-channels/pushover/issues", + "source": "https://github.com/laravel-notification-channels/pushover/tree/4.0.0" + }, + "time": "2024-03-20T08:14:56+00:00" + }, { "name": "laravel/framework", "version": "v11.34.0", diff --git a/config/notifications.php b/config/notifications.php index a5f728e4fc..de0fb4864a 100644 --- a/config/notifications.php +++ b/config/notifications.php @@ -25,7 +25,7 @@ return [ 'email' => ['enabled' => true, 'ui_configurable' => 0,], 'slack' => ['enabled' => true, 'ui_configurable' => 1,], 'ntfy' => ['enabled' => true, 'ui_configurable' => 0,], - 'pushover' => ['enabled' => false, 'ui_configurable' => 0,], + 'pushover' => ['enabled' => true, 'ui_configurable' => 0,], 'gotify' => ['enabled' => false, 'ui_configurable' => 0,], 'pushbullet' => ['enabled' => false, 'ui_configurable' => 0,], ], diff --git a/config/services.php b/config/services.php index 3757b429bf..e0c77d2d54 100644 --- a/config/services.php +++ b/config/services.php @@ -61,4 +61,8 @@ return [ 'mandrill' => [ 'secret' => env('MANDRILL_SECRET'), ], + 'pushover' => [ + 'token' => env('PUSHOVER_APP_TOKEN', ''), + 'user_token' => env('PUSHOVER_USER_TOKEN', ''), + ], ]; diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index b168ca5195..6b9e486dc7 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -2509,6 +2509,9 @@ return [ 'test_notification_channel_name_email' => 'Test email', 'test_notification_channel_name_slack' => 'Test Slack', 'test_notification_channel_name_ntfy' => 'Test Ntfy.sh', + 'test_notification_channel_name_pushover' => 'Test Pushover', + 'test_notification_channel_name_gotify' => 'Test Gotify', + 'test_notification_channel_name_pushbullet' => 'Test Pushbullet', 'split_transaction_title' => 'Description of the split transaction', 'split_transaction_title_help' => 'If you create a split transaction, there must be a global description for all splits of the transaction.',