netpanzer-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[netPanzer-CVS] netpanzer/src/NetPanzer Core/main.cpp Views/Mai...


From: Hankin Chick
Subject: [netPanzer-CVS] netpanzer/src/NetPanzer Core/main.cpp Views/Mai...
Date: Fri, 07 Nov 2003 23:28:31 -0500

CVSROOT:        /cvsroot/netpanzer
Module name:    netpanzer
Branch:         
Changes by:     Hankin Chick <address@hidden>   03/11/07 23:28:31

Modified files:
        src/NetPanzer/Core: main.cpp 
        src/NetPanzer/Views/MainMenu/Multi: GetSessionView.cpp 
                                            IRCLobby.cpp IRCLobby.hpp 
                                            IRCLobbyView.cpp 
                                            IRCLobbyView.hpp 

Log message:
        no freezing if there is no internet connection
        show user lobby connect errors instead of crashing
        wrap long lines
        list users in lobby
        lobby view blocked "join" text
        added --lobby_server=server:[port]  option
        --lobby_server='' means don't connect to lobby

Patches:
Index: netpanzer/src/NetPanzer/Core/main.cpp
diff -u netpanzer/src/NetPanzer/Core/main.cpp:1.18 
netpanzer/src/NetPanzer/Core/main.cpp:1.19
--- netpanzer/src/NetPanzer/Core/main.cpp:1.18  Sun Oct 26 12:55:48 2003
+++ netpanzer/src/NetPanzer/Core/main.cpp       Fri Nov  7 23:28:31 2003
@@ -38,6 +38,7 @@
 #include "DedicatedGameManager.hpp"
 #include "BotGameManager.hpp"
 #include "PlayerGameManager.hpp"
