Skip to content

Commit f234be1

Browse files
ImmanuelSegolrsercano
authored andcommitted
feat(cli): output enhancements
Adds cli enhancements for: - getinfo - getnodeinfo - executeswap - channelbalance Co-authored-by: rsercano <ozdemirsercan27@gmail.com>
1 parent adb8b14 commit f234be1

File tree

4 files changed

+182
-15
lines changed

4 files changed

+182
-15
lines changed

lib/cli/commands/channelbalance.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,39 @@ import { callback, loadXudClient } from '../command';
22
import { Arguments } from 'yargs';
33
import { ChannelBalanceRequest, ChannelBalanceResponse } from '../../proto/xudrpc_pb';
44
import { satsToCoinsStr } from '../utils';
5+
import Table, { HorizontalTable } from 'cli-table3';
6+
import colors from 'colors/safe';
7+
8+
const HEADERS = [
9+
colors.blue('Ticker'),
10+
colors.blue('Balance'),
11+
colors.blue('Pending Balance'),
12+
];
13+
14+
const formatChannels = (channels: ChannelBalanceResponse.AsObject) => {
15+
const formatted: any[] = [];
16+
channels.balancesMap.forEach((channel) => {
17+
const element = [];
18+
element.push(channel[0], `${satsToCoinsStr(channel[1].balance)}`, `${satsToCoinsStr(channel[1].pendingOpenBalance)}`);
19+
formatted.push(element);
20+
});
21+
return formatted;
22+
};
23+
24+
const createTable = () => {
25+
const table = new Table({
26+
head: HEADERS,
27+
}) as HorizontalTable;
28+
return table;
29+
};
30+
31+
const displayChannels = (channels: ChannelBalanceResponse.AsObject) => {
32+
const table = createTable();
33+
const formatted = formatChannels(channels);
34+
formatted.forEach(channel => table.push(channel));
35+
console.log(colors.underline(colors.bold('\nChannel balance:')));
36+
console.log(table.toString());
37+
};
538

639
export const command = 'channelbalance [currency]';
740

@@ -14,18 +47,10 @@ export const builder = {
1447
},
1548
};
1649

17-
export const formatOutput = (response: ChannelBalanceResponse.AsObject) => {
18-
const balancesMap = response.balancesMap;
19-
balancesMap.forEach(([currency, channelBalance]) => {
20-
const pendingBalance = channelBalance.pendingOpenBalance ? ` (+${satsToCoinsStr(channelBalance.pendingOpenBalance)} ${currency} pending)` : '';
21-
console.log(`${satsToCoinsStr(channelBalance.balance)} ${currency}${pendingBalance}`);
22-
});
23-
};
24-
2550
export const handler = (argv: Arguments) => {
2651
const request = new ChannelBalanceRequest();
2752
if (argv.currency) {
2853
request.setCurrency(argv.currency.toUpperCase());
2954
}
30-
loadXudClient(argv).channelBalance(request, callback(argv, formatOutput));
55+
loadXudClient(argv).channelBalance(request, callback(argv, displayChannels));
3156
};

lib/cli/commands/executeswap.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
import { callback, loadXudClient } from '../command';
22
import { Arguments } from 'yargs';
3-
import { ExecuteSwapRequest } from '../../proto/xudrpc_pb';
3+
import { ExecuteSwapRequest, SwapSuccess } from '../../proto/xudrpc_pb';
44
import { coinsToSats } from '../utils';
5+
import Table, { VerticalTable } from 'cli-table3';
6+
import colors from 'colors/safe';
7+
8+
const displaySwapSuccess = (swap: SwapSuccess.AsObject) => {
9+
const table = new Table() as VerticalTable;
10+
const obj: any = swap;
11+
Object.keys(obj).forEach((key: any) => {
12+
table.push({ [key]: obj[key] });
13+
});
14+
console.log(colors.underline(colors.bold('\nSwap success result:')));
15+
console.log(table.toString());
16+
};
517

618
export const command = 'executeswap <pair_id> <order_id> [quantity]';
719

@@ -25,5 +37,5 @@ export const handler = (argv: Arguments) => {
2537
request.setOrderId(argv.order_id);
2638
request.setPairId(argv.pair_id);
2739
request.setQuantity(coinsToSats(argv.quantity));
28-
loadXudClient(argv).executeSwap(request, callback(argv));
40+
loadXudClient(argv).executeSwap(request, callback(argv, displaySwapSuccess));
2941
};

lib/cli/commands/getinfo.ts

Lines changed: 119 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,128 @@
11
import { callback, loadXudClient } from '../command';
22
import { Arguments } from 'yargs';
3-
import { GetInfoRequest } from '../../proto/xudrpc_pb';
3+
import Table, { VerticalTable } from 'cli-table3';
4+
import colors from 'colors/safe';
5+
import { GetInfoRequest, GetInfoResponse, LndInfo, RaidenInfo } from '../../proto/xudrpc_pb';
6+
7+
type generalInfo = {
8+
version: string;
9+
numPeers: number;
10+
numPairs: number;
11+
nodePubKey: string;
12+
orders: {own: number, peer: number} | undefined
13+
};
14+
15+
const displayChannels = (channels: any, asset: string) => {
16+
const table = new Table() as VerticalTable;
17+
Object.keys(channels).forEach((key: any) => {
18+
table.push({
19+
[colors.blue(key)] : channels[key],
20+
});
21+
});
22+
console.log(colors.underline(colors.bold(`\nLnd ${asset} channels:`)));
23+
console.log(table.toString(), '\n');
24+
};
25+
26+
const displayChainsList = (list: any[], asset: string) => {
27+
const table = new Table() as VerticalTable;
28+
list.forEach((asset, i) => {
29+
if (asset) {
30+
table.push({ [colors.blue(`${i + 1}.`)]: `${asset.chain}-${asset.network}` });
31+
}
32+
});
33+
if (table.length !== 0) {
34+
console.log(colors.underline(colors.bold(`\nLnd ${asset} chains:`)));
35+
console.log(table.toString(), '\n');
36+
}
37+
};
38+
39+
const displayUriList = (uris: string[], asset: string) => {
40+
const table = new Table() as VerticalTable;
41+
uris.forEach((uri, i) => table.push({ [`${i + 1}.`]: uri }));
42+
console.log(colors.underline(colors.bold(`\nLnd ${asset} uris:`)));
43+
console.log(table.toString(), '\n');
44+
};
45+
46+
const displayLndInfo = (asset: string, info: LndInfo.AsObject) => {
47+
const basicInfotable = new Table() as VerticalTable;
48+
basicInfotable.push(
49+
{ [colors.blue('Error')]: info.error },
50+
);
51+
if (info.blockheight) {
52+
basicInfotable.push({ [colors.blue('Block Height')]: info.blockheight });
53+
}
54+
if (info.version) {
55+
basicInfotable.push({ [colors.blue('Version')]: info.version });
56+
}
57+
if (info.alias) {
58+
basicInfotable.push({ [colors.blue('Alias')] : info.alias });
59+
}
60+
61+
console.log(colors.underline(colors.bold(`\nLnd ${asset} info:`)));
62+
console.log(basicInfotable.toString(), '\n');
63+
64+
if (info.channels) {
65+
displayChannels(info.channels, asset);
66+
}
67+
68+
if (!info.error) {
69+
displayChainsList(info.chainsList, asset);
70+
}
71+
72+
if (info.urisList.length > 0) {
73+
displayUriList(info.urisList, asset);
74+
}
75+
};
76+
77+
const displayGeneral = (info: generalInfo) => {
78+
const table = new Table() as VerticalTable;
79+
table.push(
80+
{ [colors.blue('Version')]: info.version },
81+
{ [colors.blue('Pairs')]: info.numPairs },
82+
{ [colors.blue('Peers')]: info.numPeers },
83+
{ [colors.blue('Node key')]: info.nodePubKey },
84+
);
85+
if (info.orders) {
86+
table.push(
87+
{ [colors.blue('Own orders')]: info.orders.own },
88+
{ [colors.blue('Peer orders')]: info.orders.peer },
89+
);
90+
}
91+
console.log(colors.underline(colors.bold('\nGeneral XUD Info')));
92+
console.log(table.toString(), '\n');
93+
};
94+
95+
const displayRaiden = (info: RaidenInfo.AsObject) => {
96+
const table = new Table() as VerticalTable;
97+
table.push(
98+
{ [colors.blue('Version')]: info.version },
99+
{ [colors.blue('Address')]: info.address },
100+
{ [colors.blue('Channels')]: info.channels },
101+
{ [colors.blue('Error')]: info.error },
102+
);
103+
console.log(colors.underline(colors.bold('\nRaiden info:')));
104+
console.log(table.toString(), '\n');
105+
};
106+
107+
const displayGetInfo = (response: GetInfoResponse.AsObject) => {
108+
displayGeneral({
109+
nodePubKey: response.nodePubKey,
110+
numPairs: response.numPairs,
111+
numPeers: response.numPeers,
112+
version: response.version,
113+
orders: response.orders,
114+
});
115+
if (response.raiden) {
116+
displayRaiden(response.raiden);
117+
}
118+
119+
response.lndMap.forEach(asset => displayLndInfo(asset[0], asset[1]));
120+
};
4121

5122
export const command = 'getinfo';
6123

7124
export const describe = 'get general info from the xud node';
8125

9126
export const handler = (argv: Arguments) => {
10-
loadXudClient(argv).getInfo(new GetInfoRequest(), callback(argv));
127+
loadXudClient(argv).getInfo(new GetInfoRequest(), callback(argv, displayGetInfo));
11128
};

lib/cli/commands/getnodeinfo.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
import { Arguments } from 'yargs';
22
import { callback, loadXudClient } from '../command';
3-
import { GetNodeInfoRequest } from '../../proto/xudrpc_pb';
3+
import Table, { VerticalTable } from 'cli-table3';
4+
import colors from 'colors/safe';
5+
import { GetNodeInfoRequest, GetNodeInfoResponse } from '../../proto/xudrpc_pb';
6+
7+
const displayNodeInfo = (node: GetNodeInfoResponse.AsObject) => {
8+
const table = new Table() as VerticalTable;
9+
const bannedTitle = colors.blue('Banned');
10+
const reputationScore = colors.blue('Reputation Score');
11+
table.push(
12+
{ [bannedTitle]: node.banned }
13+
, { [reputationScore]: node.reputationscore });
14+
console.log(colors.underline(colors.bold('\nNode info:')));
15+
console.log(table.toString());
16+
};
417

518
export const command = 'getnodeinfo <node_pub_key>';
619

@@ -16,5 +29,5 @@ export const builder = {
1629
export const handler = (argv: Arguments) => {
1730
const request = new GetNodeInfoRequest();
1831
request.setNodePubKey(argv.node_pub_key);
19-
loadXudClient(argv).getNodeInfo(request, callback(argv));
32+
loadXudClient(argv).getNodeInfo(request, callback(argv, displayNodeInfo));
2033
};

0 commit comments

Comments
 (0)