support written @mentions (scenario 3)
This commit is contained in:
		
							parent
							
								
									328ae74b61
								
							
						
					
					
						commit
						437f04682c
					
				
					 3 changed files with 94 additions and 1 deletions
				
			
		| 
						 | 
					@ -8,6 +8,9 @@ const passthrough = require("../../passthrough")
 | 
				
			||||||
const { sync, db, discord } = passthrough
 | 
					const { sync, db, discord } = passthrough
 | 
				
			||||||
/** @type {import("../../matrix/file")} */
 | 
					/** @type {import("../../matrix/file")} */
 | 
				
			||||||
const file = sync.require("../../matrix/file")
 | 
					const file = sync.require("../../matrix/file")
 | 
				
			||||||
 | 
					const reg = require("../../matrix/read-registration")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const userRegex = reg.namespaces.users.map(u => new RegExp(u.regex))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getDiscordParseCallbacks(message, useHTML) {
 | 
					function getDiscordParseCallbacks(message, useHTML) {
 | 
				
			||||||
	return {
 | 
						return {
 | 
				
			||||||
| 
						 | 
					@ -69,7 +72,7 @@ async function messageToEvent(message, guild, api) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function addMention(mxid) {
 | 
						function addMention(mxid) {
 | 
				
			||||||
		if (!mentions.user_ids) mentions.user_ids = []
 | 
							if (!mentions.user_ids) mentions.user_ids = []
 | 
				
			||||||
		mentions.user_ids.push(mxid)
 | 
							if (!mentions.user_ids.includes(mxid)) mentions.user_ids.push(mxid)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Mentions scenarios 1 and 2, part A. i.e. translate relevant message.mentions to m.mentions
 | 
						// Mentions scenarios 1 and 2, part A. i.e. translate relevant message.mentions to m.mentions
 | 
				
			||||||
| 
						 | 
					@ -106,12 +109,28 @@ async function messageToEvent(message, guild, api) {
 | 
				
			||||||
			discordCallback: getDiscordParseCallbacks(message, true)
 | 
								discordCallback: getDiscordParseCallbacks(message, true)
 | 
				
			||||||
		}, null, null)
 | 
							}, null, null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO: add a string return type to my discord-markdown library
 | 
				
			||||||
		let body = markdown.toHTML(content, {
 | 
							let body = markdown.toHTML(content, {
 | 
				
			||||||
			discordCallback: getDiscordParseCallbacks(message, false),
 | 
								discordCallback: getDiscordParseCallbacks(message, false),
 | 
				
			||||||
			discordOnly: true,
 | 
								discordOnly: true,
 | 
				
			||||||
			escapeHTML: false,
 | 
								escapeHTML: false,
 | 
				
			||||||
		}, null, null)
 | 
							}, null, null)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Mentions scenario 3: scan the message content for written @mentions of matrix users
 | 
				
			||||||
 | 
							const matches = [...content.matchAll(/@([a-z0-9._]+)\b/gi)]
 | 
				
			||||||
 | 
							if (matches.length && matches.some(m => m[1].match(/[a-z]/i))) {
 | 
				
			||||||
 | 
								const writtenMentionsText = matches.map(m => m[1].toLowerCase())
 | 
				
			||||||
 | 
								const roomID = db.prepare("SELECT room_id FROM channel_room WHERE channel_id = ?").pluck().get(message.channel_id)
 | 
				
			||||||
 | 
								const {joined} = await api.getJoinedMembers(roomID)
 | 
				
			||||||
 | 
								for (const [mxid, member] of Object.entries(joined)) {
 | 
				
			||||||
 | 
									if (!userRegex.some(rx => mxid.match(rx))) {
 | 
				
			||||||
 | 
										const localpart = mxid.match(/@([^:]*)/)
 | 
				
			||||||
 | 
										assert(localpart)
 | 
				
			||||||
 | 
										if (writtenMentionsText.includes(localpart[1].toLowerCase()) || writtenMentionsText.includes(member.display_name.toLowerCase())) addMention(mxid)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Fallback body/formatted_body for replies
 | 
							// Fallback body/formatted_body for replies
 | 
				
			||||||
		if (repliedToEventId) {
 | 
							if (repliedToEventId) {
 | 
				
			||||||
			let repliedToDisplayName
 | 
								let repliedToDisplayName
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -215,4 +215,47 @@ test("message2event: simple reply to matrix user", async t => {
 | 
				
			||||||
	}])
 | 
						}])
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test("message2event: simple written @mention for matrix user", async t => {
 | 
				
			||||||
 | 
						const events = await messageToEvent(data.message.simple_written_at_mention_for_matrix, data.guild.general, {
 | 
				
			||||||
 | 
							async getJoinedMembers(roomID) {
 | 
				
			||||||
 | 
								t.equal(roomID, "!kLRqKKUQXcibIMtOpl:cadence.moe")
 | 
				
			||||||
 | 
								return new Promise(resolve => {
 | 
				
			||||||
 | 
									setTimeout(() => {
 | 
				
			||||||
 | 
										resolve({
 | 
				
			||||||
 | 
											joined: {
 | 
				
			||||||
 | 
												"@cadence:cadence.moe": {
 | 
				
			||||||
 | 
													display_name: "cadence [they]",
 | 
				
			||||||
 | 
													avatar_url: "whatever"
 | 
				
			||||||
 | 
												},
 | 
				
			||||||
 | 
												"@huckleton:cadence.moe": {
 | 
				
			||||||
 | 
													display_name: "huck",
 | 
				
			||||||
 | 
													avatar_url: "whatever"
 | 
				
			||||||
 | 
												},
 | 
				
			||||||
 | 
												"@_ooye_botrac4r:cadence.moe": {
 | 
				
			||||||
 | 
													display_name: "botrac4r",
 | 
				
			||||||
 | 
													avatar_url: "whatever"
 | 
				
			||||||
 | 
												},
 | 
				
			||||||
 | 
												"@_ooye_bot:cadence.moe": {
 | 
				
			||||||
 | 
													display_name: "Out Of Your Element",
 | 
				
			||||||
 | 
													avatar_url: "whatever"
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										})
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						t.deepEqual(events, [{
 | 
				
			||||||
 | 
							$type: "m.room.message",
 | 
				
			||||||
 | 
							"m.mentions": {
 | 
				
			||||||
 | 
								user_ids: [
 | 
				
			||||||
 | 
									"@cadence:cadence.moe",
 | 
				
			||||||
 | 
									"@huckleton:cadence.moe"
 | 
				
			||||||
 | 
								]
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							msgtype: "m.text",
 | 
				
			||||||
 | 
							body: "@Cadence, tell me about @Phil, the creator of the Chin Trick, who has become ever more powerful under the mentorship of @botrac4r and @huck"
 | 
				
			||||||
 | 
						}])
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: read "edits of replies" in the spec
 | 
					// TODO: read "edits of replies" in the spec
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								test/data.js
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								test/data.js
									
										
									
									
									
								
							| 
						 | 
					@ -304,6 +304,37 @@ module.exports = {
 | 
				
			||||||
			flags: 0,
 | 
								flags: 0,
 | 
				
			||||||
			components: []
 | 
								components: []
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							simple_written_at_mention_for_matrix: {
 | 
				
			||||||
 | 
								id: "1126739682080858234",
 | 
				
			||||||
 | 
								type: 0,
 | 
				
			||||||
 | 
								content: "@Cadence, tell me about @Phil, the creator of the Chin Trick, who has become ever more powerful under the mentorship of @botrac4r and @huck",
 | 
				
			||||||
 | 
								channel_id: "112760669178241024",
 | 
				
			||||||
 | 
								author: {
 | 
				
			||||||
 | 
									id: "114147806469554185",
 | 
				
			||||||
 | 
									username: "extremity",
 | 
				
			||||||
 | 
									avatar: "6628aaf6b27219c36e2d3b5cfd6d0ee6",
 | 
				
			||||||
 | 
									discriminator: "0",
 | 
				
			||||||
 | 
									public_flags: 768,
 | 
				
			||||||
 | 
									flags: 768,
 | 
				
			||||||
 | 
									banner: null,
 | 
				
			||||||
 | 
									accent_color: null,
 | 
				
			||||||
 | 
									global_name: "Extremity",
 | 
				
			||||||
 | 
									avatar_decoration: null,
 | 
				
			||||||
 | 
									display_name: "Extremity",
 | 
				
			||||||
 | 
									banner_color: null
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								attachments: [],
 | 
				
			||||||
 | 
								embeds: [],
 | 
				
			||||||
 | 
								mentions: [],
 | 
				
			||||||
 | 
								mention_roles: [],
 | 
				
			||||||
 | 
								pinned: false,
 | 
				
			||||||
 | 
								mention_everyone: false,
 | 
				
			||||||
 | 
								tts: false,
 | 
				
			||||||
 | 
								timestamp: "2023-07-07T05:01:14.019000+00:00",
 | 
				
			||||||
 | 
								edited_timestamp: null,
 | 
				
			||||||
 | 
								flags: 0,
 | 
				
			||||||
 | 
								components: []
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		simple_reply: {
 | 
							simple_reply: {
 | 
				
			||||||
			id: "1126604870762369124",
 | 
								id: "1126604870762369124",
 | 
				
			||||||
			type: 19,
 | 
								type: 19,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue