Update release topics #78
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }} | |
jobs: | |
bot: | |
name: Release topic update | |
runs-on: ubuntu-latest | |
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 }} | |
RELEASE_STATUS: "Release status: ${{ inputs.expected_status }} expected ${{ inputs.expected_date }}" | |
with: | |
script: | | |
const { HS_URL, TOKEN, RELEASE_STATUS, LOBBY_ROOM_ID, PUBLIC_ROOM_ID, ANNOUNCEMENT_ROOM_ID } = process.env; | |
const repo = context.repo; | |
const { data } = await github.rest.repos.getLatestRelease({ | |
owner: repo.owner, | |
repo: repo.repo, | |
}); | |
console.log("Found latest version: " + data.tag_name); | |
const releaseTopic = `Stable: ${data.tag_name} | ${RELEASE_STATUS}`; | |
console.log("Release topic: " + releaseTopic); | |
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}`, | |
}; | |
await fetch(`${HS_URL}/_matrix/client/v3/rooms/${roomId}/join`, { | |
method: "POST", | |
headers, | |
body: "{}", | |
}); | |
let res = await fetch(apiUrl, { | |
method: "GET", | |
headers, | |
}); | |
if (!res.ok) { | |
console.log(roomId, "failed to fetch", await res.text()); | |
return; | |
} | |
const data = await res.json(); | |
console.log(roomId, "got event", data); | |
const topic = data.topic.replace(regex, releaseTopic); | |
if (topic === data.topic) { | |
console.log(roomId, "nothing to do"); | |
return; | |
} | |
if (data["org.matrix.msc3765.topic"]) { | |
data["org.matrix.msc3765.topic"].forEach(d => { | |
d.body = d.body.replace(regex, releaseTopic); | |
}); | |
} | |
res = await fetch(apiUrl, { | |
method: "PUT", | |
body: JSON.stringify({ | |
...data, | |
topic, | |
}), | |
headers, | |
}); | |
if (res.ok) { | |
console.log(roomId, "topic updated:", topic); | |
} else { | |
console.log(roomId, await res.text()); | |
} | |
} | |
await updateReleaseInTopic(LOBBY_ROOM_ID); | |
await updateReleaseInTopic(PUBLIC_ROOM_ID); | |
await updateReleaseInTopic(ANNOUNCEMENT_ROOM_ID); |