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);
592 settings.setValue(
"RPCConsoleWindowGeometry", saveGeometry());
593 settings.setValue(
"RPCConsoleWindowPeersTabSplitterSizes",
ui->splitter->saveState());
598 settings.setValue(
"RPCConsoleWidgetPeersTabSplitterSizes",
ui->splitter->saveState());
611 if(event->type() == QEvent::KeyPress)
613 QKeyEvent *keyevt =
static_cast<QKeyEvent*
>(event);
614 int key = keyevt->key();
615 Qt::KeyboardModifiers mod = keyevt->modifiers();
618 case Qt::Key_Up:
if(obj ==
ui->lineEdit) {
browseHistory(-1);
return true; }
break;
619 case Qt::Key_Down:
if(obj ==
ui->lineEdit) {
browseHistory(1);
return true; }
break;
621 case Qt::Key_PageDown:
622 if (obj ==
ui->lineEdit) {
623 QApplication::sendEvent(
ui->messagesWidget, keyevt);
631 QApplication::sendEvent(
ui->lineEdit, keyevt);
639 if(obj ==
ui->messagesWidget && (
640 (!mod && !keyevt->text().isEmpty() && key != Qt::Key_Tab) ||
641 ((mod & Qt::ControlModifier) && key == Qt::Key_V) ||
642 ((mod & Qt::ShiftModifier) && key == Qt::Key_Insert)))
644 ui->lineEdit->setFocus();
645 QApplication::sendEvent(
ui->lineEdit, keyevt);
650 return QWidget::eventFilter(obj, event);
657 bool wallet_enabled{
false};
661 if (model && !wallet_enabled) {
667 ui->trafficGraph->setClientModel(model);
687 ui->peerWidget->verticalHeader()->hide();
688 ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
689 ui->peerWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
690 ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu);
697 ui->peerWidget->horizontalHeader()->setSectionResizeMode(
PeerTableModel::Age, QHeaderView::ResizeToContents);
698 ui->peerWidget->horizontalHeader()->setStretchLastSection(
true);
717 connect(model->
getPeerTableModel(), &QAbstractItemModel::dataChanged, [
this] { updateDetailWidget(); });
721 ui->banlistWidget->verticalHeader()->hide();
722 ui->banlistWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
723 ui->banlistWidget->setSelectionMode(QAbstractItemView::SingleSelection);
724 ui->banlistWidget->setContextMenuPolicy(Qt::CustomContextMenu);
731 ui->banlistWidget->horizontalHeader()->setStretchLastSection(
true);
757 ui->networkName->setText(QString::fromStdString(
Params().GetChainTypeString()));
760 QStringList wordList;
762 for (
size_t i = 0; i < commandList.size(); ++i)
764 wordList << commandList[i].c_str();
765 wordList << (
"help " + commandList[i]).c_str();
768 wordList <<
"help-console";
771 autoCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);
774 ui->lineEdit->setEnabled(
true);
788 void RPCConsole::addWallet(
WalletModel *
const walletModel)
791 ui->WalletSelector->addItem(walletModel->
getDisplayName(), QVariant::fromValue(walletModel));
792 if (
ui->WalletSelector->count() == 2) {
794 ui->WalletSelector->setCurrentIndex(1);
796 if (
ui->WalletSelector->count() > 2) {
797 ui->WalletSelector->setVisible(
true);
798 ui->WalletSelectorLabel->setVisible(
true);
802 void RPCConsole::removeWallet(
WalletModel *
const walletModel)
804 ui->WalletSelector->removeItem(
ui->WalletSelector->findData(QVariant::fromValue(walletModel)));
805 if (
ui->WalletSelector->count() == 2) {
806 ui->WalletSelector->setVisible(
false);
807 ui->WalletSelectorLabel->setVisible(
false);
811 void RPCConsole::setCurrentWallet(
WalletModel*
const wallet_model)
813 QVariant data = QVariant::fromValue(wallet_model);
814 ui->WalletSelector->setCurrentIndex(
ui->WalletSelector->findData(data));
825 default:
return "misc";
848 QString str =
ui->messagesWidget->toHtml();
851 str.replace(QString(
"font-size:%1pt").arg(
consoleFontSize), QString(
"font-size:%1pt").arg(newSize));
858 float oldPosFactor = 1.0 /
ui->messagesWidget->verticalScrollBar()->maximum() *
ui->messagesWidget->verticalScrollBar()->value();
860 ui->messagesWidget->setHtml(str);
861 ui->messagesWidget->verticalScrollBar()->setValue(oldPosFactor *
ui->messagesWidget->verticalScrollBar()->maximum());
866 ui->messagesWidget->clear();
867 if (!keep_prompt)
ui->lineEdit->clear();
868 ui->lineEdit->setFocus();
874 ui->messagesWidget->document()->addResource(
875 QTextDocument::ImageResource,
886 ui->messagesWidget->document()->setDefaultStyleSheet(
889 "td.time { color: #808080; font-size: %2; padding-top: 3px; } "
890 "td.message { font-family: %1; font-size: %2; white-space:pre-wrap; } "
891 "td.cmd-request { color: #006060; } "
892 "td.cmd-error { color: red; } "
893 ".secwarning { color: red; }"
894 "b { color: #006060; } "
898 static const QString welcome_message =
902 tr(
"Welcome to the %1 RPC console.\n"
903 "Use up and down arrows to navigate history, and %2 to clear screen.\n"
904 "Use %3 and %4 to increase or decrease the font size.\n"
905 "Type %5 for an overview of available commands.\n"
906 "For more information on using this console, type %6.\n"
908 "%7WARNING: Scammers have been active, telling users to type"
909 " commands here, stealing their wallet contents. Do not use this console"
910 " without fully understanding the ramifications of a command.%8")
912 "<b>" +
ui->clearButton->shortcut().toString(QKeySequence::NativeText) +
"</b>",
913 "<b>" +
ui->fontBiggerButton->shortcut().toString(QKeySequence::NativeText) +
"</b>",
914 "<b>" +
ui->fontSmallerButton->shortcut().toString(QKeySequence::NativeText) +
"</b>",
916 "<b>help-console</b>",
917 "<span class=\"secwarning\">",
932 if (e->type() == QEvent::PaletteChange) {
939 ui->messagesWidget->document()->addResource(
940 QTextDocument::ImageResource,
946 QWidget::changeEvent(e);
951 QTime time = QTime::currentTime();
952 QString timeString = time.toString();
954 out +=
"<table><tr><td class=\"time\" width=\"65\">" + timeString +
"</td>";
955 out +=
"<td class=\"icon\" width=\"32\"><img src=\"" +
categoryClass(category) +
"\"></td>";
956 out +=
"<td class=\"message " +
categoryClass(category) +
"\" valign=\"middle\">";
961 out +=
"</td></tr></table>";
962 ui->messagesWidget->append(
out);
972 connections +=
" (" + tr(
"Network activity disabled") +
")";
975 ui->numberOfConnections->setText(connections);
994 ui->numberOfBlocks->setText(QString::number(
count));
995 ui->lastBlockTime->setText(blockDate.toString());
1001 ui->mempoolNumberTxs->setText(QString::number(numberOfTxs));
1003 if (dynUsage < 1000000) {
1004 ui->mempoolSize->setText(QObject::tr(
"%1 kB").arg(dynUsage / 1000.0, 0,
'f', 2));
1006 ui->mempoolSize->setText(QObject::tr(
"%1 MB").arg(dynUsage / 1000000.0, 0,
'f', 2));
1012 QString
cmd =
ui->lineEdit->text().trimmed();
1014 if (
cmd.isEmpty()) {
1018 std::string strFilteredCmd;
1023 throw std::runtime_error(
"Invalid command line");
1025 }
catch (
const std::exception& e) {
1026 QMessageBox::critical(
this,
"Error", QString(
"Error: ") + QString::fromStdString(e.what()));
1031 if (
cmd == QLatin1String(
"stop")) {
1041 ui->lineEdit->clear();
1044 #ifdef ENABLE_WALLET
1045 wallet_model =
ui->WalletSelector->currentData().value<
WalletModel*>();
1062 QMetaObject::invokeMethod(
m_executor, [
this,
cmd, wallet_model] {
1066 cmd = QString::fromStdString(strFilteredCmd);
1101 ui->lineEdit->setText(
cmd);
1112 ui->messagesWidget->undo();
1119 connect(&
thread, &QThread::finished,
m_executor, &RPCExecutor::deleteLater);
1131 if (
ui->tabWidget->widget(index) ==
ui->tab_console) {
1132 ui->lineEdit->setFocus();
1143 QScrollBar *scrollbar =
ui->messagesWidget->verticalScrollBar();
1144 scrollbar->setValue(scrollbar->maximum());
1149 const int multiplier = 5;
1150 int mins = value * multiplier;
1156 ui->trafficGraph->setGraphRange(std::chrono::minutes{mins});
1170 ui->peersTabRightPanel->hide();
1171 ui->peerHeading->setText(tr(
"Select a peer to view detailed information."));
1176 QString peerAddrDetails(QString::fromStdString(stats->nodeStats.m_addr_name) +
" ");
1177 peerAddrDetails += tr(
"(peer: %1)").arg(QString::number(stats->nodeStats.nodeid));
1178 if (!stats->nodeStats.addrLocal.empty())
1179 peerAddrDetails +=
"<br />" + tr(
"via %1").arg(QString::fromStdString(stats->nodeStats.addrLocal));
1180 ui->peerHeading->setText(peerAddrDetails);
1181 QString bip152_hb_settings;
1182 if (stats->nodeStats.m_bip152_highbandwidth_to) bip152_hb_settings =
ts.
to;
1183 if (stats->nodeStats.m_bip152_highbandwidth_from) bip152_hb_settings += (bip152_hb_settings.isEmpty() ?
ts.
from : QLatin1Char(
'/') +
ts.
from);
1184 if (bip152_hb_settings.isEmpty()) bip152_hb_settings =
ts.
no;
1185 ui->peerHighBandwidth->setText(bip152_hb_settings);
1186 const auto time_now{GetTime<std::chrono::seconds>()};
1188 ui->peerLastBlock->setText(
TimeDurationField(time_now, stats->nodeStats.m_last_block_time));
1197 if (stats->nodeStats.nVersion) {
1198 ui->peerVersion->setText(QString::number(stats->nodeStats.nVersion));
1200 if (!stats->nodeStats.cleanSubVer.empty()) {
1201 ui->peerSubversion->setText(QString::fromStdString(stats->nodeStats.cleanSubVer));
1204 ui->peerTransportType->setText(QString::fromStdString(
TransportTypeAsString(stats->nodeStats.m_transport_type)));
1206 ui->peerSessionIdLabel->setVisible(
true);
1207 ui->peerSessionId->setVisible(
true);
1208 ui->peerSessionId->setText(QString::fromStdString(stats->nodeStats.m_session_id));
1210 ui->peerSessionIdLabel->setVisible(
false);
1211 ui->peerSessionId->setVisible(
false);
1215 ui->peerPermissions->setText(
ts.
na);
1217 QStringList permissions;
1219 permissions.append(QString::fromStdString(permission));
1221 ui->peerPermissions->setText(permissions.join(
" & "));
1223 ui->peerMappedAS->setText(stats->nodeStats.m_mapped_as != 0 ? QString::number(stats->nodeStats.m_mapped_as) :
ts.
na);
1227 if (stats->fNodeStateStatsAvailable) {
1230 if (stats->nodeStateStats.nSyncHeight > -1) {
1231 ui->peerSyncHeight->setText(QString(
"%1").arg(stats->nodeStateStats.nSyncHeight));
1236 if (stats->nodeStateStats.nCommonHeight > -1) {
1237 ui->peerCommonHeight->setText(QString(
"%1").arg(stats->nodeStateStats.nCommonHeight));
1241 ui->peerHeight->setText(QString::number(stats->nodeStateStats.m_starting_height));
1243 ui->peerAddrRelayEnabled->setText(stats->nodeStateStats.m_addr_relay_enabled ?
ts.
yes :
ts.
no);
1244 ui->peerAddrProcessed->setText(QString::number(stats->nodeStateStats.m_addr_processed));
1245 ui->peerAddrRateLimited->setText(QString::number(stats->nodeStateStats.m_addr_rate_limited));
1246 ui->peerRelayTxes->setText(stats->nodeStateStats.m_relay_txs ?
ts.
yes :
ts.
no);
1249 ui->peersTabRightPanel->show();
1254 QWidget::resizeEvent(event);
1259 QWidget::showEvent(event);
1275 QWidget::hideEvent(event);
1286 QModelIndex index =
ui->peerWidget->indexAt(point);
1287 if (index.isValid())
1293 QModelIndex index =
ui->banlistWidget->indexAt(point);
1294 if (index.isValid())
1302 for(
int i = 0; i < nodes.count(); i++)
1305 NodeId id = nodes.at(i).data().toLongLong();
1321 m_node.
ban(stats->nodeStats.addr, bantime);
1337 bool unbanned{
false};
1338 for (
const auto& node_index : nodes) {
1339 unbanned |= ban_table_model->
unban(node_index);
1342 ban_table_model->refresh();
1348 ui->peerWidget->selectionModel()->clearSelection();
1359 ui->banlistWidget->setVisible(visible);
1360 ui->banHeading->setVisible(visible);
1365 ui->tabWidget->setCurrentIndex(
int(tabType));
1370 return ui->tabWidget->tabText(
int(tab_type));
1387 this->
ui->label_alerts->setVisible(!warnings.isEmpty());
1388 this->
ui->label_alerts->setText(warnings);
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)
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.