too-long-for-discord names continued in message
This commit is contained in:
		
							parent
							
								
									8b7c47e369
								
							
						
					
					
						commit
						5daef9ae47
					
				
					 2 changed files with 43 additions and 7 deletions
				
			
		| 
						 | 
					@ -157,6 +157,33 @@ async function getMemberFromCacheOrHomeserver(roomID, mxid, api) {
 | 
				
			||||||
		return {displayname: null, avatar_url: null}
 | 
							return {displayname: null, avatar_url: null}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Splits a display name into one chunk containing <=80 characters, and another chunk containing the rest of the characters. Splits on
 | 
				
			||||||
 | 
					 * whitespace if possible.
 | 
				
			||||||
 | 
					 * These chunks, respectively, go in the display name, and at the top of the message.
 | 
				
			||||||
 | 
					 * If the second part isn't empty, it'll also contain boldening markdown and a line break at the end, so that regardless of its value it
 | 
				
			||||||
 | 
					 * can be prepended to the message content as-is.
 | 
				
			||||||
 | 
					 * @summary Splits too-long Matrix names into a display name chunk and a message content chunk.
 | 
				
			||||||
 | 
					 * @param  {string} displayName - The Matrix side display name to chop up.
 | 
				
			||||||
 | 
					 * @returns {[string, string]} The afformentioned chunks in their respective order.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					function splitDisplayName(displayName) {
 | 
				
			||||||
 | 
						/** @type {string[]} */
 | 
				
			||||||
 | 
						let displayNameChunks = chunk(displayName, 80)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (displayNameChunks.length === 1) {
 | 
				
			||||||
 | 
							return [displayName, ""]
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							/** @type {string} */
 | 
				
			||||||
 | 
							const displayNamePreRunoff = displayNameChunks[0]
 | 
				
			||||||
 | 
							// displayNameRunoff is a substring rather than a concatenation of the rest of the chunks in order to preserve whatever whitespace
 | 
				
			||||||
 | 
							// it was broken on.
 | 
				
			||||||
 | 
							/** @type {string} */
 | 
				
			||||||
 | 
							const displayNameRunoff = `**${displayName.substring(displayNamePreRunoff.length + 1)}**\n`
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return [displayNamePreRunoff, displayNameRunoff]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File | Ty.Event.Outer_M_Sticker | Ty.Event.Outer_M_Room_Message_Encrypted_File} event
 | 
					 * @param {Ty.Event.Outer_M_Room_Message | Ty.Event.Outer_M_Room_Message_File | Ty.Event.Outer_M_Sticker | Ty.Event.Outer_M_Room_Message_Encrypted_File} event
 | 
				
			||||||
| 
						 | 
					@ -179,6 +206,15 @@ async function eventToMessage(event, guild, di) {
 | 
				
			||||||
	const member = await getMemberFromCacheOrHomeserver(event.room_id, event.sender, di?.api)
 | 
						const member = await getMemberFromCacheOrHomeserver(event.room_id, event.sender, di?.api)
 | 
				
			||||||
	if (member.displayname) displayName = member.displayname
 | 
						if (member.displayname) displayName = member.displayname
 | 
				
			||||||
	if (member.avatar_url) avatarURL = utils.getPublicUrlForMxc(member.avatar_url) || undefined
 | 
						if (member.avatar_url) avatarURL = utils.getPublicUrlForMxc(member.avatar_url) || undefined
 | 
				
			||||||
 | 
						// If the display name is too long to be put into the webhook (>80 characters), put the excess characters into displayNameRunoff, later to
 | 
				
			||||||
 | 
						// be put at the top of the message
 | 
				
			||||||
 | 
						/** @type {string} */
 | 
				
			||||||
 | 
						let displayNameShortened, displayNameRunoff
 | 
				
			||||||
 | 
						[displayNameShortened, displayNameRunoff] = splitDisplayName(displayName)
 | 
				
			||||||
 | 
						// If the message type is m.emote, the full name is already included at the start of the message, so remove any runoff
 | 
				
			||||||
 | 
						if (event.type === "m.room.message" && event.content.msgtype === "m.emote") {
 | 
				
			||||||
 | 
							displayNameRunoff = ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let content = event.content.body // ultimate fallback
 | 
						let content = event.content.body // ultimate fallback
 | 
				
			||||||
	const attachments = []
 | 
						const attachments = []
 | 
				
			||||||
| 
						 | 
					@ -364,13 +400,13 @@ async function eventToMessage(event, guild, di) {
 | 
				
			||||||
		pendingFiles.push({name: filename, url})
 | 
							pendingFiles.push({name: filename, url})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	content = replyLine + content
 | 
						content = displayNameRunoff + replyLine + content
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Split into 2000 character chunks
 | 
						// Split into 2000 character chunks
 | 
				
			||||||
	const chunks = chunk(content, 2000)
 | 
						const chunks = chunk(content, 2000)
 | 
				
			||||||
	messages = messages.concat(chunks.map(content => ({
 | 
						messages = messages.concat(chunks.map(content => ({
 | 
				
			||||||
		content,
 | 
							content,
 | 
				
			||||||
		username: displayName,
 | 
							username: displayNameShortened,
 | 
				
			||||||
		avatar_url: avatarURL
 | 
							avatar_url: avatarURL
 | 
				
			||||||
	})))
 | 
						})))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -379,7 +415,7 @@ async function eventToMessage(event, guild, di) {
 | 
				
			||||||
		// There needs to be a message to add attachments to.
 | 
							// There needs to be a message to add attachments to.
 | 
				
			||||||
		if (!messages.length) messages.push({
 | 
							if (!messages.length) messages.push({
 | 
				
			||||||
			content,
 | 
								content,
 | 
				
			||||||
			username: displayName,
 | 
								username: displayNameShortened,
 | 
				
			||||||
			avatar_url: avatarURL
 | 
								avatar_url: avatarURL
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		messages[0].attachments = attachments
 | 
							messages[0].attachments = attachments
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1436,8 +1436,8 @@ test("event2message: overly long usernames are shifted into the message content"
 | 
				
			||||||
			messagesToDelete: [],
 | 
								messagesToDelete: [],
 | 
				
			||||||
			messagesToEdit: [],
 | 
								messagesToEdit: [],
 | 
				
			||||||
			messagesToSend: [{
 | 
								messagesToSend: [{
 | 
				
			||||||
				username: "I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS IMPORTAN",
 | 
									username: "I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS",
 | 
				
			||||||
				content: "**T and I DON'T MATTER**: testing the member state cache",
 | 
									content: "**IMPORTANT and I DON'T MATTER**\ntesting the member state cache",
 | 
				
			||||||
				avatar_url: undefined
 | 
									avatar_url: undefined
 | 
				
			||||||
			}]
 | 
								}]
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1468,7 +1468,7 @@ test("event2message: overly long usernames are not treated specially when the ms
 | 
				
			||||||
			messagesToDelete: [],
 | 
								messagesToDelete: [],
 | 
				
			||||||
			messagesToEdit: [],
 | 
								messagesToEdit: [],
 | 
				
			||||||
			messagesToSend: [{
 | 
								messagesToSend: [{
 | 
				
			||||||
				username: "I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS IMPORTAN",
 | 
									username: "I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS",
 | 
				
			||||||
				content: "\\* I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS IMPORTANT and I DON'T MATTER looks at the start of the message",
 | 
									content: "\\* I am BLACK I am WHITE I am SHORT I am LONG I am EVERYTHING YOU THINK IS IMPORTANT and I DON'T MATTER looks at the start of the message",
 | 
				
			||||||
				avatar_url: undefined
 | 
									avatar_url: undefined
 | 
				
			||||||
			}]
 | 
								}]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue