From c2b599166c9942865996f967c17c9dcc0fe48def Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 9 Aug 2022 19:21:36 +0100 Subject: [PATCH] Added new shiny webhook for Discord release notifications --- .github/workflows/discord-release-embed.php | 100 +++++++++++++++++++ .github/workflows/discord-release-notify.yml | 25 +++++ 2 files changed, 125 insertions(+) create mode 100644 .github/workflows/discord-release-embed.php create mode 100644 .github/workflows/discord-release-notify.yml diff --git a/.github/workflows/discord-release-embed.php b/.github/workflows/discord-release-embed.php new file mode 100644 index 000000000..8c6213b83 --- /dev/null +++ b/.github/workflows/discord-release-embed.php @@ -0,0 +1,100 @@ + + */ +function generateDiscordEmbed(string $version, string $channel, string $description, string $detailsUrl, string $sourceUrl, string $pharDownloadUrl) : array{ + return [ + "embeds" => [ + [ + "title" => "New PocketMine-MP release: $version ($channel)", + "description" => << $detailsUrl, + "color" => $channel === "stable" ? 0x57ab5a : 0xc69026 + ] + ] + ]; +} + +if(count($argv) !== 5){ + fwrite(STDERR, "Required arguments: github repo, version, API token\n"); + exit(1); +} +[, $repo, $tagName, $token, $hookURL] = $argv; + +$result = Internet::getURL('https://api.github.com/repos/' . $repo . '/releases/tags/' . $tagName, extraHeaders: [ + 'Authorization: token ' . $token +]); +if($result === null){ + fwrite(STDERR, "failed to access GitHub API\n"); + return; +} +if($result->getCode() !== 200){ + fwrite(STDERR, "Error accessing GitHub API: " . $result->getCode() . "\n"); + fwrite(STDERR, $result->getBody() . "\n"); + exit(1); +} + +$releaseInfoJson = json_decode($result->getBody(), true, JSON_THROW_ON_ERROR); +if(!is_array($releaseInfoJson)){ + fwrite(STDERR, "Invalid release JSON returned from GitHub API\n"); + exit(1); +} +$buildInfoPath = 'https://github.com/' . $repo . '/releases/download/' . $tagName . '/build_info.json'; + +$buildInfoResult = Internet::getURL($buildInfoPath, extraHeaders: [ + 'Authorization: token ' . $token +]); +if($buildInfoResult === null){ + fwrite(STDERR, "missing build_info.json\n"); + exit(1); +} +if($buildInfoResult->getCode() !== 200){ + fwrite(STDERR, "error accessing build_info.json: " . $buildInfoResult->getCode() . "\n"); + fwrite(STDERR, $buildInfoResult->getBody() . "\n"); + exit(1); +} + +$buildInfoJson = json_decode($buildInfoResult->getBody(), true, JSON_THROW_ON_ERROR); +if(!is_array($buildInfoJson)){ + fwrite(STDERR, "invalid build_info.json\n"); + exit(1); +} +$detailsUrl = $buildInfoJson["details_url"]; +$sourceUrl = $buildInfoJson["source_url"]; +$pharDownloadUrl = $buildInfoJson["download_url"]; + + +$description = $releaseInfoJson["body"]; + +$discordPayload = generateDiscordEmbed($buildInfoJson["base_version"], $buildInfoJson["channel"], $description, $detailsUrl, $sourceUrl, $pharDownloadUrl); + +$response = Internet::postURL( + $hookURL, + json_encode($discordPayload, JSON_THROW_ON_ERROR), + extraHeaders: ['Content-Type: application/json'] +); +if($response?->getCode() !== 204){ + fwrite(STDERR, "failed to send Discord webhook\n"); + fwrite(STDERR, $response?->getBody() ?? "no response body\n"); + exit(1); +} diff --git a/.github/workflows/discord-release-notify.yml b/.github/workflows/discord-release-notify.yml new file mode 100644 index 000000000..94570dc21 --- /dev/null +++ b/.github/workflows/discord-release-notify.yml @@ -0,0 +1,25 @@ +name: Notify Discord webhook of release + +on: + release: + types: + - published + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Setup PHP and tools + uses: shivammathur/setup-php@2.21.1 + with: + php-version: 8.0 + + - name: Get actual tag name + id: tag-name + run: echo ::set-output name=TAG_NAME::$(echo "${{ github.ref }}" | sed 's{^refs/tags/{{') + + - name: Run webhook post script + run: php .github/workflows/discord-release-embed.php ${{ github.repo }} ${{ steps.tag-name.outputs.TAG_NAME }} ${{ github.token }} ${{ secrets.DISCORD_RELEASE_WEBHOOK }}