cleaner code, nogui mode more stable

This commit is contained in:
unknown 2015-05-26 17:18:52 +02:00
parent 56f1082907
commit d86feee482
9 changed files with 137 additions and 104 deletions

6
.gitignore vendored
View File

@ -1,2 +1,6 @@
build/*
*.user
debug/*
release/*
*.user
*.Debug
*.Release

View File

@ -5,45 +5,46 @@
int main(int argc, char *argv[])
{
// set up the socket
// create the socket
SocketIRC sock;
sock.setServer("irc.freenode.net");
sock.setPort(6667);
// set up the bot
// create the bot
SparrowBot* bot = new SparrowBot("SparrowBot", "epicsparrow");
// connect the bot to the socket
QObject::connect(&sock, SIGNAL(receivedMsg(QString)), bot, SLOT(receiveMsg(QString)));
QObject::connect(bot, SIGNAL(sendMsg(QString)), &sock, SLOT(sendMsg(QString)));
QObject::connect(bot, SIGNAL(changeSocketStatus(int)), &sock, SLOT(setConnected(int)));
// set up Qt
// parsing arguments
bool nogui = argc > 1 && QString(argv[1]).compare("-nogui") == 0;
// set up UI
if(!nogui)
{
QApplication app(argc, argv);
// init window
MainWindow w;
// bind signals to slots
QObject::connect(&sock, SIGNAL(receivedMsg(QString)), w.getConsole(), SLOT(append(QString)));
QObject::connect(&sock, SIGNAL(stateChanged(int)), w.getLed(), SLOT(setValue(int)));
QObject::connect(&sock, SIGNAL(stateChanged(int)), w.getSwitch(), SLOT(setValue(int)));
QObject::connect(bot, SIGNAL(sendMsg(QString)), w.getConsole(), SLOT(append(QString)));
QObject::connect(w.getPrompt(), SIGNAL(sendMsg(QString)), &sock, SLOT(sendMsg(QString)));
QObject::connect(w.getPrompt(), SIGNAL(returnPressed()), w.getPrompt(), SLOT(confirmationPerformed()));
QObject::connect(w.getSwitch(), SIGNAL(valueChanged(int)), bot, SLOT(forceStatus(int)));
// show window
w.show();
return app.exec();
QObject::connect(&app, SIGNAL(aboutToQuit()), bot, SLOT(disconnect()));
sock.connectToServer(&app);
}
else
{
QCoreApplication coreApp(argc, argv);
bot->forceStatus(1);
return coreApp.exec();
QObject::connect(&coreApp, SIGNAL(aboutToQuit()), bot, SLOT(disconnect()));
sock.connectToServer(&coreApp);
}
delete(bot);
return 0;
}

View File

@ -13,16 +13,6 @@ QTextBrowser* MainWindow::getConsole()
return this->ui->monitoringConsole;
}
QSlider* MainWindow::getSwitch()
{
return this->ui->connectSwitch;
}
QProgressBar* MainWindow::getLed()
{
return this->ui->statusLed;
}
Prompt* MainWindow::getPrompt()
{
return this->ui->prompt;

View File

@ -15,35 +15,6 @@
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QSlider" name="connectSwitch">
<property name="maximum">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QProgressBar" name="statusLed">
<property name="maximum">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="textVisible">
<bool>false</bool>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTextBrowser" name="monitoringConsole"/>
</item>

View File

@ -4,6 +4,7 @@
SocketIRC::SocketIRC() : server("irc.freenode.net"), port(6667), isConnected(false)
{
connect(&sock, SIGNAL(readyRead()), this, SLOT(readMsg()));
connect(&sock, SIGNAL(disconnected()), this, SLOT(onDisconnect()));
}
void SocketIRC::setServer(std::string server_)
@ -18,34 +19,25 @@ void SocketIRC::setPort(int port_)
void SocketIRC::sendMsg(QString msg)
{
if(isConnected)
{
sock.write(msg.toStdString().c_str());
sock.flush();
std::cout << msg.toStdString();
}
msg.append("\r\n");
sock.write(msg.toStdString().c_str());
sock.flush();
}
void SocketIRC::setConnected(int c)
void SocketIRC::connectToServer(QCoreApplication* app_)
{
if(c != isConnected)
app = app_;
sock.connectToHost(QString(server.c_str()), quint16(port));
if(!sock.waitForConnected(3000))
{
if(isConnected)
{
sock.close();
isConnected = false;
emit stateChanged(isConnected);
}
std::cerr << "failed to connect : " << sock.errorString().toStdString() << std::endl;
if(app != NULL)
app->exit();
else
{
sock.connectToHost(QString(server.c_str()), quint16(port));
if(sock.waitForConnected(5000))
isConnected = true;
else
std::cerr << "failed to connect : " << sock.errorString().toStdString() << std::endl;
emit stateChanged(isConnected);
}
exit(0);
}
app->exec();
}
void SocketIRC::readMsg()
@ -59,3 +51,8 @@ void SocketIRC::readMsg()
emit receivedMsg(QString(buffer));
}
}
void SocketIRC::onDisconnect()
{
app->exit();
}

View File

@ -4,6 +4,7 @@
#include <QTcpSocket>
#include <QPushButton>
#include <QThread>
#include <QCoreApplication>
class SocketIRC : public QObject
{
@ -14,9 +15,11 @@ public:
SocketIRC();
void setServer(std::string server_);
void setPort(int port_);
void connectToServer(QCoreApplication* app_);
private:
QCoreApplication* app;
std::string server;
int port;
QTcpSocket sock;
@ -24,14 +27,13 @@ private:
private slots:
void readMsg();
void onDisconnect();
public slots:
void sendMsg(QString msg);
void setConnected(int c);
signals:
void receivedMsg(QString msg);
void stateChanged(int newState);
};
#endif // SOCKETIRC_H

View File

@ -31,21 +31,6 @@ void SparrowBot::receiveMsg(QString str)
}
}
void SparrowBot::forceStatus(int newStatus)
{
emit changeSocketStatus(newStatus);
if(newStatus)
{
//status = ONLINE;
//sendRawMessage("NICK " + nick + "\r\nUSER " + nick + " 0 * " + nick + "\r\n");
}
else
{
status = OFFLINE;
users.clear();
}
}
void SparrowBot::handleMessage(Message msg)
{
// si la ligne est un message
@ -53,10 +38,8 @@ void SparrowBot::handleMessage(Message msg)
{
// mise à jour du bot
if(msg.args.compare("!update") == 0 && msg.src != NULL && msg.src->isOp())
{
emit sendMsg("QUIT :i'll be back\r\n");
exit(0);
}
disconnect("Rebooting for update...");
// affiche les gens connectés
if(msg.args.compare("!list") == 0)
{
@ -95,7 +78,7 @@ void SparrowBot::handleMessage(Message msg)
for(QString s : names)
{
users.getOrAdd(s);
emit sendMsg(QString("WHOIS %1\r\n").arg(s));
emit sendMsg(QString("WHOIS %1").arg(s));
}
}
@ -117,11 +100,21 @@ void SparrowBot::handleMessage(Message msg)
void SparrowBot::say(QString str)
{
emit sendMsg(QString("PRIVMSG #%1 :%2\r\n").arg(chan).arg(str));
emit sendMsg(QString("PRIVMSG #%1 :%2").arg(chan).arg(str));
}
void SparrowBot::action(QString str)
{
emit sendMsg(QString("PRIVMSG #%1 :ACTION %2\r\n").arg(chan).arg(str));
emit sendMsg(QString("PRIVMSG #%1 :ACTION %2 ").arg(chan).arg(str));
}
void SparrowBot::disconnect()
{
disconnect("I'll be back");
}
void SparrowBot::disconnect(QString str)
{
emit sendMsg(QString("QUIT :%1").arg(str));
}

View File

@ -27,7 +27,8 @@ private:
public slots:
void receiveMsg(QString msg);
void forceStatus(int newStatus);
void disconnect();
void disconnect(QString str);
signals:
void sendMsg(QString msg);

74
ui_mainwindow.h Normal file
View File

@ -0,0 +1,74 @@
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.4.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QWidget>
#include "prompt.h"
QT_BEGIN_NAMESPACE
class Ui_MainWindow
{
public:
QWidget *centralWidget;
QGridLayout *gridLayout;
QTextBrowser *monitoringConsole;
Prompt *prompt;
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(374, 404);
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
gridLayout = new QGridLayout(centralWidget);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
gridLayout->setObjectName(QStringLiteral("gridLayout"));
monitoringConsole = new QTextBrowser(centralWidget);
monitoringConsole->setObjectName(QStringLiteral("monitoringConsole"));
gridLayout->addWidget(monitoringConsole, 1, 0, 1, 2);
prompt = new Prompt(centralWidget);
prompt->setObjectName(QStringLiteral("prompt"));
gridLayout->addWidget(prompt, 0, 0, 1, 2);
MainWindow->setCentralWidget(centralWidget);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0));
} // retranslateUi
};
namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H