Compare commits

...

3 Commits

Author SHA1 Message Date
lamp 02354b3a7c update 2026-05-05 00:36:56 -07:00
lamp 709ef9885b Merge branch 'master' of ssh.gitea.moe:lamp/who-fuck-ping 2026-04-10 19:26:46 -07:00
lamp 001173037e configurable interval 2026-04-10 19:13:10 -07:00
4 changed files with 101 additions and 90 deletions
+1
View File
@@ -6,6 +6,7 @@ create conf.js and paste values
export const ACCESS_TOKEN = ""; // your access token you can get it from element settings
export const SERVER_URL = ""; // your matrix server url without trailing slash i.e. https://matrix-client.matrix.org
export const ROOM_ID = ""; // make a private room and put its id here
export const INTERVAL = 30; // how often to check for new notifications
```
run
+32 -22
View File
@@ -1,4 +1,4 @@
import { ACCESS_TOKEN, SERVER_URL, ROOM_ID } from "./conf.js";
import { ACCESS_TOKEN, SERVER_URL, ROOM_ID, INTERVAL } from "./conf.js";
try {
var last_ts = Number(Deno.readTextFileSync("last_ts"));
@@ -10,21 +10,15 @@ try {
async function fetchMatrix(url, options = {}) {
options.headers ||= {};
options.headers.Authorization ||= `Bearer ${ACCESS_TOKEN}`;
url = SERVER_URL + url;
do {
console.debug("fetch", url);
try {
var res = await fetch(url, options);
if (res.ok) break;
console.warn("status:", res.status);
if (res.status == 429) {
var {retry_after_ms} = await res.json();
}
} catch (error) {
console.error(error);
}
if (!(url instanceof URL)) url = new URL(url, SERVER_URL);
console.debug("fetch", url.toString());
var res = await fetch(url, options);
console.debug("status:", res.status);
if (res.status == 429) {
var {retry_after_ms} = await res.json();
await new Promise(r => setTimeout(r, retry_after_ms || 60000));
} while (true)
return await fetchMatrix(url, options);
}
if (!res.ok) throw new Error(`HTTP ${res.status} ${await res.text()}`);
return res;
}
@@ -44,7 +38,7 @@ async function checkNotifications() {
limit = 50;
} while (next_token !== null)
console.debug("new notifications:", new_notifications);
if (new_notifications.length) console.debug("new notifications:", new_notifications);
if (!new_notifications.length) return;
for (let n of new_notifications) {
try {
@@ -58,8 +52,13 @@ async function checkNotifications() {
}
async function addNotificationToRoom(notification) {
var text = `https://matrix.to/#/${encodeURIComponent(notification.room_id)}/${encodeURIComponent(notification.event.event_id)} ${new Date(notification.ts).toLocaleString()}`;
async function addNotificationToRoom({room_id, event}) {
var url = `https://matrix.to/#/${encodeURIComponent(room_id)}/${encodeURIComponent(event.event_id)}`;
var text = `${new Date(event.origin_server_ts).toLocaleString()}
${await getAlias(room_id)}
${event.sender}
${event.content?.body}
${url}`;
await fetchMatrix(`/_matrix/client/v3/rooms/${encodeURIComponent(ROOM_ID)}/send/m.room.message/${Math.random()}`, {
method: "PUT",
headers: {
@@ -67,13 +66,24 @@ async function addNotificationToRoom(notification) {
},
body: JSON.stringify({
msgtype: "m.text",
format: "org.matrix.custom.html",
body: text,
formatted_body: `<p>${text}</p>\n<pre><code class=\"language-json\">${JSON.stringify(notification.event, null, '\t')}\n</code></pre>\n`
body: text
//format: "org.matrix.custom.html",
//formatted_body: `<p>${text}</p>\n<pre><code class=\"language-json\">${JSON.stringify(event, null, '\t')}\n</code></pre>\n`
})
});
}
async function getAlias(room_id) {
try {
var data = await fetchMatrix(`/_matrix/client/v3/rooms/${encodeURIComponent(room_id)}/state/m.room.canonical_alias/`).then(res => res.json());
console.debug(data);
return data.alias || room_id;
} catch (error) {
console.error(error);
return room_id;
}
}
@@ -83,5 +93,5 @@ while (true) {
} catch (error) {
console.error(error);
}
await new Promise(r => setTimeout(r, 10000));
await new Promise(r => setTimeout(r, (INTERVAL || 30) * 1000));
}