1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-05 05:37:29 +02:00

More twitter changeover to accounts work, mostly on sip -- does not

compile, does not work yet
This commit is contained in:
Jeff Mitchell
2011-10-04 19:34:44 -04:00
parent 60aec5ac0f
commit c3064d8249
11 changed files with 186 additions and 716 deletions

View File

@@ -20,6 +20,8 @@
#include "twitterconfigwidget.h" #include "twitterconfigwidget.h"
#include "sip/SipPlugin.h"
#include <QtCore/QtPlugin> #include <QtCore/QtPlugin>
namespace Tomahawk namespace Tomahawk
@@ -68,6 +70,18 @@ TwitterAccount::configDialogAuthedSignalSlot( bool authed )
} }
SipPlugin*
TwitterAccount::sipPlugin()
{
if ( m_twitterSipPlugin.isNull() )
{
m_twitterSipPlugin = QWeakPointer< TwitterSipPlugin >( new TwitterSipPlugin( this ) );
return m_twitterSipPlugin.data();
}
return m_twitterSipPlugin.data();
}
} }
} }

View File

@@ -24,6 +24,7 @@
#include "twitterconfigwidget.h" #include "twitterconfigwidget.h"
#include "tomahawkoauthtwitter.h" #include "tomahawkoauthtwitter.h"
#include "sip/twitter/twittersip.h"
#include "accounts/account.h" #include "accounts/account.h"
#define MYNAME "ACCOUNTTWITTER" #define MYNAME "ACCOUNTTWITTER"
@@ -64,7 +65,7 @@ public:
bool isAuthenticated() { return m_isAuthenticated; } bool isAuthenticated() { return m_isAuthenticated; }
Tomahawk::InfoSystem::InfoPlugin* infoPlugin() { return 0; } Tomahawk::InfoSystem::InfoPlugin* infoPlugin() { return 0; }
SipPlugin* sipPlugin() { return 0; } SipPlugin* sipPlugin();
QWidget* configurationWidget() { return m_configWidget.data(); } QWidget* configurationWidget() { return m_configWidget.data(); }
QWidget* aclWidget() { return 0; } QWidget* aclWidget() { return 0; }
@@ -75,6 +76,7 @@ private slots:
private: private:
bool m_isAuthenticated; bool m_isAuthenticated;
QWeakPointer< TwitterConfigWidget > m_configWidget; QWeakPointer< TwitterConfigWidget > m_configWidget;
QWeakPointer< TwitterSipPlugin > m_twitterSipPlugin;
// for settings access // for settings access
friend class TwitterConfigWidget; friend class TwitterConfigWidget;

View File

@@ -27,13 +27,18 @@
#include "typedefs.h" #include "typedefs.h"
#include "dllmacro.h" #include "dllmacro.h"
#include "infosystem/infosystem.h"
#include "sip/SipPlugin.h"
#include "tomahawksettings.h" #include "tomahawksettings.h"
class SipPlugin;
namespace Tomahawk namespace Tomahawk
{ {
namespace InfoSystem
{
class InfoPlugin;
}
namespace Accounts namespace Accounts
{ {
@@ -52,12 +57,14 @@ class DLLEXPORT Account : public QObject
public: public:
explicit Account( const QString &accountId ) explicit Account( const QString &accountId )
: QObject() : QObject()
, m_enabled( false )
, m_autoConnect( false ) , m_autoConnect( false )
, m_accountId( accountId ) {} , m_accountId( accountId ) {}
virtual ~Account() {} virtual ~Account() {}
virtual QString accountServiceName() const { return m_accountServiceName; } // e.g. "Twitter", "Last.fm" virtual QString accountServiceName() const { return m_accountServiceName; } // e.g. "Twitter", "Last.fm"
virtual QString accountFriendlyName() const { return m_accountFriendlyName; } // e.g. screen name on the service, JID, etc. virtual QString accountFriendlyName() const { return m_accountFriendlyName; } // e.g. screen name on the service, JID, etc.
virtual bool enabled() const { return m_enabled; }
virtual bool autoConnect() const { return m_autoConnect; } virtual bool autoConnect() const { return m_autoConnect; }
virtual QString accountId() const { return m_accountId; } virtual QString accountId() const { return m_accountId; }
@@ -90,12 +97,9 @@ public:
return set; return set;
} }
signals:
void configurationChanged();
protected:
virtual void setAccountServiceName( const QString &serviceName ) { m_accountServiceName = serviceName; } virtual void setAccountServiceName( const QString &serviceName ) { m_accountServiceName = serviceName; }
virtual void setAccountFriendlyName( const QString &friendlyName ) { m_accountFriendlyName = friendlyName; } virtual void setAccountFriendlyName( const QString &friendlyName ) { m_accountFriendlyName = friendlyName; }
virtual void setEnabled( bool enabled ) { m_enabled = enabled; }
virtual void setAutoConnect( bool autoConnect ) { m_autoConnect = autoConnect; } virtual void setAutoConnect( bool autoConnect ) { m_autoConnect = autoConnect; }
virtual void setAccountId( const QString &accountId ) { m_accountId = accountId; } virtual void setAccountId( const QString &accountId ) { m_accountId = accountId; }
virtual void setCredentials( const QVariantHash &credentialHash ) { m_credentials = credentialHash; } virtual void setCredentials( const QVariantHash &credentialHash ) { m_credentials = credentialHash; }
@@ -128,6 +132,7 @@ protected:
TomahawkSettings* s = TomahawkSettings::instance(); TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( "accounts/" + m_accountId ); s->beginGroup( "accounts/" + m_accountId );
m_accountFriendlyName = s->value( "accountFriendlyName", QString() ).toString(); m_accountFriendlyName = s->value( "accountFriendlyName", QString() ).toString();
m_enabled = s->value( "enabled", false ).toBool();
m_autoConnect = s->value( "autoConnect", false ).toBool(); m_autoConnect = s->value( "autoConnect", false ).toBool();
m_credentials = s->value( "credentials", QVariantHash() ).toHash(); m_credentials = s->value( "credentials", QVariantHash() ).toHash();
m_configuration = s->value( "configuration", QVariantHash() ).toHash(); m_configuration = s->value( "configuration", QVariantHash() ).toHash();
@@ -142,6 +147,7 @@ protected:
TomahawkSettings* s = TomahawkSettings::instance(); TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( "accounts/" + m_accountId ); s->beginGroup( "accounts/" + m_accountId );
s->setValue( "accountFriendlyName", m_accountFriendlyName ); s->setValue( "accountFriendlyName", m_accountFriendlyName );
s->setValue( "enabled", m_enabled );
s->setValue( "autoConnect", m_autoConnect ); s->setValue( "autoConnect", m_autoConnect );
s->setValue( "credentials", m_credentials ); s->setValue( "credentials", m_credentials );
s->setValue( "configuration", m_configuration ); s->setValue( "configuration", m_configuration );
@@ -155,12 +161,17 @@ protected:
QString m_accountServiceName; QString m_accountServiceName;
QString m_accountFriendlyName; QString m_accountFriendlyName;
bool m_enabled;
bool m_autoConnect; bool m_autoConnect;
QString m_accountId; QString m_accountId;
QVariantHash m_credentials; QVariantHash m_credentials;
QVariantHash m_configuration; QVariantHash m_configuration;
QVariantMap m_acl; QVariantMap m_acl;
QStringList m_types; QStringList m_types;
signals:
void configurationChanged();
}; };
class DLLEXPORT AccountFactory : public QObject class DLLEXPORT AccountFactory : public QObject

View File

