Skip to content

Commit

Permalink
Added XEP-0424: message retraction support
Browse files Browse the repository at this point in the history
  • Loading branch information
Ri0n committed Jul 3, 2024
1 parent c6d401b commit ec259f6
Show file tree
Hide file tree
Showing 16 changed files with 185 additions and 112 deletions.
2 changes: 1 addition & 1 deletion iris
10 changes: 10 additions & 0 deletions psi.doap
Original file line number Diff line number Diff line change
Expand Up @@ -781,6 +781,16 @@
</xmpp:SupportedXep>
</implements>

<!-- XEP-0424: Message retraction -->
<implements>
<xmpp:SupportedXep>
<xmpp:xep rdf:resource='https://xmpp.org/extensions/xep-0424.html'/>
<xmpp:status>partial</xmpp:status>
<xmpp:note xml:lang='en'>Without security checks for now.</xmpp:note>
<xmpp:version>0.2.1</xmpp:version>
</xmpp:SupportedXep>
</implements>

<!-- XEP-0444: Message Reactions -->
<implements>
<xmpp:SupportedXep>
Expand Down
14 changes: 13 additions & 1 deletion src/chatdlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include "iconaction.h"
#include "iconlabel.h"
#include "iconselect.h"
#include "iconwidget.h"
#include "jidutil.h"
#include "msgmle.h"
#include "pgputil.h"
Expand Down Expand Up @@ -149,6 +148,7 @@ void ChatDlg::init()
#endif
chatView()->init();
connect(chatView(), &ChatView::outgoingReactions, this, &ChatDlg::sendOutgoingReactions);
connect(chatView(), &ChatView::outgoingMessageRetraction, this, &ChatDlg::sendMessageRetraction);

// seems its useless hack
// connect(chatView(), SIGNAL(selectionChanged()), SLOT(logSelectionChanged())); //
Expand Down Expand Up @@ -769,6 +769,14 @@ void ChatDlg::sendOutgoingReactions(const QString &messageId, const QSet<QString
emit aSend(m);
}

void ChatDlg::sendMessageRetraction(const QString &messageId)
{
Message m(jid());
m.setType(Message::Type::Chat);
m.setRetraction(messageId);
emit aSend(m);
}

void ChatDlg::encryptedMessageSent(int x, bool b, int e, const QString &dtext)
{
Q_UNUSED(e);
Expand Down Expand Up @@ -806,6 +814,10 @@ void ChatDlg::incomingMessage(const Message &m)
auto mv = MessageView::reactionsMessage({}, m.reactions().targetId, m.reactions().reactions);
chatView()->dispatchMessage(mv);
}
if (!m.retraction().isEmpty()) {
auto mv = MessageView::retractionMessage(m.retraction());
chatView()->dispatchMessage(mv);
}
} else {
// Normal message
// Check if user requests event messages
Expand Down
1 change: 1 addition & 0 deletions src/chatdlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ private slots:
void setComposing();
void getHistory();
void sendOutgoingReactions(const QString &messageId, const QSet<QString> &reactions);
void sendMessageRetraction(const QString &messageId);

protected slots:
void checkComposing();
Expand Down
1 change: 1 addition & 0 deletions src/chatview_te.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ private slots:
void quote(const QString &text);
void nickInsertClick(const QString &nick);
void outgoingReactions(const QString &messageId, const QSet<QString> &reactions);
void outgoingMessageRetraction(const QString &messageId);

private:
bool isMuc_;
Expand Down
19 changes: 16 additions & 3 deletions src/chatview_webkit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,13 +339,22 @@ class ChatViewJSObject : public ChatViewThemeSession {
_view->outgoingReaction(messageId, reaction);
}

Q_INVOKABLE void deleteMessage(const QString &messageId) { qDebug() << "deleteMessage" << messageId; }
Q_INVOKABLE void deleteMessage(const QString &messageId)
{
emit _view->outgoingMessageRetraction(messageId);
if (!_view->d->isMuc_) {
// send back immediately coz it's not it's not iq and not MUC where server sends it back
QVariantMap vm;
vm["type"] = QLatin1String("msgretract");
vm["targetid"] = messageId;
emit newMessage(vm);
}
}

Q_INVOKABLE void replyMessage(const QString &messageId, const QString &quotedHtml)
{
auto plainText = TextUtil::rich2plain(quotedHtml);
emit _view->quote(plainText);
qDebug() << "replyMessage" << messageId;
}

Q_INVOKABLE void copyMessage(const QString &messageId) { qDebug() << "copyMessage" << messageId; }
Expand Down Expand Up @@ -676,6 +685,7 @@ void ChatView::dispatchMessage(const MessageView &mv)
types.insert(MessageView::FileTransferFinished, "ftfin");
types.insert(MessageView::NickChange, "newnick");
types.insert(MessageView::Reactions, "reactions");
types.insert(MessageView::MessageRetraction, "msgretract");
}
QVariantMap m;
switch (mv.type()) {
Expand Down Expand Up @@ -741,6 +751,9 @@ void ChatView::dispatchMessage(const MessageView &mv)
d->sendReactionsToUI(n, mv.reactionsId(), mv.reactions());
return;
}
case MessageView::MessageRetraction:
m["targetid"] = mv.retractionId();
break;
case MessageView::FileTransferRequest:
case MessageView::FileTransferFinished:
break;
Expand All @@ -762,7 +775,7 @@ void ChatView::dispatchMessage(const MessageView &mv)
if (!replaceId.isEmpty()) {
m["type"] = "replace";
m["replaceId"] = replaceId;
} else {
} else if (mv.type() != MessageView::MessageRetraction) {
m["mtype"] = m["type"];
m["type"] = "message";
}
Expand Down
1 change: 1 addition & 0 deletions src/chatview_webkit.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ private slots:
void nickInsertClick(const QString &nick);
void quote(const QString &text);
void outgoingReactions(const QString &messageId, const QSet<QString> &reactions);
void outgoingMessageRetraction(const QString &messageId);

