Skip to content

Commit

Permalink
Ajout du tracking des users
Browse files Browse the repository at this point in the history
  • Loading branch information
dguihal@gmail.com committed Nov 2, 2013
1 parent c8c7218 commit d527af2
Show file tree
Hide file tree
Showing 17 changed files with 725 additions and 65 deletions.
133 changes: 88 additions & 45 deletions core/qqbouchot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,22 +56,19 @@ QQBouchotDef bouchotsDef[] =
"#ffd0d0", "schee,seeschloss", "", QQBouchot::SlipTagsRaw },
{ "devnewton", "http://devnewton.bci.im/fr/chat/xml", "http://devnewton.bci.im/fr/chat/post", "message=%m",
"#666666", "", "", QQBouchot::SlipTagsRaw }
}
;
};

QQBouchot::QQBouchot(const QString &name, QObject *parent) :
QQNetworkAccessor(parent)
QQNetworkAccessor(parent),
m_hasXPostId(false), // unknown
m_lastId(-1),
m_name(name),
m_xmlParser(new QQXmlParser()),
m_piniWidget(NULL),
m_deltaTimeH(-1) // unknown
{
m_name = name;
m_bSettings.setRefresh(0);
m_history.clear();
m_newPostHistory.clear();
m_hasXPostId = false; // unknown
m_xPostIds.clear();
m_lastId=-1;
m_piniWidget = NULL;

m_xmlParser = new QQXmlParser();
connect(m_xmlParser, SIGNAL(newPostReady(QQPost&)), this, SLOT(insertNewPost(QQPost&)));
connect(m_xmlParser, SIGNAL(finished()), this, SLOT(parsingFinished()));

Expand Down Expand Up @@ -134,16 +131,16 @@ void QQBouchot::startRefresh()
return;

//Connection du signal
connect(&timer, SIGNAL(timeout()), this, SLOT(fetchBackend()));
connect(&m_timer, SIGNAL(timeout()), this, SLOT(fetchBackend()));

//Première récuperation
fetchBackend();
}

void QQBouchot::stopRefresh()
{
timer.disconnect();
timer.stop();
m_timer.disconnect();
m_timer.stop();
}

QQListPostPtr QQBouchot::takeNewPosts()
Expand Down Expand Up @@ -193,7 +190,7 @@ void QQBouchot::fetchBackend()
QString lastId;

//on bloque le timer
timer.stop();
m_timer.stop();

if(m_lastId < 0)
{
Expand All @@ -216,14 +213,11 @@ void QQBouchot::fetchBackend()
url.replace(QString::fromLatin1("%i"), lastId);
}

qDebug() << "QQBouchot::fetchBackend url=" << url;

QNetworkRequest request(QUrl::fromUserInput(url));
request.setAttribute(QNetworkRequest::User, QQBouchot::BackendRequest);
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);

QQSettings settings;
request.setRawHeader(QString::fromLatin1("User-Agent").toLatin1(), QString(DEFAULT_GENERAL_DEFAULT_UA).toLatin1());

if(m_bSettings.cookie().isEmpty() == false)
Expand All @@ -232,41 +226,34 @@ void QQBouchot::fetchBackend()
QNetworkReply * reply = httpGet(request);
connect(reply, SIGNAL(sslErrors(const QList<QSslError>&)), this, SLOT(slotSslErrors(const QList<QSslError>&)));

timer.setInterval(m_bSettings.refresh() * 1000);
timer.start();
m_timer.setInterval(m_bSettings.refresh() * 1000);
m_timer.start();
}


void QQBouchot::slotSslErrors(const QList<QSslError> &errors)
{
for(int i = 0; i < errors.size(); i++)
foreach(QSslError err, errors)
{
if(errors[i].error() != QSslError::NoError)
if(err.error() != QSslError::NoError)
{
qDebug() << "QQNetworkAccessor::slotNetworkReplyError: " << errors[i].errorString();
qDebug() << "QQNetworkAccessor::slotNetworkReplyError: " << err.errorString();
}
}
}

