File indexing completed on 2024-05-19 12:37:34
0001 /* 0002 This file is part of Choqok, the KDE micro-blogging client 0003 0004 SPDX-FileCopyrightText: 2008-2012 Mehrdad Momeny <mehrdad.momeny@gmail.com> 0005 0006 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0007 */ 0008 0009 #ifndef TWITTERAPIMICROBLOG_H 0010 #define TWITTERAPIMICROBLOG_H 0011 0012 #include <QDateTime> 0013 #include <QNetworkAccessManager> 0014 #include <QUrlQuery> 0015 0016 #include "microblog.h" 0017 #include "twitterapisearch.h" 0018 0019 class TwitterApiSearchTimelineWidget; 0020 class TwitterApiAccount; 0021 class KJob; 0022 0023 /** 0024 @author Mehrdad Momeny \<mehrdad.momeny@gmail.com\> 0025 */ 0026 class TWITTERAPIHELPER_EXPORT TwitterApiMicroBlog : public Choqok::MicroBlog 0027 { 0028 Q_OBJECT 0029 public: 0030 ~TwitterApiMicroBlog(); 0031 0032 virtual QMenu *createActionsMenu(Choqok::Account *theAccount, 0033 QWidget *parent = Choqok::UI::Global::mainWindow()) override; 0034 virtual QList< Choqok::Post * > loadTimeline(Choqok::Account *accountAlias, const QString &timelineName) override; 0035 virtual void saveTimeline(Choqok::Account *account, const QString &timelineName, 0036 const QList< Choqok::UI::PostWidget * > &timeline) override; 0037 0038 virtual Choqok::UI::ComposerWidget *createComposerWidget(Choqok::Account *account, QWidget *parent) override; 0039 /** 0040 \brief Create a new post 0041 0042 @see postCreated() 0043 @see abortCreatePost() 0044 */ 0045 virtual void createPost(Choqok::Account *theAccount, Choqok::Post *post) override; 0046 0047 /** 0048 \brief Abort all requests! 0049 */ 0050 virtual void abortAllJobs(Choqok::Account *theAccount) override; 0051 0052 /** 0053 \brief Abort all of createPost requests! 0054 */ 0055 virtual void abortCreatePost(Choqok::Account *theAccount, Choqok::Post *post = nullptr) override; 0056 0057 /** 0058 \brief Fetch a post 0059 0060 @see postFetched() 0061 */ 0062 virtual void fetchPost(Choqok::Account *theAccount, Choqok::Post *post) override; 0063 0064 /** 0065 \brief Remove a post 0066 0067 @see postRemoved() 0068 */ 0069 virtual void removePost(Choqok::Account *theAccount, Choqok::Post *post) override; 0070 0071 /** 0072 \brief Repeat/Retweet a post using the API 0073 */ 0074 virtual void repeatPost(Choqok::Account *theAccount, const QString &postId); 0075 0076 /** 0077 Request to update all timelines of account! 0078 They will arrive in several signals! with timelineDataReceived() signal! 0079 0080 @see timelineDataReceived() 0081 */ 0082 virtual void updateTimelines(Choqok::Account *theAccount) override; 0083 0084 /** 0085 add post with Id @p postId to @p theAccount favorite list 0086 */ 0087 virtual void createFavorite(Choqok::Account *theAccount, const QString &postId); 0088 0089 /** 0090 remove post with Id @p postId from @p theAccount favorite list 0091 */ 0092 virtual void removeFavorite(Choqok::Account *theAccount, const QString &postId); 0093 0094 /** 0095 Create friendship, or Follow/Subscribe to user with username or screen name @p username 0096 i.e. Follow / Subscribe 0097 */ 0098 virtual void createFriendship(Choqok::Account *theAccount, const QString &username); 0099 0100 /** 0101 Destroy friendship with user with username or screen name @p username 0102 i.e. Un Follow / UnSubscribe 0103 */ 0104 virtual void destroyFriendship(Choqok::Account *theAccount, const QString &username); 0105 0106 /** 0107 Block user with username or screen name @p username 0108 */ 0109 virtual void blockUser(Choqok::Account *theAccount, const QString &username); 0110 0111 /** 0112 * Report user as a spam with username or screen name @p username 0113 */ 0114 virtual void reportUserAsSpam(Choqok::Account *theAccount, const QString &username); 0115 0116 virtual void aboutToUnload() override; 0117 0118 virtual void listFriendsUsername(TwitterApiAccount *theAccount, bool active = false); 0119 0120 virtual void listFollowersUsername(TwitterApiAccount *theAccount, bool active = false); 0121 0122 virtual Choqok::TimelineInfo *timelineInfo(const QString &timelineName) override; 0123 0124 /** 0125 Return search backend to use for search. 0126 Should be implemented on sub classes 0127 */ 0128 virtual TwitterApiSearch *searchBackend() = 0; 0129 0130 virtual TwitterApiSearchTimelineWidget *createSearchTimelineWidget(Choqok::Account *theAccount, 0131 QString name, const SearchInfo &info, 0132 QWidget *parent); 0133 0134 QDateTime dateFromString(const QString &date); 0135 0136 /** 0137 * The text to add under repeated posts, to notice user about it. 0138 */ 0139 virtual QString generateRepeatedByUserTooltip(const QString &username) = 0; 0140 0141 /** 0142 * The question will show to confirm repeat post. 0143 */ 0144 virtual QString repeatQuestion() = 0; 0145 0146 virtual QByteArray authorizationHeader(TwitterApiAccount *theAccount, 0147 const QUrl &requestUrl, QNetworkAccessManager::Operation method, 0148 const QVariantMap ¶ms = QVariantMap()); 0149 0150 public Q_SLOTS: 0151 /** 0152 Launch a dialog to send direct message. 0153 There are 2 ways to use this function: 0154 1. Calling with theAccount option 0155 2. Get called by a signal from a QAction (Microblog menu) 0156 */ 0157 virtual void showDirectMessageDialog(TwitterApiAccount *theAccount = nullptr, 0158 const QString &toUsername = QString()); 0159 0160 void showSearchDialog(TwitterApiAccount *theAccount = nullptr); 0161 0162 Q_SIGNALS: 0163 void favoriteCreated(Choqok::Account *theAccount, const QString &postId); 0164 void favoriteRemoved(Choqok::Account *theAccount, const QString &postId); 0165 void friendsUsernameListed(TwitterApiAccount *theAccount, const QStringList &friendsList); 0166 void followersUsernameListed(TwitterApiAccount *theAccount, const QStringList &friendsList); 0167 0168 void friendshipCreated(Choqok::Account *theAccount, const QString &newFriendUsername); 0169 void friendshipDestroyed(Choqok::Account *theAccount, const QString &username); 0170 void userBlocked(Choqok::Account *theAccount, const QString &blockedUsername); 0171 0172 protected Q_SLOTS: 0173 virtual void slotCreatePost(KJob *job); 0174 virtual void slotFetchPost(KJob *job); 0175 virtual void slotRemovePost(KJob *job); 0176 virtual void slotCreateFavorite(KJob *job); 0177 virtual void slotRemoveFavorite(KJob *job); 0178 virtual void slotRequestTimeline(KJob *job); 0179 virtual void requestFriendsScreenName(TwitterApiAccount *theAccount, bool active); 0180 void slotRequestFriendsScreenNameActive(KJob *job); 0181 void slotRequestFriendsScreenNamePassive(KJob *job); 0182 virtual void requestFollowersScreenName(TwitterApiAccount *theAccount, bool active); 0183 void slotRequestFollowersScreenNameActive(KJob *job); 0184 void slotRequestFollowersScreenNamePassive(KJob *job); 0185 virtual void slotCreateFriendship(KJob *job); 0186 virtual void slotDestroyFriendship(KJob *job); 0187 virtual void slotBlockUser(KJob *job); 0188 virtual void slotReportUser(KJob *job); 0189 virtual void slotUpdateFriendsList(); 0190 0191 protected: 0192 TwitterApiMicroBlog(const QString &componentName, QObject *parent = nullptr); 0193 /** 0194 Request update for @p timelineName timeline. 0195 timelineName should be a valid, previously created timeline. 0196 */ 0197 virtual void requestTimeLine(Choqok::Account *theAccount, QString timelineName, 0198 QString sincePostId, int page = 1, QString maxId = QString()); 0199 0200 virtual void setTimelineInfos(); 0201 0202 void setRepeatedOfInfo(Choqok::Post *post, Choqok::Post *repeatedPost); 0203 0204 virtual Choqok::Post *readPost(Choqok::Account *theAccount, 0205 const QVariantMap &var, Choqok::Post *post); 0206 virtual Choqok::Post *readPost(Choqok::Account *theAccount, 0207 const QByteArray &buffer, Choqok::Post *post); 0208 virtual QList<Choqok::Post *> readTimeline(Choqok::Account *theAccount, const QByteArray &buffer); 0209 virtual Choqok::Post *readDirectMessage(Choqok::Account *theAccount, const QByteArray &buffer); 0210 virtual Choqok::Post *readDirectMessage(Choqok::Account *theAccount, const QVariantMap &var); 0211 virtual QList<Choqok::Post *> readDirectMessages(Choqok::Account *theAccount, const QByteArray &buffer); 0212 virtual QStringList readFriendsScreenName(Choqok::Account *theAccount, const QByteArray &buffer); 0213 virtual QStringList readFollowersScreenName(Choqok::Account *theAccount, const QByteArray &buffer); 0214 virtual Choqok::User *readUserInfo(const QByteArray &buffer); 0215 virtual Choqok::User readUser(Choqok::Account *theAccount, const QVariantMap &map); 0216 /** 0217 Checks json returned from server for error, and return error string, Or an empty string if nothing found! 0218 */ 0219 virtual QString checkForError(const QByteArray &buffer); 0220 void finishRequestFriendsScreenName(KJob *job, bool active); 0221 void finishRequestFollowersScreenName(KJob *job, bool active); 0222 void setQuotedPost(Choqok::Post* post, Choqok::Post* quotedPost); 0223 0224 ///========================================== 0225 QHash<QString, QString> timelineApiPath;//TimelineType, path 0226 QMap<QString, Choqok::TimelineInfo *> mTimelineInfos; //timelineName, Info 0227 0228 QMap<KJob *, QString> mFavoriteMap; //Job, postId 0229 QMap<KJob *, Choqok::Post *> mRemovePostMap; 0230 QMap<KJob *, Choqok::Post *> mCreatePostMap; //Job, post 0231 QMap<KJob *, Choqok::Post *> mFetchPostMap; 0232 QMap<KJob *, QString> mRequestTimelineMap; //Job, TimelineType 0233 QHash< Choqok::Account *, QMap<QString, QString> > mTimelineLatestId; //TimelineType, LatestId 0234 QMap<KJob *, Choqok::Account *> mJobsAccount; 0235 QMap<KJob *, QString> mFriendshipMap; 0236 QStringList friendsList; 0237 QStringList followersList; 0238 0239 private: 0240 class Private; 0241 Private *const d; 0242 }; 0243 0244 #endif