private:
friend class ChatViewPrivate;
Expand Down
20 changes: 20 additions & 0 deletions src/groupchatdlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,19 @@ void GCMainDlg::outgoingReactions(const QString &messageId, const QSet<QString>
emit aSend(m);
}

void GCMainDlg::sendMessageRetraction(const QString &messageId)
{
Message m(jid());
m.setType(Message::Type::Groupchat);
m.setRetraction(messageId);
// QString id = account()->client()->genUniqueId();
// m.setId(id); // we need id early for message manipulations in chatview
// m.setTimeStamp(QDateTime::currentDateTime());
// d->mle()->appendMessageHistory(m.body());

emit aSend(m);
}

void GCMainDlg::doContactContextMenu(const QString &nick)
{
auto itm = d->usersModel->findEntry(nick);
Expand Down Expand Up @@ -891,6 +904,7 @@ GCMainDlg::GCMainDlg(PsiAccount *pa, const Jid &j, TabManager *tabManager) : Tab
connect(URLObject::getInstance(), SIGNAL(openURL(QString)), SLOT(openURL(QString)));
connect(ui_.log, SIGNAL(nickInsertClick(QString)), SLOT(onNickInsertClick(QString)));
connect(ui_.log, &ChatView::outgoingReactions, this, &GCMainDlg::outgoingReactions);
connect(ui_.log, &ChatView::outgoingMessageRetraction, this, &GCMainDlg::sendMessageRetraction);

PsiToolTip::install(ui_.le_topic);

Expand Down Expand Up @@ -2179,6 +2193,12 @@ void GCMainDlg::message(const Message &_m, const PsiEvent::Ptr &e)
return;
}

if (!m.retraction().isEmpty()) {
auto mv = MessageView::retractionMessage(m.retraction());
ui_.log->dispatchMessage(mv);
return;
}

if (m.body().isEmpty())
return;

Expand Down
1 change: 1 addition & 0 deletions src/groupchatdlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ private slots:
void doContactContextMenu(const QString &nick);

void outgoingReactions(const QString &messageId, const QSet<QString> &reactions);
void sendMessageRetraction(const QString &messageId);
public:
class Private;
friend class Private;
Expand Down
7 changes: 7 additions & 0 deletions src/messageview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ MessageView MessageView::reactionsMessage(const QString &nick, const QString &ta
return mv;
}

MessageView MessageView::retractionMessage(const QString &targetMessageId)
{
MessageView mv(MessageRetraction);
mv.setRetractionId(targetMessageId);
return mv;
}