@@ -32,6 +32,7 @@
#include "sourcelist.h" #include "sourcelist.h"
#include "tomahawksettings.h" #include "tomahawksettings.h"
#include "utils/logger.h" #include "utils/logger.h"
#include "accounts/accountmanager.h"
#include "config.h" #include "config.h"
@@ -54,8 +55,6 @@ SipHandler::SipHandler( QObject* parent )
{ {
s_instance = this; s_instance = this;
loadPluginFactories( findPluginFactories() );
connect( TomahawkSettings::instance(), SIGNAL( changed() ), SLOT( onSettingsChanged() ) ); connect( TomahawkSettings::instance(), SIGNAL( changed() ), SLOT( onSettingsChanged() ) );
} }
@@ -87,13 +86,13 @@ SipHandler::avatar( const QString& name ) const
const SipInfo const SipInfo
SipHandler::sipInfo(const QString& peerId) const SipHandler::sipInfo( const QString& peerId ) const
{ {
return m_peersSipInfos.value( peerId ); return m_peersSipInfos.value( peerId );
} }
const QString const QString
SipHandler::versionString(const QString& peerId) const SipHandler::versionString( const QString& peerId ) const
{ {
return m_peersSoftwareVersions.value( peerId ); return m_peersSoftwareVersions.value( peerId );
} }
@@ -106,103 +105,6 @@ SipHandler::onSettingsChanged()
} }
QStringList
SipHandler::findPluginFactories()
{
QStringList paths;
QList< QDir > pluginDirs;
QDir appDir( qApp->applicationDirPath() );
#ifdef Q_WS_MAC
if ( appDir.dirName() == "MacOS" )
{
// Development convenience-hack
appDir.cdUp();
appDir.cdUp();
appDir.cdUp();
}
#endif
QDir libDir( CMAKE_INSTALL_PREFIX "/lib" );
QDir lib64Dir( appDir );
lib64Dir.cdUp();
lib64Dir.cd( "lib64" );
pluginDirs << appDir << libDir << lib64Dir << QDir( qApp->applicationDirPath() );
foreach ( const QDir& pluginDir, pluginDirs )
{
qDebug() << "Checking directory for plugins:" << pluginDir;
foreach ( QString fileName, pluginDir.entryList( QStringList() << "*tomahawk_sip*.so" << "*tomahawk_sip*.dylib" << "*tomahawk_sip*.dll", QDir::Files ) )
{
if ( fileName.startsWith( "libtomahawk_sip" ) )
{
const QString path = pluginDir.absoluteFilePath( fileName );
if ( !paths.contains( path ) )
paths << path;
}
}
}
return paths;
}
void
SipHandler::loadPluginFactories( const QStringList& paths )
{
foreach ( QString fileName, paths )
{
if ( !QLibrary::isLibrary( fileName ) )
continue;
qDebug() << "Trying to load plugin:" << fileName;
loadPluginFactory( fileName );
}
}
SipPlugin*
SipHandler::createPlugin( const QString& factoryId )
{
Q_ASSERT( m_pluginFactories.contains( factoryId ) );
SipPlugin* sip = m_pluginFactories[ factoryId ]->createPlugin();
hookUpPlugin( sip );
emit pluginAdded( sip );
return sip;
}
SipPlugin*
SipHandler::loadPlugin( const QString& pluginId )
{
QString factoryName = factoryFromId( pluginId );
Q_ASSERT( m_pluginFactories.contains( factoryName ) );
SipPlugin* sip = m_pluginFactories[ factoryName ]->createPlugin( pluginId );
// caller responsible for calling pluginAdded() and hookupPlugin
return sip;
}
void
SipHandler::removePlugin( SipPlugin* p )
{
p->disconnectPlugin();
m_allPlugins.removeAll( p );
m_enabledPlugins.removeAll( p );
TomahawkSettings::instance()->removeSipPlugin( p->pluginId() );
emit pluginRemoved( p );
}
void void
SipHandler::hookUpPlugin( SipPlugin* sip ) SipHandler::hookUpPlugin( SipPlugin* sip )
{ {
@@ -217,28 +119,8 @@ SipHandler::hookUpPlugin( SipPlugin* sip )
QObject::connect( sip, SIGNAL( avatarReceived( QString, QPixmap ) ), SLOT( onAvatarReceived( QString, QPixmap ) ) ); QObject::connect( sip, SIGNAL( avatarReceived( QString, QPixmap ) ), SLOT( onAvatarReceived( QString, QPixmap ) ) );
QObject::connect( sip, SIGNAL( avatarReceived( QPixmap ) ), SLOT( onAvatarReceived( QPixmap ) ) ); QObject::connect( sip, SIGNAL( avatarReceived( QPixmap ) ), SLOT( onAvatarReceived( QPixmap ) ) );
}
QObject::connect( sip->account(), SIGNAL( configurationChanged() ), sip, SLOT( configurationChanged() ) );
void
SipHandler::loadPluginFactory( const QString& path )
{
QPluginLoader loader( path );
QObject* plugin = loader.instance();
if ( !plugin )
{
qDebug() << "Error loading plugin:" << loader.errorString();
}
SipPluginFactory* sipfactory = qobject_cast<SipPluginFactory*>(plugin);
if ( sipfactory )
{
qDebug() << "Loaded plugin factory:" << loader.fileName() << sipfactory->factoryId() << sipfactory->prettyName();
m_pluginFactories[ sipfactory->factoryId() ] = sipfactory;
} else
{
qDebug() << "Loaded invalid plugin.." << loader.fileName();
}
} }
@@ -266,16 +148,12 @@ SipHandler::checkSettings()
void void
SipHandler::addSipPlugin( SipPlugin* p, bool enabled ) SipHandler::addSipPlugin( SipPlugin* p )
{ {
m_allPlugins << p; m_allPlugins << p;
hookUpPlugin( p ); hookUpPlugin( p );
if ( enabled )
{
p->connectPlugin(); p->connectPlugin();
m_enabledPlugins << p;
}
emit pluginAdded( p ); emit pluginAdded( p );
} }
@@ -285,41 +163,21 @@ void
SipHandler::removeSipPlugin( SipPlugin* p ) SipHandler::removeSipPlugin( SipPlugin* p )
{ {
p->disconnectPlugin(); p->disconnectPlugin();
p->deletePlugin();
emit pluginRemoved( p ); emit pluginRemoved( p );
// emit first so sipmodel can find the indexOf
TomahawkSettings::instance()->removeSipPlugin( p->pluginId() );
m_allPlugins.removeAll( p ); m_allPlugins.removeAll( p );
m_enabledPlugins.removeAll( p );
}
bool
SipHandler::hasPluginType( const QString& factoryId ) const
{
foreach( SipPlugin* p, m_allPlugins ) {
if( factoryFromId( p->pluginId() ) == factoryId )
return true;
}
return false;
} }
void void
SipHandler::loadFromConfig() SipHandler::loadFromAccountManager()
{ {
QStringList pluginIds = TomahawkSettings::instance()->sipPlugins(); QList< Tomahawk::Accounts::Account* > accountList = Tomahawk::Accounts::AccountManager::instance()->getAccounts( Tomahawk::Accounts::SipType );
QStringList enabled = TomahawkSettings::instance()->enabledSipPlugins(); foreach( const Tomahawk::Accounts::Account* account, accountList )
foreach( const QString& pluginId, pluginIds )
{ {
QString pluginFactory = factoryFromId( pluginId ); SipPlugin* p = account->sipPlugin();
if( m_pluginFactories.contains( pluginFactory ) ) addSipPlugin( p );
{
SipPlugin* p = loadPlugin( pluginId );
addSipPlugin( p, enabled.contains( pluginId ) );
}
} }
m_connected = true; m_connected = true;
} }
@@ -328,7 +186,7 @@ SipHandler::loadFromConfig()
void void
SipHandler::connectAll() SipHandler::connectAll()
{ {
foreach( SipPlugin* sip, m_enabledPlugins ) foreach( SipPlugin* sip, m_allPlugins )
{ {
sip->connectPlugin(); sip->connectPlugin();
} }
@@ -347,29 +205,6 @@ SipHandler::disconnectAll()
} }
void
SipHandler::disablePlugin( SipPlugin* p )
{
Q_ASSERT( m_enabledPlugins.contains( p ) );
TomahawkSettings::instance()->disableSipPlugin( p->pluginId() );
p->disconnectPlugin();
m_enabledPlugins.removeAll( p );
}
void
SipHandler::enablePlugin( SipPlugin* p )
{
Q_ASSERT( !m_enabledPlugins.contains( p ) );
p->connectPlugin();
TomahawkSettings::instance()->enableSipPlugin( p->pluginId() );
m_enabledPlugins << p;
}
void void
SipHandler::connectPlugin( const QString &pluginId ) SipHandler::connectPlugin( const QString &pluginId )
{ {
@@ -392,7 +227,7 @@ SipHandler::connectPlugin( const QString &pluginId )
{ {
if ( sip->pluginId() == pluginId ) if ( sip->pluginId() == pluginId )
{ {
Q_ASSERT( m_enabledPlugins.contains( sip ) ); // make sure the plugin we're connecting is enabled. should always be the case Q_ASSERT( m_allPlugins.contains( sip ) ); // make sure the plugin we're connecting is enabled. should always be the case
//each sip should refreshProxy() or take care of that function in some other way during connection //each sip should refreshProxy() or take care of that function in some other way during connection
sip->connectPlugin(); sip->connectPlugin();
} }
@@ -418,13 +253,6 @@ SipHandler::allPlugins() const
} }
QList< SipPlugin* >
SipHandler::enabledPlugins() const
{
return m_enabledPlugins;
}
QList< SipPlugin* > QList< SipPlugin* >
SipHandler::connectedPlugins() const SipHandler::connectedPlugins() const
{ {
@@ -432,13 +260,6 @@ SipHandler::connectedPlugins() const
} }
QList< SipPluginFactory* >
SipHandler::pluginFactories() const
{
return m_pluginFactories.values();
}
void void
SipHandler::toggleConnect() SipHandler::toggleConnect()
{ {
@@ -644,18 +465,3 @@ SipHandler::onAvatarReceived( const QPixmap& avatar )
// qDebug() << Q_FUNC_INFO << "Set own avatar on MyCollection"; // qDebug() << Q_FUNC_INFO << "Set own avatar on MyCollection";
SourceList::instance()->getLocal()->setAvatar( avatar ); SourceList::instance()->getLocal()->setAvatar( avatar );
} }
QString
SipHandler::factoryFromId( const QString& pluginId ) const
{
return pluginId.split( "_" ).first();
}
SipPluginFactory*
SipHandler::factoryFromPlugin( SipPlugin* p ) const
{
QString factoryId = factoryFromId( p->pluginId() );
return m_pluginFactories.value( factoryId, 0 );
}

View File

@@ -39,9 +39,8 @@ public:
QList< SipPluginFactory* > pluginFactories() const; QList< SipPluginFactory* > pluginFactories() const;
QList< SipPlugin* > allPlugins() const; QList< SipPlugin* > allPlugins() const;
QList< SipPlugin* > enabledPlugins() const;
QList< SipPlugin* > connectedPlugins() const; QList< SipPlugin* > connectedPlugins() const;
void loadFromConfig(); void loadFromAccountManager();
void addSipPlugin( SipPlugin* p, bool enable = true ); void addSipPlugin( SipPlugin* p, bool enable = true );
void removeSipPlugin( SipPlugin* p ); void removeSipPlugin( SipPlugin* p );

View File

@@ -19,24 +19,15 @@
#include "sip/SipPlugin.h" #include "sip/SipPlugin.h"
#include <QUuid>
#include "utils/logger.h" #include "utils/logger.h"
QString
SipPluginFactory::generateId()
{
QString uniq = QUuid::createUuid().toString().mid( 1, 8 );
return factoryId() + "_" + uniq;
}
SipPlugin::SipPlugin() : QObject() {} SipPlugin::SipPlugin() : QObject() {}
SipPlugin::~SipPlugin() {} SipPlugin::~SipPlugin() {}
SipPlugin::SipPlugin( const QString& pluginId, QObject* parent ) SipPlugin::SipPlugin( Tomahawk::Accounts::Account *account, QObject* parent )
: QObject( parent ) : QObject( parent )
, m_pluginId( pluginId ) , m_account( account )
{ {
connect( this, SIGNAL( error( int, QString ) ), this, SLOT( onError( int,QString ) ) ); connect( this, SIGNAL( error( int, QString ) ), this, SLOT( onError( int,QString ) ) );
connect( this, SIGNAL( stateChanged( SipPlugin::ConnectionState ) ), this, SLOT( onStateChange( SipPlugin::ConnectionState ) ) ); connect( this, SIGNAL( stateChanged( SipPlugin::ConnectionState ) ), this, SLOT( onStateChange( SipPlugin::ConnectionState ) ) );
@@ -48,7 +39,21 @@ SipPlugin::SipPlugin( const QString& pluginId, QObject* parent )
QString QString
SipPlugin::pluginId() const SipPlugin::pluginId() const
{ {
return m_pluginId; return m_account->accountId();
}
const QString
SipPlugin::friendlyName() const
{
return m_account->accountFriendlyName();
}
const QString
SipPlugin::serviceName() const
{
return m_account->accountServiceName();
} }
@@ -59,10 +64,10 @@ SipPlugin::menu()
} }
QWidget* Tomahawk::Accounts::Account*
SipPlugin::configWidget() SipPlugin::account() const
{ {
return 0; return m_account;
} }
@@ -76,7 +81,7 @@ SipPlugin::errorMessage() const
QIcon QIcon
SipPlugin::icon() const SipPlugin::icon() const
{ {
return QIcon(); return m_account->icon();
} }

View File

@@ -27,31 +27,12 @@
#include <QMenu> #include <QMenu>
#include <QNetworkProxy> #include <QNetworkProxy>
#include "accounts/account.h"
#include "dllmacro.h" #include "dllmacro.h"
class SipPlugin; class SipPlugin;
class DLLEXPORT SipPluginFactory : public QObject
{
Q_OBJECT
public:
SipPluginFactory() {}
virtual ~SipPluginFactory() {}
// display name for plugin
virtual QString prettyName() const = 0;
// internal name
virtual QString factoryId() const = 0;
// if the user can create multiple
virtual QIcon icon() const { return QIcon(); }
virtual bool isUnique() const { return false; }
virtual SipPlugin* createPlugin( const QString& pluginId = QString() ) = 0;
protected:
QString generateId();
};
class DLLEXPORT SipPlugin : public QObject class DLLEXPORT SipPlugin : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -61,23 +42,20 @@ public:
enum ConnectionState { Disconnected, Connecting, Connected, Disconnecting }; enum ConnectionState { Disconnected, Connecting, Connected, Disconnecting };
SipPlugin(); SipPlugin();
explicit SipPlugin( const QString& pluginId, QObject* parent = 0 ); explicit SipPlugin( Tomahawk::Accounts::Account *account, QObject* parent = 0 );
virtual ~SipPlugin(); virtual ~SipPlugin();
// plugin id is "pluginfactoryname_someuniqueid". get it from SipPluginFactory::generateId // plugin id is "pluginfactoryname_someuniqueid". get it from SipPluginFactory::generateId
QString pluginId() const; QString pluginId() const;
virtual bool isValid() const = 0; virtual bool isValid() const = 0;
virtual const QString name() const = 0; virtual const QString friendlyName() const;
virtual const QString friendlyName() const = 0; virtual const QString serviceName() const;
virtual const QString accountName() const = 0;
virtual ConnectionState connectionState() const = 0; virtual ConnectionState connectionState() const = 0;
virtual QString errorMessage() const; virtual QString errorMessage() const;
virtual QMenu* menu(); virtual QMenu* menu();
virtual QWidget* configWidget();
virtual void saveConfig() {} // called when the widget has been edited
virtual QIcon icon() const; virtual QIcon icon() const;
virtual Tomahawk::Accounts::Account* account() const;
// peer infos // peer infos
virtual const QStringList peersOnline() const; virtual const QStringList peersOnline() const;
@@ -85,6 +63,7 @@ public slots:
virtual bool connectPlugin() = 0; virtual bool connectPlugin() = 0;
virtual void disconnectPlugin() = 0; virtual void disconnectPlugin() = 0;
virtual void checkSettings() = 0; virtual void checkSettings() = 0;
virtual void configurationChanged() = 0;
virtual void addContact( const QString &jid, const QString& msg = QString() ) = 0; virtual void addContact( const QString &jid, const QString& msg = QString() ) = 0;
virtual void sendMsg( const QString& to, const QString& msg ) = 0; virtual void sendMsg( const QString& to, const QString& msg ) = 0;
@@ -124,11 +103,9 @@ private slots:
void onPeerOffline( const QString &peerId ); void onPeerOffline( const QString &peerId );
private: private:
QString m_pluginId; Tomahawk::Accounts::Account *m_account;
QString m_cachedError; QString m_cachedError;
QStringList m_peersOnline; QStringList m_peersOnline;
}; };
Q_DECLARE_INTERFACE( SipPluginFactory, "tomahawk.SipFactory/1.0" )
#endif #endif

