mirror of
https://github.com/ditatompel/xmr-remote-nodes.git
synced 2024-12-22 11:39:23 +00:00
feat: Added more information on monero node details page
These following information added to Monero Node details: - CORS capable - Country, City, ASNumber (if any) - Monitored Since This commit also add some styling to TOR, I2P information.
This commit is contained in:
parent
84ad053413
commit
b780783df0
2 changed files with 521 additions and 407 deletions
|
@ -206,10 +206,16 @@ templ TableNodes(data monero.Nodes, countries []monero.Countries, q monero.Query
|
||||||
@cellHostPort(row.ID, row.Port, row.Hostname, row.IPAddresses, row.IsTor, row.IsI2P, row.IPv6Only)
|
@cellHostPort(row.ID, row.Port, row.Hostname, row.IPAddresses, row.IsTor, row.IsI2P, row.IPv6Only)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@cellNettype(row.Nettype, row.Height)
|
@fmtNettype(row.Nettype)
|
||||||
|
<br/>
|
||||||
|
{ fmt.Sprintf("%d", row.Height) }
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@cellProtocol(row.Protocol, row.CORSCapable)
|
@fmtProtocol(row.Protocol)
|
||||||
|
if row.CORSCapable {
|
||||||
|
<br/>
|
||||||
|
(CORS 💪)
|
||||||
|
}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@cellCountry(row.CountryCode, row.CountryName, row.City, row.ASNName, row.ASN)
|
@cellCountry(row.CountryCode, row.CountryName, row.City, row.ASNName, row.ASN)
|
||||||
|
@ -259,7 +265,12 @@ templ Node(data monero.Node) {
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<ul>
|
<ul>
|
||||||
<li class="uppercase">{ data.Protocol }</li>
|
<li class="uppercase">
|
||||||
|
@fmtProtocol(data.Protocol)
|
||||||
|
if data.CORSCapable {
|
||||||
|
<span class="ml-2">(CORS 💪)</span>
|
||||||
|
}
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
@ -270,7 +281,14 @@ templ Node(data monero.Node) {
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<ul>
|
<ul>
|
||||||
<li class="uppercase">{ data.Nettype }</li>
|
<li class="uppercase">
|
||||||
|
if data.IsI2P {
|
||||||
|
<span class="badge bg-green-600 mr-2">I2P</span>
|
||||||
|
} else if data.IsTor {
|
||||||
|
<span class="badge bg-purple-800 mr-2">TOR</span>
|
||||||
|
}
|
||||||
|
@fmtNettype(data.Nettype)
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
@ -287,6 +305,32 @@ templ Node(data monero.Node) {
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
}
|
}
|
||||||
|
if data.CountryCode != "" {
|
||||||
|
<dl class="flex flex-col sm:flex-row gap-1">
|
||||||
|
<dt class="min-w-40">
|
||||||
|
<span class="block text-white text-bold">Country:</span>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
<ul>
|
||||||
|
<li class="whitespace-break-spaces">
|
||||||
|
@cellCountry(data.CountryCode, data.CountryName, data.City, data.ASNName, data.ASN)
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
}
|
||||||
|
<dl class="flex flex-col sm:flex-row gap-1">
|
||||||
|
<dt class="min-w-40">
|
||||||
|
<span class="block text-white text-bold">Monitored Since:</span>
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
<ul>
|
||||||
|
<li class="whitespace-break-spaces">
|
||||||
|
{ time.Unix(data.DateEntered, 0).UTC().Format("Jan 2, 2006 15:04 MST") } (about { utils.TimeSince(data.DateEntered) })
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,6 +457,26 @@ templ TableLogs(hxPath string, data monero.FetchLogs, q monero.QueryLogs, p pagi
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
templ fmtNettype(nettype string) {
|
||||||
|
switch nettype {
|
||||||
|
case "stagenet":
|
||||||
|
<span class="font-semibold uppercase text-sky-500">{ nettype }</span>
|
||||||
|
case "testnet":
|
||||||
|
<span class="font-semibold uppercase text-rose-500">{ nettype }</span>
|
||||||
|
default:
|
||||||
|
<span class="font-semibold uppercase text-green-500">{ nettype }</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
templ fmtProtocol(protocol string) {
|
||||||
|
switch protocol {
|
||||||
|
case "http":
|
||||||
|
<span class="font-semibold uppercase text-sky-500">{ protocol }</span>
|
||||||
|
default:
|
||||||
|
<span class="font-semibold uppercase text-green-500">{ protocol }</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
templ cellHostPort(id, port uint, hostname, ips string, isTor, isI2P, ipv6Only bool) {
|
templ cellHostPort(id, port uint, hostname, ips string, isTor, isI2P, ipv6Only bool) {
|
||||||
if isTor {
|
if isTor {
|
||||||
<button
|
<button
|
||||||
|
@ -447,7 +511,19 @@ templ cellHostPort(id, port uint, hostname, ips string, isTor, isI2P, ipv6Only b
|
||||||
.i2p:<span class="text-indigo-400">{ fmt.Sprintf("%d", port) }</span>
|
.i2p:<span class="text-indigo-400">{ fmt.Sprintf("%d", port) }</span>
|
||||||
<span class="badge bg-green-600">I2P</span>
|
<span class="badge bg-green-600">I2P</span>
|
||||||
} else {
|
} else {
|
||||||
{ ip.FormatHostname(hostname) }:<span class="text-indigo-400">{ fmt.Sprintf("%d", port) }</span>
|
<button
|
||||||
|
class="text-orange-400 hover:brightness-125"
|
||||||
|
hx-get={ fmt.Sprintf("/remote-nodes/id/%d", id) }
|
||||||
|
hx-push-url="false"
|
||||||
|
hx-target="#modal-section"
|
||||||
|
aria-haspopup="dialog"
|
||||||
|
aria-expanded="false"
|
||||||
|
aria-controls="modal-section"
|
||||||
|
data-hs-overlay="#modal-section"
|
||||||
|
>
|
||||||
|
👁 { ip.FormatHostname(hostname) }
|
||||||
|
</button>
|
||||||
|
:<span class="text-indigo-400">{ fmt.Sprintf("%d", port) }</span>
|
||||||
<br/>
|
<br/>
|
||||||
<div class="max-w-40 text-ellipsis overflow-x-auto md:overflow-hidden hover:overflow-visible">
|
<div class="max-w-40 text-ellipsis overflow-x-auto md:overflow-hidden hover:overflow-visible">
|
||||||
<span class="whitespace-break-spaces text-gray-400">{ strings.ReplaceAll(ips, ",", " ") }</span>
|
<span class="whitespace-break-spaces text-gray-400">{ strings.ReplaceAll(ips, ",", " ") }</span>
|
||||||
|
@ -458,32 +534,6 @@ templ cellHostPort(id, port uint, hostname, ips string, isTor, isI2P, ipv6Only b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
templ cellNettype(nettype string, height uint) {
|
|
||||||
switch nettype {
|
|
||||||
case "stagenet":
|
|
||||||
<span class="font-semibold uppercase text-sky-500">{ nettype }</span>
|
|
||||||
case "testnet":
|
|
||||||
<span class="font-semibold uppercase text-rose-500">{ nettype }</span>
|
|
||||||
default:
|
|
||||||
<span class="font-semibold uppercase text-green-500">{ nettype }</span>
|
|
||||||
}
|
|
||||||
<br/>
|
|
||||||
{ fmt.Sprintf("%d", height) }
|
|
||||||
}
|
|
||||||
|
|
||||||
templ cellProtocol(protocol string, cors bool) {
|
|
||||||
switch protocol {
|
|
||||||
case "http":
|
|
||||||
<span class="font-semibold uppercase text-sky-500">{ protocol }</span>
|
|
||||||
default:
|
|
||||||
<span class="font-semibold uppercase text-green-500">{ protocol }</span>
|
|
||||||
}
|
|
||||||
if cors {
|
|
||||||
<br/>
|
|
||||||
(CORS 💪)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
templ cellCountry(cc, countryName, city, asnName string, asn uint) {
|
templ cellCountry(cc, countryName, city, asnName string, asn uint) {
|
||||||
if cc != "" {
|
if cc != "" {
|
||||||
if city != "" {
|
if city != "" {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue