From 087a0d0cda08deb23fcd2e71a83cc75de4b8089a Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 30 Sep 2007 16:19:44 +0000 Subject: [PATCH] IRC polishing work - kicks are shown, error messages are displayed. Rename somehow buggy still. --- src/gui/generic/serverguiwrapper.cpp | 4 + src/gui/generic/serverguiwrapper.h | 4 + .../gamelobbydialog/gamelobbydialogimpl.cpp | 6 - .../qt/gamelobbydialog/gamelobbydialogimpl.h | 9 +- .../gamelobbydialog/lobbychat/lobbychat.cpp | 115 +++++++++++++++ .../qt/gamelobbydialog/lobbychat/lobbychat.h | 7 +- src/gui/qt/guiwrapper.cpp | 6 +- src/gui/qt/guiwrapper.h | 4 + src/gui/qt/mainwindow/mainwindowimpl.cpp | 15 +- src/gui/qt/mainwindow/mainwindowimpl.h | 4 + src/net/common/ircthread.cpp | 138 +++++++++++++++++- src/net/irccallback.h | 4 + src/net/ircthread.h | 2 + src/net/socket_msg.h | 9 ++ 14 files changed, 301 insertions(+), 26 deletions(-) diff --git a/src/gui/generic/serverguiwrapper.cpp b/src/gui/generic/serverguiwrapper.cpp index 35f7d22f..e3a93592 100644 --- a/src/gui/generic/serverguiwrapper.cpp +++ b/src/gui/generic/serverguiwrapper.cpp @@ -129,5 +129,9 @@ void ServerGuiWrapper::SignalNetServerError(int errorID, int osErrorID) { if (my void ServerGuiWrapper::SignalIrcConnect(const string &server) { if (myIrccb) myIrccb->SignalIrcConnect(server); } void ServerGuiWrapper::SignalIrcSelfJoined(const string &nickName, const std::string &channel) { if (myIrccb) myIrccb->SignalIrcSelfJoined(nickName, channel); } void ServerGuiWrapper::SignalIrcPlayerJoined(const string &nickName) { if (myIrccb) myIrccb->SignalIrcPlayerJoined(nickName); } +void ServerGuiWrapper::SignalIrcPlayerChanged(const string &oldNick, const string &newNick) { if (myIrccb) myIrccb->SignalIrcPlayerChanged(oldNick, newNick); } +void ServerGuiWrapper::SignalIrcPlayerKicked(const string &nickName, const string &byWhom, const string &reason) { if (myIrccb) myIrccb->SignalIrcPlayerKicked(nickName, byWhom, reason); } void ServerGuiWrapper::SignalIrcPlayerLeft(const string &nickName) { if (myIrccb) myIrccb->SignalIrcPlayerLeft(nickName); } void ServerGuiWrapper::SignalIrcChatMsg(const string &nickName, const string &msg) { if (myIrccb) myIrccb->SignalIrcChatMsg(nickName, msg); } +void ServerGuiWrapper::SignalIrcError(int errorCode) { if (myIrccb) myIrccb->SignalIrcError(errorCode); } +void ServerGuiWrapper::SignalIrcServerError(int errorCode) {if (myIrccb) myIrccb->SignalIrcServerError(errorCode); } diff --git a/src/gui/generic/serverguiwrapper.h b/src/gui/generic/serverguiwrapper.h index a3496e96..6d10ad85 100644 --- a/src/gui/generic/serverguiwrapper.h +++ b/src/gui/generic/serverguiwrapper.h @@ -114,8 +114,12 @@ public: void SignalIrcConnect(const std::string &server); void SignalIrcSelfJoined(const std::string &nickName, const std::string &channel); void SignalIrcPlayerJoined(const std::string &nickName); + void SignalIrcPlayerChanged(const std::string &oldNick, const std::string &newNick); + void SignalIrcPlayerKicked(const std::string &nickName, const std::string &byWhom, const std::string &reason); void SignalIrcPlayerLeft(const std::string &nickName); void SignalIrcChatMsg(const std::string &nickName, const std::string &msg); + void SignalIrcError(int errorCode); + void SignalIrcServerError(int errorCode); private: diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp index d32433e3..209e6a8d 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp @@ -36,12 +36,6 @@ gameLobbyDialogImpl::gameLobbyDialogImpl(QWidget *parent, ConfigFile *c) connect( lineEdit_ChatInput, SIGNAL( returnPressed () ), this, SLOT( sendChatMessage() ) ); connect( lineEdit_ChatInput, SIGNAL( textChanged (QString) ), this, SLOT( checkChatInputLength(QString) ) ); - connect( this, SIGNAL( signalChatConnect(QString) ), myChat, SLOT( connected (QString) ) ); - connect( this, SIGNAL( signalChatSelfJoined(QString, QString) ), myChat, SLOT( selfJoined (QString, QString) ) ); - connect( this, SIGNAL( signalChatPlayerJoined (QString) ), myChat, SLOT( playerJoined (QString) ) ); - connect( this, SIGNAL( signalChatPlayerLeft (QString) ), myChat, SLOT( playerLeft (QString) ) ); - connect( this, SIGNAL( signalChatMessage (QString, QString) ), myChat, SLOT( displayMessage (QString, QString) ) ); - clearDialog(); } diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h index a9508a1d..31da7df4 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h @@ -40,18 +40,13 @@ public: void exec(); + LobbyChat *getLobbyChat() { return myChat; } + void setSession(Session *session); Session& getSession() { return *mySession; } void setMyW ( mainWindowImpl* theValue ) { myW = theValue; } -signals: - void signalChatConnect(QString server); - void signalChatSelfJoined(QString nickName, QString channel); - void signalChatPlayerJoined(QString nickName); - void signalChatPlayerLeft(QString nickName); - void signalChatMessage(QString nickName, QString msg); - public slots: void createGame(); diff --git a/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.cpp b/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.cpp index 8de657b2..c28fde2d 100644 --- a/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.cpp +++ b/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.cpp @@ -18,6 +18,9 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "lobbychat.h" +#define IN_INCLUDE_LIBIRC_H +#include +#include #include "gamelobbydialogimpl.h" #include "session.h" @@ -71,6 +74,29 @@ void LobbyChat::playerJoined(QString playerName) myLobby->treeWidget_NickList->sortItems(0, Qt::AscendingOrder); } +void LobbyChat::playerChanged(QString oldNick, QString newNick) +{ + QList tmpList(myLobby->treeWidget_NickList->findItems(oldNick, Qt::MatchExactly)); + if (!tmpList.empty()) + tmpList.front()->setData(0, Qt::DisplayRole, newNick); + + if (myNick == oldNick) + myNick = newNick; +} + +void LobbyChat::playerKicked(QString nickName, QString byWhom, QString reason) +{ + if (myNick == nickName) + { + myLobby->accept(); + QMessageBox::warning(myLobby, tr("Network Notification"), + tr("You were kicked from the server."), + QMessageBox::Close); + } + else + myLobby->textBrowser_ChatDisplay->append(nickName + " " + tr("was kicked from the server by") + " " + byWhom + " (" + reason + ")"); +} + void LobbyChat::playerLeft(QString playerName) { QList tmpList(myLobby->treeWidget_NickList->findItems(playerName, Qt::MatchExactly)); @@ -106,3 +132,92 @@ void LobbyChat::clearChat() { // // lineEdit_ChatInput->setCompleter(completer); } + +void LobbyChat::chatError(int errorCode) +{ + QString errorMsg; + switch (errorCode) + { + case ERR_IRC_INTERNAL : + case ERR_IRC_SELECT_FAILED : + case ERR_IRC_RECV_FAILED : + case ERR_IRC_SEND_FAILED : + case ERR_IRC_INVALID_PARAM : + errorMsg = tr("An internal IRC error has occured:") + " " + QString::number(errorCode); + break; + case ERR_IRC_CONNECT_FAILED : + errorMsg = tr("Could not connect to the IRC server. Chat will be unavailable."); + break; + case ERR_IRC_TERMINATED : + errorMsg = tr("The IRC server terminated the connection. Chat will be unavailable."); + break; + case ERR_IRC_TIMEOUT : + errorMsg = tr("An IRC action timed out."); + break; + } + if (errorMsg.size()) + myLobby->textBrowser_ChatDisplay->append(errorMsg); +} + +void LobbyChat::chatServerError(int errorCode) +{ + QString errorMsg; + switch (errorCode) + { + case LIBIRC_RFC_ERR_NOSUCHNICK : + case LIBIRC_RFC_ERR_NOSUCHCHANNEL : + case LIBIRC_RFC_ERR_CANNOTSENDTOCHAN : + case LIBIRC_RFC_ERR_TOOMANYCHANNELS : + case LIBIRC_RFC_ERR_WASNOSUCHNICK : + case LIBIRC_RFC_ERR_TOOMANYTARGETS : + case LIBIRC_RFC_ERR_NOSUCHSERVICE : + case LIBIRC_RFC_ERR_NOORIGIN : + case LIBIRC_RFC_ERR_NORECIPIENT : + case LIBIRC_RFC_ERR_NOTEXTTOSEND : + case LIBIRC_RFC_ERR_NOTOPLEVEL : + case LIBIRC_RFC_ERR_WILDTOPLEVEL : + case LIBIRC_RFC_ERR_BADMASK : + case LIBIRC_RFC_ERR_UNKNOWNCOMMAND : + case LIBIRC_RFC_ERR_NOMOTD : + case LIBIRC_RFC_ERR_NOADMININFO : + case LIBIRC_RFC_ERR_FILEERROR : + case LIBIRC_RFC_ERR_NONICKNAMEGIVEN : + case LIBIRC_RFC_ERR_ERRONEUSNICKNAME : + case LIBIRC_RFC_ERR_UNAVAILRESOURCE : + case LIBIRC_RFC_ERR_USERNOTINCHANNEL : + case LIBIRC_RFC_ERR_NOTONCHANNEL : + case LIBIRC_RFC_ERR_USERONCHANNEL : + case LIBIRC_RFC_ERR_NOLOGIN : + case LIBIRC_RFC_ERR_SUMMONDISABLED : + case LIBIRC_RFC_ERR_USERSDISABLED : + case LIBIRC_RFC_ERR_NOTREGISTERED : + case LIBIRC_RFC_ERR_NEEDMOREPARAMS : + case LIBIRC_RFC_ERR_ALREADYREGISTRED : + case LIBIRC_RFC_ERR_NOPERMFORHOST : + case LIBIRC_RFC_ERR_PASSWDMISMATCH : + case LIBIRC_RFC_ERR_YOUREBANNEDCREEP : + case LIBIRC_RFC_ERR_YOUWILLBEBANNED : + case LIBIRC_RFC_ERR_KEYSET : + case LIBIRC_RFC_ERR_CHANNELISFULL : + case LIBIRC_RFC_ERR_UNKNOWNMODE : + case LIBIRC_RFC_ERR_INVITEONLYCHAN : + case LIBIRC_RFC_ERR_BANNEDFROMCHAN : + case LIBIRC_RFC_ERR_BADCHANNELKEY : + case LIBIRC_RFC_ERR_BADCHANMASK : + case LIBIRC_RFC_ERR_NOCHANMODES : + case LIBIRC_RFC_ERR_BANLISTFULL : + case LIBIRC_RFC_ERR_NOPRIVILEGES : + case LIBIRC_RFC_ERR_CHANOPRIVSNEEDED : + case LIBIRC_RFC_ERR_CANTKILLSERVER : + case LIBIRC_RFC_ERR_RESTRICTED : + case LIBIRC_RFC_ERR_UNIQOPPRIVSNEEDED : + case LIBIRC_RFC_ERR_NOOPERHOST : + case LIBIRC_RFC_ERR_UMODEUNKNOWNFLAG : + case LIBIRC_RFC_ERR_USERSDONTMATCH : + errorMsg = tr("The IRC server reported an error:") + " " + QString::number(errorCode); + break; + } +// if (errorMsg.size()) +// myLobby->textBrowser_ChatDisplay->append(errorMsg); +} + diff --git a/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.h b/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.h index 513563da..998c0c7b 100644 --- a/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.h +++ b/src/gui/qt/gamelobbydialog/lobbychat/lobbychat.h @@ -41,11 +41,16 @@ public slots: void connected(QString server); void selfJoined(QString ownName, QString channel); void playerJoined(QString playerName); + void playerChanged(QString oldNick, QString newNick); + void playerKicked(QString nickName, QString byWhom, QString reason); void playerLeft(QString playerName); void displayMessage(QString playerName, QString msg); void checkInputLength(QString); void clearChat(); - + + void chatError(int errorCode); + void chatServerError(int errorCode); + private: gameLobbyDialogImpl *myLobby; diff --git a/src/gui/qt/guiwrapper.cpp b/src/gui/qt/guiwrapper.cpp index 39ac37c7..d36a312d 100644 --- a/src/gui/qt/guiwrapper.cpp +++ b/src/gui/qt/guiwrapper.cpp @@ -142,7 +142,11 @@ void GuiWrapper::SignalNetServerError(int errorID, int osErrorID) { myW->signalN void GuiWrapper::SignalIrcConnect(const string &server) { myW->signalIrcConnect(QString::fromUtf8(server.c_str())); } void GuiWrapper::SignalIrcSelfJoined(const string &nickName, const string &channel) { myW->signalIrcSelfJoined(QString::fromUtf8(nickName.c_str()), QString::fromUtf8(channel.c_str())); } -void GuiWrapper::SignalIrcPlayerJoined(const std::string &nickName) { myW->signalIrcPlayerJoined(QString::fromUtf8(nickName.c_str())); } +void GuiWrapper::SignalIrcPlayerJoined(const string &nickName) { myW->signalIrcPlayerJoined(QString::fromUtf8(nickName.c_str())); } +void GuiWrapper::SignalIrcPlayerChanged(const string &oldNick, const string &newNick) { myW->signalIrcPlayerChanged(QString::fromUtf8(oldNick.c_str()), QString::fromUtf8(newNick.c_str())); } +void GuiWrapper::SignalIrcPlayerKicked(const std::string &nickName, const std::string &byWhom, const std::string &reason) { myW->signalIrcPlayerKicked(QString::fromUtf8(nickName.c_str()), QString::fromUtf8(byWhom.c_str()), QString::fromUtf8(reason.c_str())); } void GuiWrapper::SignalIrcPlayerLeft(const std::string &nickName) { myW->signalIrcPlayerLeft(QString::fromUtf8(nickName.c_str())); } void GuiWrapper::SignalIrcChatMsg(const std::string &nickName, const std::string &msg) { myW->signalIrcChatMessage(QString::fromUtf8(nickName.c_str()), QString::fromUtf8(msg.c_str())); } +void GuiWrapper::SignalIrcError(int errorCode) { myW->signalIrcError(errorCode); } +void GuiWrapper::SignalIrcServerError(int errorCode) {myW->signalIrcServerError(errorCode); } diff --git a/src/gui/qt/guiwrapper.h b/src/gui/qt/guiwrapper.h index ba169983..669959d5 100644 --- a/src/gui/qt/guiwrapper.h +++ b/src/gui/qt/guiwrapper.h @@ -122,8 +122,12 @@ public: void SignalIrcConnect(const std::string &server); void SignalIrcSelfJoined(const std::string &nickName, const std::string &channel); void SignalIrcPlayerJoined(const std::string &nickName); + void SignalIrcPlayerChanged(const std::string &oldNick, const std::string &newNick); + void SignalIrcPlayerKicked(const std::string &nickName, const std::string &byWhom, const std::string &reason); void SignalIrcPlayerLeft(const std::string &nickName); void SignalIrcChatMsg(const std::string &nickName, const std::string &msg); + void SignalIrcError(int errorCode); + void SignalIrcServerError(int errorCode); private: diff --git a/src/gui/qt/mainwindow/mainwindowimpl.cpp b/src/gui/qt/mainwindow/mainwindowimpl.cpp index 5f80b4b2..8d06fb58 100755 --- a/src/gui/qt/mainwindow/mainwindowimpl.cpp +++ b/src/gui/qt/mainwindow/mainwindowimpl.cpp @@ -30,6 +30,7 @@ #include "changehumanplayernamedialogimpl.h" #include "changecompleteblindsdialogimpl.h" #include "gamelobbydialogimpl.h" +#include "lobbychat.h" #include "startsplash.h" #include "mycardspixmaplabel.h" @@ -678,11 +679,15 @@ mainWindowImpl::mainWindowImpl(ConfigFile *c, QMainWindow *parent) connect(this, SIGNAL(signalNetServerError(int, int)), this, SLOT(networkError(int, int))); connect(this, SIGNAL(signalNetClientGameStart(boost::shared_ptr)), this, SLOT(networkStart(boost::shared_ptr))); - connect(this, SIGNAL(signalIrcConnect(QString)), myGameLobbyDialog, SIGNAL(signalChatConnect(QString))); - connect(this, SIGNAL(signalIrcSelfJoined(QString, QString)), myGameLobbyDialog, SIGNAL(signalChatSelfJoined(QString, QString))); - connect(this, SIGNAL(signalIrcPlayerJoined(QString)), myGameLobbyDialog, SIGNAL(signalChatPlayerJoined(QString))); - connect(this, SIGNAL(signalIrcPlayerLeft(QString)), myGameLobbyDialog, SIGNAL(signalChatPlayerLeft(QString))); - connect(this, SIGNAL(signalIrcChatMessage(QString, QString)), myGameLobbyDialog, SIGNAL(signalChatMessage(QString, QString))); + connect(this, SIGNAL(signalIrcConnect(QString)), myGameLobbyDialog->getLobbyChat(), SLOT(connected(QString))); + connect(this, SIGNAL(signalIrcSelfJoined(QString, QString)), myGameLobbyDialog->getLobbyChat(), SLOT(selfJoined(QString, QString))); + connect(this, SIGNAL(signalIrcPlayerJoined(QString)), myGameLobbyDialog->getLobbyChat(), SLOT(playerJoined(QString))); + connect(this, SIGNAL(signalIrcPlayerChanged(QString, QString)), myGameLobbyDialog->getLobbyChat(), SLOT(playerChanged(QString, QString))); + connect(this, SIGNAL(signalIrcPlayerKicked(QString, QString, QString)), myGameLobbyDialog->getLobbyChat(), SLOT(playerKicked(QString, QString, QString))); + connect(this, SIGNAL(signalIrcPlayerLeft(QString)), myGameLobbyDialog->getLobbyChat(), SLOT(playerLeft(QString))); + connect(this, SIGNAL(signalIrcChatMessage(QString, QString)), myGameLobbyDialog->getLobbyChat(), SLOT(displayMessage(QString, QString))); + connect(this, SIGNAL(signalIrcError(int)), myGameLobbyDialog->getLobbyChat(), SLOT(chatError(int))); + connect(this, SIGNAL(signalIrcServerError(int)), myGameLobbyDialog->getLobbyChat(), SLOT(chatServerError(int))); //Sound mySDLPlayer = new SDLPlayer(myConfig); diff --git a/src/gui/qt/mainwindow/mainwindowimpl.h b/src/gui/qt/mainwindow/mainwindowimpl.h index 4c8e3d9c..5e20ee7e 100755 --- a/src/gui/qt/mainwindow/mainwindowimpl.h +++ b/src/gui/qt/mainwindow/mainwindowimpl.h @@ -142,8 +142,12 @@ signals: void signalIrcConnect(QString server); void signalIrcSelfJoined(QString nickName, QString channel); void signalIrcPlayerJoined(QString nickName); + void signalIrcPlayerChanged(QString oldNick, QString newNick); + void signalIrcPlayerKicked(QString nickName, QString byWhom, QString reason); void signalIrcPlayerLeft(QString nickName); void signalIrcChatMessage(QString nickName, QString msg); + void signalIrcError(int errorCode); + void signalIrcServerError(int errorCode); public slots: diff --git a/src/net/common/ircthread.cpp b/src/net/common/ircthread.cpp index 1ea732a3..6b6af0e9 100644 --- a/src/net/common/ircthread.cpp +++ b/src/net/common/ircthread.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -78,6 +79,13 @@ void irc_notify_player_list(irc_session_t *session, const char *players) } } +void irc_handle_server_error(irc_session_t *session, unsigned irc_error_code) +{ + IrcContext *context = (IrcContext *) irc_get_ctx(session); + + context->ircThread.GetCallback().SignalIrcServerError(irc_error_code); +} + void irc_event_connect(irc_session_t *session, const char *irc_event, const char *origin, const char **params, unsigned count) { @@ -99,6 +107,36 @@ irc_event_join(irc_session_t *session, const char *irc_event, const char *origin context->ircThread.GetCallback().SignalIrcPlayerJoined(origin); } +void +irc_event_nick(irc_session_t *session, const char *irc_event, const char *origin, const char **params, unsigned count) +{ + // someone changed his/her nick + IrcContext *context = (IrcContext *) irc_get_ctx(session); + + if (context->nick != params[0]) // only act if this was not an auto-rename + { + if (context->nick == origin) + context->nick = params[0]; + context->ircThread.GetCallback().SignalIrcPlayerChanged(origin, params[0]); + } +} + +void +irc_event_kick(irc_session_t *session, const char *irc_event, const char *origin, const char **params, unsigned count) +{ + // someone got kicked + IrcContext *context = (IrcContext *) irc_get_ctx(session); + + string byWhom(origin); + string who; + string reason; + if (count >= 2) + who = params[1]; + if (count >= 3) + reason = params[2]; + context->ircThread.GetCallback().SignalIrcPlayerKicked(who, byWhom, reason); +} + void irc_event_leave(irc_session_t *session, const char *irc_event, const char *origin, const char **params, unsigned count) { @@ -136,6 +174,58 @@ irc_event_numeric(irc_session_t * session, unsigned irc_event, const char *origi if (count >= 4) irc_notify_player_list(session, params[3]); break; + case LIBIRC_RFC_ERR_NOSUCHNICK : + case LIBIRC_RFC_ERR_NOSUCHCHANNEL : + case LIBIRC_RFC_ERR_CANNOTSENDTOCHAN : + case LIBIRC_RFC_ERR_TOOMANYCHANNELS : + case LIBIRC_RFC_ERR_WASNOSUCHNICK : + case LIBIRC_RFC_ERR_TOOMANYTARGETS : + case LIBIRC_RFC_ERR_NOSUCHSERVICE : + case LIBIRC_RFC_ERR_NOORIGIN : + case LIBIRC_RFC_ERR_NORECIPIENT : + case LIBIRC_RFC_ERR_NOTEXTTOSEND : + case LIBIRC_RFC_ERR_NOTOPLEVEL : + case LIBIRC_RFC_ERR_WILDTOPLEVEL : + case LIBIRC_RFC_ERR_BADMASK : + case LIBIRC_RFC_ERR_UNKNOWNCOMMAND : + case LIBIRC_RFC_ERR_NOMOTD : + case LIBIRC_RFC_ERR_NOADMININFO : + case LIBIRC_RFC_ERR_FILEERROR : + case LIBIRC_RFC_ERR_NONICKNAMEGIVEN : + case LIBIRC_RFC_ERR_ERRONEUSNICKNAME : + case LIBIRC_RFC_ERR_UNAVAILRESOURCE : + case LIBIRC_RFC_ERR_USERNOTINCHANNEL : + case LIBIRC_RFC_ERR_NOTONCHANNEL : + case LIBIRC_RFC_ERR_USERONCHANNEL : + case LIBIRC_RFC_ERR_NOLOGIN : + case LIBIRC_RFC_ERR_SUMMONDISABLED : + case LIBIRC_RFC_ERR_USERSDISABLED : + case LIBIRC_RFC_ERR_NOTREGISTERED : + case LIBIRC_RFC_ERR_NEEDMOREPARAMS : + case LIBIRC_RFC_ERR_ALREADYREGISTRED : + case LIBIRC_RFC_ERR_NOPERMFORHOST : + case LIBIRC_RFC_ERR_PASSWDMISMATCH : + case LIBIRC_RFC_ERR_YOUREBANNEDCREEP : + case LIBIRC_RFC_ERR_YOUWILLBEBANNED : + case LIBIRC_RFC_ERR_KEYSET : + case LIBIRC_RFC_ERR_CHANNELISFULL : + case LIBIRC_RFC_ERR_UNKNOWNMODE : + case LIBIRC_RFC_ERR_INVITEONLYCHAN : + case LIBIRC_RFC_ERR_BANNEDFROMCHAN : + case LIBIRC_RFC_ERR_BADCHANNELKEY : + case LIBIRC_RFC_ERR_BADCHANMASK : + case LIBIRC_RFC_ERR_NOCHANMODES : + case LIBIRC_RFC_ERR_BANLISTFULL : + case LIBIRC_RFC_ERR_NOPRIVILEGES : + case LIBIRC_RFC_ERR_CHANOPRIVSNEEDED : + case LIBIRC_RFC_ERR_CANTKILLSERVER : + case LIBIRC_RFC_ERR_RESTRICTED : + case LIBIRC_RFC_ERR_UNIQOPPRIVSNEEDED : + case LIBIRC_RFC_ERR_NOOPERHOST : + case LIBIRC_RFC_ERR_UMODEUNKNOWNFLAG : + case LIBIRC_RFC_ERR_USERSDONTMATCH : + irc_handle_server_error(session, irc_event); + break; } } @@ -147,6 +237,9 @@ IrcThread::IrcThread(IrcCallback &callback) IrcThread::~IrcThread() { + IrcContext &context = GetContext(); + if (context.session) + irc_destroy_session(context.session); } void @@ -168,12 +261,12 @@ IrcThread::Init(const std::string &serverAddress, unsigned serverPort, bool ipv6 callbacks.event_connect = irc_event_connect; callbacks.event_join = irc_event_join; - //callbacks.event_nick + callbacks.event_nick = irc_event_nick; callbacks.event_quit = irc_event_leave; callbacks.event_part = irc_event_leave; //callbacks.event_mode //callbacks.event_topic - //callbacks.event_kick + callbacks.event_kick = irc_event_kick; callbacks.event_channel = irc_event_channel; //callbacks.event_privmsg //callbacks.event_notice @@ -219,7 +312,9 @@ IrcThread::Main() irc_session_t *s = context.session; if (s) { - if (irc_connect(s, context.serverAddress.c_str(), context.serverPort, 0, context.nick.c_str(), 0, 0) == 0) + if (irc_connect(s, context.serverAddress.c_str(), context.serverPort, 0, context.nick.c_str(), 0, 0) != 0) + HandleIrcError(irc_errno(s)); + else { // Main loop. while (irc_is_connected(s)) @@ -251,21 +346,52 @@ IrcThread::Main() int selectResult = select(maxfd + 1, &readSet, &writeSet, 0, &timeout); if (!IS_VALID_SELECT(selectResult)) { - //todo + GetCallback().SignalIrcError(ERR_IRC_SELECT_FAILED); break; } if (irc_process_select_descriptors(s, &readSet, &writeSet) != 0) { - //todo + HandleIrcError(irc_errno(s)); break; } } } - irc_destroy_session(s); } } +void +IrcThread::HandleIrcError(int errorCode) +{ + int internalErrorCode = ERR_IRC_INTERNAL; + switch(errorCode) + { + case LIBIRC_ERR_RESOLV: + case LIBIRC_ERR_SOCKET: + case LIBIRC_ERR_CONNECT: + internalErrorCode = ERR_IRC_CONNECT_FAILED; + break; + case LIBIRC_ERR_INVAL: + case LIBIRC_ERR_STATE: + internalErrorCode = ERR_IRC_INVALID_PARAM; + break; + case LIBIRC_ERR_CLOSED: + case LIBIRC_ERR_TERMINATED: + internalErrorCode = ERR_IRC_TERMINATED; + break; + case LIBIRC_ERR_READ: + internalErrorCode = ERR_IRC_RECV_FAILED; + break; + case LIBIRC_ERR_WRITE: + internalErrorCode = ERR_IRC_SEND_FAILED; + break; + case LIBIRC_ERR_TIMEOUT: + internalErrorCode = ERR_IRC_TIMEOUT; + break; + } + GetCallback().SignalIrcError(internalErrorCode); +} + const IrcContext & IrcThread::GetContext() const { diff --git a/src/net/irccallback.h b/src/net/irccallback.h index 08615a5b..f7863b4f 100644 --- a/src/net/irccallback.h +++ b/src/net/irccallback.h @@ -31,8 +31,12 @@ public: virtual void SignalIrcConnect(const std::string &server) = 0; virtual void SignalIrcSelfJoined(const std::string &nickName, const std::string &channel) = 0; virtual void SignalIrcPlayerJoined(const std::string &nickName) = 0; + virtual void SignalIrcPlayerChanged(const std::string &oldNick, const std::string &newNick) = 0; + virtual void SignalIrcPlayerKicked(const std::string &nickName, const std::string &byWhom, const std::string &reason) = 0; virtual void SignalIrcPlayerLeft(const std::string &nickName) = 0; virtual void SignalIrcChatMsg(const std::string &nickName, const std::string &msg) = 0; + virtual void SignalIrcError(int errorCode) = 0; + virtual void SignalIrcServerError(int errorCode) = 0; }; #endif diff --git a/src/net/ircthread.h b/src/net/ircthread.h index 151974aa..beebe22e 100644 --- a/src/net/ircthread.h +++ b/src/net/ircthread.h @@ -49,6 +49,8 @@ protected: // Main function of the thread. virtual void Main(); + void HandleIrcError(int errorCode); + const IrcContext &GetContext() const; IrcContext &GetContext(); diff --git a/src/net/socket_msg.h b/src/net/socket_msg.h index bb8c0bf0..948e1b38 100644 --- a/src/net/socket_msg.h +++ b/src/net/socket_msg.h @@ -58,6 +58,15 @@ #define ERR_NET_PLAYER_KICKED 114 #define ERR_NET_INVALID_PLAYER_COUNT 115 +#define ERR_IRC_INTERNAL 151 +#define ERR_IRC_CONNECT_FAILED 152 +#define ERR_IRC_TERMINATED 153 +#define ERR_IRC_SELECT_FAILED 154 +#define ERR_IRC_RECV_FAILED 155 +#define ERR_IRC_SEND_FAILED 156 +#define ERR_IRC_INVALID_PARAM 157 +#define ERR_IRC_TIMEOUT 158 + // Notifications - removed from game #define NTF_NET_INTERNAL 201 #define NTF_NET_REMOVED_ON_REQUEST 202