View File

@@ -1,9 +1,9 @@
IF( LIBJREEN_FOUND ) #IF( LIBJREEN_FOUND )
ADD_SUBDIRECTORY( jabber ) # ADD_SUBDIRECTORY( jabber )
ENDIF( LIBJREEN_FOUND ) #ENDIF( LIBJREEN_FOUND )
IF( QTWEETLIB_FOUND ) IF( QTWEETLIB_FOUND )
ADD_SUBDIRECTORY( twitter ) ADD_SUBDIRECTORY( twitter )
ENDIF( QTWEETLIB_FOUND ) ENDIF( QTWEETLIB_FOUND )
ADD_SUBDIRECTORY( zeroconf ) #ADD_SUBDIRECTORY( zeroconf )

View File

@@ -42,21 +42,10 @@
static QString s_gotTomahawkRegex = QString( "^(@[a-zA-Z0-9]+ )?(Got Tomahawk\\?) (\\{[a-fA-F0-9\\-]+\\}) (.*)$" ); static QString s_gotTomahawkRegex = QString( "^(@[a-zA-Z0-9]+ )?(Got Tomahawk\\?) (\\{[a-fA-F0-9\\-]+\\}) (.*)$" );
TwitterSipPlugin::TwitterSipPlugin( Tomahawk::Accounts::Account* account )
SipPlugin* : SipPlugin( account )
TwitterFactory::createPlugin( const QString& pluginId ) , m_configuration( account->configuration() )
{ , m_credentials( account->credentials() )
return new TwitterPlugin( pluginId.isEmpty() ? generateId() : pluginId );
}
QIcon TwitterFactory::icon() const
{
return QIcon( ":/twitter-icon.png" );
}
TwitterPlugin::TwitterPlugin( const QString& pluginId )
: SipPlugin( pluginId )
, m_isAuthed( false ) , m_isAuthed( false )
, m_checkTimer( this ) , m_checkTimer( this )
, m_connectTimer( this ) , m_connectTimer( this )
@@ -70,10 +59,12 @@ TwitterPlugin::TwitterPlugin( const QString& pluginId )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if ( Database::instance()->dbid() != twitterSavedDbid() ) if ( Database::instance()->dbid() != m_configuration[ "savedDbid" ].toString() )
setTwitterCachedPeers( QVariantHash() ); {
m_configuration[ "cachedPeers" ] = QVariantHash();
setTwitterSavedDbid( Database::instance()->dbid() ); m_configuration[ "savedDbid" ] = Database::instance()->dbid();
syncConfig();
}
m_checkTimer.setInterval( 180000 ); m_checkTimer.setInterval( 180000 );
m_checkTimer.setSingleShot( false ); m_checkTimer.setSingleShot( false );
@@ -89,92 +80,44 @@ TwitterPlugin::TwitterPlugin( const QString& pluginId )
} }
void
TwitterPlugin::configDialogAuthedSignalSlot( bool authed )
{
if ( !authed )
{
if( m_isAuthed ) {
m_state = Disconnected;
emit stateChanged( m_state );
}
setTwitterScreenName( QString() );
setTwitterOAuthToken( QString() );
setTwitterOAuthTokenSecret( QString() );
}
m_isAuthed = authed;
}
bool bool
TwitterPlugin::isValid() const TwitterSipPlugin::isValid() const
{ {
return m_isAuthed; return m_account->enabled() && m_isAuthed;
}
const QString
TwitterPlugin::name() const
{
return QString( MYNAME );
}
const QString
TwitterPlugin::friendlyName() const
{
return tr("Twitter");
}
const QString
TwitterPlugin::accountName() const
{
if( twitterScreenName().isEmpty() )
return friendlyName();
else
return twitterScreenName();
}
QIcon
TwitterPlugin::icon() const
{
return QIcon( ":/twitter-icon.png" );
} }
SipPlugin::ConnectionState SipPlugin::ConnectionState
TwitterPlugin::connectionState() const TwitterSipPlugin::connectionState() const
{ {
return m_state; return m_state;
} }
QWidget* TwitterPlugin::configWidget()
{
return m_configWidget.data();
}
bool bool
TwitterPlugin::connectPlugin() TwitterSipPlugin::connectPlugin()
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
m_cachedPeers = twitterCachedPeers(); if ( !m_account->enabled() )
return;
m_cachedPeers = m_configuration[ "cachedPeers" ].toHash();
QStringList peerList = m_cachedPeers.keys(); QStringList peerList = m_cachedPeers.keys();
qStableSort( peerList.begin(), peerList.end() ); qStableSort( peerList.begin(), peerList.end() );
registerOffers( peerList ); registerOffers( peerList );
if ( twitterOAuthToken().isEmpty() || twitterOAuthTokenSecret().isEmpty() ) if ( m_credentials[ "oauthToken" ].toString().isEmpty() || m_credentials[ "oauthTokenSecret" ].toString().isEmpty() )
{ {
qDebug() << "TwitterPlugin has empty Twitter credentials; not connecting"; qDebug() << "TwitterSipPlugin has empty Twitter credentials; not connecting";
return m_cachedPeers.isEmpty(); return m_cachedPeers.isEmpty();
} }
if ( refreshTwitterAuth() ) if ( refreshTwitterAuth() )
{ {
QTweetAccountVerifyCredentials *credVerifier = new QTweetAccountVerifyCredentials( m_twitterAuth.data(), this ); QTweetAccountVerifyCredentials *credVerifier = new QTweetAccountVerifyCredentials( m_twitterAuth.data(), this );
connect( credVerifier, SIGNAL( parsedUser(const QTweetUser &) ), SLOT( connectAuthVerifyReply(const QTweetUser &) ) ); connect( credVerifier, SIGNAL( parsedUser( const QTweetUser & ) ), SLOT( connectAuthVerifyReply( const QTweetUser & ) ) );
credVerifier->verify(); credVerifier->verify();
m_state = Connecting; m_state = Connecting;
@@ -185,7 +128,7 @@ TwitterPlugin::connectPlugin()
} }
bool bool
TwitterPlugin::refreshTwitterAuth() TwitterSipPlugin::refreshTwitterAuth()
{ {
qDebug() << Q_FUNC_INFO << " begin"; qDebug() << Q_FUNC_INFO << " begin";
if( !m_twitterAuth.isNull() ) if( !m_twitterAuth.isNull() )
@@ -198,14 +141,14 @@ TwitterPlugin::refreshTwitterAuth()
if( m_twitterAuth.isNull() ) if( m_twitterAuth.isNull() )
return false; return false;
m_twitterAuth.data()->setOAuthToken( twitterOAuthToken().toLatin1() ); m_twitterAuth.data()->setOAuthToken( m_credentials[ "oauthToken" ].toString().toLatin1() );
m_twitterAuth.data()->setOAuthTokenSecret( twitterOAuthTokenSecret().toLatin1() ); m_twitterAuth.data()->setOAuthTokenSecret( m_credentials[ "oauthTokenSecret" ].toString().toLatin1() );
return true; return true;
} }
void void
TwitterPlugin::disconnectPlugin() TwitterSipPlugin::disconnectPlugin()
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
m_checkTimer.stop(); m_checkTimer.stop();
@@ -224,6 +167,7 @@ TwitterPlugin::disconnectPlugin()
if( !m_twitterAuth.isNull() ) if( !m_twitterAuth.isNull() )
delete m_twitterAuth.data(); delete m_twitterAuth.data();
m_configuration[ "cachedPeers" ] = m_cachedPeers;
syncConfig(); syncConfig();
m_cachedPeers.empty(); m_cachedPeers.empty();
m_state = Disconnected; m_state = Disconnected;
@@ -231,11 +175,11 @@ TwitterPlugin::disconnectPlugin()
} }
void void
TwitterPlugin::connectAuthVerifyReply( const QTweetUser &user ) TwitterSipPlugin::connectAuthVerifyReply( const QTweetUser &user )
{ {
if ( user.id() == 0 ) if ( user.id() == 0 )
{ {
qDebug() << "TwitterPlugin could not authenticate to Twitter"; qDebug() << "TwitterSipPlugin could not authenticate to Twitter";
m_isAuthed = false; m_isAuthed = false;
m_state = Disconnected; m_state = Disconnected;
m_connectTimer.stop(); m_connectTimer.stop();
@@ -245,11 +189,12 @@ TwitterPlugin::connectAuthVerifyReply( const QTweetUser &user )
} }
else else
{ {
qDebug() << "TwitterPlugin successfully authenticated to Twitter as user " << user.screenName(); qDebug() << "TwitterSipPlugin successfully authenticated to Twitter as user " << user.screenName();
m_isAuthed = true; m_isAuthed = true;
if ( !m_twitterAuth.isNull() ) if ( !m_twitterAuth.isNull() )
{ {
setTwitterScreenName( user.screenName() ); m_configuration[ "screenName" ] = user.screenName;
syncConfig();
m_friendsTimeline = QWeakPointer<QTweetFriendsTimeline>( new QTweetFriendsTimeline( m_twitterAuth.data(), this ) ); m_friendsTimeline = QWeakPointer<QTweetFriendsTimeline>( new QTweetFriendsTimeline( m_twitterAuth.data(), this ) );
m_mentions = QWeakPointer<QTweetMentions>( new QTweetMentions( m_twitterAuth.data(), this ) ); m_mentions = QWeakPointer<QTweetMentions>( new QTweetMentions( m_twitterAuth.data(), this ) );
m_directMessages = QWeakPointer<QTweetDirectMessages>( new QTweetDirectMessages( m_twitterAuth.data(), this ) ); m_directMessages = QWeakPointer<QTweetDirectMessages>( new QTweetDirectMessages( m_twitterAuth.data(), this ) );
@@ -279,7 +224,7 @@ TwitterPlugin::connectAuthVerifyReply( const QTweetUser &user )
} }
else else
{ {
qDebug() << "TwitterPlugin auth pointer was null!"; qDebug() << "TwitterSipPlugin auth pointer was null!";
m_isAuthed = false; m_isAuthed = false;
m_state = Disconnected; m_state = Disconnected;
m_connectTimer.stop(); m_connectTimer.stop();
@@ -291,30 +236,25 @@ TwitterPlugin::connectAuthVerifyReply( const QTweetUser &user )
} }
} }
void
TwitterPlugin::deletePlugin()
{
TomahawkSettings::instance()->remove( pluginId() );
}
void void
TwitterPlugin::checkTimerFired() TwitterSipPlugin::checkTimerFired()
{ {
if ( !isValid() || m_twitterAuth.isNull() ) if ( !isValid() || m_twitterAuth.isNull() )
return; return;
if ( m_cachedFriendsSinceId == 0 ) if ( m_cachedFriendsSinceId == 0 )
m_cachedFriendsSinceId = twitterCachedFriendsSinceId(); m_cachedFriendsSinceId = m_configuration[ "cachedFriendsSinceId" ].toLongLong();
qDebug() << "TwitterPlugin looking at friends timeline since id " << m_cachedFriendsSinceId; qDebug() << "TwitterSipPlugin looking at friends timeline since id " << m_cachedFriendsSinceId;
if ( !m_friendsTimeline.isNull() ) if ( !m_friendsTimeline.isNull() )
m_friendsTimeline.data()->fetch( m_cachedFriendsSinceId, 0, 800 ); m_friendsTimeline.data()->fetch( m_cachedFriendsSinceId, 0, 800 );
if ( m_cachedMentionsSinceId == 0 ) if ( m_cachedMentionsSinceId == 0 )
m_cachedMentionsSinceId = twitterCachedMentionsSinceId(); m_cachedMentionsSinceId = m_configuration[ "cachedMentionsSinceId" ].toLongLong();
qDebug() << "TwitterPlugin looking at mentions timeline since id " << m_cachedMentionsSinceId; qDebug() << "TwitterSipPlugin looking at mentions timeline since id " << m_cachedMentionsSinceId;
if ( !m_mentions.isNull() ) if ( !m_mentions.isNull() )
m_mentions.data()->fetch( m_cachedMentionsSinceId, 0, 800 ); m_mentions.data()->fetch( m_cachedMentionsSinceId, 0, 800 );
@@ -322,7 +262,7 @@ TwitterPlugin::checkTimerFired()
void void
TwitterPlugin::registerOffers( const QStringList &peerList ) TwitterSipPlugin::registerOffers( const QStringList &peerList )
{ {
foreach( QString screenName, peerList ) foreach( QString screenName, peerList )
{ {
@@ -331,6 +271,7 @@ TwitterPlugin::registerOffers( const QStringList &peerList )
if ( peerData.contains( "onod" ) && peerData["onod"] != Database::instance()->dbid() ) if ( peerData.contains( "onod" ) && peerData["onod"] != Database::instance()->dbid() )
{ {
m_cachedPeers.remove( screenName ); m_cachedPeers.remove( screenName );
m_configuration[ "cachedPeers" ] = m_cachedPeers;
syncConfig(); syncConfig();
} }
@@ -338,6 +279,7 @@ TwitterPlugin::registerOffers( const QStringList &peerList )
{ {
peerData["lastseen"] = QDateTime::currentMSecsSinceEpoch(); peerData["lastseen"] = QDateTime::currentMSecsSinceEpoch();
m_cachedPeers[screenName] = peerData; m_cachedPeers[screenName] = peerData;
m_configuration[ "cachedPeers" ] = m_cachedPeers;
syncConfig(); syncConfig();
qDebug() << Q_FUNC_INFO << " already connected"; qDebug() << Q_FUNC_INFO << " already connected";
continue; continue;
@@ -346,6 +288,7 @@ TwitterPlugin::registerOffers( const QStringList &peerList )
{ {
qDebug() << Q_FUNC_INFO << " aging peer " << screenName << " out of cache"; qDebug() << Q_FUNC_INFO << " aging peer " << screenName << " out of cache";
m_cachedPeers.remove( screenName ); m_cachedPeers.remove( screenName );
m_configuration[ "cachedPeers" ] = m_cachedPeers;
syncConfig(); syncConfig();
m_cachedAvatars.remove( screenName ); m_cachedAvatars.remove( screenName );
continue; continue;
@@ -353,7 +296,7 @@ TwitterPlugin::registerOffers( const QStringList &peerList )
if ( !peerData.contains( "host" ) || !peerData.contains( "port" ) || !peerData.contains( "pkey" ) ) if ( !peerData.contains( "host" ) || !peerData.contains( "port" ) || !peerData.contains( "pkey" ) )
{ {
qDebug() << "TwitterPlugin does not have host, port and/or pkey values for " << screenName << " (this is usually *not* a bug or problem but a normal part of the process)"; qDebug() << "TwitterSipPlugin does not have host, port and/or pkey values for " << screenName << " (this is usually *not* a bug or problem but a normal part of the process)";
continue; continue;
} }
@@ -363,7 +306,7 @@ TwitterPlugin::registerOffers( const QStringList &peerList )
void void
TwitterPlugin::connectTimerFired() TwitterSipPlugin::connectTimerFired()
{ {
qDebug() << Q_FUNC_INFO << " beginning"; qDebug() << Q_FUNC_INFO << " beginning";
if ( !isValid() || m_cachedPeers.isEmpty() || m_twitterAuth.isNull() ) if ( !isValid() || m_cachedPeers.isEmpty() || m_twitterAuth.isNull() )
@@ -378,21 +321,21 @@ TwitterPlugin::connectTimerFired()
} }
qDebug() << Q_FUNC_INFO << " continuing"; qDebug() << Q_FUNC_INFO << " continuing";
QString myScreenName = twitterScreenName(); QString myScreenName = m_configuration[ "screenName" ].toString();
QStringList peerList = m_cachedPeers.keys(); QStringList peerList = m_cachedPeers.keys();
qStableSort( peerList.begin(), peerList.end() ); qStableSort( peerList.begin(), peerList.end() );
registerOffers( peerList ); registerOffers( peerList );
} }
void void
TwitterPlugin::parseGotTomahawk( const QRegExp &regex, const QString &screenName, const QString &text ) TwitterSipPlugin::parseGotTomahawk( const QRegExp &regex, const QString &screenName, const QString &text )
{ {
QString myScreenName = twitterScreenName(); QString myScreenName = m_configuration[ "screenName" ].toString();
qDebug() << "TwitterPlugin found an exact matching Got Tomahawk? mention or direct message from user " << screenName << ", now parsing"; qDebug() << "TwitterSipPlugin found an exact matching Got Tomahawk? mention or direct message from user " << screenName << ", now parsing";
regex.exactMatch( text ); regex.exactMatch( text );
if ( text.startsWith( '@' ) && regex.captureCount() >= 2 && regex.cap( 1 ) != QString( '@' + myScreenName ) ) if ( text.startsWith( '@' ) && regex.captureCount() >= 2 && regex.cap( 1 ) != QString( '@' + myScreenName ) )
{ {
qDebug() << "TwitterPlugin skipping mention because it's directed @someone that isn't us"; qDebug() << "TwitterSipPlugin skipping mention because it's directed @someone that isn't us";
return; return;
} }
@@ -408,11 +351,11 @@ TwitterPlugin::parseGotTomahawk( const QRegExp &regex, const QString &screenName
} }
if ( node.isEmpty() ) if ( node.isEmpty() )
{ {
qDebug() << "TwitterPlugin could not parse node out of the tweet"; qDebug() << "TwitterSipPlugin could not parse node out of the tweet";
return; return;
} }
else else
qDebug() << "TwitterPlugin parsed node " << node << " out of the tweet"; qDebug() << "TwitterSipPlugin parsed node " << node << " out of the tweet";
if ( node == Database::instance()->dbid() ) if ( node == Database::instance()->dbid() )
{ {
@@ -434,7 +377,7 @@ TwitterPlugin::parseGotTomahawk( const QRegExp &regex, const QString &screenName
} }
void void
TwitterPlugin::friendsTimelineStatuses( const QList< QTweetStatus > &statuses ) TwitterSipPlugin::friendsTimelineStatuses( const QList< QTweetStatus > &statuses )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
QRegExp regex( s_gotTomahawkRegex, Qt::CaseSensitive, QRegExp::RegExp2 ); QRegExp regex( s_gotTomahawkRegex, Qt::CaseSensitive, QRegExp::RegExp2 );
@@ -459,15 +402,16 @@ TwitterPlugin::friendsTimelineStatuses( const QList< QTweetStatus > &statuses )
if ( status.id() > m_cachedFriendsSinceId ) if ( status.id() > m_cachedFriendsSinceId )
m_cachedFriendsSinceId = status.id(); m_cachedFriendsSinceId = status.id();
qDebug() << "TwitterPlugin checking mention from " << status.user().screenName() << " with content " << status.text(); qDebug() << "TwitterSipPlugin checking mention from " << status.user().screenName() << " with content " << status.text();
parseGotTomahawk( regex, status.user().screenName(), status.text() ); parseGotTomahawk( regex, status.user().screenName(), status.text() );
} }
setTwitterCachedFriendsSinceId( m_cachedFriendsSinceId ); m_configuration[ "cachedFriendsSinceId" ] = m_cachedFriendsSinceId;
syncConfig();
} }
void void
TwitterPlugin::mentionsStatuses( const QList< QTweetStatus > &statuses ) TwitterSipPlugin::mentionsStatuses( const QList< QTweetStatus > &statuses )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
QRegExp regex( s_gotTomahawkRegex, Qt::CaseSensitive, QRegExp::RegExp2 ); QRegExp regex( s_gotTomahawkRegex, Qt::CaseSensitive, QRegExp::RegExp2 );
@@ -492,35 +436,36 @@ TwitterPlugin::mentionsStatuses( const QList< QTweetStatus > &statuses )
if ( status.id() > m_cachedMentionsSinceId ) if ( status.id() > m_cachedMentionsSinceId )
m_cachedMentionsSinceId = status.id(); m_cachedMentionsSinceId = status.id();
qDebug() << "TwitterPlugin checking mention from " << status.user().screenName() << " with content " << status.text(); qDebug() << "TwitterSipPlugin checking mention from " << status.user().screenName() << " with content " << status.text();
parseGotTomahawk( regex, status.user().screenName(), status.text() ); parseGotTomahawk( regex, status.user().screenName(), status.text() );
} }
setTwitterCachedMentionsSinceId( m_cachedMentionsSinceId ); m_configuration[ "cachedMentionsSinceId" ] = m_cachedMentionsSinceId;
syncConfig();
} }
void void
TwitterPlugin::pollDirectMessages() TwitterSipPlugin::pollDirectMessages()
{ {
if ( !isValid() ) if ( !isValid() )
return; return;
if ( m_cachedDirectMessagesSinceId == 0 ) if ( m_cachedDirectMessagesSinceId == 0 )
m_cachedDirectMessagesSinceId = twitterCachedDirectMessagesSinceId(); m_cachedDirectMessagesSinceId = m_configuration[ "cachedDirectMentionsSinceId" ].toLongLong();
qDebug() << "TwitterPlugin looking for direct messages since id " << m_cachedDirectMessagesSinceId; qDebug() << "TwitterSipPlugin looking for direct messages since id " << m_cachedDirectMessagesSinceId;
if ( !m_directMessages.isNull() ) if ( !m_directMessages.isNull() )
m_directMessages.data()->fetch( m_cachedDirectMessagesSinceId, 0, 800 ); m_directMessages.data()->fetch( m_cachedDirectMessagesSinceId, 0, 800 );
} }
void void
TwitterPlugin::directMessages( const QList< QTweetDMStatus > &messages ) TwitterSipPlugin::directMessages( const QList< QTweetDMStatus > &messages )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
QRegExp regex( s_gotTomahawkRegex, Qt::CaseSensitive, QRegExp::RegExp2 ); QRegExp regex( s_gotTomahawkRegex, Qt::CaseSensitive, QRegExp::RegExp2 );
QString myScreenName = twitterScreenName(); QString myScreenName = m_configuration[ "screenName" ].toString();
QHash< QString, QTweetDMStatus > latestHash; QHash< QString, QTweetDMStatus > latestHash;
foreach ( QTweetDMStatus status, messages ) foreach ( QTweetDMStatus status, messages )
@@ -550,7 +495,7 @@ TwitterPlugin::directMessages( const QList< QTweetDMStatus > &messages )
foreach( QTweetDMStatus status, latestHash.values() ) foreach( QTweetDMStatus status, latestHash.values() )
{ {
qDebug() << "TwitterPlugin checking direct message from " << status.senderScreenName() << " with content " << status.text(); qDebug() << "TwitterSipPlugin checking direct message from " << status.senderScreenName() << " with content " << status.text();
if ( status.id() > m_cachedDirectMessagesSinceId ) if ( status.id() > m_cachedDirectMessagesSinceId )
m_cachedDirectMessagesSinceId = status.id(); m_cachedDirectMessagesSinceId = status.id();
@@ -559,7 +504,7 @@ TwitterPlugin::directMessages( const QList< QTweetDMStatus > &messages )
else else
{ {
QStringList splitList = status.text().split(':'); QStringList splitList = status.text().split(':');
qDebug() << "TwitterPlugin found " << splitList.length() << " parts to the message; the parts are:"; qDebug() << "TwitterSipPlugin found " << splitList.length() << " parts to the message; the parts are:";
foreach( QString part, splitList ) foreach( QString part, splitList )
qDebug() << part; qDebug() << part;
//validity is checked above //validity is checked above
@@ -573,7 +518,7 @@ TwitterPlugin::directMessages( const QList< QTweetDMStatus > &messages )
qDebug() << "Old-style node info found, ignoring"; qDebug() << "Old-style node info found, ignoring";
continue; continue;
} }
qDebug() << "TwitterPlugin found a peerstart message from " << status.senderScreenName() << " with host " << host << " and port " << port << " and pkey " << pkey << " and node " << splitNode[0] << " destined for node " << splitNode[1]; qDebug() << "TwitterSipPlugin found a peerstart message from " << status.senderScreenName() << " with host " << host << " and port " << port << " and pkey " << pkey << " and node " << splitNode[0] << " destined for node " << splitNode[1];
QVariantHash peerData = ( m_cachedPeers.contains( status.senderScreenName() ) ) ? QVariantHash peerData = ( m_cachedPeers.contains( status.senderScreenName() ) ) ?
@@ -590,18 +535,19 @@ TwitterPlugin::directMessages( const QList< QTweetDMStatus > &messages )
if ( Database::instance()->dbid().startsWith( splitNode[1] ) ) if ( Database::instance()->dbid().startsWith( splitNode[1] ) )
{ {
qDebug() << "TwitterPlugin found message destined for this node; destroying it"; qDebug() << "TwitterSipPlugin found message destined for this node; destroying it";
if ( !m_directMessageDestroy.isNull() ) if ( !m_directMessageDestroy.isNull() )
m_directMessageDestroy.data()->destroyMessage( status.id() ); m_directMessageDestroy.data()->destroyMessage( status.id() );
} }
} }
} }
setTwitterCachedDirectMessagesSinceId( m_cachedDirectMessagesSinceId ); m_configuration[ "cachedDirectMessagesSinceId" ] = m_cachedDirectMessagesSinceId;
syncConfig();
} }
void void
TwitterPlugin::registerOffer( const QString &screenName, const QVariantHash &peerData ) TwitterSipPlugin::registerOffer( const QString &screenName, const QVariantHash &peerData )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
@@ -656,26 +602,27 @@ TwitterPlugin::registerOffer( const QString &screenName, const QVariantHash &pee
if( needToAddToCache && _peerData.contains( "node" ) ) if( needToAddToCache && _peerData.contains( "node" ) )
{ {
qDebug() << "TwitterPlugin registering offer to " << friendlyName << " with node " << _peerData["node"].toString() << " and offeredkey " << _peerData["okey"].toString(); qDebug() << "TwitterSipPlugin registering offer to " << friendlyName << " with node " << _peerData["node"].toString() << " and offeredkey " << _peerData["okey"].toString();
m_keyCache << Servent::instance()->createConnectionKey( friendlyName, _peerData["node"].toString(), _peerData["okey"].toString(), false ); m_keyCache << Servent::instance()->createConnectionKey( friendlyName, _peerData["node"].toString(), _peerData["okey"].toString(), false );
} }
if( needToSend && _peerData.contains( "node") ) if( needToSend && _peerData.contains( "node") )
{ {
qDebug() << "TwitterPlugin needs to send and has node"; qDebug() << "TwitterSipPlugin needs to send and has node";
_peerData["ohst"] = QVariant::fromValue< QString >( Servent::instance()->externalAddress() ); _peerData["ohst"] = QVariant::fromValue< QString >( Servent::instance()->externalAddress() );
_peerData["oprt"] = QVariant::fromValue< int >( Servent::instance()->externalPort() ); _peerData["oprt"] = QVariant::fromValue< int >( Servent::instance()->externalPort() );
peersChanged = true; peersChanged = true;
if( !Servent::instance()->externalAddress().isEmpty() && !Servent::instance()->externalPort() == 0 ) if( !Servent::instance()->externalAddress().isEmpty() && !Servent::instance()->externalPort() == 0 )
QMetaObject::invokeMethod( this, "sendOffer", Q_ARG( QString, screenName ), Q_ARG( QVariantHash, _peerData ) ); QMetaObject::invokeMethod( this, "sendOffer", Q_ARG( QString, screenName ), Q_ARG( QVariantHash, _peerData ) );
else else
qDebug() << "TwitterPlugin did not send offer because external address is " << Servent::instance()->externalAddress() << " and external port is " << Servent::instance()->externalPort(); qDebug() << "TwitterSipPlugin did not send offer because external address is " << Servent::instance()->externalAddress() << " and external port is " << Servent::instance()->externalPort();
} }
if ( peersChanged ) if ( peersChanged )
{ {
_peerData["lastseen"] = QString::number( QDateTime::currentMSecsSinceEpoch() ); _peerData["lastseen"] = QString::number( QDateTime::currentMSecsSinceEpoch() );
m_cachedPeers[screenName] = QVariant::fromValue< QVariantHash >( _peerData ); m_cachedPeers[screenName] = QVariant::fromValue< QVariantHash >( _peerData );
m_configuration[ "cachedPeers" ] = m_cachedPeers;
syncConfig(); syncConfig();
} }
@@ -685,7 +632,7 @@ TwitterPlugin::registerOffer( const QString &screenName, const QVariantHash &pee
} }
void void
TwitterPlugin::sendOffer( const QString &screenName, const QVariantHash &peerData ) TwitterSipPlugin::sendOffer( const QString &screenName, const QVariantHash &peerData )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
QString offerString = QString( "TOMAHAWKPEER:Host=%1:Port=%2:Node=%3*%4:PKey=%5" ).arg( peerData["ohst"].toString() ) QString offerString = QString( "TOMAHAWKPEER:Host=%1:Port=%2:Node=%3*%4:PKey=%5" ).arg( peerData["ohst"].toString() )
@@ -693,26 +640,26 @@ TwitterPlugin::sendOffer( const QString &screenName, const QVariantHash &peerDat
.arg( Database::instance()->dbid() ) .arg( Database::instance()->dbid() )
.arg( peerData["node"].toString().left( 8 ) ) .arg( peerData["node"].toString().left( 8 ) )
.arg( peerData["okey"].toString() ); .arg( peerData["okey"].toString() );
qDebug() << "TwitterPlugin sending message to " << screenName << ": " << offerString; qDebug() << "TwitterSipPlugin sending message to " << screenName << ": " << offerString;
if( !m_directMessageNew.isNull() ) if( !m_directMessageNew.isNull() )
m_directMessageNew.data()->post( screenName, offerString ); m_directMessageNew.data()->post( screenName, offerString );
} }
void void
TwitterPlugin::makeConnection( const QString &screenName, const QVariantHash &peerData ) TwitterSipPlugin::makeConnection( const QString &screenName, const QVariantHash &peerData )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if ( !peerData.contains( "host" ) || !peerData.contains( "port" ) || !peerData.contains( "pkey" ) || !peerData.contains( "node" ) || if ( !peerData.contains( "host" ) || !peerData.contains( "port" ) || !peerData.contains( "pkey" ) || !peerData.contains( "node" ) ||
peerData["host"].toString().isEmpty() || peerData["port"].toString().isEmpty() || peerData["pkey"].toString().isEmpty() || peerData["node"].toString().isEmpty() ) peerData["host"].toString().isEmpty() || peerData["port"].toString().isEmpty() || peerData["pkey"].toString().isEmpty() || peerData["node"].toString().isEmpty() )
{ {
qDebug() << "TwitterPlugin could not find host and/or port and/or pkey and/or node for peer " << screenName; qDebug() << "TwitterSipPlugin could not find host and/or port and/or pkey and/or node for peer " << screenName;
return; return;
} }
if ( peerData["host"].toString() == Servent::instance()->externalAddress() && if ( peerData["host"].toString() == Servent::instance()->externalAddress() &&
peerData["port"].toInt() == Servent::instance()->externalPort() ) peerData["port"].toInt() == Servent::instance()->externalPort() )
{ {
qDebug() << "TwitterPlugin asked to make connection to our own host and port, ignoring " << screenName; qDebug() << "TwitterSipPlugin asked to make connection to our own host and port, ignoring " << screenName;
return; return;
} }
@@ -726,31 +673,31 @@ TwitterPlugin::makeConnection( const QString &screenName, const QVariantHash &pe
} }
void void
TwitterPlugin::directMessagePosted( const QTweetDMStatus& message ) TwitterSipPlugin::directMessagePosted( const QTweetDMStatus& message )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
qDebug() << "TwitterPlugin sent message to " << message.recipientScreenName() << " containing: " << message.text(); qDebug() << "TwitterSipPlugin sent message to " << message.recipientScreenName() << " containing: " << message.text();
} }
void void
TwitterPlugin::directMessagePostError( QTweetNetBase::ErrorCode errorCode, const QString &message ) TwitterSipPlugin::directMessagePostError( QTweetNetBase::ErrorCode errorCode, const QString &message )
{ {
Q_UNUSED( errorCode ); Q_UNUSED( errorCode );
Q_UNUSED( message ); Q_UNUSED( message );
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
qDebug() << "TwitterPlugin received an error posting direct message: " << m_directMessageNew.data()->lastErrorMessage(); qDebug() << "TwitterSipPlugin received an error posting direct message: " << m_directMessageNew.data()->lastErrorMessage();
} }
void void
TwitterPlugin::directMessageDestroyed( const QTweetDMStatus& message ) TwitterSipPlugin::directMessageDestroyed( const QTweetDMStatus& message )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
qDebug() << "TwitterPlugin destroyed message " << message.text(); qDebug() << "TwitterSipPlugin destroyed message " << message.text();
} }
void void
TwitterPlugin::fetchAvatar( const QString& screenName ) TwitterSipPlugin::fetchAvatar( const QString& screenName )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if ( m_twitterAuth.isNull() ) if ( m_twitterAuth.isNull() )
@@ -761,7 +708,7 @@ TwitterPlugin::fetchAvatar( const QString& screenName )
} }
void void
TwitterPlugin::avatarUserDataSlot( const QTweetUser &user ) TwitterSipPlugin::avatarUserDataSlot( const QTweetUser &user )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if ( user.profileImageUrl().isEmpty() || m_twitterAuth.isNull() ) if ( user.profileImageUrl().isEmpty() || m_twitterAuth.isNull() )
@@ -774,14 +721,14 @@ TwitterPlugin::avatarUserDataSlot( const QTweetUser &user )
} }
void void
TwitterPlugin::refreshProxy() TwitterSipPlugin::refreshProxy()
{ {
if ( !m_twitterAuth.isNull() ) if ( !m_twitterAuth.isNull() )
m_twitterAuth.data()->setNetworkAccessManager( TomahawkUtils::nam() ); m_twitterAuth.data()->setNetworkAccessManager( TomahawkUtils::nam() );
} }
void void
TwitterPlugin::profilePicReply() TwitterSipPlugin::profilePicReply()
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
QNetworkReply *reply = qobject_cast< QNetworkReply* >( sender() ); QNetworkReply *reply = qobject_cast< QNetworkReply* >( sender() );
@@ -801,267 +748,9 @@ TwitterPlugin::profilePicReply()
} }
void void
TwitterPlugin::checkSettings() TwitterSipPlugin::configurationChanged()
{ {
if ( m_state == Disconnected ) if ( m_state != Disconnected )
return;
disconnectPlugin(); disconnectPlugin();
connectPlugin(); connectPlugin();
} }
void
TwitterPlugin::setTwitterSavedDbid( const QString& dbid )
{
TomahawkSettings::instance()->setValue( pluginId() + "/saveddbid", dbid );
}
QString
TwitterPlugin::twitterSavedDbid() const
{
return TomahawkSettings::instance()->value( pluginId() + "/saveddbid", QString() ).toString();
}
QString
TwitterPlugin::twitterScreenName() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "ScreenName", Qt::CaseSensitive ) )
{
s->setValue( "screenname_tmp",
s->value( "ScreenName" ).toString() );
s->remove( "ScreenName" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "screenname_tmp", Qt::CaseSensitive ) )
{
s->setValue( "screenname",
s->value( "screenname_tmp" ).toString() );
s->remove( "screenname_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/screenname" ).toString();
}
void
TwitterPlugin::setTwitterScreenName( const QString& screenName )
{
TomahawkSettings::instance()->setValue( pluginId() + "/screenname", screenName );
}
QString
TwitterPlugin::twitterOAuthToken() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "OAuthToken", Qt::CaseSensitive ) )
{
s->setValue( "oauthtoken_tmp",
s->value( "OAuthToken" ).toString() );
s->remove( "OAuthToken" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "oauthtoken_tmp", Qt::CaseSensitive ) )
{
s->setValue( "oauthtoken",
s->value( "oauthtoken_tmp" ).toString() );
s->remove( "oauthtoken_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/oauthtoken" ).toString();
}
void
TwitterPlugin::setTwitterOAuthToken( const QString& oauthtoken )
{
TomahawkSettings::instance()->setValue( pluginId() + "/oauthtoken", oauthtoken );
}
QString
TwitterPlugin::twitterOAuthTokenSecret() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "OAuthTokenSecret", Qt::CaseSensitive ) )
{
s->setValue( "oauthtokensecret_tmp",
s->value( "OAuthTokenSecret" ).toString() );
s->remove( "OAuthTokenSecret" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "oauthtokensecret_tmp", Qt::CaseSensitive ) )
{
s->setValue( "oauthtokensecret",
s->value( "oauthtokensecret_tmp" ).toString() );
s->remove( "oauthtokensecret_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/oauthtokensecret" ).toString();
}
void
TwitterPlugin::setTwitterOAuthTokenSecret( const QString& oauthtokensecret )
{
TomahawkSettings::instance()->setValue( pluginId() + "/oauthtokensecret", oauthtokensecret );
}
qint64
TwitterPlugin::twitterCachedFriendsSinceId() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "CachedFriendsSinceID", Qt::CaseSensitive ) )
{
s->setValue( "cachedfriendssinceid_tmp",
s->value( "CachedFriendsSinceID" ).toLongLong() );
s->remove( "CachedFriendsSinceID" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "cachedfriendssinceid_tmp", Qt::CaseSensitive ) )
{
s->setValue( "cachedfriendssinceid",
s->value( "cachedfriendssinceid_tmp" ).toLongLong() );
s->remove( "cachedfriendssinceid_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/cachedfriendssinceid", 0 ).toLongLong();
}
void
TwitterPlugin::setTwitterCachedFriendsSinceId( qint64 cachedId )
{
TomahawkSettings::instance()->setValue( pluginId() + "/cachedfriendssinceid", cachedId );
}
qint64
TwitterPlugin::twitterCachedMentionsSinceId() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "CachedMentionsSinceID", Qt::CaseSensitive ) )
{
s->setValue( "cachedmentionssinceid_tmp",
s->value( "CachedMentionsSinceID" ).toLongLong() );
s->remove( "CachedMentionsSinceID" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "cachedmentionssinceid_tmp", Qt::CaseSensitive ) )
{
s->setValue( "cachedmentionssinceid",
s->value( "cachedmentionssinceid_tmp" ).toLongLong() );
s->remove( "cachedmentionssinceid_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/cachedmentionssinceid", 0 ).toLongLong();
}
void
TwitterPlugin::setTwitterCachedMentionsSinceId( qint64 cachedId )
{
TomahawkSettings::instance()->setValue( pluginId() + "/cachedmentionssinceid", cachedId );
}
qint64
TwitterPlugin::twitterCachedDirectMessagesSinceId() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "CachedDirectMessagesSinceID", Qt::CaseSensitive ) )
{
s->setValue( "cacheddirectmessagessinceid_tmp",
s->value( "CachedDirectMessagesSinceID" ).toLongLong() );
s->remove( "CachedDirectMessagesSinceID" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "cacheddirectmessagessinceid_tmp", Qt::CaseSensitive ) )
{
s->setValue( "cacheddirectmessagessinceid",
s->value( "cacheddirectmessagessinceid_tmp" ).toLongLong() );
s->remove( "cacheddirectmessagessinceid_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/cacheddirectmessagessinceid", 0 ).toLongLong();
}
void
TwitterPlugin::setTwitterCachedDirectMessagesSinceId( qint64 cachedId )
{
TomahawkSettings::instance()->setValue( pluginId() + "/cacheddirectmessagessinceid", cachedId );
}
QVariantHash
TwitterPlugin::twitterCachedPeers() const
{
TomahawkSettings* s = TomahawkSettings::instance();
s->beginGroup( pluginId() );
QStringList keys = s->childKeys();
if ( keys.contains( "CachedPeers", Qt::CaseSensitive ) )
{
s->setValue( "cachedpeers_tmp",
s->value( "CachedPeers" ).toHash() );
s->remove( "CachedPeers" );
s->sync();
}
keys = s->childKeys();
if ( keys.contains( "cachedpeers_tmp", Qt::CaseSensitive ) )
{
s->setValue( "cachedpeers",
s->value( "cachedpeers_tmp" ).toHash() );
s->remove( "cachedpeers_tmp" );
s->sync();
}
s->endGroup();
return s->value( pluginId() + "/cachedpeers", QVariantHash() ).toHash();
}
void
TwitterPlugin::setTwitterCachedPeers( const QVariantHash &cachedPeers )
{
TomahawkSettings::instance()->setValue( pluginId() + "/cachedpeers", cachedPeers );
TomahawkSettings::instance()->sync();
}
Q_EXPORT_PLUGIN2( sipfactory, TwitterFactory )

