1
0
forked from BRT/arc
arc/main.cpp
2025-04-24 15:45:44 +04:00

185 lines
7.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QApplication>
#include <QThread>
#include "dao/AccountDAO.h"
#include "views/MainWindow.h"
#include "database/DatabaseManager.h"
#include "database/dao/CommonDataDAO.h"
#include "db/AccountInfoScreener.h"
#include "services/DeviceScreener.h"
#include <iostream>
#include <cstdlib>
#include <thread>
#include <chrono>
void setupWorkerAndThread(QCoreApplication &app) {
auto *thread = new QThread;
auto *deviceScreenerWorker = new DeviceScreener;
// Перемещаем worker в новый поток thread.
// Это значит, что все слоты worker, вызываемые через connect(), теперь будут исполняться в этом фоне-потоке.
deviceScreenerWorker->moveToThread(thread);
// Когда поток запустится, автоматически вызовется worker->start() внутри фонового потока.
QObject::connect(thread, &QThread::started, deviceScreenerWorker, &DeviceScreener::start);
// 🔁 Эти 3 строки делают автоматическую зачистку:
// Когда worker закончит работу (emit finished()), мы:
// - останавливаем поток (thread->quit())
// - удаляем worker (deleteLater)
// - удаляем thread (deleteLater)
// Это защищает от утечек памяти и оставшихся потоков после завершения.
QObject::connect(deviceScreenerWorker, &DeviceScreener::finished, thread, &QThread::quit);
QObject::connect(deviceScreenerWorker, &DeviceScreener::finished, deviceScreenerWorker, &QObject::deleteLater);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
// Когда пользователь закрывает приложение (Ctrl+C, exit() и т.п.), мы вызываем worker->stop() — ты сам пишешь, что в этом методе.
//Обычно он просто ставит флаг m_running = false, чтобы остановить бесконечный цикл в start()
QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
deviceScreenerWorker->stop();
});
thread->start();
}
void runADBCommand(const std::string& command) {
// Формируем команду для запуска в shell
std::string fullCommand = "adb shell " + command;
std::cout << "Executing: " << fullCommand << std::endl;
// Запуск команды
int result = std::system(fullCommand.c_str());
// Проверка на успешность выполнения
if (result != 0) {
std::cerr << "Error executing command: " << fullCommand << std::endl;
}
}
void wait(const int milliseconds) {
std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
}
int main(int argc, char *argv[]) {
// Шаг 1: запускаем приложение РСХБ
runADBCommand("monkey -p ru.rshb.dbo -c android.intent.category.LAUNCHER 1");
wait(4500); // Ждем пока загружается приложение, перед экраном ввода пин-кода
// Шаг 2: Ввод ПИН
runADBCommand("input tap 275 900"); // Клик по цифре 1
runADBCommand("input tap 560 900"); // Клик по цифре 2
runADBCommand("input tap 275 900"); // Клик по цифре 1
runADBCommand("input tap 275 900"); // Клик по цифре 1
wait(5500);
// Шаг 3: Закрытие рекламы
runADBCommand("input tap 300 2090"); // Закрыть баннер пуш-уведомлений (Баннер высвечивается при каждом 2-м запуске)
// runADBCommand("input tap 993 163"); // Закрыть сторис (только при первом входе после логина)
// runADBCommand("input tap 920 151"); // Закрыть окно перед главным экраном (только при первом входе после логина)
// runADBCommand("input tap 990 170"); // Закрыть другое окно (только при первом входе после логина)
wait(1500);
// Шаг 4: Пролистывание до кнопки "Все продукты"
runADBCommand("input swipe 1000 2000 1000 1300");
wait(3000);
// Шаг 5: Нажимаем на кнопку "Все продукты"
runADBCommand("input tap 570 1240");
wait(3000);
// Шаг 6: Выбор карты
// runADBCommand("input tap 530 535"); // Для карты дебетовая, цифровая, **6387
runADBCommand("input tap 530 675"); // Для карты дебетовая, **0823
// runADBCommand("input tap 530 800"); // Для карты дебетовая, **7498
wait(1500);
// Шаг 7: Нажимаем на кнопку "Оплатить"
runADBCommand("input tap 430 920");
wait(1200);
// Шаг 8: Нажимаем на блок "По номеру телефона"
runADBCommand("input tap 260 1500");
wait(2000);
// Шаг 8.1: Закрытие окна разрешения доступа к контактам
// runADBCommand("input tap 540 2140");
// wait(500);
// Вводим номер телефона для перевода
runADBCommand("input tap 250 250");
runADBCommand("input text '9272960333'");
wait(1200);
// Шаг 9: Нажимаем на область "Другой банк через СБП"
runADBCommand("input tap 500 600");
wait(2000);
// Шаг 10: Выбор банка
// runADBCommand("input tap 280 280"); // Нажимаем для фокуса у поля ввода текста
// runADBCommand("input text 'Т-Банк'"); // Передаем текст 'Т-банк' (Проблема - выдает NullPointerException из-за кириллицы)
runADBCommand("input tap 420 620"); // Т-Банк (Пока выбираю хардкодовым нажатием по списку)
wait(2000);
// Шаг 11: Ввод суммы
runADBCommand("input tap 300 1040");
runADBCommand("input text '10'");
wait(2000);
// Шаг 11.1: Подтверждаем перевод
runADBCommand("input tap 500 2170");
wait(2000);
// Завершаем перевод
runADBCommand("input tap 500 2170");
std::cout << "All commands executed successfully." << std::endl;
return 0;
QApplication app(argc, argv);
// QList<Card> cards = AccountInfoScreener::parseCardData(QByteArray());
// for (const Card &card: cards) {
// AccountInfo info;
// info.deviceId = "6edc4a47";
// info.appName = "bank";
// info.cardName = card.name;
// info.amount = card.amount;
// info.description = card.description;
// info.status = "active";
// info.updateTime = QDateTime::currentDateTime();
// qDebug() << "Account info: " << AccountDAO::upsertAccount(info);
// }
// setupWorkerAndThread(app);
//
// const QDateTime current = QDateTime::currentDateTimeUtc();
// qDebug() << "Обновление lastScan:" << CommonDataDAO::updateLastScan(current);
//
// const QDateTime savedTime = CommonDataDAO::getLastScan();
// qDebug() << "Сохранившееся время:" << savedTime.toString();
//
//
MainWindow window;
window.show();
return app.exec();
}