| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #pragma once
- #include "Protocol.h"
- #include <QByteArray>
- #include <QHash>
- #include <QJsonObject>
- #include <QObject>
- #include <QVector>
- #include <functional>
- class QTcpSocket;
- class QTimer;
- class ImClient : public QObject
- {
- Q_OBJECT
- public:
- using Reply = std::function<void(const QJsonObject &)>;
- static ImClient &instance();
- bool isConnected() const;
- qint64 uid() const { return m_uid; }
- QString account() const { return m_account; }
- QString nickname() const { return m_nickname; }
- QString phone() const { return m_phone; }
- QString signature() const { return m_signature; }
- int avatarVer() const { return m_avatarVer; }
- QString sessionPassword() const { return m_sessionPassword; }
- bool isIntentionalClose() const { return m_intentionalClose; }
- void connectToServer();
- void disconnectFromServer();
- void clearProfile();
- void login(const QString &account, const QString &password, Reply cb);
- void logout(Reply cb);
- void registerUser(const QString &nickname, const QString &account, const QString &phone,
- const QString &smsCode, const QString &password, Reply cb);
- void sendCode(const QString &phone, const QString &scene, Reply cb);
- void resetPassword(qint64 uid, const QString &phone, const QString &smsCode,
- const QString &password, Reply cb);
- void changePassword(const QString &oldPassword, const QString &password, Reply cb);
- void friendList(Reply cb);
- void searchUser(const QString &keyword, Reply cb);
- void addFriend(qint64 uid, Reply cb);
- void addFriend(qint64 uid, const QString &message, Reply cb);
- void addFriendAccount(const QString &account, Reply cb);
- void friendRequestList(Reply cb);
- void handleFriendRequest(qint64 id, int action, Reply cb);
- void getPrivacy(Reply cb);
- void setPrivacy(int allowSearchAccount, int allowSearchPhone, int allowAddFriend, Reply cb);
- void stickerPackList(Reply cb);
- void stickerPack(qint64 packId, Reply cb);
- void getSticker(qint64 packId, const QString &code, Reply cb);
- void convList(Reply cb);
- void msgHistory(qint64 peerUid, qint64 lastId, int limit, Reply cb);
- void deleteConv(qint64 peerUid, Reply cb);
- void deleteMsgs(qint64 peerUid, const QVector<qint64> &ids, Reply cb);
- void setUnread(qint64 peerUid, int unread, Reply cb);
- void deleteFriend(qint64 uid, Reply cb);
- void setRemark(qint64 uid, const QString &remark, Reply cb);
- void getProfile(qint64 uid, Reply cb);
- void setProfile(const QString &nickname, const QString &signature, const QByteArray &avatarJpeg,
- Reply cb);
- void getAvatar(qint64 uid, Reply cb);
- void putFile(const QString &name, const QString &mime, qint64 size, Reply cb);
- void putFile(const QString &name, const QString &mime, qint64 size, const QString &purpose,
- Reply cb);
- void getFile(qint64 fileId, Reply cb);
- void favoriteAdd(const QJsonObject &body, Reply cb, int timeoutMs = 15000);
- void favoriteList(Reply cb);
- void favoriteGet(qint64 id, Reply cb);
- void favoriteUpdate(qint64 id, const QString &content, Reply cb);
- void favoriteDelete(qint64 id, Reply cb);
- void chat(qint64 toUid, const QString &content, Reply cb);
- void chat(qint64 toUid, int msgType, const QString &content, Reply cb);
- void applyLocalProfile(const QString &nickname, const QString &signature, int avatarVer);
- static bool ok(const QJsonObject &reply);
- static QString messageOf(const QJsonObject &reply);
- signals:
- void connected();
- void disconnected();
- void connectFailed(const QString &reason);
- void kicked();
- void limitsUpdated();
- void chatNotify(const QJsonObject &msg);
- void friendRequestNotify(const QJsonObject &msg);
- void friendAcceptedNotify(const QJsonObject &msg);
- private:
- explicit ImClient(QObject *parent = nullptr);
- ~ImClient() override;
- struct Pending
- {
- Reply cb;
- };
- void request(Proto::Type type, Proto::Cmd cmd, const QJsonObject &body, Reply cb,
- int timeoutMs = 15000);
- void flushQueue();
- void failAll(const QString &reason);
- void sendRaw(Proto::Type type, Proto::Cmd cmd, quint32 seq, const QByteArray &body);
- void onReadyRead();
- void onConnected();
- void onDisconnected();
- void onSocketError();
- void onHeartbeat();
- void handlePacket(const Proto::Packet &pkt);
- void applyLoginProfile(const QJsonObject &reply);
- void applyLimitsFromReply(const QJsonObject &reply);
- QJsonObject netError(const QString &msg) const;
- QTcpSocket *m_socket = nullptr;
- QTimer *m_heartbeat = nullptr;
- Proto::PacketCodec *m_codec = nullptr;
- quint32 m_seq = 0;
- bool m_intentionalClose = false;
- bool m_configReady = false;
- qint64 m_uid = 0;
- QString m_account;
- QString m_nickname;
- QString m_phone;
- QString m_signature;
- int m_avatarVer = 0;
- QString m_sessionPassword;
- QHash<quint32, Pending> m_pending;
- struct Queued
- {
- quint16 type = 0;
- quint16 cmd = 0;
- QJsonObject body;
- Reply cb;
- int timeoutMs = 15000;
- };
- QVector<Queued> m_queue;
- };
|