Add files
This commit is contained in:
		
							parent
							
								
									68f4d2540d
								
							
						
					
					
						commit
						05b254fba5
					
				| @ -1,2 +1,5 @@ | ||||
| # mc-server-watcher | ||||
| A script that sends a Discord webhook whenever a server goes offline/online and when a player joins/leaves (works for up to ~5 players) | ||||
| 
 | ||||
| Requires [MCStatus](https://github.com/reimarpb/mcstatus) to be installed | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										116
									
								
								watch-server.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								watch-server.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,116 @@ | ||||
| const { exec } = require("child_process"); | ||||
| const https = require("https"); | ||||
| 
 | ||||
| const SERVER = process.argv[2]; | ||||
| const WEBHOOK_URL = process.env.WEBHOOK_URL; | ||||
| 
 | ||||
| let oldServerStatus = { | ||||
| 	online: false, | ||||
| 	players: -1, | ||||
| 	samplePlayers: [], | ||||
| }; | ||||
| 
 | ||||
| getServerStatus(SERVER); | ||||
| setInterval(() => getServerStatus(SERVER), 10000); | ||||
| 
 | ||||
| function getServerStatus(server) { | ||||
| 	console.log(`Getting server status of ${server}`); | ||||
| 
 | ||||
| 	return new Promise((resolve, reject) => { | ||||
| 		exec("mcstatus -j " + server, async (error, stdout, stderr) => { | ||||
| 			if  (error) { | ||||
| 				console.log(stderr); | ||||
| 				if (oldServerStatus.online) { | ||||
| 					sendMessage(":red_circle: The server is now offline"); | ||||
| 					oldServerStatus = { | ||||
| 						online: false, | ||||
| 						players: -1, | ||||
| 						samplePlayers: [], | ||||
| 					}; | ||||
| 				} | ||||
| 				return resolve(); | ||||
| 			} | ||||
| 
 | ||||
| 			console.log(stdout); | ||||
| 
 | ||||
| 			const json = JSON.parse(stdout); | ||||
| 
 | ||||
| 			if (json.version.name.match(/Offline/)) { | ||||
| 				if (oldServerStatus.online) { | ||||
| 					sendMessage(":red_circle: The server is now offline"); | ||||
| 					oldServerStatus = { | ||||
| 						online: false, | ||||
| 						players: -1, | ||||
| 						samplePlayers: [], | ||||
| 					}; | ||||
| 				} | ||||
| 				return resolve(); | ||||
| 			} | ||||
| 
 | ||||
| 			const match = json.description.text.match(new RegExp(`Connect to §a(${SERVER}:\\d+)§7§8`)); | ||||
| 			if (match) { | ||||
| 				resolve(await getServerStatus(match[1])); | ||||
| 				return resolve(); | ||||
| 			} | ||||
| 
 | ||||
| 			if (!oldServerStatus.online) { | ||||
| 				await sendMessage(":green_circle: The server is now online"); | ||||
| 			} | ||||
| 
 | ||||
| 			const samplePlayers = json.players.sample || []; | ||||
| 			samplePlayers.forEach(player => { | ||||
| 				if (!oldServerStatus.samplePlayers.map(p => p.id).includes(player.id)) { | ||||
| 					sendMessage(`**${player.name}** joined the server`); | ||||
| 				} | ||||
| 			}); | ||||
| 
 | ||||
| 			oldServerStatus.samplePlayers.forEach(player => { | ||||
| 				if (!samplePlayers.map(p => p.id).includes(player.id)) { | ||||
| 					sendMessage(`**${player.name}** left the server`); | ||||
| 				} | ||||
| 			}); | ||||
| 
 | ||||
| 			/*if (oldServerStatus.players != json.players.online) { | ||||
| 				sendMessage(`There are now **${json.players.online}** players online`); | ||||
| 			}*/ | ||||
| 
 | ||||
| 			oldServerStatus = { | ||||
| 				online: true, | ||||
| 				players: json.players.online, | ||||
| 				samplePlayers, | ||||
| 			}; | ||||
| 		}); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function sendMessage(text) { | ||||
| 	console.log(text); | ||||
| 
 | ||||
| 	return new Promise((resolve, reject) => { | ||||
| 		const data = JSON.stringify({ | ||||
| 			content: text, | ||||
| 		}); | ||||
| 
 | ||||
| 		const options = { | ||||
| 			method: "POST", | ||||
| 			headers: { | ||||
| 				"Accept": "application/json", | ||||
| 				"Content-Type": "application/json", | ||||
| 				"Content-Length": data.length, | ||||
| 			} | ||||
| 		}; | ||||
| 		const req = https.request(WEBHOOK_URL, options, (res) => { | ||||
| 
 | ||||
| 			let data = ""; | ||||
| 			res.on("data", chunk => data += chunk); | ||||
| 			res.on("end", () => { | ||||
| 				console.log(res.statusCode); | ||||
| 				resolve(); | ||||
| 			}); | ||||
| 
 | ||||
| 		}); | ||||
| 		req.write(data); | ||||
| 		req.end(); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user