Working part, moderators resending

This commit is contained in:
Jan Kaluza 2011-05-19 08:26:09 +02:00
parent 457d19d1ec
commit 8e03fbec47
10 changed files with 88 additions and 22 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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

View file

@ -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;
}

View file

@ -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);

View file

@ -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);
}
}
}

View file

@ -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);

View file

@ -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) {

View file

@ -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;

View file

@ -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;