Working part, moderators resending
This commit is contained in:
parent
457d19d1ec
commit
8e03fbec47
10 changed files with 88 additions and 22 deletions
|
@ -65,6 +65,7 @@ class IRCNetworkPlugin : public NetworkPlugin {
|
|||
if (m_sessions[user] == NULL)
|
||||
return;
|
||||
m_sessions[user]->part(QString::fromStdString(room));
|
||||
m_sessions[user]->removeAutoJoinChannel(QString::fromStdString(room));
|
||||
}
|
||||
|
||||
std::map<std::string, MyIrcSession *> m_sessions;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "session.h"
|
||||
#include <QtCore>
|
||||
#include <iostream>
|
||||
#include "Swiften/Elements/StatusShow.h"
|
||||
|
||||
MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent) : Irc::Session(parent)
|
||||
{
|
||||
|
@ -48,6 +49,7 @@ MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, Netwo
|
|||
{
|
||||
this->np = np;
|
||||
this->user = user;
|
||||
p = (MyIrcSession *) parent;
|
||||
connect(this, SIGNAL(receiverChanged(QString)), SLOT(on_receiverChanged(QString)));
|
||||
connect(this, SIGNAL(joined(QString)), SLOT(on_joined(QString)));
|
||||
connect(this, SIGNAL(parted(QString, QString)), SLOT(on_parted(QString, QString)));
|
||||
|
@ -76,14 +78,30 @@ void MyIrcBuffer::on_receiverChanged(const QString& receiver)
|
|||
qDebug() << "receiver changed:" << receiver;
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_joined(const QString& origin) {
|
||||
qDebug() << "joined:" << receiver() << origin;
|
||||
np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), 0);
|
||||
int MyIrcBuffer::correctNickname(std::string &nickname) {
|
||||
int flags = 0;
|
||||
switch(nickname.at(0)) {
|
||||
case '@': nickname = nickname.substr(1); flags = 1; break;
|
||||
case '+': nickname = nickname.substr(1); break;
|
||||
default: break;
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_parted(const QString& origin, const QString& message)
|
||||
{
|
||||
qDebug() << "parted:" << receiver() << origin << message;
|
||||
void MyIrcBuffer::on_joined(const QString& origin) {
|
||||
qDebug() << "joined:" << receiver() << origin;
|
||||
int flags = 0;
|
||||
std::string nickname = origin.toStdString();
|
||||
flags = correctNickname(nickname);
|
||||
np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), flags, Swift::StatusShow::Online);
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_parted(const QString& origin, const QString& message) {
|
||||
qDebug() << "parted:" << receiver() << origin << message;
|
||||
int flags = 0;
|
||||
std::string nickname = origin.toStdString();
|
||||
flags = correctNickname(nickname);
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::None, message.toStdString());
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_quit(const QString& origin, const QString& message)
|
||||
|
@ -93,12 +111,24 @@ void MyIrcBuffer::on_quit(const QString& origin, const QString& message)
|
|||
|
||||
void MyIrcBuffer::on_nickChanged(const QString& origin, const QString& nick) {
|
||||
qDebug() << "nick changed:" << receiver() << origin << nick;
|
||||
np->handleParticipantChanged(user, origin.toStdString(), receiver().toStdString(), 0, nick.toStdString());
|
||||
std::string nickname = origin.toStdString();
|
||||
int flags = p->m_modes[receiver().toStdString() + nickname];
|
||||
std::cout << receiver().toStdString() + nickname << " " << flags << "\n";
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::Online, "", nick.toStdString());
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, const QString& args)
|
||||
{
|
||||
qDebug() << "mode changed:" << receiver() << origin << mode << args;
|
||||
void MyIrcBuffer::on_modeChanged(const QString& origin, const QString& mode, const QString& args) {
|
||||
// mode changed: "#testik" "HanzZ" "+o" "hanzz_k"
|
||||
qDebug() << "mode changed:" << receiver() << origin << mode << args;
|
||||
std::string nickname = args.toStdString();
|
||||
if (mode == "+o") {
|
||||
p->m_modes[receiver().toStdString() + nickname] = 1;
|
||||
}
|
||||
else {
|
||||
p->m_modes[receiver().toStdString() + nickname] = 0;
|
||||
}
|
||||
int flags = p->m_modes[receiver().toStdString() + nickname];
|
||||
np->handleParticipantChanged(user, nickname, receiver().toStdString(), flags, Swift::StatusShow::Online, "");
|
||||
}
|
||||
|
||||
void MyIrcBuffer::on_topicChanged(const QString& origin, const QString& topic)
|
||||
|
@ -155,7 +185,12 @@ void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, co
|
|||
QStringList members = params.value(3).split(" ");
|
||||
|
||||
for (int i = 0; i < members.size(); i++) {
|
||||
np->handleParticipantChanged(user, members.at(i).toStdString(), channel.toStdString(), 0);
|
||||
int flags = 0;
|
||||
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(), flags, Swift::StatusShow::Online);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ class MyIrcSession : public Irc::Session
|
|||
|
||||
public:
|
||||
MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent = 0);
|
||||
std::map<std::string, int> m_modes;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void on_connected();
|
||||
|
@ -45,6 +46,7 @@ public:
|
|||
MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent);
|
||||
NetworkPlugin *np;
|
||||
std::string user;
|
||||
MyIrcSession *p;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void on_receiverChanged(const QString& receiver);
|
||||
|
@ -63,6 +65,8 @@ protected Q_SLOTS:
|
|||
void on_ctcpActionReceived(const QString& origin, const QString& action, Irc::Buffer::MessageFlags flags);
|
||||
void on_numericMessageReceived(const QString& origin, uint code, const QStringList& params);
|
||||
void on_unknownMessageReceived(const QString& origin, const QStringList& params);
|
||||
|
||||
int correctNickname(std::string &nickname);
|
||||
};
|
||||
|
||||
#endif // SESSION_H
|
||||
|
|
|
@ -33,6 +33,8 @@ class ConversationManager;
|
|||
|
||||
class Conversation {
|
||||
public:
|
||||
enum ParticipantFlag {None, Moderator};
|
||||
|
||||
/// Constructor.
|
||||
Conversation(ConversationManager *conversationManager, const std::string &legacyName, bool m_muc = false);
|
||||
|
||||
|
@ -42,7 +44,7 @@ class Conversation {
|
|||
const std::string &getLegacyName() { return m_legacyName; }
|
||||
|
||||
void handleMessage(boost::shared_ptr<Swift::Message> &message, const std::string &nickname = "");
|
||||
void handleParticipantChanged(const std::string &nickname, int flag, const std::string &newname = "");
|
||||
void handleParticipantChanged(const std::string &nickname, int flag, int status = Swift::StatusShow::None, const std::string &statusMessage = "", const std::string &newname = "");
|
||||
void setNickname(const std::string &nickname) {
|
||||
m_nickname = nickname;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ class NetworkPlugin {
|
|||
const std::string &groups, int status, const std::string &statusMessage = "", const std::string &iconHash = ""
|
||||
);
|
||||
|
||||
void handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, const std::string &newname = "");
|
||||
void handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, int status = Swift::StatusShow::None, const std::string &statusMessage = "", const std::string &newname = "");
|
||||
|
||||
void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message);
|
||||
|
||||
|
|
|
@ -78,16 +78,22 @@ void Conversation::handleMessage(boost::shared_ptr<Swift::Message> &message, con
|
|||
}
|
||||
}
|
||||
|
||||
void Conversation::handleParticipantChanged(const std::string &nick, int flag, const std::string &newname) {
|
||||
void Conversation::handleParticipantChanged(const std::string &nick, int flag, int status, const std::string &statusMessage, const std::string &newname) {
|
||||
std::string nickname = nick;
|
||||
if (nickname.find("@") == 0) {
|
||||
nickname = nickname.substr(1);
|
||||
}
|
||||
Swift::Presence::ref presence = Swift::Presence::create();
|
||||
presence->setFrom(Swift::JID(m_legacyName, m_conversationManager->getComponent()->getJID().toBare(), nickname));
|
||||
presence->setTo(m_conversationManager->getUser()->getJID().toString());
|
||||
presence->setType(Swift::Presence::Available);
|
||||
|
||||
if (!statusMessage.empty())
|
||||
presence->setStatus(statusMessage);
|
||||
|
||||
Swift::StatusShow s((Swift::StatusShow::Type) status);
|
||||
|
||||
if (s.getType() == Swift::StatusShow::None)
|
||||
presence->setType(Swift::Presence::Unavailable);
|
||||
presence->setShow(s.getType());
|
||||
|
||||
Swift::MUCUserPayload *p = new Swift::MUCUserPayload ();
|
||||
if (m_nickname == nickname) {
|
||||
Swift::MUCUserPayload::StatusCode c;
|
||||
|
@ -95,18 +101,28 @@ void Conversation::handleParticipantChanged(const std::string &nick, int flag, c
|
|||
p->addStatusCode(c);
|
||||
}
|
||||
|
||||
|
||||
Swift::MUCUserPayload::Item item(Swift::MUCOccupant::Member, Swift::MUCOccupant::Participant);
|
||||
|
||||
if (flag & Moderator) {
|
||||
item = Swift::MUCUserPayload::Item(Swift::MUCOccupant::Admin, Swift::MUCOccupant::Moderator);
|
||||
}
|
||||
|
||||
if (!newname.empty()) {
|
||||
item.nick = newname;
|
||||
Swift::MUCUserPayload::StatusCode c;
|
||||
c.code = 303;
|
||||
p->addStatusCode(c);
|
||||
presence->setType(Swift::Presence::Unavailable);
|
||||
}
|
||||
|
||||
p->addItem(item);
|
||||
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(p));
|
||||
m_conversationManager->getComponent()->getStanzaChannel()->sendPresence(presence);
|
||||
if (!newname.empty()) {
|
||||
handleParticipantChanged(newname, flag, status, statusMessage);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -105,13 +105,15 @@ void NetworkPlugin::handleDisconnected(const std::string &user, const std::strin
|
|||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, const std::string &newname) {
|
||||
void NetworkPlugin::handleParticipantChanged(const std::string &user, const std::string &nickname, const std::string &room, int flags, int status, const std::string &statusMessage, const std::string &newname) {
|
||||
pbnetwork::Participant d;
|
||||
d.set_username(user);
|
||||
d.set_nickname(nickname);
|
||||
d.set_room(room);
|
||||
d.set_flag(flags);
|
||||
d.set_newname(newname);
|
||||
d.set_status(status);
|
||||
d.set_statusmessage(statusMessage);
|
||||
|
||||
std::string message;
|
||||
d.SerializeToString(&message);
|
||||
|
|
|
@ -210,7 +210,7 @@ void NetworkPluginServer::handleParticipantChangedPayload(const std::string &dat
|
|||
return;
|
||||
}
|
||||
|
||||
conv->handleParticipantChanged(payload.nickname(), payload.flag(), payload.newname());
|
||||
conv->handleParticipantChanged(payload.nickname(), payload.flag(), payload.status(), payload.statusmessage(), payload.newname());
|
||||
|
||||
// LocalBuddy *buddy = (LocalBuddy *) user->getRosterManager()->getBuddy(payload.buddyname());
|
||||
// if (buddy) {
|
||||
|
|
|
@ -52,7 +52,9 @@ message Participant {
|
|||
required string room = 2;
|
||||
required string nickname = 3;
|
||||
required int32 flag = 4;
|
||||
optional string newname = 5;
|
||||
required int32 status = 5;
|
||||
optional string statusMessage = 6;
|
||||
optional string newname = 7;
|
||||
}
|
||||
|
||||
message WrapperMessage {
|
||||
|
@ -69,8 +71,7 @@ message WrapperMessage {
|
|||
TYPE_JOIN_ROOM = 11;
|
||||
TYPE_LEAVE_ROOM = 12;
|
||||
TYPE_PARTICIPANT_CHANGED = 13;
|
||||
TYPE_PARTICIPANT_LEFT = 14;
|
||||
TYPE_ROOM_NICKNAME_CHANGED = 15;
|
||||
TYPE_ROOM_NICKNAME_CHANGED = 14;
|
||||
}
|
||||
required Type type = 1;
|
||||
optional bytes payload = 2;
|
||||
|
|
|
@ -90,6 +90,11 @@ void User::handlePresence(Swift::Presence::ref presence) {
|
|||
onRoomLeft(presence->getTo().getNode());
|
||||
}
|
||||
else {
|
||||
// force connection to legacy network to let backend to handle auto-join on connect.
|
||||
if (!m_readyForConnect) {
|
||||
m_readyForConnect = true;
|
||||
onReadyToConnect();
|
||||
}
|
||||
onRoomJoined(presence->getTo().getNode(), presence->getTo().getResource(), "");
|
||||
}
|
||||
return;
|
||||
|
|
Loading…
Add table
Reference in a new issue