Add meta descriptions for mempool and liquid
This commit is contained in:
@@ -34,6 +34,7 @@ export class ChannelPreviewComponent implements OnInit {
|
||||
this.openGraphService.waitFor('channel-data-' + this.shortId);
|
||||
this.error = null;
|
||||
this.seoService.setTitle(`Channel: ${params.get('short_id')}`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.channel:Overview for Lightning channel ${params.get('short_id')}. See channel capacity, the Lightning nodes involved, related on-chain transactions, and more.`);
|
||||
return this.lightningApiService.getChannel$(params.get('short_id'))
|
||||
.pipe(
|
||||
tap((data) => {
|
||||
|
||||
@@ -35,6 +35,7 @@ export class ChannelComponent implements OnInit {
|
||||
.pipe(
|
||||
tap((value) => {
|
||||
this.seoService.setTitle($localize`Channel: ${value.short_id}`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.channel:Overview for Lightning channel ${value.short_id}. See channel capacity, the Lightning nodes involved, related on-chain transactions, and more.`);
|
||||
}),
|
||||
catchError((err) => {
|
||||
this.error = err;
|
||||
|
||||
@@ -31,6 +31,7 @@ export class GroupPreviewComponent implements OnInit {
|
||||
|
||||
ngOnInit(): void {
|
||||
this.seoService.setTitle(`Mempool.Space Lightning Nodes`);
|
||||
this.seoService.setDescription(`See all Lightning nodes run by mempool.space -- these are the nodes that provide the data on the mempool.space Lightning dashboard.`);
|
||||
|
||||
this.nodes$ = this.activatedRoute.paramMap
|
||||
.pipe(
|
||||
|
||||
@@ -39,6 +39,7 @@ export class GroupComponent implements OnInit {
|
||||
});
|
||||
|
||||
this.seoService.setTitle(`Mempool.space Lightning Nodes`);
|
||||
this.seoService.setDescription(`See all Lightning nodes run by mempool.space -- these are the nodes that provide the data on the mempool.space Lightning dashboard.`);
|
||||
|
||||
this.nodes$ = this.lightningApiService.getNodGroupNodes$('mempool.space')
|
||||
.pipe(
|
||||
|
||||
@@ -25,6 +25,7 @@ export class LightningDashboardComponent implements OnInit, AfterViewInit {
|
||||
|
||||
ngOnInit(): void {
|
||||
this.seoService.setTitle($localize`:@@142e923d3b04186ac6ba23387265d22a2fa404e0:Lightning Explorer`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.dashboard:Get stats on the Lightning network (aggregate capacity, connectivity, etc) and Lightning nodes (channels, liquidity, etc) and Lightning channels (status, fees, etc).`);
|
||||
|
||||
this.nodesRanking$ = this.lightningApiService.getNodesRanking$().pipe(share());
|
||||
this.statistics$ = this.lightningApiService.getLatestStatistics$().pipe(share());
|
||||
|
||||
@@ -49,6 +49,7 @@ export class NodePreviewComponent implements OnInit {
|
||||
}),
|
||||
map((node) => {
|
||||
this.seoService.setTitle(`Node: ${node.alias}`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.node:Overview for the Lightning network node named ${node.alias}. See channels, capacity, location, fee stats, and more.`);
|
||||
|
||||
const socketsObject = [];
|
||||
const socketTypesMap = {};
|
||||
|
||||
@@ -60,6 +60,7 @@ export class NodeComponent implements OnInit {
|
||||
}),
|
||||
map((node) => {
|
||||
this.seoService.setTitle($localize`Node: ${node.alias}`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.node:Overview for the Lightning network node named ${node.alias}. See channels, capacity, location, fee stats, and more.`);
|
||||
this.clearnetSocketCount = 0;
|
||||
this.torSocketCount = 0;
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
@Input() disableSpinner = false;
|
||||
@Output() readyEvent = new EventEmitter();
|
||||
|
||||
channelsObservable: Observable<any>;
|
||||
channelsObservable: Observable<any>;
|
||||
|
||||
center: number[] | undefined;
|
||||
zoom: number | undefined;
|
||||
@@ -41,7 +41,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
chartOptions: EChartsOption = {};
|
||||
chartInitOptions = {
|
||||
renderer: 'canvas',
|
||||
};
|
||||
};
|
||||
|
||||
constructor(
|
||||
private seoService: SeoService,
|
||||
@@ -64,15 +64,16 @@ export class NodesChannelsMap implements OnInit {
|
||||
this.zoom = 1.4;
|
||||
this.center = [0, 10];
|
||||
}
|
||||
|
||||
|
||||
if (this.style === 'graph') {
|
||||
this.seoService.setTitle($localize`Lightning Nodes Channels World Map`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.node-map:See the channels of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.`);
|
||||
}
|
||||
|
||||
if (['nodepage', 'channelpage'].includes(this.style)) {
|
||||
this.nodeSize = 8;
|
||||
}
|
||||
|
||||
|
||||
this.channelsObservable = this.activatedRoute.paramMap
|
||||
.pipe(
|
||||
delay(100),
|
||||
@@ -81,7 +82,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
if (this.style === 'channelpage' && this.channel.length === 0 || !this.hasLocation) {
|
||||
this.isLoading = false;
|
||||
}
|
||||
|
||||
|
||||
return zip(
|
||||
this.assetsService.getWorldMapJson$,
|
||||
this.style !== 'channelpage' ? this.apiService.getChannelsGeo$(params.get('public_key') ?? undefined, this.style) : [''],
|
||||
@@ -140,7 +141,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
// on top of each other
|
||||
let random = Math.random() * 2 * Math.PI;
|
||||
let random2 = Math.random() * 0.01;
|
||||
|
||||
|
||||
if (!nodesPubkeys[node1UniqueId]) {
|
||||
nodes.push([
|
||||
channel[node1GpsLat] + random2 * Math.cos(random),
|
||||
@@ -167,7 +168,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
}
|
||||
|
||||
const channelLoc = [];
|
||||
channelLoc.push(nodesPubkeys[node1UniqueId].slice(0, 2));
|
||||
channelLoc.push(nodesPubkeys[node1UniqueId].slice(0, 2));
|
||||
channelLoc.push(nodesPubkeys[node2UniqueId].slice(0, 2));
|
||||
channelsLoc.push(channelLoc);
|
||||
}
|
||||
@@ -326,7 +327,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
this.chartInstance.on('finished', () => {
|
||||
this.isLoading = false;
|
||||
});
|
||||
|
||||
|
||||
if (this.style === 'widget') {
|
||||
this.chartInstance.getZr().on('click', (e) => {
|
||||
this.zone.run(() => {
|
||||
@@ -335,7 +336,7 @@ export class NodesChannelsMap implements OnInit {
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
this.chartInstance.on('click', (e) => {
|
||||
if (e.data) {
|
||||
this.zone.run(() => {
|
||||
|
||||
@@ -48,6 +48,7 @@ export class NodesMap implements OnInit, OnChanges {
|
||||
ngOnInit(): void {
|
||||
if (!this.widget) {
|
||||
this.seoService.setTitle($localize`:@@af8560ca50882114be16c951650f83bca73161a7:Lightning Nodes World Map`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.node-channel-map:See the locations of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.`);
|
||||
}
|
||||
|
||||
if (!this.inputNodes$) {
|
||||
|
||||
@@ -65,6 +65,7 @@ export class NodesNetworksChartComponent implements OnInit {
|
||||
this.miningWindowPreference = '3y';
|
||||
} else {
|
||||
this.seoService.setTitle($localize`:@@b420668a91f8ebaf6e6409c4ba87f1d45961d2bd:Lightning Nodes Per Network`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.nodes-network:See the number of Lightning network nodes visualized over time by network: clearnet only (IPv4, IPv6), darknet (Tor, I2p, cjdns), and both.`);
|
||||
this.miningWindowPreference = this.miningService.getDefaultTimespan('all');
|
||||
}
|
||||
this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
|
||||
@@ -375,7 +376,7 @@ export class NodesNetworksChartComponent implements OnInit {
|
||||
// We create dummy duplicated series so when we use the data zoom, the y axis
|
||||
// both scales properly
|
||||
const invisibleSerie = {...serie};
|
||||
invisibleSerie.name = 'ignored' + Math.random().toString();
|
||||
invisibleSerie.name = 'ignored' + Math.random().toString();
|
||||
invisibleSerie.stack = 'ignored';
|
||||
invisibleSerie.yAxisIndex = 1;
|
||||
invisibleSerie.lineStyle = {
|
||||
|
||||
@@ -44,7 +44,7 @@ export class NodesPerCountryChartComponent implements OnInit {
|
||||
|
||||
ngOnInit(): void {
|
||||
this.seoService.setTitle($localize`:@@9d3ad4c6623870d96b65fb7a708fed6ce7c20044:Lightning Nodes Per Country`);
|
||||
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.nodes-country-overview:See a geographical breakdown of the Lightning network: how many Lightning nodes are hosted in countries around the world, aggregate BTC capacity for each country, and more.`);
|
||||
this.nodesPerCountryObservable$ = this.apiService.getNodesPerCountry$()
|
||||
.pipe(
|
||||
map(data => {
|
||||
|
||||
@@ -33,6 +33,7 @@ export class NodesPerCountry implements OnInit {
|
||||
.pipe(
|
||||
map(response => {
|
||||
this.seoService.setTitle($localize`Lightning nodes in ${response.country.en}`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.nodes-country:Explore all the Lightning nodes hosted in ${response.country.en} and see an overview of each node's capacity, number of open channels, and more.`);
|
||||
|
||||
this.country = {
|
||||
name: response.country.en,
|
||||
@@ -47,7 +48,7 @@ export class NodesPerCountry implements OnInit {
|
||||
iso: response.nodes[i].iso_code,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
const sumLiquidity = response.nodes.reduce((partialSum, a) => partialSum + a.capacity, 0);
|
||||
const sumChannels = response.nodes.reduce((partialSum, a) => partialSum + a.channels, 0);
|
||||
const isps = {};
|
||||
@@ -70,14 +71,14 @@ export class NodesPerCountry implements OnInit {
|
||||
isps[node.isp].asns.push(node.as_number);
|
||||
}
|
||||
isps[node.isp].count++;
|
||||
|
||||
|
||||
if (isps[node.isp].count > topIsp.count) {
|
||||
topIsp.count = isps[node.isp].count;
|
||||
topIsp.id = isps[node.isp].asns.join(',');
|
||||
topIsp.name = node.isp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
nodes: response.nodes,
|
||||
sumLiquidity: sumLiquidity,
|
||||
|
||||
@@ -42,6 +42,7 @@ export class NodesPerISPPreview implements OnInit {
|
||||
id: this.route.snapshot.params.isp.split(',').join(', ')
|
||||
};
|
||||
this.seoService.setTitle($localize`Lightning nodes on ISP: ${response.isp} [AS${this.route.snapshot.params.isp}]`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.nodes-isp:Browse all Bitcoin Lightning nodes using the ${response.isp} [AS${this.route.snapshot.params.isp}] ISP and see aggregate stats like total number of nodes, total capacity, and more for the ISP.`);
|
||||
|
||||
for (const i in response.nodes) {
|
||||
response.nodes[i].geolocation = <GeolocationData>{
|
||||
|
||||
@@ -37,6 +37,7 @@ export class NodesPerISP implements OnInit {
|
||||
id: this.route.snapshot.params.isp.split(',').join(', ')
|
||||
};
|
||||
this.seoService.setTitle($localize`Lightning nodes on ISP: ${response.isp} [AS${this.route.snapshot.params.isp}]`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.nodes-isp:Browse all Bitcoin Lightning nodes using the ${response.isp} [AS${this.route.snapshot.params.isp}] ISP and see aggregate stats like total number of nodes, total capacity, and more for the ISP.`);
|
||||
|
||||
for (const i in response.nodes) {
|
||||
response.nodes[i].geolocation = <GeolocationData>{
|
||||
|
||||
@@ -25,6 +25,7 @@ export class OldestNodes implements OnInit {
|
||||
ngOnInit(): void {
|
||||
if (!this.widget) {
|
||||
this.seoService.setTitle($localize`Oldest lightning nodes`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.ranking.oldest:See the oldest nodes on the Lightning network along with their capacity, number of channels, location, etc.`);
|
||||
}
|
||||
|
||||
for (let i = 1; i <= (this.widget ? 10 : 100); ++i) {
|
||||
|
||||
@@ -15,7 +15,7 @@ import { LightningApiService } from '../../lightning-api.service';
|
||||
export class TopNodesPerCapacity implements OnInit {
|
||||
@Input() nodes$: Observable<INodesRanking>;
|
||||
@Input() widget: boolean = false;
|
||||
|
||||
|
||||
topNodesPerCapacity$: Observable<ITopNodesPerCapacity[]>;
|
||||
skeletonRows: number[] = [];
|
||||
currency$: Observable<string>;
|
||||
@@ -31,6 +31,7 @@ export class TopNodesPerCapacity implements OnInit {
|
||||
|
||||
if (!this.widget) {
|
||||
this.seoService.setTitle($localize`:@@2d9883d230a47fbbb2ec969e32a186597ea27405:Liquidity Ranking`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.ranking.liquidity:See Lightning nodes with the most BTC liquidity deployed along with high-level stats like number of open channels, location, node age, and more.`);
|
||||
}
|
||||
|
||||
for (let i = 1; i <= (this.widget ? 6 : 100); ++i) {
|
||||
|
||||
@@ -35,6 +35,7 @@ export class TopNodesPerChannels implements OnInit {
|
||||
|
||||
if (this.widget === false) {
|
||||
this.seoService.setTitle($localize`:@@c50bf442cf99f6fc5f8b687c460f33234b879869:Connectivity Ranking`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.ranking.channels:See Lightning nodes with the most channels open along with high-level stats like total node capacity, node age, and more.`);
|
||||
|
||||
this.topNodesPerChannels$ = this.apiService.getTopNodesByChannels$().pipe(
|
||||
map((ranking) => {
|
||||
|
||||
@@ -20,6 +20,7 @@ export class NodesRankingsDashboard implements OnInit {
|
||||
|
||||
ngOnInit(): void {
|
||||
this.seoService.setTitle($localize`Top lightning nodes`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.rankings-dashboard:See top the Lightning network nodes ranked by liquidity, connectivity, and age.`);
|
||||
this.nodesRanking$ = this.lightningApiService.getNodesRanking$().pipe(share());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ export class LightningStatisticsChartComponent implements OnInit {
|
||||
this.miningWindowPreference = '3y';
|
||||
} else {
|
||||
this.seoService.setTitle($localize`:@@ea8db27e6db64f8b940711948c001a1100e5fe9f:Lightning Network Capacity`);
|
||||
this.seoService.setDescription($localize`:@@meta.description.lightning.stats-chart:See the capacity of the Lightning network visualized over time in terms of the number of open channels and total bitcoin capacity.`);
|
||||
this.miningWindowPreference = this.miningService.getDefaultTimespan('all');
|
||||
}
|
||||
this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
|
||||
|
||||
Reference in New Issue
Block a user