/emoji can now upload Matrix-exclusive emojis
This commit is contained in:
		
							parent
							
								
									d1e3640078
								
							
						
					
					
						commit
						4151979e10
					
				
					 1 changed files with 29 additions and 11 deletions
				
			
		| 
						 | 
					@ -202,27 +202,45 @@ const commands = [{
 | 
				
			||||||
					.addLine(`Ⓜ️ This room isn't bridged to Discord. ${matrixOnlyConclusion}`, `Ⓜ️ <em>This room isn't bridged to Discord. ${matrixOnlyConclusion}</em>`, matrixOnlyReason === "NOT_BRIDGED")
 | 
										.addLine(`Ⓜ️ This room isn't bridged to Discord. ${matrixOnlyConclusion}`, `Ⓜ️ <em>This room isn't bridged to Discord. ${matrixOnlyConclusion}</em>`, matrixOnlyReason === "NOT_BRIDGED")
 | 
				
			||||||
					.addLine(`Ⓜ️ *Discord ran out of space for emojis. ${matrixOnlyConclusion}`, `Ⓜ️ <em>Discord ran out of space for emojis. ${matrixOnlyConclusion}</em>`, matrixOnlyReason === "CAPACITY")
 | 
										.addLine(`Ⓜ️ *Discord ran out of space for emojis. ${matrixOnlyConclusion}`, `Ⓜ️ <em>Discord ran out of space for emojis. ${matrixOnlyConclusion}</em>`, matrixOnlyReason === "CAPACITY")
 | 
				
			||||||
					.addLine(`Ⓜ️ *If you were a Discord user, you wouldn't have permission to create emojis. ${matrixOnlyConclusion}`, `Ⓜ️ <em>If you were a Discord user, you wouldn't have permission to create emojis. ${matrixOnlyConclusion}</em>`, matrixOnlyReason === "CAPACITY")
 | 
										.addLine(`Ⓜ️ *If you were a Discord user, you wouldn't have permission to create emojis. ${matrixOnlyConclusion}`, `Ⓜ️ <em>If you were a Discord user, you wouldn't have permission to create emojis. ${matrixOnlyConclusion}</em>`, matrixOnlyReason === "CAPACITY")
 | 
				
			||||||
					.addLine("[Preview not available in plain text.]", `Preview: <img data-mx-emoticon height="48" src="${mxc}">`)
 | 
										.addLine("[Preview not available in plain text.]", `Preview: <img data-mx-emoticon height="48" src="${mxc} title=":${name}:" alt=":${name}:">`)
 | 
				
			||||||
					.addLine("Hit ✅ to add it.")
 | 
										.addLine("Hit ✅ to add it.")
 | 
				
			||||||
					.get()
 | 
										.get()
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			addButton(event.room_id, sent, "✅", event.sender).then(async () => {
 | 
								addButton(event.room_id, sent, "✅", event.sender).then(async () => {
 | 
				
			||||||
				const publicUrl = mxUtils.getPublicUrlForMxc(mxc)
 | 
					 | 
				
			||||||
				// @ts-ignore
 | 
					 | 
				
			||||||
				const resizeInput = await fetch(publicUrl, {agent: false}).then(res => res.arrayBuffer())
 | 
					 | 
				
			||||||
				const resizeOutput = await sharp(resizeInput)
 | 
					 | 
				
			||||||
					.resize(EMOJI_SIZE, EMOJI_SIZE, {fit: "inside", withoutEnlargement: true, background: {r: 0, g: 0, b: 0, alpha: 0}})
 | 
					 | 
				
			||||||
					.png()
 | 
					 | 
				
			||||||
					.toBuffer({resolveWithObject: true})
 | 
					 | 
				
			||||||
				if (matrixOnlyReason) {
 | 
									if (matrixOnlyReason) {
 | 
				
			||||||
					// Edit some state keys
 | 
										// Edit some state
 | 
				
			||||||
 | 
										const type = "im.ponies.room_emotes"
 | 
				
			||||||
 | 
										const key = "moe.cadence.ooye.pack.matrix"
 | 
				
			||||||
 | 
										let pack
 | 
				
			||||||
 | 
										try {
 | 
				
			||||||
 | 
											pack = await api.getStateEvent(event.room_id, type, key)
 | 
				
			||||||
 | 
										} catch (e) {
 | 
				
			||||||
 | 
											pack = {
 | 
				
			||||||
 | 
												pack: {
 | 
				
			||||||
 | 
													display_name: "Non-Discord Emojis",
 | 
				
			||||||
 | 
													usage: ["emoticon", "sticker"]
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if (!("images" in pack)) pack.images = {}
 | 
				
			||||||
 | 
										pack.images[name] = {
 | 
				
			||||||
 | 
											url: mxc // Directly use the same file that the Matrix user uploaded. Don't need to worry about dimensions/filesize because clients already request their preferred resized version from the homeserver.
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
					api.sendEvent(event.room_id, "m.room.message", {
 | 
										api.sendEvent(event.room_id, "m.room.message", {
 | 
				
			||||||
						...ctx,
 | 
											...ctx,
 | 
				
			||||||
						msgtype: "m.text",
 | 
											...new MatrixStringBuilder()
 | 
				
			||||||
						body: "Sorry, adding Matrix-only emojis not supported yet!!"
 | 
												.addLine(`Created :${name}:`, `<img data-mx-emoticon height="48" src="${mxc}" title=":${name}:" alt=":${name}:">`)
 | 
				
			||||||
 | 
												.get()
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					// Upload it to Discord and have the bridge sync it back to Matrix again
 | 
										// Upload it to Discord and have the bridge sync it back to Matrix again
 | 
				
			||||||
 | 
										const publicUrl = mxUtils.getPublicUrlForMxc(mxc)
 | 
				
			||||||
 | 
										// @ts-ignore
 | 
				
			||||||
 | 
										const resizeInput = await fetch(publicUrl, {agent: false}).then(res => res.arrayBuffer())
 | 
				
			||||||
 | 
										const resizeOutput = await sharp(resizeInput)
 | 
				
			||||||
 | 
											.resize(EMOJI_SIZE, EMOJI_SIZE, {fit: "inside", withoutEnlargement: true, background: {r: 0, g: 0, b: 0, alpha: 0}})
 | 
				
			||||||
 | 
											.png()
 | 
				
			||||||
 | 
											.toBuffer({resolveWithObject: true})
 | 
				
			||||||
					console.log(`uploading emoji ${resizeOutput.data.length} bytes to :${name}:`)
 | 
										console.log(`uploading emoji ${resizeOutput.data.length} bytes to :${name}:`)
 | 
				
			||||||
					const emoji = await discord.snow.guildAssets.createEmoji(guildID, {name, image: "data:image/png;base64," + resizeOutput.data.toString("base64")})
 | 
										const emoji = await discord.snow.guildAssets.createEmoji(guildID, {name, image: "data:image/png;base64," + resizeOutput.data.toString("base64")})
 | 
				
			||||||
					api.sendEvent(event.room_id, "m.room.message", {
 | 
										api.sendEvent(event.room_id, "m.room.message", {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue