Hacks & Customizations
These hacks are unsupported customizations meant as unofficial workarounds.
They can cause instability, introduce issues and may conflict with future updates. Apply at your own risk!

Format Webhooks for Pushover

  • Author: @ssddanbrown
  • Created: 20th Oct 2023
  • Updated: 20th Oct 2023
  • Last Tested On: v23.08.3

This is a hack to adapt outgoing webhooks from BookStack so that they are directly compatible with the pushover message API. It specifically targets pushover webhook endpoints, so this won’t affect non-pushover webhooks.

To use, you simply need to create a webhook in BookStack as normal, but use https://api.pushover.net/1/messages.json as the “Webhook Endpoint”. Review the options below to ensure you’ve configured the code for your Pushover instance.

This hack demonstrates how the format of webhooks can be altered via the logical theme system. This code could be taken and easily altered to suit other platforms where desired.

Options

  • Configure your Pushover API token & user key on lines 19-20, replacing the existing placeholder values between the string quotes.
  • Additional options can be passed to the Pushover API via adding-to/altering the array passed back from the formatWebhookDataForPushover function.
    • These are explained in the Pushover API documentation.
    • As an example, a sound parameter is set to use the tugboat notification sound for sent notifications. You can remove this to not define a specific notification sound.

Considerations

  • Your pushover credentials will be stored within your functions.php file. You may want to consider who will have access to this file since they’d be able to access your pushover account via the API.

Code

functions.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php

use BookStack\Activity\Models\Loggable;
use BookStack\Activity\Models\Webhook;
use BookStack\Activity\Tools\WebhookFormatter;
use BookStack\Facades\Theme;
use BookStack\Theming\ThemeEvents;
use BookStack\Users\Models\User;

// Format the usual BookStack webhook data into a format that
// pushover can accept.
function formatWebhookDataForPushover(array $defaultWebhookData): array
{
    // Within here you can define and provide back any of the variables
    // supported by the pushover API as defined here:
    // https://pushover.net/api#messages
    return [
        // Required
        'token'   => 'axxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // Replace value with an app/api token/key
        'user'    => 'uxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', // Replace value with user/group key
        'message' => $defaultWebhookData['text'],

        // Any other optional parameters
        'url'   => $defaultWebhookData['url'] ?? null,
        'sound' => 'tugboat',
    ];
}

// Listen for webhook call events in BookStack, so we can manipulate the
// data before it's sent to the webhook endpoint.
Theme::listen(ThemeEvents::WEBHOOK_CALL_BEFORE, function (
    string $event,
    Webhook $webhook,
    string|Loggable $detail,
    User $initiator,
    int $initTime,
) {
    // Override the data format if going to a pushover API endpoint
    if (str_starts_with($webhook->endpoint, 'https://api.pushover.net')) {
        $defaultData = WebhookFormatter::getDefault($event, $webhook, $detail, $initiator, $initTime);
        return formatWebhookDataForPushover($defaultData->format());
    }

    // Otherwise return null to leave the webhook data alone
    return null;
});

Request an Update

Hack not working on the latest version of BookStack?
You can request this hack to be updated & tested for a small one-time fee.
This helps keeps these hacks updated & maintained in a sustainable manner.


Latest Hacks