File: redirectplugin.cpp

package info (click to toggle)
psi-plugins 1.5-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 4,368 kB
  • sloc: cpp: 42,063; xml: 714; ansic: 84; makefile: 61; sh: 12
file content (129 lines) | stat: -rw-r--r-- 3,591 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * redirectplugin.cpp - plugin
 * Copyright (C) 2013  Sergey Ilinykh
 *
 * 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 2
 * 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 library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

#include <QDomElement>
#include <QDateTime>
#include <QTextDocument>

#include "redirectplugin.h"

#include "optionaccessinghost.h"
#include "stanzasendinghost.h"
#include "accountinfoaccessinghost.h"
#include "applicationinfoaccessinghost.h"
#include "contactinfoaccessinghost.h"

#ifndef HAVE_QT5
Q_EXPORT_PLUGIN2(redirectplugin, Redirector)
#endif

bool Redirector::enable() {
	if (psiOptions) {
		enabled = true;
		targetJid = psiOptions->getPluginOption("jid").toString();
	}
	return enabled;
}

bool Redirector::disable() {
	enabled = false;
	return true;
}

void Redirector::applyOptions() {
	if (!options_)
		return;

	targetJid = ui_.le_jid->text();
	psiOptions->setPluginOption("jid", targetJid);
}

void Redirector::restoreOptions() {
	if (!options_)
		return;

	targetJid = psiOptions->getPluginOption("jid").toString();
	ui_.le_jid->setText(targetJid);
}

QWidget* Redirector::options() {
	if (!enabled) {
		return 0;
	}
	options_ = new QWidget();
	ui_.setupUi(options_);

	restoreOptions();

	return options_;
}

bool Redirector::incomingStanza(int account, const QDomElement& stanza) {
	Q_UNUSED(account)

	if (!enabled || stanza.tagName() != "message") {
		return false;
	}
	int targetAccount = accInfoHost->findOnlineAccountForContact(targetJid);
	QDomNodeList bodies = stanza.elementsByTagName("body");
	if (targetAccount == -1 || bodies.count() == 0) {
		return false;
	}

	int contactId;
	QString from = stanza.attribute("from");

	QDomDocument doc;
	QDomElement e = doc.createElement("message");
	e.setAttribute("to", ui_.le_jid->text());
	e.setAttribute("type", "chat");
	// TODO id?
	contactId = contactIdMap.value(from);
	if (!contactId) {
		contactIdMap.insert(from, nextContactId);
		contactId = nextContactId++;
	}
	QDomElement body = doc.createElement("body");
	e.appendChild(body);
#ifdef HAVE_QT5
	body.appendChild(doc.createTextNode(QString("#%1 %2").arg(contactId).arg(bodies.at(0).toElement().text().toHtmlEscaped())));
#else
	body.appendChild(doc.createTextNode(QString("#%1 %2").arg(contactId).arg(Qt::escape(bodies.at(0).toElement().text()))));
#endif
	QDomElement forward = e.appendChild(doc.createElementNS("urn:xmpp:forward:0", "forwarded")).toElement();
	forward.appendChild(doc.createElementNS("urn:xmpp:delay", "delay")).toElement()
			.setAttribute("stamp", QDateTime::currentDateTimeUtc().toString("yyyy-MM-ddThh:mm:ssZ"));

	forward.appendChild(doc.importNode(stanza, true));

	stanzaHost->sendStanza(targetAccount, e);

	return true;
}

bool Redirector::outgoingStanza(int /*account*/, QDomElement& /*xml*/) {
	return false;
}

QString Redirector::pluginInfo() {
	return tr("Author: ") +  "rion\n"
			+ tr("Email: ") + "rion4ik@gmail.com\n\n"
			+ trUtf8("Redirects all incoming messages to some jid and allows to redirect messages back.");
}