Promote another event if part = 0 is redacted
This commit is contained in:
		
							parent
							
								
									f69cf587a2
								
							
						
					
					
						commit
						ef15c850dd
					
				
					 3 changed files with 41 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -83,6 +83,20 @@ async function editToChanges(message, guild, api) {
 | 
			
		|||
	// Anything remaining in oldEventRows is present in the old version only and should be redacted.
 | 
			
		||||
	eventsToRedact = oldEventRows
 | 
			
		||||
 | 
			
		||||
	// If events are being deleted, we might be deleting the part = 0. But we want to have a part = 0 at all times. In this case we choose an existing event to promote.
 | 
			
		||||
	let promoteEvent = null, promoteNextEvent = false
 | 
			
		||||
	if (eventsToRedact.some(e => e.part === 0)) {
 | 
			
		||||
		if (eventsToReplace.length) {
 | 
			
		||||
			// We can choose an existing event to promote. Bigger order is better.
 | 
			
		||||
			const order = e => 2*+(e.event_type === "m.room.message") + 1*+(e.event_subtype === "m.text")
 | 
			
		||||
			eventsToReplace.sort((a, b) => order(b) - order(a))
 | 
			
		||||
			promoteEvent = eventsToReplace[0].old.event_id
 | 
			
		||||
		} else {
 | 
			
		||||
			// Everything is being deleted. Whatever gets sent in their place will be the new part = 0.
 | 
			
		||||
			promoteNextEvent = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Now, everything in eventsToSend and eventsToRedact is a real change, but everything in eventsToReplace might not have actually changed!
 | 
			
		||||
	// (Example: a MESSAGE_UPDATE for a text+image message - Discord does not allow the image to be changed, but the text might have been.)
 | 
			
		||||
	// So we'll remove entries from eventsToReplace that *definitely* cannot have changed. (This is category 4 mentioned above.) Everything remaining *may* have changed.
 | 
			
		||||
| 
						 | 
				
			
			@ -103,7 +117,7 @@ async function editToChanges(message, guild, api) {
 | 
			
		|||
	eventsToRedact = eventsToRedact.map(e => e.event_id)
 | 
			
		||||
	eventsToReplace = eventsToReplace.map(e => ({oldID: e.old.event_id, newContent: makeReplacementEventContent(e.old.event_id, e.newFallbackContent, e.newInnerContent)}))
 | 
			
		||||
 | 
			
		||||
	return {roomID, eventsToReplace, eventsToRedact, eventsToSend, senderMxid}
 | 
			
		||||
	return {roomID, eventsToReplace, eventsToRedact, eventsToSend, senderMxid, promoteEvent, promoteNextEvent}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ const data = require("../../test/data")
 | 
			
		|||
const Ty = require("../../types")
 | 
			
		||||
 | 
			
		||||
test("edit2changes: edit by webhook", async t => {
 | 
			
		||||
	const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_by_webhook, data.guild.general, {})
 | 
			
		||||
	const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.edit_by_webhook, data.guild.general, {})
 | 
			
		||||
	t.deepEqual(eventsToRedact, [])
 | 
			
		||||
	t.deepEqual(eventsToSend, [])
 | 
			
		||||
	t.deepEqual(eventsToReplace, [{
 | 
			
		||||
| 
						 | 
				
			
			@ -27,10 +27,12 @@ test("edit2changes: edit by webhook", async t => {
 | 
			
		|||
		}
 | 
			
		||||
	}])
 | 
			
		||||
	t.equal(senderMxid, null)
 | 
			
		||||
	t.equal(promoteEvent, null)
 | 
			
		||||
	t.equal(promoteNextEvent, false)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
test("edit2changes: bot response", async t => {
 | 
			
		||||
	const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.bot_response, data.guild.general, {
 | 
			
		||||
	const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.bot_response, data.guild.general, {
 | 
			
		||||
		async getJoinedMembers(roomID) {
 | 
			
		||||
			t.equal(roomID, "!hYnGGlPHlbujVVfktC:cadence.moe")
 | 
			
		||||
			return new Promise(resolve => {
 | 
			
		||||
| 
						 | 
				
			
			@ -82,17 +84,21 @@ test("edit2changes: bot response", async t => {
 | 
			
		|||
		}
 | 
			
		||||
	}])
 | 
			
		||||
	t.equal(senderMxid, "@_ooye_bojack_horseman:cadence.moe")
 | 
			
		||||
	t.equal(promoteEvent, null)
 | 
			
		||||
	t.equal(promoteNextEvent, false)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
test("edit2changes: remove caption from image", async t => {
 | 
			
		||||
	const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.removed_caption_from_image, data.guild.general, {})
 | 
			
		||||
	const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.removed_caption_from_image, data.guild.general, {})
 | 
			
		||||
	t.deepEqual(eventsToRedact, ["$mtR8cJqM4fKno1bVsm8F4wUVqSntt2sq6jav1lyavuA"])
 | 
			
		||||
	t.deepEqual(eventsToSend, [])
 | 
			
		||||
	t.deepEqual(eventsToReplace, [])
 | 
			
		||||
	t.equal(promoteEvent, "$51f4yqHinwnSbPEQ9dCgoyy4qiIJSX0QYYVUnvwyTCI")
 | 
			
		||||
	t.equal(promoteNextEvent, false)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
test("edit2changes: add caption back to that image", async t => {
 | 
			
		||||
	const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {})
 | 
			
		||||
	const {eventsToRedact, eventsToReplace, eventsToSend, promoteEvent, promoteNextEvent} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {})
 | 
			
		||||
	t.deepEqual(eventsToRedact, [])
 | 
			
		||||
	t.deepEqual(eventsToSend, [{
 | 
			
		||||
		$type: "m.room.message",
 | 
			
		||||
| 
						 | 
				
			
			@ -101,6 +107,8 @@ test("edit2changes: add caption back to that image", async t => {
 | 
			
		|||
		"m.mentions": {}
 | 
			
		||||
	}])
 | 
			
		||||
	t.deepEqual(eventsToReplace, [])
 | 
			
		||||
	t.equal(promoteEvent, null)
 | 
			
		||||
	t.equal(promoteNextEvent, false)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
test("edit2changes: stickers and attachments are not changed, only the content can be edited", async t => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue