catch up on missed d->m messages when logging in
This commit is contained in:
		
							parent
							
								
									0f20dcab6d
								
							
						
					
					
						commit
						3436759504
					
				
					 16 changed files with 268 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -190,6 +190,33 @@ async function _syncRoom(channelID, shouldActuallySync) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function _unbridgeRoom(channelID) {
 | 
			
		||||
	/** @ts-ignore @type {DiscordTypes.APIGuildChannel} */
 | 
			
		||||
	const channel = discord.channels.get(channelID)
 | 
			
		||||
	assert.ok(channel)
 | 
			
		||||
	const roomID = db.prepare("SELECT room_id from channel_room WHERE channel_id = ?").pluck().get(channelID)
 | 
			
		||||
	assert.ok(roomID)
 | 
			
		||||
	const spaceID = db.prepare("SELECT space_id FROM guild_space WHERE guild_id = ?").pluck().get(channel.guild_id)
 | 
			
		||||
	assert.ok(spaceID)
 | 
			
		||||
 | 
			
		||||
	// remove room from being a space member
 | 
			
		||||
	await api.sendState(spaceID, "m.space.child", roomID, {})
 | 
			
		||||
 | 
			
		||||
	// send a notification in the room
 | 
			
		||||
	await api.sendEvent(roomID, "m.room.message", {
 | 
			
		||||
		msgtype: "m.notice",
 | 
			
		||||
		body: "⚠️ This room was removed from the bridge."
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// leave room
 | 
			
		||||
	await api.leaveRoom(roomID)
 | 
			
		||||
 | 
			
		||||
	// delete room from database
 | 
			
		||||
	const {changes} = db.prepare("DELETE FROM channel_room WHERE room_id = ? AND channel_id = ?").run(roomID, channelID)
 | 
			
		||||
	assert.equal(changes, 1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {DiscordTypes.APIGuildTextChannel} channel
 | 
			
		||||
 * @param {string} spaceID
 | 
			
		||||
| 
						 | 
				
			
			@ -237,3 +264,4 @@ module.exports.syncRoom = syncRoom
 | 
			
		|||
module.exports.createAllForGuild = createAllForGuild
 | 
			
		||||
module.exports.channelToKState = channelToKState
 | 
			
		||||
module.exports._convertNameAndTopic = convertNameAndTopic
 | 
			
		||||
module.exports._unbridgeRoom = _unbridgeRoom
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ test("member2state: general", async t => {
 | 
			
		|||
		await _memberToStateContent(testData.member.sheep.user, testData.member.sheep, testData.guild.general.id),
 | 
			
		||||
		{
 | 
			
		||||
			avatar_url: "mxc://cadence.moe/rfemHmAtcprjLEiPiEuzPhpl",
 | 
			
		||||
			displayname: "The Expert's Submarine | aprilsong",
 | 
			
		||||
			displayname: "The Expert's Submarine",
 | 
			
		||||
			membership: "join",
 | 
			
		||||
			"moe.cadence.ooye.member": {
 | 
			
		||||
				avatar: "/guilds/112760669178241024/users/134826546694193153/avatars/38dd359aa12bcd52dd3164126c587f8c.png?size=1024"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,8 +22,11 @@ async function sendMessage(message, guild) {
 | 
			
		|||
 | 
			
		||||
	let senderMxid = null
 | 
			
		||||
	if (!message.webhook_id) {
 | 
			
		||||
		assert(message.member)
 | 
			
		||||
		senderMxid = await registerUser.syncUser(message.author, message.member, message.guild_id, roomID)
 | 
			
		||||
		if (message.member) { // available on a gateway message create event
 | 
			
		||||
			senderMxid = await registerUser.syncUser(message.author, message.member, message.guild_id, roomID)
 | 
			
		||||
		} else { // well, good enough...
 | 
			
		||||
			senderMxid = await registerUser.ensureSimJoined(message.author, roomID)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const events = await messageToEvent.messageToEvent(message, guild, {}, {api})
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +38,7 @@ async function sendMessage(message, guild) {
 | 
			
		|||
		const eventWithoutType = {...event}
 | 
			
		||||
		delete eventWithoutType.$type
 | 
			
		||||
 | 
			
		||||
		const eventID = await api.sendEvent(roomID, eventType, event, senderMxid)
 | 
			
		||||
		const eventID = await api.sendEvent(roomID, eventType, event, senderMxid, new Date(message.timestamp).getTime())
 | 
			
		||||
		db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, channel_id, part, source) VALUES (?, ?, ?, ?, ?, ?, 1)").run(eventID, eventType, event.msgtype || null, message.id, message.channel_id, eventPart) // source 1 = discord
 | 
			
		||||
 | 
			
		||||
		eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue