forked from blue/squawk
delivery statuses now actually mean something for MUC messages
This commit is contained in:
parent
6d1b83d0f8
commit
91cc851bfc
@ -51,7 +51,8 @@ Account::Account(const QString& p_login, const QString& p_server, const QString&
|
||||
avatarHash(),
|
||||
avatarType(),
|
||||
ownVCardRequestInProgress(false),
|
||||
network(p_net)
|
||||
network(p_net),
|
||||
pendingStateMessages()
|
||||
{
|
||||
config.setUser(p_login);
|
||||
config.setDomain(p_server);
|
||||
@ -594,7 +595,7 @@ QString Core::Account::getFullJid() const
|
||||
void Core::Account::sendMessage(const Shared::Message& data)
|
||||
{
|
||||
if (state == Shared::connected) {
|
||||
QXmppMessage msg(data.getFrom(), data.getTo(), data.getBody(), data.getThread());
|
||||
QXmppMessage msg(getFullJid(), data.getTo(), data.getBody(), data.getThread());
|
||||
msg.setId(data.getId());
|
||||
msg.setType(static_cast<QXmppMessage::Type>(data.getType())); //it is safe here, my type is compatible
|
||||
msg.setOutOfBandUrl(data.getOutOfBandUrl());
|
||||
@ -611,9 +612,8 @@ void Core::Account::sendMessage(const Shared::Message& data)
|
||||
}
|
||||
|
||||
if (ri != 0) {
|
||||
if (!ri->isMuc()) {
|
||||
ri->appendMessageToArchive(data);
|
||||
}
|
||||
pendingStateMessages.insert(std::make_pair(data.getId(), data.getPenPalJid()));
|
||||
}
|
||||
|
||||
client.sendPacket(msg);
|
||||
@ -731,12 +731,18 @@ bool Core::Account::handleGroupMessage(const QXmppMessage& msg, bool outgoing, b
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
cnt->appendMessageToArchive(sMsg);
|
||||
|
||||
QDateTime fiveMinsAgo = QDateTime::currentDateTime().addSecs(-300);
|
||||
if (sMsg.getTime() > fiveMinsAgo) { //otherwise it's considered a delayed delivery, most probably MUC history receipt
|
||||
std::map<QString, QString>::const_iterator pItr = pendingStateMessages.find(id);
|
||||
if (pItr != pendingStateMessages.end()) {
|
||||
cnt->changeMessageState(id, Shared::Message::State::delivered);
|
||||
emit changeMessage(jid, id, {{"state", static_cast<uint>(Shared::Message::State::delivered)}});
|
||||
} else {
|
||||
cnt->appendMessageToArchive(sMsg);
|
||||
QDateTime minAgo = QDateTime::currentDateTime().addSecs(-60);
|
||||
if (sMsg.getTime() > minAgo) { //otherwise it's considered a delayed delivery, most probably MUC history receipt
|
||||
emit message(sMsg);
|
||||
}
|
||||
}
|
||||
|
||||
if (!forwarded && !outgoing) {
|
||||
if (msg.isReceiptRequested() && id.size() > 0) {
|
||||
|
@ -113,6 +113,7 @@ signals:
|
||||
void addPresence(const QString& jid, const QString& name, const QMap<QString, QVariant>& data);
|
||||
void removePresence(const QString& jid, const QString& name);
|
||||
void message(const Shared::Message& data);
|
||||
void changeMessage(const QString& jid, const QString& id, const QMap<QString, QVariant>& data);
|
||||
void responseArchive(const QString& jid, const std::list<Shared::Message>& list);
|
||||
void error(const QString& text);
|
||||
void addRoomParticipant(const QString& jid, const QString& nickName, const QMap<QString, QVariant>& data);
|
||||
@ -153,6 +154,7 @@ private:
|
||||
QString avatarType;
|
||||
bool ownVCardRequestInProgress;
|
||||
NetworkAccess* network;
|
||||
std::map<QString, QString> pendingStateMessages;
|
||||
|
||||
private slots:
|
||||
void onClientConnected();
|
||||
|
@ -221,6 +221,46 @@ void Core::RosterItem::appendMessageToArchive(const Shared::Message& msg)
|
||||
}
|
||||
}
|
||||
|
||||
void Core::RosterItem::changeMessageState(const QString& id, Shared::Message::State newState)
|
||||
{
|
||||
bool found = false;
|
||||
for (Shared::Message& msg : appendCache) {
|
||||
if (msg.getId() == id) {
|
||||
msg.setState(newState);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
for (Shared::Message& msg : hisoryCache) {
|
||||
if (msg.getId() == id) {
|
||||
msg.setState(newState);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
try {
|
||||
archive->setMessageState(id, newState);
|
||||
found = true;
|
||||
} catch (const Archive::NotFound& e) {
|
||||
qDebug() << "An attempt to change state to the message" << id << "but it couldn't be found";
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
for (Shared::Message& msg : responseCache) {
|
||||
if (msg.getId() == id) {
|
||||
msg.setState(newState);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Core::RosterItem::flushMessagesToArchive(bool finished, const QString& firstId, const QString& lastId)
|
||||
{
|
||||
unsigned int added(0);
|
||||
|
@ -72,6 +72,8 @@ public:
|
||||
virtual Shared::VCard handleResponseVCard(const QXmppVCardIq& card, const QString& resource);
|
||||
virtual void handlePresence(const QXmppPresence& pres) = 0;
|
||||
|
||||
void changeMessageState(const QString& id, Shared::Message::State newState);
|
||||
|
||||
signals:
|
||||
void nameChanged(const QString& name);
|
||||
void subscriptionStateChanged(Shared::SubscriptionState state);
|
||||
|
@ -125,6 +125,7 @@ void Core::Squawk::addAccount(const QString& login, const QString& server, const
|
||||
connect(acc, &Account::addPresence, this, &Squawk::onAccountAddPresence);
|
||||
connect(acc, &Account::removePresence, this, &Squawk::onAccountRemovePresence);
|
||||
connect(acc, &Account::message, this, &Squawk::onAccountMessage);
|
||||
connect(acc, &Account::changeMessage, this, &Squawk::onAccountChangeMessage);
|
||||
connect(acc, &Account::responseArchive, this, &Squawk::onAccountResponseArchive);
|
||||
|
||||
connect(acc, &Account::addRoom, this, &Squawk::onAccountAddRoom);
|
||||
@ -488,6 +489,14 @@ void Core::Squawk::onAccountRemoveRoomPresence(const QString& jid, const QString
|
||||
emit removeRoomParticipant(acc->getName(), jid, nick);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Core::Squawk::onAccountChangeMessage(const QString& jid, const QString& id, const QMap<QString, QVariant>& data)
|
||||
{
|
||||
Account* acc = static_cast<Account*>(sender());
|
||||
emit changeMessage(acc->getName(), jid, id, data);
|
||||
}
|
||||
|
||||
void Core::Squawk::removeRoomRequest(const QString& account, const QString& jid)
|
||||
{
|
||||
AccountsMap::const_iterator itr = amap.find(account);
|
||||
@ -567,3 +576,4 @@ void Core::Squawk::uploadVCard(const QString& account, const Shared::VCard& card
|
||||
}
|
||||
itr->second->uploadVCard(card);
|
||||
}
|
||||
|
||||
|
@ -69,6 +69,7 @@ signals:
|
||||
void uploadFileError(const QString& messageId, const QString& error);
|
||||
void uploadFileProgress(const QString& messageId, qreal value);
|
||||
void responseVCard(const QString& jid, const Shared::VCard& card);
|
||||
void changeMessage(const QString& account, const QString& jid, const QString& id, const QMap<QString, QVariant>& data);
|
||||
|
||||
public slots:
|
||||
void start();
|
||||
@ -131,6 +132,7 @@ private slots:
|
||||
void onAccountAddRoomPresence(const QString& jid, const QString& nick, const QMap<QString, QVariant>& data);
|
||||
void onAccountChangeRoomPresence(const QString& jid, const QString& nick, const QMap<QString, QVariant>& data);
|
||||
void onAccountRemoveRoomPresence(const QString& jid, const QString& nick);
|
||||
void onAccountChangeMessage(const QString& jid, const QString& id, const QMap<QString, QVariant>& data);
|
||||
};
|
||||
|
||||
}
|
||||
|
1
main.cpp
1
main.cpp
@ -127,6 +127,7 @@ int main(int argc, char *argv[])
|
||||
QObject::connect(squawk, &Core::Squawk::removePresence, &w, &Squawk::removePresence);
|
||||
QObject::connect(squawk, &Core::Squawk::stateChanged, &w, &Squawk::stateChanged);
|
||||
QObject::connect(squawk, &Core::Squawk::accountMessage, &w, &Squawk::accountMessage);
|
||||
QObject::connect(squawk, &Core::Squawk::changeMessage, &w, &Squawk::changeMessage);
|
||||
QObject::connect(squawk, &Core::Squawk::responseArchive, &w, &Squawk::responseArchive);
|
||||
QObject::connect(squawk, &Core::Squawk::addRoom, &w, &Squawk::addRoom);
|
||||
QObject::connect(squawk, &Core::Squawk::changeRoom, &w, &Squawk::changeRoom);
|
||||
|
@ -47,13 +47,16 @@ Room::~Room()
|
||||
void Room::handleSendMessage(const QString& text)
|
||||
{
|
||||
Shared::Message msg(Shared::Message::groupChat);
|
||||
msg.setFrom(account->getFullJid());
|
||||
msg.setFromJid(room->getJid());
|
||||
msg.setFromResource(room->getNick());
|
||||
msg.setToJid(palJid);
|
||||
//msg.setToResource(activePalResource);
|
||||
msg.setBody(text);
|
||||
msg.setOutgoing(true);
|
||||
msg.generateRandomId();
|
||||
msg.setCurrentTime();
|
||||
msg.setState(Shared::Message::State::pending);
|
||||
addMessage(msg);
|
||||
emit sendMessage(msg);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user