MessageView MessageView::statusMessage(const QString &nick, int status, const QString &statusText, int priority)
{
QString message = QObject::tr("%1 is now %2").arg(nick, status2txt(status));
Expand Down
9 changes: 7 additions & 2 deletions src/messageview.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class MessageView {
FileTransferRequest,
FileTransferFinished,
Reactions,
MessageRetraction
};

enum Flag {
Expand Down Expand Up @@ -74,6 +75,7 @@ class MessageView {
static MessageView nickChangeMessage(const QString &nick, const QString &newNick);
static MessageView reactionsMessage(const QString &nick, const QString &targetMessageId,
const QSet<QString> &reactions);
static MessageView retractionMessage(const QString &targetMessageId);

inline Type type() const { return _type; }
inline const QString &text() const { return _text; }
Expand Down Expand Up @@ -122,12 +124,14 @@ class MessageView {
inline const QString &replaceId() const { return _replaceId; }
inline void setQuoteId(const QString &id) { _quoteId = id; }
inline const QString &quoteId() const { return _quoteId; }
inline void setReactionsId(const QString &id) { _reactionsId = id; }
inline const QString &reactionsId() const { return _reactionsId; }
inline void setRetractionId(const QString &id) { _retractionId = id; }
inline const QString &retractionId() const { return _retractionId; }
inline void setCarbonDirection(XMPP::Message::CarbonDir c) { _carbon = c; }
inline XMPP::Message::CarbonDir carbonDirection() const { return _carbon; }
inline void addReference(FileSharingItem *fsi) { _references.append(fsi); }
inline const QList<FileSharingItem *> &references() const { return _references; }
inline void setReactionsId(const QString &id) { _reactionsId = id; }
inline const QString &reactionsId() const { return _reactionsId; }
inline void setReactions(const QSet<QString> &r) { _reactions = r; }
inline const QSet<QString> &reactions() const { return _reactions; }

Expand All @@ -145,6 +149,7 @@ class MessageView {
QMap<QString, QString> _urls;
QString _replaceId;
QString _quoteId;
QString _retractionId;
QString _reactionsId;
XMPP::Message::CarbonDir _carbon;
QList<FileSharingItem *> _references;
Expand Down
6 changes: 5 additions & 1 deletion src/psiaccount.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1576,6 +1576,9 @@ void PsiAccount::updateFeatures()
if (themeFeatures.contains(QStringLiteral("reactions"))) {
features << QLatin1String("urn:xmpp:reactions:0");
}
if (themeFeatures.contains(QStringLiteral("message-retract"))) {
features << QLatin1String("urn:xmpp:message-retract:1");
}
}
#endif

Expand Down Expand Up @@ -2836,7 +2839,8 @@ void PsiAccount::processIncomingMessage(const Message &_m)
if (_m.type() != Message::Type::Error && _m.body().isEmpty() && _m.urlList().isEmpty() && _m.invite().isEmpty()
&& !_m.containsEvents() && _m.chatState() == StateNone && _m.subject().isNull()
&& _m.rosterExchangeItems().isEmpty() && _m.mucInvites().isEmpty() && _m.getForm().fields().empty()
&& _m.messageReceipt() == ReceiptNone && _m.getMUCStatuses().isEmpty() && _m.reactions().targetId.isEmpty())
&& _m.messageReceipt() == ReceiptNone && _m.getMUCStatuses().isEmpty() && _m.reactions().targetId.isEmpty()
&& _m.retraction().isEmpty())
return;

// skip headlines?
Expand Down
11 changes: 3 additions & 8 deletions themes/chatview/psi/adapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,18 +151,17 @@ function psiThemeAdapter(chat) {
shared.msgElPostProcess = config.postProcess;
for (var tname in config.templates) {
if (config.templates[tname]) {
t[tname] = new shared.Template(config.templates[tname]);
t[tname] = new shared.Template(config.templates[tname].trim());
}
}
t.message = t.message || "%message%";
t.sys = t.sys || "%message%";
t.sysMessage = t.sysMessage || t.sys;
t.sysMessageUT = t.sysMessageUT || t.sysMessage;
t.statusMessageUT = t.statusMessageUT || (t.statusMessage || t.sysMessageUT);
t.statusMessage = t.statusMessage || t.sysMessage;
t.statusMessageUT = t.statusMessageUT || (t.statusMessage || t.sysMessageUT);
t.sentMessage = t.sentMessage || t.message;
t.receivedMessage = t.receivedMessage || t.message;
t.spooledMessage = t.spooledMessage || t.message;
t.receivedMessageGroupping = t.receivedMessageGroupping || t.messageGroupping;
t.sentMessageGroupping = t.sentMessageGroupping || t.messageGroupping;
t.lastMsgDate = t.lastMsgDate || t.sys;
Expand Down Expand Up @@ -297,11 +296,7 @@ function psiThemeAdapter(chat) {
}
if (!template) {
data.nextOfGroup = false; //can't group w/o template
if (data.spooled) {
template = shared.templates.spooledMessage;
} else {
template = data.local?shared.templates.sentMessage:shared.templates.receivedMessage;
}
template = data.local?shared.templates.sentMessage:shared.templates.receivedMessage;
}
break;
case "join":
Expand Down
Loading

0 comments on commit ec259f6

Please sign in to comment.