+#include "IRCLobbyView.hpp"
 
 /** This functions iterates throgh the SDL event queue.
  * It returns true if a quit message has been received, otherwise false.
@@ -178,6 +179,9 @@
     bool_option debug_option('g', "debug",
             "enable debug output", false);
     commandline.add(&debug_option);
+    option<char *> lobby_server_option('\0', "lobby_server",
+        "Use an empty lobby server if you dont want to use the lobby", false);
+    commandline.add(&lobby_server_option);
 
     if(!commandline.process() || commandline.help() || commandline.version())
         exit(0);
@@ -185,6 +189,9 @@
     if (debug_option.value()) {
         LOGGER.setLogLevel(Logger::LEVEL_DEBUG);
         LOGGER.debug("debug option enabled");
+    }
+    if (lobby_server_option.value()) {
+        IRCLobbyView::lobby_server=lobby_server_option.value();
     }
 
     // Initialize SDL
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/GetSessionView.cpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/GetSessionView.cpp:1.16 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/GetSessionView.cpp:1.17
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/GetSessionView.cpp:1.16        
Mon Nov  3 08:26:35 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/GetSessionView.cpp     Fri Nov 
 7 23:28:31 2003
@@ -141,8 +141,10 @@
 
 
         Desktop::setVisibility("IPAddressView", true);
-        Desktop::setVisibility("IRCLobbyView", true);
-        IRCLobbyView::startIRC();
+        if(!IRCLobbyView::lobby_server.empty()) {
+            Desktop::setVisibility("IRCLobbyView", true);
+            IRCLobbyView::startIRC();
+        }
         //Desktop::setVisibility("JoinView", true);
         //Desktop::setVisibility("GetSessionHostView", true);
         //Desktop::setVisibility("UnitSelectionView", true);
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp:1.2 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp:1.3
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp:1.2       Thu Nov 
 6 12:53:26 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp   Fri Nov  7 
23:28:31 2003
@@ -29,15 +29,25 @@
 static const char* ask_server_running_mess = "Who's running a server?";
 static const char* server_running_mess = "I'm running";
 
-IRCLobby::IRCLobby(const std::string& servername, int serverport,
-        const std::string& nickname,
+IRCLobby::IRCLobby(const std::string& server,
+        const std::string& nick,
         const std::string& newchannelname)
-    : irc_server_socket(0), channel_name(newchannelname), game_servers(0),
-      running_thread(0)
+    : irc_server_socket(0), channel_name(newchannelname), nickname(nick),
+        game_servers(0), running_thread(0)
 {
+    unsigned int colon=server.find(':',0);
+    if(colon==std::string::npos) {
+        serveraddress=server;
+        serverport=6667;
+    }
+    else {
+        serveraddress=server.substr(0,colon);
+        colon++;
+        std::string port_str(server.substr(colon,server.length()-colon));
+        serverport=atoi(port_str.c_str());
+    }
     game_servers=new GameServerList();
     game_servers_mutex=SDL_CreateMutex();
-    connectToServer(servername, serverport, nickname, channel_name);
     startMessagesThread();
 }
 
@@ -82,20 +92,30 @@
     return sendIRCMessageLine(buffer.str(), dest);
 }
 
-void IRCLobby::connectToServer(const std::string& serveraddress, int port,
-        const std::string& nickname, const std::string& channel)
+void IRCLobby::connectToServer()
 {
     IPaddress addr;
     // some old versions of SDL_net take a char* instead of const char*
     if(SDLNet_ResolveHost(&addr, const_cast<char*>(serveraddress.c_str()), 
6667)
-            < 0)
-        throw Exception("Couldn't resolve server address for '%s'",
-                serveraddress.c_str());
+            < 0) {
+        std::string err_mess("Couldn't resolve server address for "+
+                serveraddress);
+        addChatMessage("",err_mess);
+        LOG((err_mess.c_str()));
+        return;
+    }
         
     irc_server_socket = SDLNet_TCP_Open(&addr);
-    if(!irc_server_socket)
-        throw Exception("Couldn't connect to irc server: %s",
-                SDLNet_GetError());
+    if(!irc_server_socket) {
+        std::string err_mess("Couldn't connect to irc server: " +serveraddress
+            + ":" );
+        err_mess+= serverport;
+        err_mess+= "Err:";
+        err_mess+= SDLNet_GetError();
+        addChatMessage("",err_mess);
+        LOG(("%s",err_mess.c_str()));
+        return;
+    }
 
     // login
     const char *playername = nickname.c_str();
@@ -147,9 +167,16 @@
     sendIRCMessageLine(buffer.str());
 }
 
+void IRCLobby::refreshUserList()
+{
+    std::string str("NAMES "+channel_name);
+    sendIRCLine(str);
+}
+
 int IRCLobby::messagesThreadEntry(void* data)
 {
     IRCLobby* t = (IRCLobby*) data;
+    t->connectToServer();
     t->processMessages();
     return 0;
 }
@@ -166,6 +193,10 @@
 
 void IRCLobby::processMessages()
 {
+    if(irc_server_socket == 0) {
+        return;
+    }
+
     while(1) {
         try {
             processMessage();
@@ -181,11 +212,24 @@
 void IRCLobby::addChatMessage(const std::string& user,
                               const std::string& message)
 {
-    // only save latest 20 messages
-    while(chat_messages.size() > 20)
-        chat_messages.pop_front();
-
-    chat_messages.push_back(IRCChatMessage(user, message));
+    static const unsigned int max_chat_cols=42;
+    int ch_upto=0;
+    while(1) {
+        // only save latest 20 messages
+        while(chat_messages.size() > 20)
+            chat_messages.pop_front();
+
+        if((message.length()-ch_upto)>max_chat_cols) {
+            // split a long message up...
+            chat_messages.push_back(IRCChatMessage(user, 
message.substr(ch_upto,max_chat_cols)));
+            ch_upto+=max_chat_cols;
+        }
+        else {
+            // insert the whole message
+            chat_messages.push_back(IRCChatMessage(user, 
message.substr(ch_upto,message.length()-ch_upto)));
+            break;
+        }
+    }
 }
 
 // read a line of irc and process it.
@@ -207,28 +251,56 @@
     while(*code && isspace(*code)) { code++; }
 
     int code_i=atoi(code);
+    if((mess=strchr(buf+1,':'))==NULL) {
+        return;
+    }
+    mess++;
+
     if(code_i>=400 && code_i<500) {
+        addChatMessage("Error",mess);
         LOG(("IRC:%s",buf));
     }
+    if(code_i==353) {
+        addChatMessage("Lobby",mess);
+        return;
+    }
 
     // get remote user/host
-    // address@hidden PRIVMSG #netpanzerlob :asfd
     if(
         (host=strchr(buf,'@'))==0
-        || (mess=strchr(buf+1,':'))==0
         || (user_end=strchr(buf,'!'))==0
     ) {
         return;
     }
     *host++=0;
     *user_end++=0;
-    mess++;
+
+    if(strncmp(code,"JOIN ",5)==0) {
+        std::string joined(buf+1);
+        joined+=" has arrived in lobby";
+        addChatMessage("",joined);
+        if(gameconfig->hostorjoin== _game_session_host) {
+            LOG(("%s",joined.c_str()));
+        }
+        return;
+    }
+    if(strncmp(code,"PART ",5)==0 || strncmp(code,"QUIT ",5)==0) {
+        std::string leave(buf+1);
+        leave+=" has left the lobby";
+        addChatMessage("",leave);
+        if(gameconfig->hostorjoin== _game_session_host) {
+            LOG(("%s",leave.c_str()));
+        }
+        return;
+    }
+
+
     if((host_end=strchr(host,' '))==0) {
         return;
     }
     *host_end++=0;
     while(isspace(*host_end)) host_end++;
-    if(strncmp(host_end,"PRIVMSG",7)!=0) {
+    if(strncmp(host_end,"PRIVMSG ",8)!=0) {
         return;
     }
 
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp:1.2 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp:1.3
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp:1.2       Thu Nov 
 6 12:53:26 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp   Fri Nov  7 
23:28:31 2003
@@ -36,7 +36,7 @@
 class IRCLobby
 {
 public:
-    IRCLobby(const std::string& servername, int serverport,
+    IRCLobby(const std::string& servername,
              const std::string& nickname,
              const std::string& channel);
     ~IRCLobby();
@@ -44,6 +44,7 @@
     void sendChatMessage(const std::string& user, const std::string& line);
     void sendIRCMessageLine(const std::string& line);
     void refreshServerList();
+    void refreshUserList();
 
 private:
     void startMessagesThread();
@@ -58,9 +59,9 @@
     void sendIRCLine(const std::string& line);
     void sendIRCMessageLine(const std::string& line, const std::string& to);
     void readIRCLine(char *buf, size_t buf_len);
-    void connectToServer(const std::string& serveraddr, int port, 
-            const std::string& nickname, const std::string& channel_name);
+    void connectToServer();
     void addChatMessage(const std::string& user, const std::string& message);
+    int isConnected() { return irc_server_socket!=NULL?1:0; }
 
     SDL_mutex *game_servers_mutex;   
 
@@ -68,6 +69,9 @@
     TCPsocket irc_server_socket;
 
     std::string channel_name;
+    std::string nickname;
+    std::string serveraddress;
+    int serverport;
     std::list<IRCChatMessage> chat_messages;
     GameServerList* game_servers;
     
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp:1.3 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp:1.4
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp:1.3   Thu Nov 
 6 14:58:27 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp       Fri Nov 
 7 23:28:31 2003
@@ -30,6 +30,7 @@
 #include "Client.hpp"
 
 IRCLobby *IRCLobbyView::lobby_connection=0;
+std::string IRCLobbyView::lobby_server("irc.freenode.net:6667");
 
 cInputFieldString IRCLobbyView::szChat;
 
@@ -37,6 +38,7 @@
 static void buttonRefresh(void)
 {
     IRCLobbyView::lobby_connection->refreshServerList();
+    IRCLobbyView::lobby_connection->refreshUserList();
 }
 
 static void chatReturnPressed(cInputField* )
@@ -63,7 +65,7 @@
     setAllowMove(false);
     setVisible(false);
 
-    moveTo(iXY(bodyTextRect.min.x, bodyTextRect.min.y + 200));
+    moveTo(iXY(bodyTextRect.max.x-400, bodyTextRect.min.y + 200));
 
     iXY  area_size = iXY(400, lobby_view_height);
     resizeClientArea(area_size);
@@ -92,28 +94,33 @@
     if(lobby_connection==0) { return; }
 
 //~~~ todo: scrollbar for large list of servers
-    SDL_mutexP(lobby_connection->game_servers_mutex);
-    
-    GameServerList::iterator i;
-    GameServerList* serverlist = lobby_connection->game_servers;
-    disp_server_upto=0;
-    for(i=serverlist->begin(); i!=serverlist->end(); i++) {
-        const GameServer* server = &(*i);
-
-        std::stringstream playerstr;
-        playerstr << server->playercount << "/" << server->max_players;
-        
-        clientArea.bltString(iXY(0,y),server->user.c_str(), Color::white);
-        clientArea.bltString(iXY(140,y),playerstr.str().c_str(), Color::white);
-        clientArea.bltString(iXY(200,y),server->map.c_str(), Color::white);
+    if(!lobby_connection->isConnected()) {
+        clientArea.bltString(iXY(0,0),"Not connected to lobby", Color::white);
+    }
+    else {
+        SDL_mutexP(lobby_connection->game_servers_mutex);
         
-        displayed_servers[disp_server_upto++]=server;
-        y += Surface::getFontHeight();
-        if(y >= server_list_end_y)
-            break;
+        GameServerList::iterator i;
+        GameServerList* serverlist = lobby_connection->game_servers;
+        disp_server_upto=0;
+        for(i=serverlist->begin(); i!=serverlist->end(); i++) {
+            const GameServer* server = &(*i);
+
+            std::stringstream playerstr;
+            playerstr << server->playercount << "/" << server->max_players;
+            
+            clientArea.bltString(iXY(0,y),server->user.c_str(), Color::white);
+            clientArea.bltString(iXY(140,y),playerstr.str().c_str(), 
Color::white);
+            clientArea.bltString(iXY(200,y),server->map.c_str(), Color::white);
+            
+            displayed_servers[disp_server_upto++]=server;
+            y += Surface::getFontHeight();
+            if(y >= server_list_end_y)
+                break;
+        }
+        SDL_mutexV(lobby_connection->game_servers_mutex);
+        total_displayed_servers=disp_server_upto;
     }
-    SDL_mutexV(lobby_connection->game_servers_mutex);
-    total_displayed_servers=disp_server_upto;
 
     std::list<IRCChatMessage>::reverse_iterator m;
     y = chat_list_end_y - Surface::getFontHeight();
@@ -154,8 +161,9 @@
 void IRCLobbyView::startIRC()
 {
     try {
+        if(lobby_server.empty()) { return; }
         stopIRC();
-        lobby_connection = new IRCLobby("irc.freenode.net", 6667,
+        lobby_connection=new IRCLobby(lobby_server,
                 gameconfig->playername, "#netpanzerlob");
     } catch(std::exception& e) {
         LOG(("Couldn't connect to irc lobby: %s", e.what()));
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp:1.2 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp:1.3
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp:1.2   Thu Nov 
 6 12:53:26 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp       Fri Nov 
 7 23:28:31 2003
@@ -31,6 +31,7 @@
  const GameServer *displayed_servers[64];
  int total_displayed_servers;
 public:
+ static std::string lobby_server;
  static cInputFieldString szChat;
  static IRCLobby *lobby_connection;
  IRCLobbyView();




reply via email to

[Prev in Thread] Current Thread [Next in Thread]