diff --git a/CustomModels/usermodel.cpp b/CustomModels/usermodel.cpp index 198c1de3a0ee27d1f15058719eab3c46535e00d7..109239225844dbb84bcbbea630ef21d1cd09cd92 100644 --- a/CustomModels/usermodel.cpp +++ b/CustomModels/usermodel.cpp @@ -54,7 +54,7 @@ QVariant UserModel::data( const QModelIndex &index, int role ) const } if ( role == UserRoles::status ) { - int status = 0; + int status = 2; switch ( user->getStatus() ) { case RocketChatUser::status::ONLINE : diff --git a/CustomModels/usermodel.h b/CustomModels/usermodel.h index 233bed67ccf6b7e229eb665bc22b6cc22c25f333..79f489fcd05b5b1ec8dd3e329f83e968b77d338c 100644 --- a/CustomModels/usermodel.h +++ b/CustomModels/usermodel.h @@ -47,6 +47,7 @@ class UserModel: public QAbstractListModel public slots: bool insertUser( const QString &, const QSharedPointer<RocketChatUser> & ); void refreshUserList(); + void addUser( QSharedPointer<RocketChatUser> pUser ); public: UserModel( QObject *parent = nullptr ); @@ -58,7 +59,6 @@ class UserModel: public QAbstractListModel QSharedPointer<RocketChatUser> getUserById( const QString &pId ); - void addUser( QSharedPointer<RocketChatUser> pUser ); protected: QHash<int, QByteArray> roleNames() const; diff --git a/config.h b/config.h index 849783df3df3ffabb87f337ec4e9ca2d10a15c5a..d29a64c906e6c27050caafda81ec3613e65c20be 100755 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG_H #define CONFIG_H -#define DBVERSION 4 +#define DBVERSION 5 #endif // CONFIG_H diff --git a/engine.pro b/engine.pro index 6341f9762606032e21a6599ee4a60c5305093b8a..064de0f06f24af07c587556f843df943a01a2b49 100644 --- a/engine.pro +++ b/engine.pro @@ -283,6 +283,7 @@ RESOURCES += \ DISTFILES += \ sql/migrations/3.sql \ - sql/migrations/4.sql + sql/migrations/4.sql \ + sql/migrations/5.sql diff --git a/persistancelayer.cpp b/persistancelayer.cpp index bec51d305f2d543866710c33fbd152e1a6bfb1ba..c110672d258cc2c323f05b277d1deddc41cd79fd 100755 --- a/persistancelayer.cpp +++ b/persistancelayer.cpp @@ -98,7 +98,8 @@ void PersistanceLayer::initShema() "archived bool," "joined bool, " "blocked bool DEFAULT 0, " - "username varchar(100) DEFAULT \"\")" ) ); + "username varchar(100) DEFAULT \"\", " + "chat_partner_id varchar(100) DEFAULT \"\")" ) ); if ( !query.exec() ) { qWarning() << query.lastError(); @@ -302,6 +303,9 @@ void PersistanceLayer::upgradeSchema() } else if ( dbVersion < 4 ) { currentTarget = 4; sqlFile.setFileName( QStringLiteral( ":/sql/migrations/4.sql" ) ); + } else if ( dbVersion < 5 ) { + currentTarget = 5; + sqlFile.setFileName( QStringLiteral( ":/sql/migrations/5.sql" ) ); } if ( !sqlFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { @@ -762,12 +766,12 @@ void PersistanceLayer::setSetting( const QString &pProperty, const QString &pVal } -void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername ) +void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername, const QString &pMchatPartnerId ) { transaction(); QSqlQuery setChannel; setChannel.prepare( QStringLiteral( "REPLACE INTO rooms " - "(id,name,type,joined,read_only,muted,archived,blocked,username) VALUES(:id,:name,:type,:joined,:read_only,:muted,:archived,:blocked,:username)" ) ); + "(id,name,type,joined,read_only,muted,archived,blocked,username) VALUES(:id,:name,:type,:joined,:read_only,:muted,:archived,:blocked,:username,:chat_partner_id)" ) ); setChannel.bindValue( QStringLiteral( ":id" ), pId ); setChannel.bindValue( QStringLiteral( ":name" ), pName ); setChannel.bindValue( QStringLiteral( ":joined" ), pJoined ); @@ -777,6 +781,8 @@ void PersistanceLayer::addChannel( const QString &pId, const QString &pName, con setChannel.bindValue( QStringLiteral( ":archived" ), pArchived ); setChannel.bindValue( QStringLiteral( ":blocked" ), pBlocked ); setChannel.bindValue( QStringLiteral( ":username" ), pUsername ); + setChannel.bindValue( QStringLiteral( ":chat_partner_id" ), pUsername ); + if ( !setChannel.exec() ) { qWarning() << setChannel.lastError(); @@ -785,13 +791,13 @@ void PersistanceLayer::addChannel( const QString &pId, const QString &pName, con commit(); } -void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername ) +void PersistanceLayer::addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername, const QString &pMchatPartnerId ) { bool readOnly = false; QString muted = ""; bool archived = false; bool blocked = false; - addChannel( pId, pName, pType, pJoined, readOnly, muted, archived, blocked, pUsername ); + addChannel( pId, pName, pType, pJoined, readOnly, muted, archived, blocked, pUsername, pMchatPartnerId ); } void PersistanceLayer::deleteChannel( const QString &pId ) @@ -1210,6 +1216,8 @@ QList<QVariantHash> PersistanceLayer::getChannels( void ) int archivedCol = rec.indexOf( QStringLiteral( "archived" ) ); int blocked = rec.indexOf( QStringLiteral( "blocked" ) ); int usernameCol = rec.indexOf( QStringLiteral( "username" ) ); + int chatPartnerIdCol = rec.indexOf( QStringLiteral( "chat_partner_id" ) ); + while ( rooms.next() ) { QVariantHash roomsHash; @@ -1224,6 +1232,8 @@ QList<QVariantHash> PersistanceLayer::getChannels( void ) roomsHash[QStringLiteral( "archived" )] = rooms.value( archivedCol ).toBool(); roomsHash[QStringLiteral( "blocked" )] = rooms.value( blocked ).toBool(); roomsHash[QStringLiteral( "username" )] = rooms.value( usernameCol ).toString(); + roomsHash[QStringLiteral( "chatPartnerId" )] = rooms.value( chatPartnerIdCol ).toString(); + roomsList.append( roomsHash ); } } diff --git a/persistancelayer.h b/persistancelayer.h index c9dc4df78b4657595d9331d911a704a5ad18ca85..ce4a8c5fa573b3563bfa021cca12340037aa9ed7 100755 --- a/persistancelayer.h +++ b/persistancelayer.h @@ -39,8 +39,8 @@ class PersistanceLayer : public QObject void setUserName( const QString & ); void setPassword( const QString & ); void setToken( const QString &, uint ); - void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername ); - void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername ); + void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, bool pReadOnly, const QString &pMuted, bool pArchived, bool pBlocked, const QString &pUsername, const QString &pMchatPartnerId ); + void addChannel( const QString &pId, const QString &pName, const QString &pType, bool pJoined, const QString &pUsername, const QString &pMchatPartnerId ); void deleteChannel( const QString &pId ); void addMessage( const QString &pId, const QString &pRid, const QString &pAuthor, qint64 pTs, const QString &pJson, const QString &pUserId ); void addFileCacheEntry( const QString &pUrl, const QString &pPath ); diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp index bcf16bde5402cdf71d4c70d71f98b6e505444452..cab921932ec42a0fd0fc87d1115f73b50c01aa4b 100755 --- a/rocketchatserver.cpp +++ b/rocketchatserver.cpp @@ -1714,11 +1714,11 @@ void RocketChatServerData::getCustomEmojis() QSharedPointer<RocketChatNotifyNoticesRequest> notifyNoticeSubSubscription( new RocketChatNotifyNoticesRequest( this->mUserId ) ); QSharedPointer<RocketChatSubScriptionChangedRequest> noitfySubscriptionsSubscription( new RocketChatSubScriptionChangedRequest( this->mUserId ) ); QSharedPointer<RocketChatSubscribeActiveUsers> activeUsersSubscription( new RocketChatSubscribeActiveUsers() ); - sendDdprequest( notifySubSubscription ); - sendDdprequest( notifyNoticeSubSubscription ); - sendDdprequest( noitfySubscriptionsSubscription ); - sendDdprequest( activeUsersSubscription ); - sendDdprequest( notifyRoomsChanged ); + sendDdprequest( notifySubSubscription, true ); + sendDdprequest( notifyNoticeSubSubscription, true ); + sendDdprequest( noitfySubscriptionsSubscription, true ); + sendDdprequest( activeUsersSubscription, true ); + sendDdprequest( notifyRoomsChanged, true ); onLoggedIn(); sendUnsentMessages(); diff --git a/services/rocketchatchannelservice.cpp b/services/rocketchatchannelservice.cpp index 1258f8f3787f4af207a3fca883ee2de44532fd18..59824c17f900a9cc6dfe0b835bb96d567625cee9 100755 --- a/services/rocketchatchannelservice.cpp +++ b/services/rocketchatchannelservice.cpp @@ -260,6 +260,8 @@ void RocketChatChannelService::loadJoinedChannelsFromDb() if ( Q_LIKELY( !roomsList.isEmpty() ) ) { QVector<QSharedPointer<RocketChatChannel>> channels; + auto users = Models::getUsersModel(); + for ( const auto &roomHash : roomsList ) { QSharedPointer<RocketChatChannel> channelPointer = createChannelObject( roomHash["id"].toString(), roomHash["name"].toString(), roomHash["type"].toString(), roomHash["username"].toString() ); @@ -268,6 +270,18 @@ void RocketChatChannelService::loadJoinedChannelsFromDb() channelPointer->setArchived( roomHash["archived"].toBool() ); channelPointer->setReadOnly( roomHash["readOnly"].toBool() ); channelPointer->setJoined( roomHash["joined"].toBool() ); + channelPointer->setChatPartnerId( roomHash["chatPartnerId"].toString() ); + + if ( channelPointer->getType() == "d" ) { + auto user = users->getUserById( channelPointer->getChatPartnerId() ); + + if ( !user.isNull() ) { + channelPointer->setChatPartner( user ); + } else { + auto newUser = QSharedPointer<RocketChatUser>( new RocketChatUser( channelPointer->getChatPartnerId() ) ); + channelPointer->setChatPartner( newUser ); + } + } if ( roomHash.contains( "blocked" ) ) { channelPointer->setBlocked( roomHash["blocked"].toBool() ); @@ -283,16 +297,17 @@ void RocketChatChannelService::loadJoinedChannelsFromDb() void RocketChatChannelService::persistChannel( QSharedPointer<RocketChatChannel> pChannel ) { - QString id = pChannel->getRoomId(); - QString name = pChannel->getName(); - QString type = pChannel->getType(); - QString muted = pChannel->getMuted().join( "," ); - QString username = pChannel->getUsername(); - bool joined = pChannel->getJoined(); - bool archived = pChannel->getArchived(); - bool readonly = pChannel->getReadOnly(); - bool blocked = pChannel->getBlocked(); - mStorage->addChannel( id, name, type, joined, readonly, muted, archived, blocked, username ); + auto id = pChannel->getRoomId(); + auto name = pChannel->getName(); + auto type = pChannel->getType(); + auto muted = pChannel->getMuted().join( "," ); + auto username = pChannel->getUsername(); + auto joined = pChannel->getJoined(); + auto archived = pChannel->getArchived(); + auto readonly = pChannel->getReadOnly(); + auto blocked = pChannel->getBlocked(); + auto chatPartnerId = pChannel->getChatPartnerId(); + mStorage->addChannel( id, name, type, joined, readonly, muted, archived, blocked, username, chatPartnerId ); } /** * Fills the channel with users, which are loaded from the server @@ -321,21 +336,32 @@ void RocketChatChannelService::loadUsersOfChannel( QSharedPointer<RocketChatChan for ( const auto current : records ) { if ( current.type() == QJsonValue::Object ) { QJsonObject userObject = current.toObject(); - QString username = userObject["username"].toString(); - QString userId = userObject["id"].toString(); + QString username; + QString userId; QString status; + QString name; + + if ( userObject.contains( "id" ) ) { + userId = userObject["id"].toString(); + } else if ( userObject.contains( "_id" ) ) { + userId = userObject["_id"].toString(); + } + + if ( userObject.contains( "username" ) ) { + username = userObject["username"].toString(); + } if ( userObject.contains( "status" ) ) { status = userObject["status"].toString(); } - if ( userId.isEmpty() && userObject.contains( "_id" ) ) { - userId = userObject["_id"].toString(); + if ( userObject.contains( "name" ) ) { + name = userObject["name"].toString(); } QSharedPointer<RocketChatUser> user; - QString name = userObject["name"].toString(); + auto oldUser = userModel->getUserById( userId ); if ( !oldUser.isNull() ) { diff --git a/sql.qrc b/sql.qrc index 2efe50d77fcfd806a1878187d225f26dc30a31c8..704a7f271bd99d2db7a24b93cb13a51fbb629864 100644 --- a/sql.qrc +++ b/sql.qrc @@ -5,5 +5,6 @@ <file>sql/migrations/2.sql</file> <file>sql/migrations/3.sql</file> <file>sql/migrations/4.sql</file> + <file>sql/migrations/5.sql</file> </qresource> </RCC> diff --git a/sql/migrations/5.sql b/sql/migrations/5.sql new file mode 100644 index 0000000000000000000000000000000000000000..87b997d5b223fd6338cb0bb4f5f7d4ebd42a0f5e --- /dev/null +++ b/sql/migrations/5.sql @@ -0,0 +1,2 @@ +ALTER TABLE rooms ADD chat_partner_id varchar(100) DEFAULT ""; +REPLACE INTO app_info (db_ver) VALUES(5);