diff --git a/src/libtomahawk/sip/SipPlugin.h b/src/libtomahawk/sip/SipPlugin.h index 52daa67eb..73c127311 100644 --- a/src/libtomahawk/sip/SipPlugin.h +++ b/src/libtomahawk/sip/SipPlugin.h @@ -16,10 +16,11 @@ public: virtual ~SipPlugin() {} virtual bool isValid() = 0; + virtual const QString name() = 0; public slots: - virtual bool connect( bool startup = false ) = 0; - virtual void disconnect() = 0; + virtual bool connectPlugin( bool startup = false ) = 0; + virtual void disconnectPlugin() = 0; virtual void addContact( const QString &jid, const QString& msg = QString() ) = 0; virtual void sendMsg( const QString& to, const QString& msg ) = 0; diff --git a/src/libtomahawk/tomahawksettings.cpp b/src/libtomahawk/tomahawksettings.cpp index e961b4871..2fea7e2ac 100644 --- a/src/libtomahawk/tomahawksettings.cpp +++ b/src/libtomahawk/tomahawksettings.cpp @@ -402,6 +402,30 @@ TomahawkSettings::setTwitterOAuthTokenSecret( const QString& oauthtokensecret ) setValue( "twitter/oauthtokensecret", oauthtokensecret ); } +qint64 +TomahawkSettings::twitterCachedFriendsSinceId() const +{ + return value( "twitter/cachedfriendssinceid", 0 ).toLongLong(); +} + +void +TomahawkSettings::setTwitterCachedFriendsSinceId( qint64 cachedId ) +{ + setValue( "twitter/cachedfriendssinceid", cachedId ); +} + +qint64 +TomahawkSettings::twitterCachedMentionsSinceId() const +{ + return value( "twitter/cachedmentionssinceid", 0 ).toLongLong(); +} + +void +TomahawkSettings::setTwitterCachedMentionsSinceId( qint64 cachedId ) +{ + setValue( "twitter/cachedmentionssinceid", cachedId ); +} + bool TomahawkSettings::scrobblingEnabled() const { diff --git a/src/libtomahawk/tomahawksettings.h b/src/libtomahawk/tomahawksettings.h index 7e92afe5c..3dc1f5d52 100644 --- a/src/libtomahawk/tomahawksettings.h +++ b/src/libtomahawk/tomahawksettings.h @@ -103,6 +103,12 @@ public: QString twitterOAuthTokenSecret() const; void setTwitterOAuthTokenSecret( const QString& oauthtokensecret ); + qint64 twitterCachedFriendsSinceId() const; + void setTwitterCachedFriendsSinceId( qint64 sinceid ); + + qint64 twitterCachedMentionsSinceId() const; + void setTwitterCachedMentionsSinceId( qint64 sinceid ); + /// XMPP Component Settings QString xmppBotServer() const; void setXmppBotServer( const QString &server ); diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 9f0ae3560..2991be622 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -1,7 +1,3 @@ -#include "settingsdialog.h" -#include "ui_settingsdialog.h" -#include "ui_proxydialog.h" - #include #include #include @@ -14,14 +10,17 @@ #include #endif +#include +#include + +#include "settingsdialog.h" +#include "ui_settingsdialog.h" +#include "ui_proxydialog.h" #include "tomahawk/tomahawkapp.h" #include "musicscanner.h" #include "tomahawksettings.h" #include "sip/SipHandler.h" #include "sip/twitter/tomahawkoauthtwitter.h" -#include -#include - static QString md5( const QByteArray& src ) @@ -156,8 +155,8 @@ SettingsDialog::~SettingsDialog() if( rejabber ) { - APP->sipHandler()->disconnect(); - APP->sipHandler()->connect(); + APP->sipHandler()->disconnectPlugins(); + APP->sipHandler()->connectPlugins(); } } else @@ -303,6 +302,7 @@ SettingsDialog::authenticateTwitter() ui->twitterStatusLabel->setText("Status: Credentials saved"); ui->twitterAuthenticateButton->setText( "Re-authenticate" ); ui->twitterInstructionsBox->setVisible( true ); + TomahawkApp::instance()->sipHandler()->connectPlugins( false, "SIPTWITTER" ); } else { diff --git a/src/sip/SipHandler.cpp b/src/sip/SipHandler.cpp index 9e72cb2e6..51b118bc2 100644 --- a/src/sip/SipHandler.cpp +++ b/src/sip/SipHandler.cpp @@ -114,30 +114,39 @@ SipHandler::loadPlugin( QObject* plugin ) void -SipHandler::connect( bool startup ) +SipHandler::connectPlugins( bool startup, const QString &pluginName ) { foreach( SipPlugin* sip, m_plugins ) - sip->connect( startup ); + { + if ( pluginName.isEmpty() || ( !pluginName.isEmpty() && sip->name() == pluginName ) ) + sip->connectPlugin( startup ); + } m_connected = true; } void -SipHandler::disconnect() +SipHandler::disconnectPlugins( const QString &pluginName ) { foreach( SipPlugin* sip, m_plugins ) - sip->disconnect(); - SourceList::instance()->removeAllRemote(); - m_connected = false; + { + if ( pluginName.isEmpty() || ( !pluginName.isEmpty() && sip->name() == pluginName ) ) + sip->disconnectPlugin(); + } + if( pluginName.isEmpty() ) + { + SourceList::instance()->removeAllRemote(); + m_connected = false; + } } void SipHandler::toggleConnect() { if( m_connected ) - disconnect(); + disconnectPlugins(); else - connect(); + connectPlugins(); } diff --git a/src/sip/SipHandler.h b/src/sip/SipHandler.h index 1ae2b6592..775fc653b 100644 --- a/src/sip/SipHandler.h +++ b/src/sip/SipHandler.h @@ -19,8 +19,8 @@ public: public slots: void addContact( const QString& id ) { qDebug() << Q_FUNC_INFO << id; } - void connect( bool startup = false ); - void disconnect(); + void connectPlugins( bool startup = false, const QString &pluginName = QString() ); + void disconnectPlugins( const QString &pluginName = QString() ); void toggleConnect(); signals: diff --git a/src/sip/jabber/jabber.cpp b/src/sip/jabber/jabber.cpp index 112caf64d..1df70718c 100644 --- a/src/sip/jabber/jabber.cpp +++ b/src/sip/jabber/jabber.cpp @@ -12,9 +12,14 @@ JabberPlugin::setProxy( QNetworkProxy* proxy ) p->setProxy( proxy ); } +const QString +JabberPlugin::name() +{ + return QString( MYNAME ); +} bool -JabberPlugin::connect( bool startup ) +JabberPlugin::connectPlugin( bool startup ) { qDebug() << "JabberPlugin::connect"; if ( startup && !TomahawkSettings::instance()->jabberAutoConnect() ) diff --git a/src/sip/jabber/jabber.h b/src/sip/jabber/jabber.h index 19cc5d1de..c2a80ce61 100644 --- a/src/sip/jabber/jabber.h +++ b/src/sip/jabber/jabber.h @@ -6,6 +6,8 @@ #include "../sipdllmacro.h" +#define MYNAME "SIPJABBER" + class SIPDLLEXPORT JabberPlugin : public SipPlugin { Q_OBJECT @@ -20,13 +22,14 @@ public: //FIXME: Make this more correct virtual bool isValid() { return true; } + virtual const QString name(); void setProxy( QNetworkProxy* proxy ); public slots: - virtual bool connect( bool startup ); + virtual bool connectPlugin( bool startup ); - void disconnect() + void disconnectPlugin() { QMetaObject::invokeMethod( p, "disconnect", diff --git a/src/sip/twitter/twitter.cpp b/src/sip/twitter/twitter.cpp index 99d3d4e4b..4b8fe687d 100644 --- a/src/sip/twitter/twitter.cpp +++ b/src/sip/twitter/twitter.cpp @@ -1,28 +1,46 @@ #include "twitter.h" -#include +#include +#include #include #include +#include +#include -#include #include +#include + TwitterPlugin::TwitterPlugin() - : m_twitterAuth( 0 ) - , m_isAuthed( false ) + : SipPlugin() + , m_isValid( false ) + , m_checkTimer( this ) { + m_checkTimer.setInterval( 60000 ); + m_checkTimer.setSingleShot( false ); + QObject::connect( &m_checkTimer, SIGNAL( timeout() ), SLOT( checkTimerFired() ) ); + m_checkTimer.start(); } bool TwitterPlugin::isValid() { - return m_isAuthed; + return m_isValid; +} + +const QString +TwitterPlugin::name() +{ + qDebug() << "TwitterPlugin returning plugin name " << QString( MYNAME ); + return QString( MYNAME ); } bool -TwitterPlugin::connect( bool /*startup*/ ) -{ +TwitterPlugin::connectPlugin( bool /*startup*/ ) +{ + qDebug() << "TwitterPlugin connectPlugin called"; + TomahawkSettings *settings = TomahawkSettings::instance(); if ( settings->twitterOAuthToken().isEmpty() || settings->twitterOAuthTokenSecret().isEmpty() ) @@ -31,13 +49,13 @@ TwitterPlugin::connect( bool /*startup*/ ) return false; } - delete m_twitterAuth; - m_twitterAuth = new TomahawkOAuthTwitter( this ); - m_twitterAuth->setNetworkAccessManager( TomahawkUtils::nam() ); - m_twitterAuth->setOAuthToken( settings->twitterOAuthToken().toLatin1() ); - m_twitterAuth->setOAuthTokenSecret( settings->twitterOAuthTokenSecret().toLatin1() ); + delete m_twitterAuth.data(); + m_twitterAuth = QWeakPointer( new TomahawkOAuthTwitter( this ) ); + m_twitterAuth.data()->setNetworkAccessManager( TomahawkUtils::nam() ); + m_twitterAuth.data()->setOAuthToken( settings->twitterOAuthToken().toLatin1() ); + m_twitterAuth.data()->setOAuthTokenSecret( settings->twitterOAuthTokenSecret().toLatin1() ); - QTweetAccountVerifyCredentials *credVerifier = new QTweetAccountVerifyCredentials( m_twitterAuth, this ); + QTweetAccountVerifyCredentials *credVerifier = new QTweetAccountVerifyCredentials( m_twitterAuth.data(), this ); QObject::connect( credVerifier, SIGNAL( parsedUser(const QTweetUser &) ), SLOT( connectAuthVerifyReply(const QTweetUser &) ) ); credVerifier->verify(); /* @@ -48,18 +66,66 @@ TwitterPlugin::connect( bool /*startup*/ ) return true; } +void +TwitterPlugin::disconnectPlugin() +{ + if( !m_friendsTimeline.isNull() ) + m_friendsTimeline.data()->deleteLater(); + if( !m_twitterAuth.isNull() ) + m_twitterAuth.data()->deleteLater(); +} + void TwitterPlugin::connectAuthVerifyReply( const QTweetUser &user ) { if ( user.id() == 0 ) { qDebug() << "Could not authenticate to Twitter"; - m_isAuthed = false; + m_isValid = false; } else { - qDebug() << "Successfully authenticated to Twitter as user " << user.screenName(); - m_isAuthed = true; + qDebug() << "TwitterPlugin successfully authenticated to Twitter as user " << user.screenName(); + m_isValid = true; + if ( !m_twitterAuth.isNull() ) + { + m_friendsTimeline = QWeakPointer( new QTweetFriendsTimeline( m_twitterAuth.data(), this ) ); + QObject::connect( m_friendsTimeline.data(), SIGNAL( parsedStatuses(const QList< QTweetStatus > &) ), SLOT( friendsTimelineStatuses(const QList &) ) ); + QMetaObject::invokeMethod( this, "checkTimerFired", Qt::DirectConnection ); + } + else + { + qDebug() << "Twitter auth pointer was null!"; + m_isValid = false; + } + } +} + +void +TwitterPlugin::checkTimerFired() +{ + if ( isValid() ) + { + qint64 cachedfriendssinceid = TomahawkSettings::instance()->twitterCachedFriendsSinceId(); + if ( !m_friendsTimeline.isNull() ) + m_friendsTimeline.data()->fetch( cachedfriendssinceid, 0, 800 ); + } +} + +void +TwitterPlugin::friendsTimelineStatuses( const QList< QTweetStatus >& statuses ) +{ + QRegExp regex( QString( "^(@[a-zA-Z0-9]+ )?Got Tomahawk\\?(.*)$" ) ); + foreach( QTweetStatus status, statuses ) + { + QString statusText = status.text(); + qDebug() << "Performing matching on status text " << statusText; + if ( regex.exactMatch( statusText ) ) + { + qDebug() << "Found an exact matching Tweet from user " << status.user().screenName(); + } + else + qDebug() << "No match, matched length is " << regex.matchedLength(); } } diff --git a/src/sip/twitter/twitter.h b/src/sip/twitter/twitter.h index fd64c1e94..96d7a855d 100644 --- a/src/sip/twitter/twitter.h +++ b/src/sip/twitter/twitter.h @@ -1,31 +1,36 @@ -#ifndef ZEROCONF_H -#define ZEROCONF_H +#ifndef TWITTER_H +#define TWITTER_H + +#include +#include -#include "sip/SipPlugin.h" -#include "tomahawkoauthtwitter.h" #include #include +#include #include "../sipdllmacro.h" +#include "sip/SipPlugin.h" +#include "tomahawkoauthtwitter.h" + +#define MYNAME "SIPTWITTER" class SIPDLLEXPORT TwitterPlugin : public SipPlugin { Q_OBJECT Q_INTERFACES( SipPlugin ) - + public: TwitterPlugin(); virtual ~TwitterPlugin() {} virtual bool isValid(); + virtual const QString name(); public slots: - virtual bool connect( bool startup ); + virtual bool connectPlugin( bool startup ); - void disconnect() - { - } + void disconnectPlugin(); void sendMsg( const QString& to, const QString& msg ) { @@ -42,11 +47,14 @@ public slots: private slots: void lanHostFound( const QString& host, int port, const QString& name, const QString& nodeid ); void connectAuthVerifyReply( const QTweetUser &user ); - void connectAuthVerifyError( QTweetNetBase::ErrorCode errorCode, const QString& errorMsg ); + void checkTimerFired(); + void friendsTimelineStatuses( const QList< QTweetStatus > &statuses ); private: - TomahawkOAuthTwitter *m_twitterAuth; - bool m_isAuthed; + QWeakPointer m_twitterAuth; + bool m_isValid; + QTimer m_checkTimer; + QWeakPointer m_friendsTimeline; }; #endif diff --git a/src/sip/zeroconf/zeroconf.cpp b/src/sip/zeroconf/zeroconf.cpp index 702c7983b..c4b692214 100644 --- a/src/sip/zeroconf/zeroconf.cpp +++ b/src/sip/zeroconf/zeroconf.cpp @@ -2,9 +2,14 @@ #include +const QString +ZeroconfPlugin::name() +{ + return QString( MYNAME ); +} bool -ZeroconfPlugin::connect( bool /*startup*/ ) +ZeroconfPlugin::connectPlugin( bool /*startup*/ ) { delete m_zeroconf; m_zeroconf = new TomahawkZeroconf( Servent::instance()->port(), this ); diff --git a/src/sip/zeroconf/zeroconf.h b/src/sip/zeroconf/zeroconf.h index 233160589..164a1c545 100644 --- a/src/sip/zeroconf/zeroconf.h +++ b/src/sip/zeroconf/zeroconf.h @@ -6,6 +6,8 @@ #include "../sipdllmacro.h" +#define MYNAME "SIPZEROCONF" + class SIPDLLEXPORT ZeroconfPlugin : public SipPlugin { Q_OBJECT @@ -19,11 +21,12 @@ public: virtual ~ZeroconfPlugin() {} virtual bool isValid() { return true; } + virtual const QString name(); public slots: - virtual bool connect( bool startup ); + virtual bool connectPlugin( bool startup ); - void disconnect() + void disconnectPlugin() { } diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index f6b01fa19..99d7ea296 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -422,7 +422,7 @@ TomahawkApp::setupSIP() { m_xmppBot = new XMPPBot( this ); qDebug() << "Connecting SIP classes"; - m_sipHandler->connect( true ); + m_sipHandler->connectPlugins( true ); // m_sipHandler->setProxy( *TomahawkUtils::proxy() ); } }