/* * Squawk messenger. * Copyright (C) 2019 Yury Gubich * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CORE_ACCOUNT_H #define CORE_ACCOUNT_H #include #include #include #include #include #include #include #include #include #include #include "../global.h" #include "contact.h" namespace Core { class Account : public QObject { Q_OBJECT class MucInfo; public: Account(const QString& p_login, const QString& p_server, const QString& p_password, const QString& p_name, QObject* parent = 0); ~Account(); void connect(); void disconnect(); void reconnect(); Shared::ConnectionState getState() const; QString getName() const; QString getLogin() const; QString getServer() const; QString getPassword() const; QString getResource() const; Shared::Availability getAvailability() const; void setName(const QString& p_name); void setLogin(const QString& p_login); void setServer(const QString& p_server); void setPassword(const QString& p_password); void setResource(const QString& p_resource); void setAvailability(Shared::Availability avail); QString getFullJid() const; void sendMessage(const Shared::Message& data); void requestArchive(const QString& jid, int count, const QString& before); void setReconnectTimes(unsigned int times); void subscribeToContact(const QString& jid, const QString& reason); void unsubscribeFromContact(const QString& jid, const QString& reason); void removeContactRequest(const QString& jid); void addContactRequest(const QString& jid, const QString& name, const QSet& groups); signals: void connectionStateChanged(int); void availabilityChanged(int); void addGroup(const QString& name); void removeGroup(const QString& name); void addRoom(const QString& jid, const QMap& data); void changeRoom(const QString& jid, const QMap& data); void removeRoom(const QString& jid); void addContact(const QString& jid, const QString& group, const QMap& data); void removeContact(const QString& jid); void removeContact(const QString& jid, const QString& group); void changeContact(const QString& jid, const QMap& data); void addPresence(const QString& jid, const QString& name, const QMap& data); void removePresence(const QString& jid, const QString& name); void message(const Shared::Message& data); void responseArchive(const QString& jid, const std::list& list); void error(const QString& text); private: QString name; std::map achiveQueries; QXmppClient client; QXmppConfiguration config; QXmppPresence presence; Shared::ConnectionState state; std::map> groups; QXmppCarbonManager* cm; QXmppMamManager* am; QXmppMucManager* mm; QXmppBookmarkManager* bm; std::map contacts; unsigned int maxReconnectTimes; unsigned int reconnectTimes; std::map queuedContacts; std::set outOfRosterContacts; std::map mucInfo; private slots: void onClientConnected(); void onClientDisconnected(); void onClientError(QXmppClient::Error err); void onRosterReceived(); void onRosterItemAdded(const QString& bareJid); void onRosterItemChanged(const QString& bareJid); void onRosterItemRemoved(const QString& bareJid); void onRosterPresenceChanged(const QString& bareJid, const QString& resource); void onPresenceReceived(const QXmppPresence& presence); void onMessageReceived(const QXmppMessage& message); void onCarbonMessageReceived(const QXmppMessage& message); void onCarbonMessageSent(const QXmppMessage& message); void onMamMessageReceived(const QString& bareJid, const QXmppMessage& message); void onMamResultsReceived(const QString &queryId, const QXmppResultSetReply &resultSetReply, bool complete); void onMucRoomAdded(QXmppMucRoom* room); void onMucJoined(); void onMucLeft(); void onMucNameChanged(const QString& roomName); void onMucNickNameChanged(const QString& nickName); void onMucError(const QXmppStanza::Error& error); void onMucMessage(const QXmppMessage& message); void bookmarksReceived(const QXmppBookmarkSet& bookmarks); void onContactGroupAdded(const QString& group); void onContactGroupRemoved(const QString& group); void onContactNameChanged(const QString& name); void onContactSubscriptionStateChanged(Shared::SubscriptionState state); void onContactHistoryResponse(const std::list& list); void onContactNeedHistory(const QString& before, const QString& after, const QDateTime& at); void onMamLog(QXmppLogger::MessageType type, const QString &msg); private: void addedAccount(const QString &bareJid); void handleNewContact(Contact* contact); bool handleChatMessage(const QXmppMessage& msg, bool outgoing = false, bool forwarded = false, bool guessing = false); void addToGroup(const QString& jid, const QString& group); void removeFromGroup(const QString& jid, const QString& group); void initializeMessage(Shared::Message& target, const QXmppMessage& source, bool outgoing = false, bool forwarded = false, bool guessing = false) const; Shared::SubscriptionState castSubscriptionState(QXmppRosterIq::Item::SubscriptionType qs) const; void logMessage(const QXmppMessage& msg, const QString& reason = "Message wasn't handled: "); class MucInfo { public: MucInfo(bool p_al, bool p_jo, const QString& p_jid, const QString& p_name, const QString& p_nick): autoJoin(p_al), joined(p_jo), jid(p_jid), name(p_name), nick(p_nick), removed(false) {} bool autoJoin; bool joined; QString jid; QString name; QString nick; bool removed; }; }; } #endif // CORE_ACCOUNT_H