Compare commits
6 commits
c298f78f96
...
33ec4a9bea
| Author | SHA1 | Date | |
|---|---|---|---|
| 33ec4a9bea | |||
| 0bb7a27164 | |||
| c7313035a4 | |||
| 493bc25602 | |||
| f176b547ce | |||
| 1758b7aa22 |
1 changed files with 24 additions and 19 deletions
|
|
@ -8,6 +8,7 @@ const util = require("util")
|
||||||
const Ty = require("../types")
|
const Ty = require("../types")
|
||||||
const {discord, db, sync, as, select} = require("../passthrough")
|
const {discord, db, sync, as, select} = require("../passthrough")
|
||||||
const {tag} = require("@cloudrac3r/html-template-tag")
|
const {tag} = require("@cloudrac3r/html-template-tag")
|
||||||
|
const {Semaphore} = require("@chriscdn/promise-semaphore")
|
||||||
|
|
||||||
/** @type {import("./actions/send-event")} */
|
/** @type {import("./actions/send-event")} */
|
||||||
const sendEvent = sync.require("./actions/send-event")
|
const sendEvent = sync.require("./actions/send-event")
|
||||||
|
|
@ -153,34 +154,38 @@ function guard(type, fn) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const errorRetrySema = new Semaphore()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Ty.Event.Outer<Ty.Event.M_Reaction>} reactionEvent
|
* @param {Ty.Event.Outer<Ty.Event.M_Reaction>} reactionEvent
|
||||||
*/
|
*/
|
||||||
async function onRetryReactionAdd(reactionEvent) {
|
async function onRetryReactionAdd(reactionEvent) {
|
||||||
const roomID = reactionEvent.room_id
|
const roomID = reactionEvent.room_id
|
||||||
const event = await api.getEvent(roomID, reactionEvent.content["m.relates_to"]?.event_id)
|
errorRetrySema.request(async () => {
|
||||||
|
const event = await api.getEvent(roomID, reactionEvent.content["m.relates_to"]?.event_id)
|
||||||
|
|
||||||
// Check that it's a real error from OOYE
|
// Check that it's a real error from OOYE
|
||||||
const error = event.content["moe.cadence.ooye.error"]
|
const error = event.content["moe.cadence.ooye.error"]
|
||||||
if (event.sender !== `@${reg.sender_localpart}:${reg.ooye.server_name}` || !error) return
|
if (event.sender !== `@${reg.sender_localpart}:${reg.ooye.server_name}` || !error) return
|
||||||
|
|
||||||
// To stop people injecting misleading messages, the reaction needs to come from either the original sender or a room moderator
|
// To stop people injecting misleading messages, the reaction needs to come from either the original sender or a room moderator
|
||||||
if (reactionEvent.sender !== event.sender) {
|
if (reactionEvent.sender !== event.sender) {
|
||||||
// Check if it's a room moderator
|
// Check if it's a room moderator
|
||||||
const powerLevelsStateContent = await api.getStateEvent(roomID, "m.room.power_levels", "")
|
const powerLevelsStateContent = await api.getStateEvent(roomID, "m.room.power_levels", "")
|
||||||
const powerLevel = powerLevelsStateContent.users?.[reactionEvent.sender] || 0
|
const powerLevel = powerLevelsStateContent.users?.[reactionEvent.sender] || 0
|
||||||
if (powerLevel < 50) return
|
if (powerLevel < 50) return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retry
|
// Retry
|
||||||
if (error.source === "matrix") {
|
if (error.source === "matrix") {
|
||||||
as.emit(`type:${error.payload.type}`, error.payload)
|
as.emit(`type:${error.payload.type}`, error.payload)
|
||||||
} else if (error.source === "discord") {
|
} else if (error.source === "discord") {
|
||||||
discord.cloud.emit("event", error.payload)
|
discord.cloud.emit("event", error.payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redact the error to stop people from executing multiple retries
|
// Redact the error to stop people from executing multiple retries
|
||||||
await api.redactEvent(roomID, event.event_id)
|
await api.redactEvent(roomID, event.event_id)
|
||||||
|
}, roomID)
|
||||||
}
|
}
|
||||||
|
|
||||||
sync.addTemporaryListener(as, "type:m.room.message", guard("m.room.message",
|
sync.addTemporaryListener(as, "type:m.room.message", guard("m.room.message",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue