5 #if defined(HAVE_CONFIG_H)
10 #include <qt/forms/ui_debugwindow.h>
12 #include <chainparams.h>
30 #include <QAbstractButton>
31 #include <QAbstractItemModel>
35 #include <QKeySequence>
36 #include <QLatin1String>
39 #include <QMessageBox>
44 #include <QStringList>
45 #include <QStyledItemDelegate>
61 {
"cmd-request",
":/icons/tx_input"},
62 {
"cmd-reply",
":/icons/tx_output"},
63 {
"cmd-error",
":/icons/tx_output"},
64 {
"misc",
":/icons/tx_inout"},
71 const QStringList historyFilter = QStringList()
75 <<
"signmessagewithprivkey"
76 <<
"signrawtransactionwithkey"
78 <<
"walletpassphrasechange"
111 timer.setSingleShot(
true);
112 connect(&
timer, &QTimer::timeout, [
this]{
func(); });
125 const char *
Name()
override {
return "Qt"; }
137 : QStyledItemDelegate(parent) {}
139 QString
displayText(
const QVariant& value,
const QLocale& locale)
const override
143 return value.toString() + QLatin1String(
" ");
147 #include <qt/rpcconsole.moc>
171 std::vector< std::vector<std::string> > stack;
172 stack.emplace_back();
177 STATE_EATING_SPACES_IN_ARG,
178 STATE_EATING_SPACES_IN_BRACKETS,
183 STATE_ESCAPE_DOUBLEQUOTED,
184 STATE_COMMAND_EXECUTED,
185 STATE_COMMAND_EXECUTED_INNER
186 } state = STATE_EATING_SPACES;
189 unsigned nDepthInsideSensitive = 0;
190 size_t filter_begin_pos = 0, chpos;
191 std::vector<std::pair<size_t, size_t>> filter_ranges;
193 auto add_to_current_stack = [&](
const std::string& strArg) {
194 if (stack.back().empty() && (!nDepthInsideSensitive) && historyFilter.contains(QString::fromStdString(strArg), Qt::CaseInsensitive)) {
195 nDepthInsideSensitive = 1;
196 filter_begin_pos = chpos;
200 stack.emplace_back();
205 auto close_out_params = [&]() {
206 if (nDepthInsideSensitive) {
207 if (!--nDepthInsideSensitive) {
209 filter_ranges.emplace_back(filter_begin_pos, chpos);
210 filter_begin_pos = 0;
216 std::string strCommandTerminated = strCommand;
217 if (strCommandTerminated.back() !=
'\n')
218 strCommandTerminated +=
"\n";
219 for (chpos = 0; chpos < strCommandTerminated.size(); ++chpos)
221 char ch = strCommandTerminated[chpos];
224 case STATE_COMMAND_EXECUTED_INNER:
225 case STATE_COMMAND_EXECUTED:
227 bool breakParsing =
true;
230 case '[': curarg.clear(); state = STATE_COMMAND_EXECUTED_INNER;
break;
232 if (state == STATE_COMMAND_EXECUTED_INNER)
240 if (curarg.size() && fExecute)
246 const auto parsed{ToIntegral<size_t>(curarg)};
248 throw std::runtime_error(
"Invalid result query");
250 subelement = lastResult[parsed.value()];
255 throw std::runtime_error(
"Invalid result query");
256 lastResult = subelement;
259 state = STATE_COMMAND_EXECUTED;
263 breakParsing =
false;
269 if (lastResult.
isStr())
272 curarg = lastResult.
write(2);
278 add_to_current_stack(curarg);
284 state = STATE_EATING_SPACES;
291 case STATE_EATING_SPACES_IN_ARG:
292 case STATE_EATING_SPACES_IN_BRACKETS:
293 case STATE_EATING_SPACES:
296 case '"': state = STATE_DOUBLEQUOTED;
break;
297 case '\'': state = STATE_SINGLEQUOTED;
break;
298 case '\\': state = STATE_ESCAPE_OUTER;
break;
299 case '(':
case ')':
case '\n':
300 if (state == STATE_EATING_SPACES_IN_ARG)
301 throw std::runtime_error(
"Invalid Syntax");
302 if (state == STATE_ARGUMENT)
304 if (ch ==
'(' && stack.size() && stack.back().size() > 0)
306 if (nDepthInsideSensitive) {
307 ++nDepthInsideSensitive;
309 stack.emplace_back();
314 throw std::runtime_error(
"Invalid Syntax");
316 add_to_current_stack(curarg);
318 state = STATE_EATING_SPACES_IN_BRACKETS;
320 if ((ch ==
')' || ch ==
'\n') && stack.size() > 0)
325 UniValue params =
RPCConvertValues(stack.back()[0], std::vector<std::string>(stack.back().begin() + 1, stack.back().end()));
326 std::string method = stack.back()[0];
330 QByteArray encodedName = QUrl::toPercentEncoding(wallet_model->
getWalletName());
331 uri =
"/wallet/"+std::string(encodedName.constData(), encodedName.length());
335 lastResult =
node->executeRpc(method, params, uri);
338 state = STATE_COMMAND_EXECUTED;
342 case ' ':
case ',':
case '\t':
343 if(state == STATE_EATING_SPACES_IN_ARG && curarg.empty() && ch ==
',')
344 throw std::runtime_error(
"Invalid Syntax");
346 else if(state == STATE_ARGUMENT)
348 add_to_current_stack(curarg);
351 if ((state == STATE_EATING_SPACES_IN_BRACKETS || state == STATE_ARGUMENT) && ch ==
',')
353 state = STATE_EATING_SPACES_IN_ARG;
356 state = STATE_EATING_SPACES;
358 default: curarg += ch; state = STATE_ARGUMENT;
361 case STATE_SINGLEQUOTED:
364 case '\'': state = STATE_ARGUMENT;
break;
365 default: curarg += ch;
368 case STATE_DOUBLEQUOTED:
371 case '"': state = STATE_ARGUMENT;
break;
372 case '\\': state = STATE_ESCAPE_DOUBLEQUOTED;
break;
373 default: curarg += ch;
376 case STATE_ESCAPE_OUTER:
377 curarg += ch; state = STATE_ARGUMENT;
379 case STATE_ESCAPE_DOUBLEQUOTED:
380 if(ch !=
'"' && ch !=
'\\') curarg +=
'\\';
381 curarg += ch; state = STATE_DOUBLEQUOTED;
385 if (pstrFilteredOut) {
386 if (STATE_COMMAND_EXECUTED == state) {
390 *pstrFilteredOut = strCommand;
391 for (
auto i = filter_ranges.rbegin(); i != filter_ranges.rend(); ++i) {
392 pstrFilteredOut->replace(i->first, i->second - i->first,
"(…)");
397 case STATE_COMMAND_EXECUTED:
398 if (lastResult.
isStr())
399 strResult = lastResult.
get_str();
401 strResult = lastResult.
write(2);
404 case STATE_EATING_SPACES:
416 std::string executableCommand =
command.toStdString() +
"\n";
419 if(executableCommand ==
"help-console\n") {
421 "This console accepts RPC commands using the standard syntax.\n"
422 " example: getblockhash 0\n\n"
424 "This console can also accept RPC commands using the parenthesized syntax.\n"
425 " example: getblockhash(0)\n\n"
427 "Commands may be nested when specified with the parenthesized syntax.\n"
428 " example: getblock(getblockhash(0) 1)\n\n"
430 "A space or a comma can be used to delimit arguments for either syntax.\n"
431 " example: getblockhash 0\n"
432 " getblockhash,0\n\n"
434 "Named results can be queried with a non-quoted key string in brackets using the parenthesized syntax.\n"
435 " example: getblock(getblockhash(0) 1)[tx]\n\n"
437 "Results without keys can be queried with an integer in brackets using the parenthesized syntax.\n"
438 " example: getblock(getblockhash(0),1)[tx][0]\n\n")));
456 catch (
const std::runtime_error&)
461 catch (
const std::exception& e)
471 platformStyle(_platformStyle)
478 if (!restoreGeometry(settings.value(
"RPCConsoleWindowGeometry").toByteArray())) {
480 move(QGuiApplication::primaryScreen()->availableGeometry().center() - frameGeometry().center());
482 ui->splitter->restoreState(settings.value(
"RPCConsoleWindowPeersTabSplitterSizes").toByteArray());
487 ui->splitter->restoreState(settings.value(
"RPCConsoleWidgetPeersTabSplitterSizes").toByteArray());
493 constexpr QChar nonbreaking_hyphen(8209);
496 tr(
"Inbound: initiated by peer"),
500 tr(
"Outbound Full Relay: default"),
503 tr(
"Outbound Block Relay: does not relay transactions or addresses"),
508 tr(
"Outbound Manual: added using RPC %1 or %2/%3 configuration options")
510 .arg(QString(nonbreaking_hyphen) +
"addnode")
511 .arg(QString(nonbreaking_hyphen) +
"connect"),
514 tr(
"Outbound Feeler: short-lived, for testing addresses"),
517 tr(
"Outbound Address Fetch: short-lived, for soliciting addresses")};
518 const QString connection_types_list{
"<ul><li>" +
Join(
CONNECTION_TYPE_DOC, QString(
"</li><li>")) +
"</li></ul>"};
519 ui->peerConnectionTypeLabel->setToolTip(
ui->peerConnectionTypeLabel->toolTip().arg(connection_types_list));
522 tr(
"detecting: peer could be v1 or v2"),
524 tr(
"v1: unencrypted, plaintext transport protocol"),
526 tr(
"v2: BIP324 encrypted transport protocol")};
527 const QString transport_types_list{
"<ul><li>" +
Join(
TRANSPORT_TYPE_DOC, QString(
"</li><li>")) +
"</li></ul>"};
528 ui->peerTransportTypeLabel->setToolTip(
ui->peerTransportTypeLabel->toolTip().arg(transport_types_list));
529 const QString hb_list{
"<ul><li>\""
530 +
ts.
to +
"\" – " + tr(
"we selected the peer for high bandwidth relay") +
"</li><li>\""
531 +
ts.
from +
"\" – " + tr(
"the peer selected us for high bandwidth relay") +
"</li><li>\""
532 +
ts.
no +
"\" – " + tr(
"no high bandwidth relay selected") +
"</li></ul>"};
533 ui->peerHighBandwidthLabel->setToolTip(
ui->peerHighBandwidthLabel->toolTip().arg(hb_list));
534 ui->dataDir->setToolTip(
ui->dataDir->toolTip().arg(QString(nonbreaking_hyphen) +
"datadir"));
535 ui->blocksDir->setToolTip(
ui->blocksDir->toolTip().arg(QString(nonbreaking_hyphen) +
"blocksdir"));
536 ui->openDebugLogfileButton->setToolTip(
ui->openDebugLogfileButton->toolTip().arg(
PACKAGE_NAME));
545 ui->fontBiggerButton->setShortcut(tr(
"Ctrl++"));
551 ui->fontSmallerButton->setShortcut(tr(
"Ctrl+-"));
558 ui->lineEdit->installEventFilter(
this);
559 ui->lineEdit->setMaxLength(16 * 1024 * 1024);
560 ui->messagesWidget->installEventFilter(
this);
562 connect(
ui->clearButton, &QAbstractButton::clicked, [
this] { clear(); });
568 ui->WalletSelector->setVisible(
false);
569 ui->WalletSelectorLabel->setVisible(
false);
594 settings.setValue(
"RPCConsoleWindowGeometry", saveGeometry());
595 settings.setValue(
"RPCConsoleWindowPeersTabSplitterSizes",
ui->splitter->saveState());
600 settings.setValue(
"RPCConsoleWidgetPeersTabSplitterSizes",
ui->splitter->saveState());
613 if(event->type() == QEvent::KeyPress)
615 QKeyEvent *keyevt =
static_cast<QKeyEvent*
>(event);
616 int key = keyevt->key();
617 Qt::KeyboardModifiers mod = keyevt->modifiers();
620 case Qt::Key_Up:
if(obj ==
ui->lineEdit) {
browseHistory(-1);
return true; }
break;
621 case Qt::Key_Down:
if(obj ==
ui->lineEdit) {
browseHistory(1);
return true; }
break;
623 case Qt::Key_PageDown:
624 if (obj ==
ui->lineEdit) {
625 QApplication::sendEvent(
ui->messagesWidget, keyevt);
633 QApplication::sendEvent(
ui->lineEdit, keyevt);
641 if(obj ==
ui->messagesWidget && (
642 (!mod && !keyevt->text().isEmpty() && key != Qt::Key_Tab) ||
643 ((mod & Qt::ControlModifier) && key == Qt::Key_V) ||
644 ((mod & Qt::ShiftModifier) && key == Qt::Key_Insert)))
646 ui->lineEdit->setFocus();
647 QApplication::sendEvent(
ui->lineEdit, keyevt);
652 return QWidget::eventFilter(obj, event);
659 bool wallet_enabled{
false};
663 if (model && !wallet_enabled) {
669 ui->trafficGraph->setClientModel(model);
689 ui->peerWidget->verticalHeader()->hide();
690 ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
691 ui->peerWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
692 ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu);
699 ui->peerWidget->horizontalHeader()->setSectionResizeMode(
PeerTableModel::Age, QHeaderView::ResizeToContents);
700 ui->peerWidget->horizontalHeader()->setStretchLastSection(
true);
719 connect(model->
getPeerTableModel(), &QAbstractItemModel::dataChanged, [
this] { updateDetailWidget(); });
723 ui->banlistWidget->verticalHeader()->hide();
724 ui->banlistWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
725 ui->banlistWidget->setSelectionMode(QAbstractItemView::SingleSelection);
726 ui->banlistWidget->setContextMenuPolicy(Qt::CustomContextMenu);
733 ui->banlistWidget->horizontalHeader()->setStretchLastSection(
true);
759 ui->networkName->setText(QString::fromStdString(
Params().GetChainTypeString()));
762 QStringList wordList;
764 for (
size_t i = 0; i < commandList.size(); ++i)
766 wordList << commandList[i].c_str();
767 wordList << (
"help " + commandList[i]).c_str();
770 wordList <<
"help-console";
773 autoCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);
776 ui->lineEdit->setEnabled(
true);
790 void RPCConsole::addWallet(
WalletModel *
const walletModel)
793 ui->WalletSelector->addItem(walletModel->
getDisplayName(), QVariant::fromValue(walletModel));
794 if (
ui->WalletSelector->count() == 2) {
796 ui->WalletSelector->setCurrentIndex(1);
798 if (
ui->WalletSelector->count() > 2) {
799 ui->WalletSelector->setVisible(
true);
800 ui->WalletSelectorLabel->setVisible(
true);
804 void RPCConsole::removeWallet(
WalletModel *
const walletModel)
806 ui->WalletSelector->removeItem(
ui->WalletSelector->findData(QVariant::fromValue(walletModel)));
807 if (
ui->WalletSelector->count() == 2) {
808 ui->WalletSelector->setVisible(
false);
809 ui->WalletSelectorLabel->setVisible(
false);
813 void RPCConsole::setCurrentWallet(
WalletModel*
const wallet_model)
815 QVariant data = QVariant::fromValue(wallet_model);
816 ui->WalletSelector->setCurrentIndex(
ui->WalletSelector->findData(data));
827 default:
return "misc";
850 QString str =
ui->messagesWidget->toHtml();
853 str.replace(QString(
"font-size:%1pt").arg(
consoleFontSize), QString(
"font-size:%1pt").arg(newSize));
860 float oldPosFactor = 1.0 /
ui->messagesWidget->verticalScrollBar()->maximum() *
ui->messagesWidget->verticalScrollBar()->value();
862 ui->messagesWidget->setHtml(str);
863 ui->messagesWidget->verticalScrollBar()->setValue(oldPosFactor *
ui->messagesWidget->verticalScrollBar()->maximum());
868 ui->messagesWidget->clear();
869 if (!keep_prompt)
ui->lineEdit->clear();
870 ui->lineEdit->setFocus();
876 ui->messagesWidget->document()->addResource(
877 QTextDocument::ImageResource,
888 ui->messagesWidget->document()->setDefaultStyleSheet(
891 "td.time { color: #808080; font-size: %2; padding-top: 3px; } "
892 "td.message { font-family: %1; font-size: %2; white-space:pre-wrap; } "
893 "td.cmd-request { color: #006060; } "
894 "td.cmd-error { color: red; } "
895 ".secwarning { color: red; }"
896 "b { color: #006060; } "
900 static const QString welcome_message =
904 tr(
"Welcome to the %1 RPC console.\n"
905 "Use up and down arrows to navigate history, and %2 to clear screen.\n"
906 "Use %3 and %4 to increase or decrease the font size.\n"
907 "Type %5 for an overview of available commands.\n"
908 "For more information on using this console, type %6.\n"
910 "%7WARNING: Scammers have been active, telling users to type"
911 " commands here, stealing their wallet contents. Do not use this console"
912 " without fully understanding the ramifications of a command.%8")
914 "<b>" +
ui->clearButton->shortcut().toString(QKeySequence::NativeText) +
"</b>",
915 "<b>" +
ui->fontBiggerButton->shortcut().toString(QKeySequence::NativeText) +
"</b>",
916 "<b>" +
ui->fontSmallerButton->shortcut().toString(QKeySequence::NativeText) +
"</b>",
918 "<b>help-console</b>",
919 "<span class=\"secwarning\">",
934 if (e->type() == QEvent::PaletteChange) {
941 ui->messagesWidget->document()->addResource(
942 QTextDocument::ImageResource,
948 QWidget::changeEvent(e);
953 QTime time = QTime::currentTime();
954 QString timeString = time.toString();
956 out +=
"<table><tr><td class=\"time\" width=\"65\">" + timeString +
"</td>";
957 out +=
"<td class=\"icon\" width=\"32\"><img src=\"" +
categoryClass(category) +
"\"></td>";
958 out +=
"<td class=\"message " +
categoryClass(category) +
"\" valign=\"middle\">";
963 out +=
"</td></tr></table>";
964 ui->messagesWidget->append(
out);
975 connections +=
" (" + tr(
"Network activity disabled") +
")";
978 ui->numberOfConnections->setText(connections);
997 ui->numberOfBlocks->setText(QString::number(
count));
998 ui->lastBlockTime->setText(blockDate.toString());
1004 ui->mempoolNumberTxs->setText(QString::number(numberOfTxs));
1006 if (dynUsage < 1000000) {
1007 ui->mempoolSize->setText(QObject::tr(
"%1 kB").arg(dynUsage / 1000.0, 0,
'f', 2));
1009 ui->mempoolSize->setText(QObject::tr(
"%1 MB").arg(dynUsage / 1000000.0, 0,
'f', 2));
1015 QString
cmd =
ui->lineEdit->text().trimmed();
1017 if (
cmd.isEmpty()) {
1021 std::string strFilteredCmd;
1026 throw std::runtime_error(
"Invalid command line");
1028 }
catch (
const std::exception& e) {
1029 QMessageBox::critical(
this,
"Error", QString(
"Error: ") + QString::fromStdString(e.what()));
1034 if (
cmd == QLatin1String(
"stop")) {
1044 ui->lineEdit->clear();
1047 #ifdef ENABLE_WALLET
1048 wallet_model =
ui->WalletSelector->currentData().value<
WalletModel*>();
1065 QMetaObject::invokeMethod(
m_executor, [
this,
cmd, wallet_model] {
1069 cmd = QString::fromStdString(strFilteredCmd);
1104 ui->lineEdit->setText(
cmd);
1115 ui->messagesWidget->undo();
1122 connect(&
thread, &QThread::finished,
m_executor, &RPCExecutor::deleteLater);
1134 if (
ui->tabWidget->widget(index) ==
ui->tab_console) {
1135 ui->lineEdit->setFocus();
1146 QScrollBar *scrollbar =
ui->messagesWidget->verticalScrollBar();
1147 scrollbar->setValue(scrollbar->maximum());
1152 const int multiplier = 5;
1153 int mins = value * multiplier;
1159 ui->trafficGraph->setGraphRange(std::chrono::minutes{mins});
1173 ui->peersTabRightPanel->hide();
1174 ui->peerHeading->setText(tr(
"Select a peer to view detailed information."));
1179 QString peerAddrDetails(QString::fromStdString(stats->nodeStats.m_addr_name) +
" ");
1180 peerAddrDetails += tr(
"(peer: %1)").arg(QString::number(stats->nodeStats.nodeid));
1181 if (!stats->nodeStats.addrLocal.empty())
1182 peerAddrDetails +=
"<br />" + tr(
"via %1").arg(QString::fromStdString(stats->nodeStats.addrLocal));
1183 ui->peerHeading->setText(peerAddrDetails);
1184 QString bip152_hb_settings;
1185 if (stats->nodeStats.m_bip152_highbandwidth_to) bip152_hb_settings =
ts.
to;
1186 if (stats->nodeStats.m_bip152_highbandwidth_from) bip152_hb_settings += (bip152_hb_settings.isEmpty() ?
ts.
from : QLatin1Char(
'/') +
ts.
from);
1187 if (bip152_hb_settings.isEmpty()) bip152_hb_settings =
ts.
no;
1188 ui->peerHighBandwidth->setText(bip152_hb_settings);
1189 const auto time_now{GetTime<std::chrono::seconds>()};
1191 ui->peerLastBlock->setText(
TimeDurationField(time_now, stats->nodeStats.m_last_block_time));
1200 if (stats->nodeStats.nVersion) {
1201 ui->peerVersion->setText(QString::number(stats->nodeStats.nVersion));
1203 if (!stats->nodeStats.cleanSubVer.empty()) {
1204 ui->peerSubversion->setText(QString::fromStdString(stats->nodeStats.cleanSubVer));
1207 ui->peerTransportType->setText(QString::fromStdString(
TransportTypeAsString(stats->nodeStats.m_transport_type)));
1209 ui->peerSessionIdLabel->setVisible(
true);
1210 ui->peerSessionId->setVisible(
true);
1211 ui->peerSessionId->setText(QString::fromStdString(stats->nodeStats.m_session_id));
1213 ui->peerSessionIdLabel->setVisible(
false);
1214 ui->peerSessionId->setVisible(
false);
1218 ui->peerPermissions->setText(
ts.
na);
1220 QStringList permissions;
1222 permissions.append(QString::fromStdString(permission));
1224 ui->peerPermissions->setText(permissions.join(
" & "));
1226 ui->peerMappedAS->setText(stats->nodeStats.m_mapped_as != 0 ? QString::number(stats->nodeStats.m_mapped_as) :
ts.
na);
1230 if (stats->fNodeStateStatsAvailable) {
1233 if (stats->nodeStateStats.nSyncHeight > -1) {
1234 ui->peerSyncHeight->setText(QString(
"%1").arg(stats->nodeStateStats.nSyncHeight));
1239 if (stats->nodeStateStats.nCommonHeight > -1) {
1240 ui->peerCommonHeight->setText(QString(
"%1").arg(stats->nodeStateStats.nCommonHeight));
1244 ui->peerHeight->setText(QString::number(stats->nodeStateStats.m_starting_height));
1246 ui->peerAddrRelayEnabled->setText(stats->nodeStateStats.m_addr_relay_enabled ?
ts.
yes :
ts.
no);
1247 ui->peerAddrProcessed->setText(QString::number(stats->nodeStateStats.m_addr_processed));
1248 ui->peerAddrRateLimited->setText(QString::number(stats->nodeStateStats.m_addr_rate_limited));
1249 ui->peerRelayTxes->setText(stats->nodeStateStats.m_relay_txs ?
ts.
yes :
ts.
no);
1252 ui->peersTabRightPanel->show();
1257 QWidget::resizeEvent(event);
1262 QWidget::showEvent(event);
1278 QWidget::hideEvent(event);
1289 QModelIndex index =
ui->peerWidget->indexAt(point);
1290 if (index.isValid())
1296 QModelIndex index =
ui->banlistWidget->indexAt(point);
1297 if (index.isValid())
1305 for(
int i = 0; i < nodes.count(); i++)
1308 NodeId id = nodes.at(i).data().toLongLong();
1324 m_node.
ban(stats->nodeStats.addr, bantime);
1340 bool unbanned{
false};
1341 for (
const auto& node_index : nodes) {
1342 unbanned |= ban_table_model->
unban(node_index);
1345 ban_table_model->refresh();
1351 ui->peerWidget->selectionModel()->clearSelection();
1362 ui->banlistWidget->setVisible(visible);
1363 ui->banHeading->setVisible(visible);
1368 ui->tabWidget->setCurrentIndex(
int(tabType));
1373 return ui->tabWidget->tabText(
int(tab_type));
1390 this->
ui->label_alerts->setVisible(!warnings.isEmpty());
1391 this->
ui->label_alerts->setText(warnings);
1399 const QString chainType = QString::fromStdString(
Params().GetChainTypeString());
1400 const QString title = tr(
"Node window - [%1]").arg(chainType);
1401 this->setWindowTitle(title);
const CChainParams & Params()
Return the currently selected parameters.
Qt model providing information about banned peers, similar to the "getpeerinfo" RPC call.
bool unban(const QModelIndex &index)
ChainType GetChainType() const
Return the chain type.
Model for Bitcoin network client.
void bytesChanged(quint64 totalBytesIn, quint64 totalBytesOut)
QString blocksDir() const
QString getStatusBarWarnings() const
Return warnings to be displayed in status bar.
interfaces::Node & node() const
PeerTableModel * getPeerTableModel()
PeerTableSortProxy * peerTableSortProxy()
void numConnectionsChanged(int count)
QString formatClientStartupTime() const
int getNumConnections(unsigned int flags=CONNECTIONS_ALL) const
Return number of connections, default is in- and outbound (total)
BanTableModel * getBanTableModel()
void numBlocksChanged(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType header, SynchronizationState sync_state)
void alertsChanged(const QString &warnings)
QString formatFullVersion() const
QString formatSubVersion() const
void mempoolSizeChanged(long count, size_t mempoolSizeInBytes)
void networkActiveChanged(bool networkActive)
static std::vector< std::string > ToStrings(NetPermissionFlags flags)
QString displayText(const QVariant &value, const QLocale &locale) const override
PeerIdViewDelegate(QObject *parent=nullptr)
Class for handling RPC timers (used for e.g.
std::function< void()> func
QtRPCTimerBase(std::function< void()> &_func, int64_t millis)
~QtRPCTimerBase()=default
const char * Name() override
Implementation name.
RPCTimerBase * NewTimer(std::function< void()> &func, int64_t millis) override
Factory function for timers.
~QtRPCTimerInterface()=default
Local Bitcoin RPC console.
QMenu * peersTableContextMenu
RPCConsole(interfaces::Node &node, const PlatformStyle *platformStyle, QWidget *parent)
struct RPCConsole::TranslatedStrings ts
void browseHistory(int offset)
Go forward or back in history.
QByteArray m_banlist_widget_header_state
RPCTimerInterface * rpcTimerInterface
QString TimeDurationField(std::chrono::seconds time_now, std::chrono::seconds time_at_event) const
Helper for the output of a time duration field.
void on_lineEdit_returnPressed()
void message(int category, const QString &msg)
Append the message to the message widget.
void setFontSize(int newSize)
void updateTrafficStats(quint64 totalBytesIn, quint64 totalBytesOut)
update traffic statistics
void setTrafficGraphRange(int mins)
static bool RPCParseCommandLine(interfaces::Node *node, std::string &strResult, const std::string &strCommand, bool fExecute, std::string *const pstrFilteredOut=nullptr, const WalletModel *wallet_model=nullptr)
Split shell command line into a list of arguments and optionally execute the command(s).
const PlatformStyle *const platformStyle
void updateDetailWidget()
show detailed information on ui about selected node
void showEvent(QShowEvent *event) override
void resizeEvent(QResizeEvent *event) override
static bool RPCExecuteCommandLine(interfaces::Node &node, std::string &strResult, const std::string &strCommand, std::string *const pstrFilteredOut=nullptr, const WalletModel *wallet_model=nullptr)
QString tabTitle(TabTypes tab_type) const
void updateNetworkState()
Update UI with latest network info from model.
void clear(bool keep_prompt=false)
void disconnectSelectedNode()
Disconnect a selected node on the Peers tab.
@ SUBVERSION_COLUMN_WIDTH
QCompleter * autoCompleter
void setMempoolSize(long numberOfTxs, size_t dynUsage)
Set size (number of transactions and memory usage) of the mempool in the UI.
void hideEvent(QHideEvent *event) override
QKeySequence tabShortcut(TabTypes tab_type) const
void showPeersTableContextMenu(const QPoint &point)
Show custom context menu on Peers tab.
QList< NodeId > cachedNodeids
interfaces::Node & m_node
void unbanSelectedNode()
Unban a selected node on the Bans tab.
void updateAlerts(const QString &warnings)
void clearSelectedNode()
clear the selected node
void on_sldGraphRange_valueChanged(int value)
change the time range of the network traffic graph
void setNumConnections(int count)
Set number of connections shown in the UI.
void setNumBlocks(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType synctype)
Set number of blocks and last block date shown in the UI.
ClientModel * clientModel
void banSelectedNode(int bantime)
Ban a selected node on the Peers tab.
void scrollToEnd()
Scroll console view to end.
void keyPressEvent(QKeyEvent *) override
void on_tabWidget_currentChanged(int index)
void setNetworkActive(bool networkActive)
Set network state shown in the UI.
QString cmdBeforeBrowsing
virtual bool eventFilter(QObject *obj, QEvent *event) override
void on_openDebugLogfileButton_clicked()
open the debug.log from the current datadir
void showBanTableContextMenu(const QPoint &point)
Show custom context menu on Bans tab.
void setClientModel(ClientModel *model=nullptr, int bestblock_height=0, int64_t bestblock_date=0, double verification_progress=0.0)
void setTabFocus(enum TabTypes tabType)
set which tab has the focus (is visible)
QByteArray m_peer_widget_header_state
void changeEvent(QEvent *e) override
WalletModel * m_last_wallet_model
void showOrHideBanTableIfRequired()
Hides ban table if no bans are present.
QMenu * banTableContextMenu
void reply(int category, const QString &command)
RPCExecutor(interfaces::Node &node)
interfaces::Node & m_node
void request(const QString &command, const WalletModel *wallet_model)
Opaque base class for timers returned by NewTimerFunc.
void push_back(UniValue val)
const std::string & get_str() const
const UniValue & find_value(std::string_view key) const
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
Interface to Bitcoin wallet from Qt view code.
QString getDisplayName() const
static bool isWalletEnabled()
QString getWalletName() const
Top-level interface for a bitcoin node (bitcoind process).
virtual void rpcSetTimerInterfaceIfUnset(RPCTimerInterface *iface)=0
Set RPC timer interface if unset.
virtual bool disconnectById(NodeId id)=0
Disconnect node by id.
virtual std::vector< std::string > listRpcCommands()=0
List rpc commands.
virtual bool ban(const CNetAddr &net_addr, int64_t ban_time_offset)=0
Ban node.
virtual void rpcUnsetTimerInterface(RPCTimerInterface *iface)=0
Unset RPC timer interface.
virtual bool getNetworkActive()=0
Get network active.
virtual bool disconnectByAddress(const CNetAddr &net_addr)=0
Disconnect node by address.
UniValue RPCConvertValues(const std::string &strMethod, const std::vector< std::string > &strParams)
Convert positional arguments to command-specific RPC representation.
std::string TransportTypeAsString(TransportProtocolType transport_type)
Convert TransportProtocolType enum to a string value.
QString NetworkToQString(Network net)
Convert enum Network to QString.
QString HtmlEscape(const QString &str, bool fMultiLine)
QList< QModelIndex > getEntryData(const QAbstractItemView *view, int column)
Return a field of the currently selected entry as a QString.
QFont fixedPitchFont(bool use_embedded_font)
QString formatBytes(uint64_t bytes)
QString formatDurationStr(std::chrono::seconds dur)
Convert seconds into a QString with days, hours, mins, secs.
void AddButtonShortcut(QAbstractButton *button, const QKeySequence &shortcut)
Connects an additional shortcut to a QAbstractButton.
void handleCloseWindowShortcut(QWidget *w)
void copyEntryData(const QAbstractItemView *view, int column, int role)
Copy a field of the currently selected entry of a view to the clipboard.
QString formatPingTime(std::chrono::microseconds ping_time)
Format a CNodeStats.m_last_ping_time into a user-readable string or display N/A, if 0.
QString formatTimeOffset(int64_t nTimeOffset)
Format a CNodeCombinedStats.nTimeOffset into a user-readable string.
QString ConnectionTypeToQString(ConnectionType conn_type, bool prepend_direction)
Convert enum ConnectionType to QString.
QString formatServicesStr(quint64 mask)
Format CNodeStats.nServices bitmask into a user-readable string.
bool IsEscapeOrBack(int key)
void ThreadRename(std::string &&)
Rename a thread both in terms of an internal (in-memory) name as well as its system thread name.
const std::vector< std::string > CONNECTION_TYPE_DOC
const std::vector< std::string > TRANSPORT_TYPE_DOC
const int INITIAL_TRAFFIC_GRAPH_MINS
const struct @8 ICON_MAPPING[]
const QSize FONT_RANGE(4, 40)
const int CONSOLE_HISTORY
static QString categoryClass(int category)
const char fontSizeSettingsKey[]
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.