File indexing completed on 2024-04-28 04:55:37

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 &params = 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