[Top][All Lists]
[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();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [netPanzer-CVS] netpanzer/src/NetPanzer Core/main.cpp Views/Mai...,
Hankin Chick <=