riot-web/.github/workflows/update-topics.yaml

104 lines
4.4 KiB
YAML
Raw Normal View History

name: Update release topics
on:
workflow_dispatch:
inputs:
expected_status:
description: What type of release is the next expected release
required: true
default: RC
type: choice
options:
- RC
- Release
expected_date:
description: Expected release date e.g. July 11th
required: true
type: string
concurrency: ${{ github.workflow }}
permissions: {} # No permissions required
jobs:
bot:
name: Release topic update
runs-on: ubuntu-24.04
environment: Matrix
steps:
- uses: actions/github-script@v7
env:
HS_URL: ${{ secrets.BETABOT_HS_URL }}
LOBBY_ROOM_ID: ${{ secrets.ROOM_ID }}
PUBLIC_ROOM_ID: "!YTvKGNlinIzlkMTVRl:matrix.org"
ANNOUNCEMENT_ROOM_ID: "!bijaLdadorKgNGtHdA:matrix.org"
TOKEN: ${{ secrets.BETABOT_ACCESS_TOKEN }}
2023-07-13 13:21:41 +02:00
RELEASE_STATUS: "Release status: ${{ inputs.expected_status }} expected ${{ inputs.expected_date }}"
with:
script: |
2023-07-13 13:21:41 +02:00
const { HS_URL, TOKEN, RELEASE_STATUS, LOBBY_ROOM_ID, PUBLIC_ROOM_ID, ANNOUNCEMENT_ROOM_ID } = process.env;
const repo = context.repo;
2023-07-13 13:23:30 +02:00
const { data } = await github.rest.repos.getLatestRelease({
2023-07-13 13:21:41 +02:00
owner: repo.owner,
repo: repo.repo,
});
2023-07-13 13:26:02 +02:00
console.log("Found latest version: " + data.tag_name);
2023-07-13 13:21:41 +02:00
2023-07-13 13:23:30 +02:00
const releaseTopic = `Stable: ${data.tag_name} | ${RELEASE_STATUS}`;
2023-07-13 13:26:02 +02:00
console.log("Release topic: " + releaseTopic);
2023-07-13 13:31:39 +02:00
const regex = /Stable: v(.+) \| Release status: (\w+) expected (\w+ \d+\w\w)/gm;
async function updateReleaseInTopic(roomId) {
const apiUrl = `${HS_URL}/_matrix/client/v3/rooms/${roomId}/state/m.room.topic/`;
const headers = {
"Content-Type": "application/json",
"Authorization": `Bearer ${TOKEN}`,
};
2023-07-10 12:49:38 +02:00
await fetch(`${HS_URL}/_matrix/client/v3/rooms/${roomId}/join`, {
method: "POST",
headers,
body: "{}",
});
2023-07-10 12:16:18 +02:00
let res = await fetch(apiUrl, {
method: "GET",
headers,
});
2023-10-25 15:00:06 +02:00
if (!res.ok) {
console.log(roomId, "failed to fetch", await res.text());
return;
}
const data = await res.json();
2023-10-25 15:09:28 +02:00
console.log(roomId, "got event", data);
2023-07-13 13:21:41 +02:00
const topic = data.topic.replace(regex, releaseTopic);
if (topic === data.topic) {
console.log(roomId, "nothing to do");
2023-07-10 12:12:17 +02:00
return;
}
2023-07-10 12:27:41 +02:00
if (data["org.matrix.msc3765.topic"]) {
data["org.matrix.msc3765.topic"].forEach(d => {
2023-07-13 13:21:41 +02:00
d.body = d.body.replace(regex, releaseTopic);
2023-07-10 12:27:41 +02:00
});
}
2023-07-10 12:16:18 +02:00
res = await fetch(apiUrl, {
method: "PUT",
2023-07-10 12:18:28 +02:00
body: JSON.stringify({
...data,
topic,
2023-07-10 12:18:28 +02:00
}),
headers,
});
2023-07-10 12:14:03 +02:00
if (res.ok) {
console.log(roomId, "topic updated:", topic);
} else {
console.log(roomId, await res.text());
}
}
await updateReleaseInTopic(LOBBY_ROOM_ID);
2023-07-10 12:36:28 +02:00
await updateReleaseInTopic(PUBLIC_ROOM_ID);
await updateReleaseInTopic(ANNOUNCEMENT_ROOM_ID);