Hot-reload Presence instances

This commit is contained in:
Cadence Ember 2025-02-13 01:16:52 +13:00
parent b0ded8e289
commit ac40c54e40
5 changed files with 15 additions and 8 deletions

11
package-lock.json generated
View file

@ -31,7 +31,7 @@
"get-relative-path": "^1.0.2",
"get-stream": "^6.0.1",
"h3": "^1.12.0",
"heatsync": "^2.6.0",
"heatsync": "^2.7.0",
"lru-cache": "^10.4.3",
"minimist": "^1.2.8",
"prettier-bytes": "^1.0.4",
@ -1868,12 +1868,15 @@
}
},
"node_modules/heatsync": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/heatsync/-/heatsync-2.6.0.tgz",
"integrity": "sha512-UfemOt4Kg1hvhDj/Zz8sYa1pF73ul+tF19MYNisYoOymXoTo4iCZv2BDdCMFE1xvZ6YFjcMoekb/aeBU1uqFjQ==",
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/heatsync/-/heatsync-2.7.0.tgz",
"integrity": "sha512-9ILOyyHFZKfIrqBmNz+fwKd+zupFE2UqFZ9k4FjRcMjNDp7GtW+K9n2htXLy3CwdDTRd6NV6BPxKvU51UqKIJA==",
"license": "MIT",
"dependencies": {
"backtracker": "^4.0.0"
},
"engines": {
"node": ">=14.6.0"
}
},
"node_modules/html-es6cape": {

View file

@ -40,7 +40,7 @@
"get-relative-path": "^1.0.2",
"get-stream": "^6.0.1",
"h3": "^1.12.0",
"heatsync": "^2.6.0",
"heatsync": "^2.7.0",
"lru-cache": "^10.4.3",
"minimist": "^1.2.8",
"prettier-bytes": "^1.0.4",

View file

@ -38,13 +38,14 @@ const guildPresenceSetting = new class {
}
}
class Presence {
class Presence extends sync.ReloadableClass {
/** @type {string} */ userID
/** @type {{presence: "online" | "offline" | "unavailable", status_msg?: string}} */ data
/** @private @type {?string | undefined} */ mxid
/** @private @type {number} */ delay = Math.random()
constructor(userID) {
super()
this.userID = userID
}
@ -66,12 +67,13 @@ class Presence {
// This random delay will space them out over the whole 28 second cycle.
setTimeout(() => {
api.setPresence(this.data, mxid).catch(() => {})
}, this.delay)
}, this.delay * presenceLoopInterval).unref()
}
}
sync.reloadClassMethods(Presence)
const presenceTracker = new class {
/** @private @type {Map<string, Presence>} userID -> Presence */ presences
/** @private @type {Map<string, Presence>} userID -> Presence */ presences = sync.remember(() => new Map())
constructor() {
sync.addTemporaryInterval(() => this.syncPresences(), presenceLoopInterval)

View file

@ -19,6 +19,7 @@ const eventDispatcher = sync.require("./d2m/event-dispatcher")
const updatePins = sync.require("./d2m/actions/update-pins")
const speedbump = sync.require("./d2m/actions/speedbump")
const ks = sync.require("./matrix/kstate")
const setPresence = sync.require("./d2m/actions/set-presence")
const guildID = "112760669178241024"
const extraContext = {}

View file

@ -1,5 +1,6 @@
// @ts-check
const {ReadableStream} = require("stream/web")
const {test} = require("supertape")
const {router} = require("../../test/web")
const assert = require("assert").strict