IRC backend almost work in gateway mode
This commit is contained in:
parent
bc3971f7d2
commit
fdc1a4199a
3 changed files with 77 additions and 33 deletions
|
@ -22,12 +22,18 @@ void IRCNetworkPlugin::sendData(const std::string &string) {
|
|||
}
|
||||
|
||||
void IRCNetworkPlugin::handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) {
|
||||
MyIrcSession *session = new MyIrcSession(user, this);
|
||||
std::string h = user.substr(0, user.find("@"));
|
||||
session->setNick(QString::fromStdString(h.substr(0, h.find("%"))));
|
||||
session->connectToServer(QString::fromStdString(h.substr(h.find("%") + 1)), 6667);
|
||||
std::cout << "CONNECTING IRC NETWORK " << h.substr(h.find("%") + 1) << "\n";
|
||||
m_sessions[user] = session;
|
||||
// Server is in server-mode, so user is JID of server when we want to connect
|
||||
if (CONFIG_BOOL(config, "service.server_mode")) {
|
||||
MyIrcSession *session = new MyIrcSession(user, this);
|
||||
std::string h = user.substr(0, user.find("@"));
|
||||
session->setNick(QString::fromStdString(h.substr(0, h.find("%"))));
|
||||
session->connectToServer(QString::fromStdString(h.substr(h.find("%") + 1)), 6667);
|
||||
std::cout << "CONNECTING IRC NETWORK " << h.substr(h.find("%") + 1) << "\n";
|
||||
m_sessions[user] = session;
|
||||
}
|
||||
else {
|
||||
handleConnected(user);
|
||||
}
|
||||
}
|
||||
|
||||
void IRCNetworkPlugin::handleLogoutRequest(const std::string &user, const std::string &legacyName) {
|
||||
|
@ -38,27 +44,54 @@ void IRCNetworkPlugin::handleLogoutRequest(const std::string &user, const std::s
|
|||
}
|
||||
|
||||
void IRCNetworkPlugin::handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &/*xhtml*/) {
|
||||
std::cout << "MESSAGE " << user << " " << legacyName << "\n";
|
||||
if (m_sessions[user] == NULL)
|
||||
return;
|
||||
m_sessions[user]->message(QString::fromStdString(legacyName), QString::fromStdString(message));
|
||||
|
||||
std::string r = legacyName;
|
||||
if (!CONFIG_BOOL(config, "service.server_mode")) {
|
||||
r = legacyName.substr(0, r.find("@"));
|
||||
}
|
||||
std::cout << "MESSAGE " << user << " " << r << "\n";
|
||||
m_sessions[user]->message(QString::fromStdString(r), QString::fromStdString(message));
|
||||
std::cout << "SENT\n";
|
||||
}
|
||||
|
||||
void IRCNetworkPlugin::handleJoinRoomRequest(const std::string &user, const std::string &room, const std::string &nickname, const std::string &password) {
|
||||
std::cout << "JOIN\n";
|
||||
if (m_sessions[user] == NULL)
|
||||
return;
|
||||
m_sessions[user]->addAutoJoinChannel(QString::fromStdString(room));
|
||||
m_sessions[user]->join(QString::fromStdString(room), QString::fromStdString(password));
|
||||
std::string r = room;
|
||||
if (m_sessions[user] == NULL) {
|
||||
// in gateway mode we want to login this user to network according to legacyName
|
||||
if (room.find("%") != std::string::npos) {
|
||||
// suffix is %irc.freenode.net to let MyIrcSession return #room%irc.freenode.net
|
||||
MyIrcSession *session = new MyIrcSession(user, this, room.substr(room.find("%")));
|
||||
session->setNick(QString::fromStdString(nickname));
|
||||
session->connectToServer(QString::fromStdString(room.substr(room.find("%") + 1)), 6667);
|
||||
std::cout << "CONNECTING IRC NETWORK " << room.substr(room.find("%") + 1) << "\n";
|
||||
std::cout << "SUFFIX " << room.substr(room.find("%")) << "\n";
|
||||
m_sessions[user] = session;
|
||||
r = room.substr(0, room.find("%"));
|
||||
std::cout << "room=" << r << "\n";
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_sessions[user]->addAutoJoinChannel(QString::fromStdString(r));
|
||||
m_sessions[user]->join(QString::fromStdString(r), QString::fromStdString(password));
|
||||
// update nickname, because we have nickname per session, no nickname per room.
|
||||
handleRoomNicknameChanged(user, room, m_sessions[user]->nick().toStdString());
|
||||
handleRoomNicknameChanged(user, r, m_sessions[user]->nick().toStdString());
|
||||
}
|
||||
|
||||
void IRCNetworkPlugin::handleLeaveRoomRequest(const std::string &user, const std::string &room) {
|
||||
std::cout << "PART\n";
|
||||
if (m_sessions[user] == NULL)
|
||||
return;
|
||||
m_sessions[user]->part(QString::fromStdString(room));
|
||||
m_sessions[user]->removeAutoJoinChannel(QString::fromStdString(room));
|
||||
|
||||
std::string r = room;
|
||||
if (!CONFIG_BOOL(config, "service.server_mode")) {
|
||||
r = room.substr(0, room.find("%"));
|
||||
}
|
||||
|
||||
m_sessions[user]->part(QString::fromStdString(r));
|
||||
m_sessions[user]->removeAutoJoinChannel(QString::fromStdString(r));
|
||||
}
|
||||
|
|
|
@ -13,10 +13,11 @@
|
|||
#include <iostream>
|
||||
#include "Swiften/Elements/StatusShow.h"
|
||||
|
||||
MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent) : Irc::Session(parent)
|
||||
MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, const std::string &suffix, QObject* parent) : Irc::Session(parent)
|
||||
{
|
||||
this->np = np;
|
||||
this->user = user;
|
||||
this->suffix = suffix;
|
||||
connect(this, SIGNAL(disconnected()), SLOT(on_disconnected()));
|
||||
}
|
||||
|
||||
|
@ -26,8 +27,9 @@ void MyIrcSession::on_connected(){
|
|||
|
||||
void MyIrcSession::on_disconnected()
|
||||
{
|
||||
std::cout << "disconnected:\n";
|
||||
np->handleDisconnected(user, 0, "");
|
||||
std::cout << "disconnected:\n";
|
||||
if (suffix.empty())
|
||||
np->handleDisconnected(user, 0, "");
|
||||
}
|
||||
|
||||
void MyIrcSession::on_bufferAdded(Irc::Buffer* buffer)
|
||||
|
@ -42,14 +44,15 @@ void MyIrcSession::on_bufferRemoved(Irc::Buffer* buffer)
|
|||
|
||||
Irc::Buffer* MyIrcSession::createBuffer(const QString& receiver)
|
||||
{
|
||||
return new MyIrcBuffer(receiver, user, np, this);
|
||||
return new MyIrcBuffer(receiver, user, np, suffix, this);
|
||||
}
|
||||
|
||||
MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent)
|
||||
MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, const std::string &suffix, Irc::Session* parent)
|
||||
: Irc::Buffer(receiver, parent)
|
||||
{
|
||||
this->np = np;
|
||||
this->user = user;
|
||||
this->suffix = suffix;
|
||||
p = (MyIrcSession *) parent;
|
||||
connect(this, SIGNAL(receiverChanged(QString)), SLOT(on_receiverChanged(QString)));
|
||||
connect(this, SIGNAL(joined(QString)), SLOT(on_joined(QString)));
|
||||
|
@ -94,7 +97,7 @@ void MyIrcBuffer::on_joined(const QString& origin) {
|
|||
bool flags = 0;
|
||||
std::string nickname = origin.toStdString();
|
||||
flags = correctNickname(nickname);
|
||||
np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), (int) flags, pbnetwork::STATUS_ONLINE);
|
||||
np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString() + suffix, (int) flags, pbnetwork::STATUS_ONLINE);
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_parted(const QString& origin, const QString& message) {
|
||||
|
@ -102,7 +105,7 @@ void MyIrcBuffer::on_parted(const QString& origin, const QString& message) {
|
|||
bool flags = 0;
|
||||
std::string nickname = origin.toStdString();
|
||||
flags = correctNickname(nickname);
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString(),(int) flags, pbnetwork::STATUS_NONE, message.toStdString());
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString() + suffix,(int) flags, pbnetwork::STATUS_NONE, message.toStdString());
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_quit(const QString& origin, const QString& message)
|
||||
|
@ -116,7 +119,7 @@ void MyIrcBuffer::on_nickChanged(const QString& origin, const QString& nick) {
|
|||
std::string nickname = origin.toStdString();
|
||||
bool flags = p->m_modes[receiver().toStdString() + nickname];
|
||||
// std::cout << receiver().toStdString() + nickname << " " << flags << "\n";
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString(),(int) flags, pbnetwork::STATUS_ONLINE, "", nick.toStdString());
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "", nick.toStdString());
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, const QString& args) {
|
||||
|
@ -132,13 +135,13 @@ void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, con
|
|||
p->m_modes[receiver().toStdString() + nickname] = 0;
|
||||
}
|
||||
bool flags = p->m_modes[receiver().toStdString() + nickname];
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString(),(int) flags, pbnetwork::STATUS_ONLINE, "");
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE, "");
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_topicChanged(const QString& origin, const QString& topic) {
|
||||
//topic changed: "#testik" "HanzZ" "test"
|
||||
qDebug() << "topic changed:" << receiver() << origin << topic;
|
||||
np->handleSubject(user, receiver().toStdString(), topic.toStdString(), origin.toStdString());
|
||||
np->handleSubject(user, receiver().toStdString() + suffix, topic.toStdString(), origin.toStdString());
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_invited(const QString& origin, const QString& receiver, const QString& channel)
|
||||
|
@ -155,7 +158,11 @@ void MyIrcBuffer::on_messageReceived(const QString& origin, const QString& messa
|
|||
qDebug() << "message received:" << receiver() << origin << message << (flags & Irc::Buffer::IdentifiedFlag ? "(identified!)" : "(not identified)");
|
||||
if (!receiver().startsWith("#") && (flags & Irc::Buffer::EchoFlag))
|
||||
return;
|
||||
np->handleMessage(user, receiver().toStdString(), message.toStdString(), origin.toStdString());
|
||||
std::string r = receiver().toStdString();
|
||||
// if (!suffix.empty()) {
|
||||
// r = receiver().replace('@', '%').toStdString();
|
||||
// }
|
||||
np->handleMessage(user, r + suffix, message.toStdString(), origin.toStdString());
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_noticeReceived(const QString& origin, const QString& notice, Irc::Buffer::MessageFlags flags)
|
||||
|
@ -186,13 +193,14 @@ void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, co
|
|||
{
|
||||
switch (code) {
|
||||
case 251:
|
||||
np->handleConnected(user);
|
||||
if (suffix.empty())
|
||||
np->handleConnected(user);
|
||||
break;
|
||||
case 332:
|
||||
m_topicData = params.value(2).toStdString();
|
||||
break;
|
||||
case 333:
|
||||
np->handleSubject(user, params.value(1).toStdString(), m_topicData, params.value(2).toStdString());
|
||||
np->handleSubject(user, params.value(1).toStdString() + suffix, m_topicData, params.value(2).toStdString());
|
||||
break;
|
||||
case 353:
|
||||
QString channel = params.value(2);
|
||||
|
@ -203,12 +211,12 @@ void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, co
|
|||
std::string nickname = members.at(i).toStdString();
|
||||
flags = correctNickname(nickname);
|
||||
p->m_modes[channel.toStdString() + nickname] = flags;
|
||||
// std::cout << channel.toStdString() + nickname << " " << flags << "\n";
|
||||
np->handleParticipantChanged(user, nickname, channel.toStdString(),(int) flags, pbnetwork::STATUS_ONLINE);
|
||||
std::cout << channel.toStdString() + suffix << " " << flags << "\n";
|
||||
np->handleParticipantChanged(user, nickname, channel.toStdString() + suffix,(int) flags, pbnetwork::STATUS_ONLINE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
qDebug() << "numeric message received:" << receiver() << origin << code << params;
|
||||
qDebug() << "numeric message received:" << receiver() << origin << code << params;
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_unknownMessageReceived(const QString& origin, const QStringList& params)
|
||||
|
|
|
@ -22,8 +22,9 @@ class MyIrcSession : public Irc::Session
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent = 0);
|
||||
MyIrcSession(const std::string &user, NetworkPlugin *np, const std::string &suffix = "", QObject* parent = 0);
|
||||
std::map<std::string, bool> m_modes;
|
||||
std::string suffix;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void on_connected();
|
||||
|
@ -35,6 +36,7 @@ protected Q_SLOTS:
|
|||
protected:
|
||||
NetworkPlugin *np;
|
||||
std::string user;
|
||||
|
||||
virtual Irc::Buffer* createBuffer(const QString& receiver);
|
||||
};
|
||||
|
||||
|
@ -43,11 +45,12 @@ class MyIrcBuffer : public Irc::Buffer
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent);
|
||||
MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, const std::string &suffix, Irc::Session* parent);
|
||||
NetworkPlugin *np;
|
||||
std::string user;
|
||||
MyIrcSession *p;
|
||||
std::string m_topicData;
|
||||
std::string suffix;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void on_receiverChanged(const QString& receiver);
|
||||
|
|
Loading…
Add table
Reference in a new issue