diff options
Diffstat (limited to 'kopete/protocols/irc/ircservercontact.cpp')
-rw-r--r-- | kopete/protocols/irc/ircservercontact.cpp | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/kopete/protocols/irc/ircservercontact.cpp b/kopete/protocols/irc/ircservercontact.cpp new file mode 100644 index 00000000..3ca21643 --- /dev/null +++ b/kopete/protocols/irc/ircservercontact.cpp @@ -0,0 +1,220 @@ +/* + ircservercontact.cpp - IRC Server Contact + + Copyright (c) 2003 by Michel Hermier <[email protected]> + Copyright (c) 2002 by Nick Betcher <[email protected]> + + Kopete (c) 2002-2003 by the Kopete developers <[email protected]> + + ************************************************************************* + * * + * 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. * + * * + ************************************************************************* +*/ + +#include "ircusercontact.h" +#include "ircservercontact.h" +#include "ircaccount.h" +#include "ircprotocol.h" + +#include "kopetechatsessionmanager.h" +#include "kopeteview.h" + +#include <kaction.h> +#include <kdebug.h> +#include <klocale.h> + +#include <qtimer.h> + +IRCServerContact::IRCServerContact(IRCContactManager *contactManager, const QString &servername, Kopete::MetaContact *m) + : IRCContact(contactManager, servername, m, "irc_server") +{ + KIRC::Engine *engine = kircEngine(); + + QObject::connect(engine, SIGNAL(internalError(KIRC::Engine::Error, KIRC::Message &)), + this, SLOT(engineInternalError(KIRC::Engine::Error, KIRC::Message &))); +/* + //FIXME: Have some kind of a debug option for raw input/ouput display?? + QObject::connect(engine, SIGNAL(sentMessage(KIRC::Message &)), + this, SLOT(engineSentMessage(KIRC::Message &))); + QObject::connect(engine, SIGNAL(receivedMessage(KIRC::Message &)), + this, SLOT(engineReceivedMessage(KIRC::Message &))); +*/ + + QObject::connect(engine, SIGNAL(incomingNotice(const QString &, const QString &)), + this, SLOT(slotIncomingNotice(const QString &, const QString &))); + + QObject::connect(engine, SIGNAL(incomingCannotSendToChannel(const QString &, const QString &)), + this, SLOT(slotCannotSendToChannel(const QString &, const QString &))); + + QObject::connect(engine, SIGNAL(incomingUnknown(const QString &)), + this, SLOT(slotIncomingUnknown(const QString &))); + + QObject::connect(engine, SIGNAL(incomingConnectString(const QString &)), + this, SLOT(slotIncomingConnect(const QString &))); + + QObject::connect(engine, SIGNAL(incomingMotd(const QString &)), + this, SLOT(slotIncomingMotd(const QString &))); + + QObject::connect(Kopete::ChatSessionManager::self(), SIGNAL(viewCreated(KopeteView*)), + this, SLOT(slotViewCreated(KopeteView*)) ); + + updateStatus(); +} + +void IRCServerContact::updateStatus() +{ + KIRC::Engine::Status status = kircEngine()->status(); + switch( status ) + { + case KIRC::Engine::Idle: + case KIRC::Engine::Connecting: + if( m_chatSession ) + m_chatSession->setDisplayName( caption() ); + setOnlineStatus( m_protocol->m_ServerStatusOffline ); + break; + + case KIRC::Engine::Authentifying: + case KIRC::Engine::Connected: + case KIRC::Engine::Closing: + // should make some extra check here + setOnlineStatus( m_protocol->m_ServerStatusOnline ); + break; + + default: + setOnlineStatus( m_protocol->m_StatusUnknown ); + } +} + +const QString IRCServerContact::caption() const +{ + return i18n("%1 @ %2").arg(ircAccount()->mySelf()->nickName() ).arg( + kircEngine()->currentHost().isEmpty() ? ircAccount()->networkName() : kircEngine()->currentHost() + ); +} + +void IRCServerContact::engineInternalError(KIRC::Engine::Error engineError, KIRC::Message &ircmsg) +{ + QString error; + switch (engineError) + { + case KIRC::Engine::ParsingFailed: + error = i18n("KIRC Error - Parse error: "); + break; + case KIRC::Engine::UnknownCommand: + error = i18n("KIRC Error - Unknown command: "); + break; + case KIRC::Engine::UnknownNumericReply: + error = i18n("KIRC Error - Unknown numeric reply: "); + break; + case KIRC::Engine::InvalidNumberOfArguments: + error = i18n("KIRC Error - Invalid number of arguments: "); + break; + case KIRC::Engine::MethodFailed: + error = i18n("KIRC Error - Method failed: "); + break; + default: + error = i18n("KIRC Error - Unknown error: "); + } + + ircAccount()->appendMessage(error + QString(ircmsg.raw()), IRCAccount::ErrorReply); +} + +void IRCServerContact::slotSendMsg(Kopete::Message &, Kopete::ChatSession *manager) +{ + manager->messageSucceeded(); + Kopete::Message msg( manager->myself(), manager->members(), + i18n("You can not talk to the server, you can only issue commands here. Type /help for supported commands."), Kopete::Message::Internal, Kopete::Message::PlainText, CHAT_VIEW); + manager->appendMessage(msg); +} + +void IRCServerContact::appendMessage( const QString &message ) +{ + Kopete::ContactPtrList members; + members.append( this ); + Kopete::Message msg( this, members, message, Kopete::Message::Internal, + Kopete::Message::RichText, CHAT_VIEW ); + appendMessage(msg); +} + +void IRCServerContact::slotIncomingNotice( const QString &orig, const QString ¬ice ) +{ + if (orig.isEmpty()) { + // Prefix missing. + // NOTICE AUTH :*** Checking Ident + + ircAccount()->appendMessage(i18n("NOTICE from %1: %2").arg(kircEngine()->currentHost(), notice), + IRCAccount::NoticeReply); + + } else { + // :[email protected] NOTICE foobar :[Logon News - Oct 12 2005] Due to growing problems ... + // :[email protected] NOTICE foobar :hello + + if (orig.contains('!')) { + ircAccount()->appendMessage(i18n("NOTICE from %1 (%2): %3").arg( + orig.section('!', 0, 0), + orig.section('!', 1, 1), + notice), + IRCAccount::NoticeReply); + } else { + ircAccount()->appendMessage(i18n("NOTICE from %1: %2").arg( + orig, notice), IRCAccount::NoticeReply); + } + } +} + +void IRCServerContact::slotIncomingUnknown(const QString &message) +{ + ircAccount()->appendMessage(message, IRCAccount::UnknownReply); +} + +void IRCServerContact::slotIncomingConnect(const QString &message) +{ + ircAccount()->appendMessage(message, IRCAccount::ConnectReply); +} + +void IRCServerContact::slotIncomingMotd(const QString &message) +{ + ircAccount()->appendMessage(message, IRCAccount::InfoReply); +} + +void IRCServerContact::slotCannotSendToChannel(const QString &channel, const QString &message) +{ + ircAccount()->appendMessage(QString::fromLatin1("%1: %2").arg(channel).arg(message), IRCAccount::ErrorReply); +} + +void IRCServerContact::appendMessage(Kopete::Message &msg) +{ + msg.setImportance( Kopete::Message::Low ); //to don't distrub the user + + if (m_chatSession && m_chatSession->view(false)) + m_chatSession->appendMessage(msg); +/* +// disable the buffering for now: cause a memleak since we don't made it a *fixed size fifo* + else + mMsgBuffer.append( msg ); +*/ +} + +void IRCServerContact::slotDumpMessages() +{ + if (!mMsgBuffer.isEmpty()) + { + manager()->appendMessage( mMsgBuffer.front() ); + mMsgBuffer.pop_front(); + QTimer::singleShot( 0, this, SLOT( slotDumpMessages() ) ); + } +} + +void IRCServerContact::slotViewCreated( KopeteView *v ) +{ + kdDebug(14121) << k_funcinfo << "Created: " << v << ", mgr: " << v->msgManager() << ", Mine: " << m_chatSession << endl; + if (m_chatSession && v->msgManager() == m_chatSession) + QTimer::singleShot(500, this, SLOT(slotDumpMessages())); +} + +#include "ircservercontact.moc" |