View File

@@ -19,8 +19,6 @@
#ifndef TWITTER_H #ifndef TWITTER_H
#define TWITTER_H #define TWITTER_H
#include "twitterconfigwidget.h"
#include <QTimer> #include <QTimer>
#include <QWeakPointer> #include <QWeakPointer>
#include <QSet> #include <QSet>
@@ -36,48 +34,28 @@
#include "../sipdllmacro.h" #include "../sipdllmacro.h"
#include "sip/SipPlugin.h" #include "sip/SipPlugin.h"
#include "accounts/account.h"
#include "tomahawkoauthtwitter.h" #include "tomahawkoauthtwitter.h"
#define MYNAME "SIPTWITTER" #define MYNAME "SIPTWITTER"
class SIPDLLEXPORT TwitterFactory : public SipPluginFactory class SIPDLLEXPORT TwitterSipPlugin : public SipPlugin
{
Q_OBJECT
Q_INTERFACES( SipPluginFactory )
public:
TwitterFactory() {}
virtual ~TwitterFactory() {}
virtual QString prettyName() const { return "Twitter"; }
virtual QString factoryId() const { return "siptwitter"; }
virtual QIcon icon() const;
virtual SipPlugin* createPlugin( const QString& pluginId = QString() );
};
class SIPDLLEXPORT TwitterPlugin : public SipPlugin
{ {
Q_OBJECT Q_OBJECT
public: public:
TwitterPlugin( const QString& pluginId ); TwitterSipPlugin( Tomahawk::Accounts::Account *account );
virtual ~TwitterPlugin() {} virtual ~TwitterSipPlugin() {}
virtual bool isValid() const; virtual bool isValid() const;
virtual const QString name() const;
virtual const QString accountName() const;
virtual const QString friendlyName() const;
virtual ConnectionState connectionState() const; virtual ConnectionState connectionState() const;
virtual QIcon icon() const;
virtual QWidget* configWidget();
public slots: public slots:
virtual bool connectPlugin(); virtual bool connectPlugin();
void disconnectPlugin(); void disconnectPlugin();
void checkSettings();
void refreshProxy(); void refreshProxy();
void deletePlugin(); void configurationChanged();
void sendMsg( const QString& to, const QString& msg ) void sendMsg( const QString& to, const QString& msg )
{ {
@@ -97,7 +75,6 @@ public slots:
} }
private slots: private slots:
void configDialogAuthedSignalSlot( bool authed );
void connectAuthVerifyReply( const QTweetUser &user ); void connectAuthVerifyReply( const QTweetUser &user );
void checkTimerFired(); void checkTimerFired();
void connectTimerFired(); void connectTimerFired();
@@ -117,26 +94,14 @@ private slots:
void profilePicReply(); void profilePicReply();
private: private:
inline void syncConfig() { setTwitterCachedPeers( m_cachedPeers ); } inline void syncConfig() { m_account->setCredentials( m_credentials ); m_account->setConfiguration( m_configuration ); m_account->syncConfig(); }
bool refreshTwitterAuth(); bool refreshTwitterAuth();
void parseGotTomahawk( const QRegExp &regex, const QString &screenName, const QString &text ); void parseGotTomahawk( const QRegExp &regex, const QString &screenName, const QString &text );
// handle per-plugin config // handle per-plugin config
QString twitterSavedDbid() const;
void setTwitterSavedDbid( const QString& dbid );
QString twitterScreenName() const;
void setTwitterScreenName( const QString& screenName );
QString twitterOAuthToken() const; QString twitterOAuthToken() const;
void setTwitterOAuthToken( const QString& oauthtoken ); void setTwitterOAuthToken( const QString& oauthtoken );
QString twitterOAuthTokenSecret() const; QString twitterOAuthTokenSecret() const;
void setTwitterOAuthTokenSecret( const QString& oauthtokensecret ); void setTwitterOAuthTokenSecret( const QString& oauthtokensecret );
qint64 twitterCachedFriendsSinceId() const;
void setTwitterCachedFriendsSinceId( qint64 sinceid );
qint64 twitterCachedMentionsSinceId() const;
void setTwitterCachedMentionsSinceId( qint64 sinceid );
qint64 twitterCachedDirectMessagesSinceId() const;
void setTwitterCachedDirectMessagesSinceId( qint64 sinceid );
QVariantHash twitterCachedPeers() const;
void setTwitterCachedPeers( const QVariantHash &cachedPeers );
QWeakPointer< TomahawkOAuthTwitter > m_twitterAuth; QWeakPointer< TomahawkOAuthTwitter > m_twitterAuth;
QWeakPointer< QTweetFriendsTimeline > m_friendsTimeline; QWeakPointer< QTweetFriendsTimeline > m_friendsTimeline;
@@ -145,6 +110,9 @@ private:
QWeakPointer< QTweetDirectMessageNew > m_directMessageNew; QWeakPointer< QTweetDirectMessageNew > m_directMessageNew;
QWeakPointer< QTweetDirectMessageDestroy > m_directMessageDestroy; QWeakPointer< QTweetDirectMessageDestroy > m_directMessageDestroy;
QVariantHash m_configuration;
QVariantHash m_credentials;
bool m_isAuthed; bool m_isAuthed;
QTimer m_checkTimer; QTimer m_checkTimer;
QTimer m_connectTimer; QTimer m_connectTimer;

View File

@@ -523,8 +523,7 @@ TomahawkApp::initSIP()
#endif #endif
tDebug( LOGINFO ) << "Connecting SIP classes"; tDebug( LOGINFO ) << "Connecting SIP classes";
//SipHandler::instance()->refreshProxy(); SipHandler::instance()->loadFromAccountManager();
SipHandler::instance()->loadFromConfig();
} }
} }