forked from ChrisChrome/weather-bot
		
	[+] Ability to get product text via discord
This commit is contained in:
		
							parent
							
								
									c814f4602a
								
							
						
					
					
						commit
						c6964ee0e9
					
				
							
								
								
									
										35
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								index.js
									
									
									
									
									
								
							|  | @ -36,6 +36,7 @@ const parseProductID = function (product_id) { | ||||||
| 	const [timestamp, station, wmo, pil] = product_id.split("-"); | 	const [timestamp, station, wmo, pil] = product_id.split("-"); | ||||||
| 	return { | 	return { | ||||||
| 		timestamp: convertDate(timestamp), | 		timestamp: convertDate(timestamp), | ||||||
|  | 		originalTimestamp: timestamp, | ||||||
| 		station, | 		station, | ||||||
| 		wmo, | 		wmo, | ||||||
| 		pil | 		pil | ||||||
|  | @ -115,6 +116,7 @@ xmpp.on("stanza", (stanza) => { | ||||||
| 		const bodyData = getFirstURL(body); | 		const bodyData = getFirstURL(body); | ||||||
| 		// get product id from "x" tag
 | 		// get product id from "x" tag
 | ||||||
| 		const product_id = parseProductID(stanza.getChild("x").attrs.product_id); | 		const product_id = parseProductID(stanza.getChild("x").attrs.product_id); | ||||||
|  | 		const product_id_raw = stanza.getChild("x").attrs.product_id; | ||||||
| 		// Check timestamp, if not within 3 minutes, ignore it
 | 		// Check timestamp, if not within 3 minutes, ignore it
 | ||||||
| 		const now = new Date(); | 		const now = new Date(); | ||||||
| 		const diff = (now - product_id.timestamp) / 1000 / 60; | 		const diff = (now - product_id.timestamp) / 1000 / 60; | ||||||
|  | @ -129,7 +131,7 @@ xmpp.on("stanza", (stanza) => { | ||||||
| 				"title": "New Alert", | 				"title": "New Alert", | ||||||
| 				"tags": [`Timestamp: ${product_id.timestamp}`, `Station: ${product_id.station}`, `WMO: ${product_id.wmo}`, `PIL: ${product_id.pil}`, `Channel: ${fromChannel}`], | 				"tags": [`Timestamp: ${product_id.timestamp}`, `Station: ${product_id.station}`, `WMO: ${product_id.wmo}`, `PIL: ${product_id.pil}`, `Channel: ${fromChannel}`], | ||||||
| 				"priority": 3, | 				"priority": 3, | ||||||
| 				"actions": [{ "action": "view", "label": "Product", "url": bodyData.url }] | 				"actions": [{ "action": "view", "label": "Product", "url": bodyData.url }, { "action": "view", "label": "Product Text", "url": `https://mesonet.agron.iastate.edu/api/1/nwstext/${product_id_raw}`}] | ||||||
| 			} | 			} | ||||||
| 			if (stanza.getChild("x").attrs.twitter_media) { | 			if (stanza.getChild("x").attrs.twitter_media) { | ||||||
| 				ntfyBody.attach = stanza.getChild("x").attrs.twitter_media; | 				ntfyBody.attach = stanza.getChild("x").attrs.twitter_media; | ||||||
|  | @ -191,6 +193,15 @@ xmpp.on("stanza", (stanza) => { | ||||||
| 									label: "Product", | 									label: "Product", | ||||||
| 									style: 5, | 									style: 5, | ||||||
| 									url: bodyData.url | 									url: bodyData.url | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									type: 2, | ||||||
|  | 									style: 1, | ||||||
|  | 									custom_id: product_id_raw, | ||||||
|  | 									label: "Product Text", | ||||||
|  | 									emoji: { | ||||||
|  | 										name: "📄" | ||||||
|  | 									} | ||||||
| 								} | 								} | ||||||
| 							] | 							] | ||||||
| 						} | 						} | ||||||
|  | @ -437,6 +448,28 @@ discord.on("interactionCreate", async (interaction) => { | ||||||
| 					}); | 					}); | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  | 		case Discord.InteractionType.MessageComponent: | ||||||
|  | 			if (interaction.customId) { | ||||||
|  | 				const product_id = interaction.customId; | ||||||
|  | 				const url = `https://mesonet.agron.iastate.edu/api/1/nwstext/${product_id}`; | ||||||
|  | 				fetch(url).then((res) => { | ||||||
|  | 					if (res.status !== 200) { | ||||||
|  | 						interaction.reply({ content: "Failed to get product text", ephemeral: true }); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  | 					// Retruns raw text, paginate it into multiple embeds if needed
 | ||||||
|  | 					res.text().then((text) => { | ||||||
|  | 						const pages = text.match(/[\s\S]{1,2000}(?=\s|$)/g); | ||||||
|  | 						const embeds = pages.map((page, ind) => ({ | ||||||
|  | 							title: `Product Text Pg ${ind + 1}/${pages.length}`, | ||||||
|  | 							description: `\`\`\`${page}\`\`\``, | ||||||
|  | 							color: 0x00ff00 | ||||||
|  | 						})); | ||||||
|  | 						interaction.reply({ embeds }); | ||||||
|  | 					}); | ||||||
|  | 				}); | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| }); | }); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue