part of IRC presences sending
This commit is contained in:
parent
1ebe5535c4
commit
0a33a3100e
14 changed files with 237 additions and 15 deletions
|
@ -28,7 +28,7 @@ class IRCNetworkPlugin : public NetworkPlugin {
|
|||
|
||||
void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) {
|
||||
Swift::JID jid(legacyName);
|
||||
MyIrcSession *session = new MyIrcSession();
|
||||
MyIrcSession *session = new MyIrcSession(user, this);
|
||||
session->setNick(QString::fromStdString(jid.getNode()));
|
||||
session->connectToServer(QString::fromStdString(jid.getDomain()), 6667);
|
||||
std::cout << "CONNECTING IRC NETWORK " << jid.getNode() << " " << jid.getDomain() << "\n";
|
||||
|
|
|
@ -12,8 +12,10 @@
|
|||
#include <QtCore>
|
||||
#include <iostream>
|
||||
|
||||
MyIrcSession::MyIrcSession(QObject* parent) : Irc::Session(parent)
|
||||
MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent) : Irc::Session(parent)
|
||||
{
|
||||
this->np = np;
|
||||
this->user = user;
|
||||
}
|
||||
|
||||
void MyIrcSession::on_connected()
|
||||
|
@ -38,12 +40,14 @@ void MyIrcSession::on_bufferRemoved(Irc::Buffer* buffer)
|
|||
|
||||
Irc::Buffer* MyIrcSession::createBuffer(const QString& receiver)
|
||||
{
|
||||
return new MyIrcBuffer(receiver, this);
|
||||
return new MyIrcBuffer(receiver, user, np, this);
|
||||
}
|
||||
|
||||
MyIrcBuffer::MyIrcBuffer(const QString& receiver, Irc::Session* parent)
|
||||
MyIrcBuffer::MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent)
|
||||
: Irc::Buffer(receiver, parent)
|
||||
{
|
||||
this->np = np;
|
||||
this->user = user;
|
||||
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)));
|
||||
|
@ -144,6 +148,16 @@ void MyIrcBuffer::on_ctcpActionReceived(const QString& origin, const QString& ac
|
|||
|
||||
void MyIrcBuffer::on_numericMessageReceived(const QString& origin, uint code, const QStringList& params)
|
||||
{
|
||||
switch (code) {
|
||||
case 353:
|
||||
QString channel = params.value(2);
|
||||
QStringList members = params.value(3).split(" ");
|
||||
|
||||
for (int i = 0; i < members.size(); i++) {
|
||||
np->handleParticipantChanged(user, members.at(i).toStdString(), channel.toStdString(), 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
qDebug() << "numeric message received:" << receiver() << origin << code << params;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,13 +13,16 @@
|
|||
|
||||
#include <IrcSession>
|
||||
#include <IrcBuffer>
|
||||
#include <transport/networkplugin.h>
|
||||
|
||||
using namespace Transport;
|
||||
|
||||
class MyIrcSession : public Irc::Session
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MyIrcSession(QObject* parent = 0);
|
||||
MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* parent = 0);
|
||||
|
||||
protected Q_SLOTS:
|
||||
void on_connected();
|
||||
|
@ -29,6 +32,8 @@ protected Q_SLOTS:
|
|||
void on_bufferRemoved(Irc::Buffer* buffer);
|
||||
|
||||
protected:
|
||||
NetworkPlugin *np;
|
||||
std::string user;
|
||||
virtual Irc::Buffer* createBuffer(const QString& receiver);
|
||||
};
|
||||
|
||||
|
@ -37,7 +42,9 @@ class MyIrcBuffer : public Irc::Buffer
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MyIrcBuffer(const QString& receiver, Irc::Session* parent);
|
||||
MyIrcBuffer(const QString& receiver, const std::string &user, NetworkPlugin *np, Irc::Session* parent);
|
||||
NetworkPlugin *np;
|
||||
std::string user;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void on_receiverChanged(const QString& receiver);
|
||||
|
|
10
cmake_modules/IRCClientQtConfig.cmake
Normal file
10
cmake_modules/IRCClientQtConfig.cmake
Normal file
|
@ -0,0 +1,10 @@
|
|||
FIND_LIBRARY(IRC_LIBRARY NAMES ircclient-qt)
|
||||
FIND_PATH(IRC_INCLUDE_DIR NAMES "ircglobal.h" PATH_SUFFIXES ircclient-qt )
|
||||
|
||||
# message( STATUS ${IRC_LIBRARY})
|
||||
if( IRC_LIBRARY AND IRC_INCLUDE_DIR )
|
||||
message( STATUS "Found libircclient-qt: ${IRC_LIBRARY}, ${IRC_INCLUDE_DIR}")
|
||||
set( IRC_FOUND 1 )
|
||||
else()
|
||||
message( STATUS "Could NOT find libircclient-qt" )
|
||||
endif()
|
13
examples/external_network_plugin/CMakeLists.txt
Normal file
13
examples/external_network_plugin/CMakeLists.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
FILE(GLOB SRC *.cpp)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pbnetwork_pb2.py"
|
||||
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
|
||||
ARGS --python_out ${CMAKE_CURRENT_BINARY_DIR} pbnetwork.proto
|
||||
COMMENT "Running Py protocol buffer compiler on pbnetwork.proto"
|
||||
VERBATIM )
|
||||
|
||||
ADD_EXECUTABLE(external_network_plugin ${SRC} ${CMAKE_CURRENT_BINARY_DIR}/pbnetwork_pb2.py)
|
||||
|
||||
TARGET_LINK_LIBRARIES(external_network_plugin transport ${SWIFTEN_LIBRARIES})
|
||||
|
39
examples/external_network_plugin/main.cpp
Normal file
39
examples/external_network_plugin/main.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include "transport/config.h"
|
||||
#include "transport/transport.h"
|
||||
#include "transport/usermanager.h"
|
||||
#include "transport/logger.h"
|
||||
#include "transport/sqlite3backend.h"
|
||||
#include "transport/userregistration.h"
|
||||
#include "transport/networkpluginserver.h"
|
||||
#include "Swiften/EventLoop/SimpleEventLoop.h"
|
||||
|
||||
using namespace Transport;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
Config config;
|
||||
if (!config.load("sample.cfg")) {
|
||||
std::cout << "Can't open sample.cfg configuration file.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Swift::SimpleEventLoop eventLoop;
|
||||
Component transport(&eventLoop, &config, NULL);
|
||||
Logger logger(&transport);
|
||||
|
||||
SQLite3Backend sql(&config);
|
||||
logger.setStorageBackend(&sql);
|
||||
if (!sql.connect()) {
|
||||
std::cout << "Can't connect to database.\n";
|
||||
}
|
||||
|
||||
UserManager userManager(&transport, &sql);
|
||||
UserRegistration userRegistration(&transport, &userManager, &sql);
|
||||
logger.setUserRegistration(&userRegistration);
|
||||
logger.setUserManager(&userManager);
|
||||
|
||||
NetworkPluginServer plugin(&transport, &config, &userManager);
|
||||
|
||||
transport.connect();
|
||||
eventLoop.run();
|
||||
}
|
29
examples/external_network_plugin/pbnetwork.proto
Normal file
29
examples/external_network_plugin/pbnetwork.proto
Normal file
|
@ -0,0 +1,29 @@
|
|||
package pbnetwork;
|
||||
|
||||
message Connected {
|
||||
required string name = 1;
|
||||
}
|
||||
|
||||
message Disconnected {
|
||||
required string name = 1;
|
||||
required int32 error = 2;
|
||||
optional string message = 3;
|
||||
}
|
||||
|
||||
message Login {
|
||||
required string protocol = 1;
|
||||
required string legacyName = 2;
|
||||
required string password = 3;
|
||||
}
|
||||
|
||||
message WrapperMessage {
|
||||
enum Type {
|
||||
TYPE_CONNECTED = 1;
|
||||
TYPE_DISCONNECTED = 2;
|
||||
TYPE_LOGIN = 3;
|
||||
TYPE_LOGOUT = 4;
|
||||
}
|
||||
required Type type = 1;
|
||||
required bytes payload = 2;
|
||||
}
|
||||
;
|
29
examples/external_network_plugin/plugin.py
Normal file
29
examples/external_network_plugin/plugin.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
#! /usr/bin/python
|
||||
|
||||
from pbnetwork_pb2 import *
|
||||
import time
|
||||
import sys
|
||||
import socket
|
||||
import struct
|
||||
|
||||
|
||||
connected = Connected()
|
||||
connected.name = "hanzz.k@gmail.com"
|
||||
|
||||
wrapper = WrapperMessage()
|
||||
wrapper.type = WrapperMessage.TYPE_CONNECTED
|
||||
wrapper.payload = connected.SerializeToString()
|
||||
|
||||
sck = socket.socket()
|
||||
sck.connect(("localhost", 10000))
|
||||
|
||||
message = wrapper.SerializeToString();
|
||||
header = struct.pack(">L", len(message))
|
||||
print [header]
|
||||
sck.send(header + message+header + message);
|
||||
sck.send(header + message);
|
||||
sck.send(header + message);
|
||||
sck.send(header + message);
|
||||
sck.send(header + message);
|
||||
|
||||
print sck.recv(255)
|
|
@ -42,6 +42,10 @@ class Conversation {
|
|||
const std::string &getLegacyName() { return m_legacyName; }
|
||||
|
||||
void handleMessage(boost::shared_ptr<Swift::Message> &message);
|
||||
void handleParticipantChanged(const std::string &nickname, int flag);
|
||||
void setNickname(const std::string &nickname) {
|
||||
m_nickname = nickname;
|
||||
}
|
||||
|
||||
virtual void sendMessage(boost::shared_ptr<Swift::Message> &message) = 0;
|
||||
|
||||
|
@ -52,6 +56,7 @@ class Conversation {
|
|||
private:
|
||||
ConversationManager *m_conversationManager;
|
||||
std::string m_legacyName;
|
||||
std::string m_nickname;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -44,6 +44,8 @@ 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);
|
||||
|
||||
void handleDisconnected(const std::string &user, const std::string &legacyName, int error, const std::string &message);
|
||||
|
||||
void handleMessage(const std::string &user, const std::string &legacyName, const std::string &message);
|
||||
|
|
|
@ -55,6 +55,7 @@ class NetworkPluginServer {
|
|||
void handleDisconnectedPayload(const std::string &payload);
|
||||
void handleBuddyChangedPayload(const std::string &payload);
|
||||
void handleConvMessagePayload(const std::string &payload);
|
||||
void handleParticipantChangedPayload(const std::string &payload);
|
||||
|
||||
void handleUserCreated(User *user);
|
||||
void handleRoomJoined(User *user, const std::string &room, const std::string &nickname, const std::string &password);
|
||||
|
|
|
@ -38,17 +38,37 @@ Conversation::~Conversation() {
|
|||
}
|
||||
|
||||
void Conversation::handleMessage(boost::shared_ptr<Swift::Message> &message) {
|
||||
message->setTo(m_conversationManager->getUser()->getJID().toBare());
|
||||
Buddy *buddy = m_conversationManager->getUser()->getRosterManager()->getBuddy(m_legacyName);
|
||||
if (buddy) {
|
||||
std::cout << m_legacyName << " 222222\n";
|
||||
message->setFrom(buddy->getJID());
|
||||
if (message->getType() != Swift::Message::Groupchat) {
|
||||
message->setTo(m_conversationManager->getUser()->getJID().toBare());
|
||||
Buddy *buddy = m_conversationManager->getUser()->getRosterManager()->getBuddy(m_legacyName);
|
||||
if (buddy) {
|
||||
std::cout << m_legacyName << " 222222\n";
|
||||
message->setFrom(buddy->getJID());
|
||||
}
|
||||
else {
|
||||
std::cout << m_legacyName << " 1111111\n";
|
||||
// TODO: escape from and setFrom
|
||||
}
|
||||
m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message);
|
||||
}
|
||||
else {
|
||||
std::cout << m_legacyName << " 1111111\n";
|
||||
// TODO: escape from and setFrom
|
||||
}
|
||||
|
||||
void Conversation::handleParticipantChanged(const std::string &nickname, int flag) {
|
||||
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);
|
||||
|
||||
Swift::MUCUserPayload *p = new Swift::MUCUserPayload ();
|
||||
if (m_nickname == nickname) {
|
||||
Swift::MUCUserPayload::StatusCode c;
|
||||
c.code = 110;
|
||||
p->addStatusCode(c);
|
||||
}
|
||||
m_conversationManager->getComponent()->getStanzaChannel()->sendMessage(message);
|
||||
p->addItem(Swift::MUCUserPayload::Item(Swift::MUCOccupant::Member, Swift::MUCOccupant::Participant));
|
||||
|
||||
presence->addPayload(boost::shared_ptr<Swift::Payload>(p));
|
||||
m_conversationManager->getComponent()->getStanzaChannel()->sendPresence(presence);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -104,6 +104,21 @@ 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) {
|
||||
pbnetwork::Participant d;
|
||||
d.set_username(user);
|
||||
d.set_nickname(nickname);
|
||||
d.set_room(room);
|
||||
d.set_flag(flags);
|
||||
|
||||
std::string message;
|
||||
d.SerializeToString(&message);
|
||||
|
||||
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_PARTICIPANT_CHANGED);
|
||||
|
||||
send(message);
|
||||
}
|
||||
|
||||
void NetworkPlugin::handleConnected(bool error) {
|
||||
if (error) {
|
||||
std::cout << "Connecting error\n";
|
||||
|
|
|
@ -194,6 +194,37 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) {
|
|||
}
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleParticipantChangedPayload(const std::string &data) {
|
||||
pbnetwork::Participant payload;
|
||||
if (payload.ParseFromString(data) == false) {
|
||||
// TODO: ERROR
|
||||
return;
|
||||
}
|
||||
|
||||
User *user = m_userManager->getUser(payload.username());
|
||||
if (!user)
|
||||
return;
|
||||
|
||||
NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.room());
|
||||
if (!conv) {
|
||||
return;
|
||||
}
|
||||
|
||||
conv->handleParticipantChanged(payload.nickname(), payload.flag());
|
||||
|
||||
// LocalBuddy *buddy = (LocalBuddy *) user->getRosterManager()->getBuddy(payload.buddyname());
|
||||
// if (buddy) {
|
||||
// handleBuddyPayload(buddy, payload);
|
||||
// buddy->buddyChanged();
|
||||
// }
|
||||
// else {
|
||||
// buddy = new LocalBuddy(user->getRosterManager(), -1);
|
||||
// handleBuddyPayload(buddy, payload);
|
||||
// user->getRosterManager()->setBuddy(buddy);
|
||||
// }
|
||||
std::cout << payload.nickname() << "\n";
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleConvMessagePayload(const std::string &data) {
|
||||
pbnetwork::ConversationMessage payload;
|
||||
// std::cout << "payload...\n";
|
||||
|
@ -258,6 +289,9 @@ void NetworkPluginServer::handleDataRead(boost::shared_ptr<Swift::Connection> c,
|
|||
case pbnetwork::WrapperMessage_Type_TYPE_PONG:
|
||||
m_pongReceived = true;
|
||||
break;
|
||||
case pbnetwork::WrapperMessage_Type_TYPE_PARTICIPANT_CHANGED:
|
||||
handleParticipantChangedPayload(wrapper.payload());
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -320,6 +354,10 @@ void NetworkPluginServer::handleRoomJoined(User *user, const std::string &r, con
|
|||
WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_JOIN_ROOM);
|
||||
|
||||
send(m_client, message);
|
||||
|
||||
NetworkConversation *conv = new NetworkConversation(user->getConversationManager(), r);
|
||||
conv->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, this, _1, _2));
|
||||
conv->setNickname(nickname);
|
||||
}
|
||||
|
||||
void NetworkPluginServer::handleUserDestroyed(User *user) {
|
||||
|
|
Loading…
Add table
Reference in a new issue