Wipe branch
This commit is contained in:
		
							
								
								
									
										223
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,223 @@ | ||||
| const sprintf = (...[string, ...args]) => { | ||||
|     return string.replace(/{(\d+)}/g, (match, number) => args[number] ?? match); | ||||
| } | ||||
|  | ||||
| const getJSON = async url => { | ||||
| 	const resp = await fetch(url) | ||||
| 	const json = await resp.json() | ||||
|     return json; | ||||
| } | ||||
|  | ||||
| const createPopup = async id => { | ||||
| 	const asics = await getJSON('/api/asictypes') | ||||
|  | ||||
| 	asicoptions = '' | ||||
| 	asics.forEach(elem => { | ||||
| 		asicoptions += sprintf('<option value="{0}">{1}</option>', elem['key'], elem['value']) | ||||
| 	}) | ||||
|  | ||||
| 	document.querySelector('body').innerHTML += sprintf(popup, id, asicoptions, 'content') | ||||
| } | ||||
|  | ||||
| const deletePopup = id => { | ||||
| 	document.querySelector('#popup-' + id).remove() | ||||
| } | ||||
|  | ||||
| const update = async () => { | ||||
| 	let inner = await getStats() | ||||
| 	document.querySelector('.grid').innerHTML = inner | ||||
| } | ||||
|  | ||||
| const datafn = async () => { | ||||
| 	// return await getJSON('/api/webinit') | ||||
| } | ||||
|  | ||||
| const data = datafn() | ||||
|  | ||||
| console.log(data) | ||||
|  | ||||
| const cols = 40 | ||||
| const rows = 40 | ||||
|  | ||||
|  | ||||
| const css = | ||||
| 	`<style> | ||||
| 	@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap'); | ||||
|  | ||||
| 	* { | ||||
| 		margin: 0; | ||||
| 		padding: 0; | ||||
| 		box-sizing: border-box; | ||||
| 		font-family: 'Source Code Pro', monospace; | ||||
| 	} | ||||
|  | ||||
| 	body { | ||||
| 		background: #000; | ||||
| 	} | ||||
|  | ||||
| 	input, | ||||
| 	select { | ||||
| 		border: 1px solid #fff; | ||||
| 		background: #000; | ||||
| 		color: #fff; | ||||
| 		padding: 5px 10px; | ||||
| 	} | ||||
|  | ||||
| 	.green { | ||||
| 		background: #0b0 !important; | ||||
| 	} | ||||
|  | ||||
| 	.yellow { | ||||
| 		background: #ff0 !important; | ||||
| 	} | ||||
|  | ||||
| 	.red { | ||||
| 		background: #f11 !important; | ||||
| 	} | ||||
|  | ||||
| 	.darkred { | ||||
| 		background: #300 !important; | ||||
| 	} | ||||
|  | ||||
| 	.header { | ||||
| 		height: 60px; | ||||
| 		background: #222; | ||||
| 		text-align: center; | ||||
| 		margin: 0 0 1px 0; | ||||
| 		display: grid; | ||||
| 		justify-items: center; | ||||
| 		align-content: center; | ||||
| 	} | ||||
|  | ||||
| 	.header-info { | ||||
| 		color: #bbb; | ||||
| 		font-weight: 700; | ||||
| 	} | ||||
|  | ||||
| 	.grid { | ||||
| 		display: grid; | ||||
| 		grid-template-columns: repeat(${cols}, 30px); | ||||
| 		grid-template-rows: repeat(${rows}, 30px); | ||||
| 		grid-gap: 1px; | ||||
| 		margin: auto; | ||||
| 		width: max-content; | ||||
| 	} | ||||
|  | ||||
| 	.cell { | ||||
| 		position: relative; | ||||
| 		background: #111; | ||||
| 		font-size: 9px; | ||||
| 	} | ||||
|  | ||||
| 	.cell:hover { | ||||
| 		cursor: pointer; | ||||
| 	} | ||||
|  | ||||
| 	.cell:hover::after { | ||||
| 		content: ''; | ||||
| 		position: absolute; | ||||
| 		top: 0; | ||||
| 		left: 0; | ||||
| 		width: 100%; | ||||
| 		height: 100%; | ||||
| 		pointer-events: none; | ||||
| 		background: #ffffff33; | ||||
| 	} | ||||
|  | ||||
| 	.popup { | ||||
| 		position: fixed; | ||||
| 		top: 0; | ||||
| 		left: 0; | ||||
| 		width: 100vw; | ||||
| 		height: 100vh; | ||||
| 		display: grid; | ||||
| 		justify-items: center; | ||||
| 		align-content: center; | ||||
| 	} | ||||
|  | ||||
| 	.popup-bg { | ||||
| 		position: absolute; | ||||
| 		width: 100%; | ||||
| 		height: 100%; | ||||
| 		background: #00000033; | ||||
| 		z-index: 98; | ||||
| 	} | ||||
|  | ||||
| 	.popup-window { | ||||
| 		position: relative; | ||||
| 		height: max-content; | ||||
| 		max-height: 90vh; | ||||
| 		width: max-content; | ||||
| 		max-width: 90vw; | ||||
| 		padding: 40px; | ||||
| 		background: #222; | ||||
| 		z-index: 99; | ||||
| 	} | ||||
| 	</style> | ||||
| 	` | ||||
|  | ||||
| const header = | ||||
| 	'<div class="header">' | ||||
| 		+ '<div class="header-info">' | ||||
| 			+ 'Всего устройств: {0}, Предупреждений, {1}, Ошибки: {2}, В сети: {3}, Не в сети: {4}' | ||||
| 		+ '</div>' | ||||
| 	+ '</div>' | ||||
|  | ||||
|  | ||||
| const cell = | ||||
| 	'<div class="cell {1}" id="cell-{0}" onclick="createPopup({0})">' | ||||
| 		+ '{2}' | ||||
| 	+ '</div>' | ||||
|  | ||||
| const grid = | ||||
| 	'<div class="grid">' | ||||
| 		+ '{0}' | ||||
| 	+ '</div>' | ||||
|  | ||||
| const popup = | ||||
| 	'<div class="popup" id="popup-{0}">' | ||||
| 		+ '<div class="popup-bg" onclick="deletePopup({0})"></div>' | ||||
| 		+ '<div class="popup-window">' | ||||
| 			+ '<div class="row">' | ||||
| 				+ '<select>' | ||||
| 					+ '<option value="none">Свободно</option>' | ||||
| 					+ '{1}' | ||||
| 				+ '</select>' | ||||
| 				+ '<input type="text" placeholder="Адрес...">' | ||||
| 			+ '</div>' | ||||
| 			+ '{2}' | ||||
| 		+ '</div>' | ||||
| 	+ '</div>' | ||||
|  | ||||
| const getStats = async () => { | ||||
| 	let cells = '' | ||||
| 	let info = await getJSON('/curstatus.json') | ||||
| 	for(let i = 1; i <= cols * rows; i++) { | ||||
| 		if(info.asics[i]?.status == "ok") | ||||
| 			cells += sprintf(cell, i, 'green', info.asics[i]?.hashrate) | ||||
| 		else if(info.asics[i]?.status == "warn") | ||||
| 			cells += sprintf(cell, i, 'yellow', info.asics[i]?.hashrate) | ||||
| 		else if(info.asics[i]?.status == "crit") | ||||
| 			cells += sprintf(cell, i, 'red', info.asics[i]?.hashrate) | ||||
| 		else if(info.asics[i]?.status == "off") | ||||
| 			cells += sprintf(cell, i, 'darkred', '') | ||||
| 		else | ||||
| 			cells += sprintf(cell, i, '', '') | ||||
| 	} | ||||
| 	return cells | ||||
| } | ||||
|  | ||||
| const run = async () => { | ||||
| 	document.querySelector('body').innerHTML += css | ||||
| 	document.querySelector('body').innerHTML += sprintf(header) | ||||
|  | ||||
| 	let inner = sprintf(grid, await getStats()) | ||||
| 	document.querySelector('body').innerHTML += inner | ||||
|  | ||||
| 	setInterval(async () => { | ||||
| 		await update() | ||||
| 	}, 10000) | ||||
| } | ||||
|  | ||||
|  | ||||
| run() | ||||
		Reference in New Issue
	
	Block a user