void QQBouchot::requestFinishedSlot(QNetworkReply *reply)
{
// Recuperation du Statut HTTP
//QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

qDebug() << "QQBouchot::requestFinishedSlot url=" << reply->url();

if(reply->error() != QNetworkReply::NoError)
{
qWarning() << "QQBouchot::requestFinishedSlot, error : " << reply->error()
<< ", msg : " << reply->errorString();
//stopRefresh();
}
else
{
switch(reply->request().attribute(QNetworkRequest::User, QQBouchot::UnknownRequest).toInt(0))
{
case QQBouchot::PostRequest:
//qDebug() << "QQBouchot::requestFinishedSlot post Request detected, refresh du backend ";
if(reply->hasRawHeader(X_POST_ID_HEADER))
{
m_hasXPostId = true;
Expand All @@ -275,12 +262,9 @@ void QQBouchot::requestFinishedSlot(QNetworkReply *reply)

fetchBackend();
break;

case QQBouchot::BackendRequest:
//qDebug() << "QQBouchot::requestFinishedSlot fetch backend detected";
parseBackend(reply->readAll());
break;

default:
qWarning() << "QQBouchot::requestFinishedSlot, reply->request().attribute(QNetworkRequest::User).toInt() unknown";
}
Expand Down Expand Up @@ -328,12 +312,83 @@ void QQBouchot::parsingFinished()
{
if(m_newPostHistory.size() > 0)
{
QDateTime currentDateTime = QDateTime::currentDateTime();
if(m_deltaTimeH == -1 &&
m_history.size() > 0 &&
m_newPostHistory.size() > 0)
{
//Le delta de TZ ne peut etre determine efficacement que lors d'un
// refresh de backend (pas lors du chargement initial).
QQPost *last = m_newPostHistory.last();
QDateTime postDateTime = QDateTime::fromString(last->norloge(), "yyyyMMddHHmmss");
m_deltaTimeH = postDateTime.secsTo(currentDateTime) / 3600; //Secondes vers Heures
}

m_history.append(m_newPostHistory);
m_lastPosters.clear();
{
int deltaTimeH = m_deltaTimeH;
// Si on ne sait pas on considere que c'est 0 en attendant d'en savoir plus
if(deltaTimeH < 0)
deltaTimeH = 0;

currentDateTime.addSecs( deltaTimeH * 3600 ); // on se met sur le meme TZ que le bouchot
for(int i = m_history.size() - 1; i >= 0; i--)
{
QQPost *post = m_history.at(i);
QDateTime postDateTime = QDateTime::fromString(post->norloge(), "yyyyMMddHHmmss");
if(qAbs(currentDateTime.secsTo(postDateTime)) < (2 * 3600))
{
QString name;
bool isAuth;
if(post->login().size() > 0)
{
name = post->login();
isAuth = true;
}
else if((post->UA().size() > 0) && ! post->UA().contains('/'))
{
name = post->UA();
isAuth = false;
}

if(name.length() > 0)
{
QQMussel mussel(name, m_name, isAuth);
bool found = false;
foreach (QQMussel lastMussels, m_lastPosters) {
if(lastMussels == mussel)
{
found = true;
break;
}
}
if(! found)
m_lastPosters.append(mussel);
}
}
else
break;
}
emit lastPostersUpdated();
}
m_lastId = m_xmlParser->maxId();
askPiniUpdate();
}
}

void QQBouchot::askPiniUpdate()
{
QApplication::postEvent(
(QObject *) m_piniWidget,
new QQBackendUpdatedEvent(
QQBackendUpdatedEvent::BACKEND_UPDATED,
m_bSettings.group()
),
Qt::LowEventPriority
);
}

void QQBouchot::checkGroupModified(const QString &oldGroupName)
{
if(m_bSettings.group() != oldGroupName)
Expand Down Expand Up @@ -431,15 +486,3 @@ QList<QString> QQBouchot::listGroups()
}
return listGroups;
}

void QQBouchot::askPiniUpdate()
{
QApplication::postEvent(
(QObject *) m_piniWidget,
new QQBackendUpdatedEvent(
QQBackendUpdatedEvent::BACKEND_UPDATED,
m_bSettings.group()
),
Qt::LowEventPriority
);
}
14 changes: 11 additions & 3 deletions core/qqbouchot.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "core/qqnetworkaccessor.h"
#include "core/qqpost.h"
#include "core/qqmussel.h"

#include <QColor>
#include <QHash>
Expand Down Expand Up @@ -91,7 +92,7 @@ class QQBouchot : public QQNetworkAccessor
~QQBouchot();

QString name() { return m_name; }
//void setName(const QString &newName) { m_name = newName; }
QList<QQMussel> lastPosters() { return m_lastPosters; }

void parseBackend(const QByteArray &data);
void postMessage(const QString &message);
Expand All @@ -111,6 +112,7 @@ class QQBouchot : public QQNetworkAccessor

virtual bool event(QEvent *e);

//static
static QQBouchotSettings getBouchotDef(const QString &bouchotName);
static QStringList getBouchotDefNameList();
static QQBouchot * bouchot(const QString &bouchotName);
Expand All @@ -125,6 +127,8 @@ public slots:
void removed(QString name, QString groupName);
void destroyed(QQBouchot *bouchot);
void groupChanged(QQBouchot *bouchot, QString oldGroupName);
void refreshStarted(int interval);
void lastPostersUpdated();

protected slots:
void fetchBackend();
Expand All @@ -133,8 +137,8 @@ protected slots:
void parsingFinished();

private:
void checkGroupModified(const QString &oldGroupName);
void askPiniUpdate();
void checkGroupModified(const QString &oldGroupName);

QQListPostPtr m_history;
bool m_hasXPostId; //false = unknown
Expand All @@ -143,12 +147,16 @@ protected slots:
QString m_name;
QQListPostPtr m_newPostHistory;
QQBouchotSettings m_bSettings;
QTimer timer;
QTimer m_timer;

QQXmlParser *m_xmlParser;

QWidget *m_piniWidget;

int m_deltaTimeH;
QList<QQMussel> m_lastPosters;

//static
static QHash<QString, QQBouchot *> s_hashBouchots;
};

Expand Down
24 changes: 24 additions & 0 deletions core/qqmussel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "qqmussel.h"

#define SEP_CHAR '@'

QQMussel::QQMussel(QString name, QString board, bool isAuth) :
m_name(name),
m_board(board),
m_isAuth(isAuth)
{
}

QString QQMussel::fullName() const
{
QString fn;
fn.append(m_name).append(SEP_CHAR).append(m_board);
return m_name;
}

bool QQMussel::equals(const QQMussel mussel) const
{
return (m_name == mussel.m_name) &&
(m_board == mussel.m_board) &&
(m_isAuth == mussel.m_isAuth);
}
25 changes: 25 additions & 0 deletions core/qqmussel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#ifndef QQMUSSEL_H
#define QQMUSSEL_H

#include <QString>

class QQMussel
{
public:
explicit QQMussel(QString name, QString board, bool isAuth = true);

QString name() const { return m_name; }
QString board() const { return m_board; }
bool isAuth() const { return m_isAuth; }

QString fullName() const;
bool equals(const QQMussel mussel) const;
bool operator== (const QQMussel mussel) const { return this->equals(mussel); }

private:
QString m_name;
QString m_board;
bool m_isAuth;
};

#endif // QQMUSSEL_H
13 changes: 13 additions & 0 deletions mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "ui_mainwindow.h"
#include "core/qqbouchot.h"
#include "core/qqsettings.h"
#include "ui/qqboardsinfo.h"
#include "ui/qqpalmipede.h"
#include "ui/qqpinipede.h"
#include "ui/qqpinisearchwidget.h"
Expand Down Expand Up @@ -47,9 +48,19 @@ MainWindow::MainWindow(QWidget *parent) :
QAction *actionTotozManager = m_totozManager->toggleViewAction();
actionTotozManager->setShortcut(Qt::ControlModifier + Qt::Key_T);

// Setup du board info
m_boardsInfo = new QQBoardsInfo(this);
m_boardsInfo->setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea);
m_boardsInfo->updateBoardList();
addDockWidget(Qt::LeftDockWidgetArea, m_boardsInfo, Qt::Vertical);

QAction *actionBoardInfo = m_boardsInfo->toggleViewAction();
actionBoardInfo->setShortcut(Qt::ControlModifier + Qt::Key_I);
// Setup du bouton d'options
QToolButton *toolButton = new QToolButton();
toolButton->setIcon(QIcon(":/img/settings-icon.png"));
toolButton->addAction(actionBoardInfo);
toolButton->addAction(actionPalmi);
toolButton->addAction(actionTotozManager);

Expand Down Expand Up @@ -244,6 +255,8 @@ void MainWindow::initBouchot(QQBouchot *bouchot)

connect(bouchot, SIGNAL(destroyed(QQBouchot*)), this, SLOT(bouchotDestroyed(QQBouchot *)));
connect(bouchot, SIGNAL(groupChanged(QQBouchot*,QString)), this, SLOT(bouchotGroupChanged(QQBouchot*,QString)));

m_boardsInfo->updateBoardList();
}


Expand Down
Loading

0 comments on commit d527af2

Please sign in to comment.