PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/Sirius/sirius.cpp

https://gitlab.com/kohoutovice/Sirius_old
C++ | 461 lines | 411 code | 43 blank | 7 comment | 113 complexity | ffcca438d2939777dd8381e36d82738e MD5 | raw file
  1. #include "sirius.h"
  2. #include <QMediaPlayer>
  3. #include <QQmlApplicationEngine>
  4. #include <QQmlContext>
  5. #include <QQuickView>
  6. #include <iostream>
  7. #include "youtubeapi.h"
  8. #include <QFileDialog>
  9. #include <textparser.h>
  10. #include <QVector>
  11. #include "defines.h"
  12. extern QQmlApplicationEngine *engine;
  13. Sirius::Sirius() {
  14. config = new Configuration(WORK_DIR + "sirius.json"); //TODO make the configuration cyphered
  15. try {
  16. config->load();
  17. } catch (const std::runtime_error& e) {
  18. printing.print(QString(e.what()));
  19. }
  20. { // connect this class with qml
  21. QQmlContext *context = engine->rootContext();
  22. context->setContextProperty("configClass", config);
  23. }
  24. { // connect this class with qml
  25. QQmlContext *context = engine->rootContext();
  26. context->setContextProperty("siriusClass", this);
  27. }
  28. locker = new QTimer(this);
  29. connect(locker,SIGNAL(timeout()),this,SLOT(lockState()));
  30. lang = new Language();
  31. network = new NetworkHandler(this);
  32. QQmlContext *context_net = engine->rootContext();
  33. context_net->setContextProperty("netClass", network);
  34. network->startClient(config->getServerIp());
  35. db = new DatabaseHandling(config->getDBAdress(),config->getDBUserName(),config->getDBUserName(),config->getDBPassword());
  36. systemCont = new systemControll;
  37. musicmixer = new musicMixer(this,config->getMusicDir());
  38. locker->start(LOCK_TIME);
  39. notif = new Notification();
  40. {
  41. QQmlContext *context = engine->rootContext();
  42. context->setContextProperty("notifClass", notif);
  43. notif->start();
  44. }
  45. smtp = new SmtpClient(config->getSmtpServer(), config->getSmtpPort(), SmtpClient::SslConnection);
  46. smtp->setUser(config->getMailUsername());
  47. smtp->setPassword(config->getMailPassword());
  48. printing.print("Zdravím Vás pane");
  49. connect(&printing,SIGNAL(userPrint(QString)),this,SLOT(sayMe(QString)));
  50. }
  51. Sirius::~Sirius()
  52. {
  53. //TODO clean it
  54. }
  55. void Sirius::processInput(QString vstup){
  56. vstup = vstup.toLower();
  57. inputProc(vstup);
  58. emit stateChange(stav);
  59. }
  60. void Sirius::inputProc(QString vstup){
  61. vstup = vstup.trimmed();
  62. vstup = vstup + " ";
  63. currentSentence += vstup + " ";
  64. locker->setInterval(LOCK_TIME);
  65. QStringList input = vstup.split(" ");
  66. if(continuous == 0){
  67. for(int i = 0; i < input.size(); i++){
  68. if(input[i] == "konec"){//TODO
  69. lockState();
  70. break;
  71. }
  72. //-------------------komunikace s jiz spustenymi procesy
  73. if(musicmixer != NULL)
  74. if(musicmixer->isActive())
  75. musicmixer->command(input.at(i));
  76. if(vizualizace != NULL)
  77. if(vizualizace->isVisible())
  78. vizualizace->command(input.at(i));
  79. //------------------------------------------------------
  80. QString prikaz;
  81. if(stav < 10000)
  82. stav = lang->findNextState(input.at(i),stav);
  83. else if(stav >= 10000){
  84. for(int j = i; j < input.size(); j++){
  85. if(input.at(j) != "s" && input.at(j) != "nazvem" && input.at(j) != "názvem"){//TODO zavest blacklist slov bez duleziteho vyznamu
  86. prikaz += input.at(j);
  87. if(j != (input.size()-1)){ // pokud jsou jeste nejaka slova dej mezi ne mezeru
  88. prikaz += " ";
  89. }
  90. }
  91. }
  92. runStatus(prikaz);
  93. break;
  94. }
  95. }
  96. }else{
  97. runStatus(vstup);
  98. }
  99. }
  100. void Sirius::runStatus(QString input){
  101. qWarning() << "continuos" <<continuous << "stav" << stav << "input" << input;
  102. switch(stav){
  103. case 10000:{ //hledej na netu
  104. if(input != ""){
  105. emit showWebPage("http://www.google.com/search?q=" + input);
  106. //QString link = "http://www.google.com/search?q=" + input + "";
  107. //QDesktopServices::openUrl(QUrl(link));
  108. reset_fsm();
  109. }
  110. }
  111. break;
  112. case 10001:
  113. break;
  114. case 10002:
  115. break;
  116. case 10003:
  117. break;
  118. case 1004:{ // vytvor novy projekt
  119. QString command = NULL;
  120. qDebug() << "104" << continuous << stav << input;
  121. if(continuous == 0){
  122. input = input.replace(" ", "_");
  123. command = "mkdir " + config->getProjectDir() + "/"+ input;
  124. system(qPrintable(command));
  125. command = "touch " + config->getProjectDir() + "/"+ input + "/poznamky_" + input + ".txt";
  126. system(qPrintable(command));
  127. askUser("Jaký typ projektu?",input);
  128. }else if(continuous == 1){
  129. if(input.contains("arduino")){
  130. QTextStream(stdout) << "zapinam arduino IDE" << endl;
  131. command = "";
  132. command += "echo '//author: Jan Jurča, created by: Sirius\n"
  133. "void setup() { \n"
  134. "\n"
  135. "}\n"
  136. "void loop() {\n"
  137. "}' > "+ config->getProjectDir() + "/"+ inputAskUser + "/" + inputAskUser + ".ino";
  138. system(qPrintable(command));
  139. command = "arduino " + config->getProjectDir() + "/"+ inputAskUser + "/" + inputAskUser + ".ino";
  140. system(qPrintable(command));
  141. continuous = 0;
  142. reset_fsm();
  143. }
  144. }
  145. }
  146. break;
  147. case 10005:{ // hudebni mixer
  148. sayMe("spoustim music mixer");
  149. musicmixer->mixMusic(2);
  150. //emit mixMusic(2); //TODO make a research about calling qthread with methods vs signals
  151. reset_fsm();
  152. break;
  153. }
  154. case 10006:{ // nastaveni casovace
  155. int input_cas = 0;
  156. QStringList sentenceList = currentSentence.split(" ");
  157. for(int i = 0; i < sentenceList.size(); i++ ){
  158. input_cas += QString(sentenceList.at(i)).toInt();
  159. }
  160. if( input == "" || input_cas < 1 ){ //bude se ptát tak dlouho dokud nezíská platný udaj o case
  161. askUser("Na jak dlouho?",input);
  162. continuous = 1;
  163. }else{
  164. timerList << new CustomTimer(QDateTime(QDateTime::currentDateTime()).addSecs(input_cas*60),this); //TODO
  165. printing.print("Časovač nastaven na "+ QString::number(input_cas) + " minut.");
  166. reset_fsm();
  167. continuous = 0;
  168. }
  169. break;
  170. }
  171. case 10007:{ // tvorba videa
  172. reset_fsm();
  173. break;
  174. }
  175. case 10008:{ // spuštění vizualizace
  176. #ifdef DESKTOP
  177. if( vizualizace != NULL)
  178. delete vizualizace;
  179. vizualizace = new serialVisualise();
  180. if(!vizualizace->isVisible())
  181. vizualizace->show();
  182. #else
  183. printing.print(tr("Nepodporovaná funkce na tomto zařízeni"));
  184. #endif
  185. reset_fsm();
  186. break;
  187. }
  188. case 10009:{ // vypnout pocitac
  189. reset_fsm();
  190. systemCont->shutDown(); //TODO make it for android too
  191. break;
  192. }
  193. case 10010:{ // uspat pocitac
  194. reset_fsm();
  195. systemCont->sleepMode();//TODO make it for android too
  196. break;
  197. }
  198. case 10011:{ // pridej poznamku
  199. if(continuous == 0){
  200. poznamka = "\n";
  201. QDateTime datumPoznamky = QDateTime::currentDateTime();
  202. poznamka += datumPoznamky.toString();
  203. poznamka += "\n";
  204. poznamka += input;
  205. continuous = 1;
  206. printing.print("Přidávám poznámku:");
  207. printing.print(poznamka);
  208. }else{
  209. poznamka += " ";
  210. poznamka += input;
  211. printing.print("Pokračuji v poznámce");
  212. printing.print(input);
  213. QStringList inputList = input.split(" ");
  214. for(int i = 0; i < inputList.size(); i++){
  215. if(inputList[i] == "konec"){
  216. QFile notes(config->getNotesFile());
  217. if(notes.open(QIODevice::Append | QIODevice::Text)){
  218. QTextStream stream(&notes);
  219. stream << poznamka;
  220. notes.close();
  221. }
  222. printing.print("Ukončuji poznámku");
  223. reset_fsm();
  224. continuous = 0;
  225. }
  226. }
  227. }
  228. break;
  229. }
  230. case 10012:{ // aktualizuj se
  231. reset_fsm();
  232. break;
  233. }
  234. case 10013:{ // Otevři projekt
  235. reset_fsm();
  236. break;
  237. }
  238. case 10014:{ // Otevři konsoli
  239. reset_fsm();
  240. QProcess *process = new QProcess;
  241. process->start(config->getConsoleDir());
  242. if(!process->waitForStarted()){
  243. printing.print("nepodařilo se spustit konzoli");
  244. }
  245. break;
  246. }
  247. case 10015:{ //reboot pc
  248. reset_fsm();
  249. systemCont->reboot();
  250. break;
  251. }
  252. case 10016:{ //aktualizuj db hudby
  253. reset_fsm();
  254. //musicmixer->aktualizaceMusicDB();
  255. break;
  256. }
  257. case 10017:{ //otevri poznamky
  258. emit showFile(config->getNotesFile());
  259. reset_fsm();
  260. break;
  261. }
  262. case 10018:{ //otevri port a poslouchej na nem
  263. if(input.toInt() != 0){
  264. network->listenOnPort(input.toInt());
  265. emit showFile("udp://"+QString::number(input.toInt()));
  266. reset_fsm();
  267. } else {
  268. askUser("Jaký port?",input);
  269. }
  270. break;
  271. }
  272. case 10019:{ // poslat email
  273. static QString subject;
  274. static QString mail_content;
  275. static QString recipient;
  276. if(continuous == 0){
  277. askUser("Jaký předmět:",input);
  278. }
  279. else if(continuous == 1){
  280. subject = input;
  281. askUser("Text zprávy:",input);
  282. }
  283. else if(continuous == 2){
  284. mail_content = input;
  285. askUser("Komu:",input);
  286. } else if (continuous == 3){
  287. recipient = input;
  288. MimeMessage message;
  289. message.setSender(new EmailAddress(config->getMailUsername(), "My name")); // TODO add my name to config file
  290. message.addRecipient(new EmailAddress(recipient));
  291. message.setSubject(subject);
  292. MimeText text;
  293. text.setText(mail_content + "\n");
  294. message.addPart(&text);
  295. if(!smtp->connectToHost())
  296. printing.print("Can't connect to mail host");
  297. if(!smtp->login())
  298. printing.print("Cant login to mail");
  299. if(!smtp->sendMail(message))
  300. printing.print("Cant send mail");
  301. smtp->quit();
  302. reset_fsm();
  303. }//TODO udelej skript ketry stahne kontaktní knížku z googlu a nahodí ji do mé databáze ze které se potom budou vybírat kontakty pro siriuse jak prosté a geniální že :-)
  304. break;
  305. }
  306. case 10020:{ // pridej notifikaci
  307. static QString notifText = "";
  308. if(continuous == 0){
  309. askUser("Jaky je obsah upozorneni?",input);
  310. notifText = "";
  311. } else if(continuous == 1) {
  312. askUser("A kdy?",input);
  313. notifText = input;
  314. } else if (continuous == 5){
  315. QDateTime date = QDateTime::currentDateTime();
  316. date = date.addDays(1);
  317. QTime time = QTime::fromString("08:00","hh:mm");
  318. date.setTime(time);
  319. printing.print("Notifikace nastavena na "+ date.toString());
  320. notif->addNotification(date,notifText);
  321. reset_fsm();
  322. } else {
  323. QTime time = QTime::currentTime().addSecs(3600);
  324. QDateTime date = QDateTime::currentDateTime();
  325. if (TextParser::getTime(input) != QTime()) {
  326. time = TextParser::getTime(input);
  327. date.setTime(time);
  328. }
  329. if(TextParser::getDate(input) != QDate()){
  330. date.setDate(TextParser::getDate(input));
  331. }
  332. notif->addNotification(date,notifText);
  333. }
  334. break;
  335. }
  336. case 10021:{ // aktualizuj konfiguracni soubor
  337. printing.print(input);
  338. input = input.trimmed();
  339. if(continuous == 0){
  340. askUser("Jaka je cesta ke consoli?",input,"folder");
  341. } else if(continuous == 1) {
  342. config->setConsoleDir(input);
  343. askUser("IP adresa DB serveru:",input);
  344. } else if(continuous == 2) {
  345. config->setDBAdress(input);
  346. askUser("Heslo k DB:",input);
  347. } else if(continuous == 3) {
  348. config->setDBPassword(input);
  349. askUser("Uzivatelske jmeno k DB:",input);
  350. } else if(continuous == 4) {
  351. config->setDBUserName(input);
  352. askUser("Mailove heslo:",input);
  353. } else if(continuous == 5) {
  354. config->setMailPassword(input);
  355. askUser("Mailova adresa:",input);
  356. } else if(continuous == 6) {
  357. config->setMailUsername(input);
  358. askUser("Slozka s hudbou:",input,"folder");
  359. } else if(continuous == 7) {
  360. config->setMusicDir(input);
  361. askUser("Soubor s poznamkami:",input);
  362. } else if(continuous == 8) {
  363. config->setNotesFile(input);
  364. askUser("Slozka s projekty:",input,"folder");
  365. } else if(continuous == 9) {
  366. config->setProjectDir(input);
  367. askUser("SMTP server:",input);
  368. } else if(continuous == 10) {
  369. config->setSmtpServer(input);
  370. askUser("SMTP port:",input);
  371. } else if(continuous == 11) {
  372. config->setSmtpPort(input.toInt());
  373. if(config->saveConfiguration())
  374. printing.print("Configuration succesfuly saved");
  375. reset_fsm();
  376. }
  377. break;
  378. }
  379. case 10022:{ // otevri soubor
  380. emit showFile(QFileDialog::getOpenFileName(nullptr,tr("Open file"), QDir::homePath()));
  381. reset_fsm();
  382. break;
  383. }
  384. default:{
  385. printing.print("Stav " + QString::number(stav) + " nenalezen");
  386. break;
  387. }
  388. }
  389. }
  390. void Sirius::askUser(QString dotaz, QString input, QString type){
  391. printing.print(dotaz);
  392. emit s_askUser(dotaz,type);
  393. continuous++;
  394. inputAskUser = input;
  395. }
  396. void Sirius::lockState(){
  397. if(stav != 0){
  398. printing.print("Zamčeno");
  399. stav = 0;
  400. }
  401. reset_fsm();
  402. }
  403. void Sirius::sayMe(QString text){
  404. QTextStream(stdout) << __FUNCTION__ << ": " << text << endl;
  405. emit messageOutput(text);
  406. }
  407. bool Sirius::fileExists(QString path) {
  408. QFileInfo check_file(path);
  409. return check_file.exists() && check_file.isFile();
  410. }
  411. void Sirius::reset_fsm(){
  412. this->stav = 1;
  413. this->currentSentence = "";
  414. this->continuous = 0;
  415. }
  416. void Sirius::sayMe(QUrl url){
  417. sayMe(url.toString());
  418. }