diff options
Diffstat (limited to 'bouncer')
-rw-r--r-- | bouncer/core.h | 16 | ||||
-rw-r--r-- | bouncer/ircserver.cpp | 13 | ||||
-rw-r--r-- | bouncer/mobileclient.cpp | 14 | ||||
-rw-r--r-- | bouncer/window.cpp | 122 |
4 files changed, 125 insertions, 40 deletions
diff --git a/bouncer/core.h b/bouncer/core.h index d7d54f3..8817b77 100644 --- a/bouncer/core.h +++ b/bouncer/core.h @@ -67,6 +67,7 @@ public: virtual void handleUserClosed(); void pushMessage(const char *str); + void notifyWindowRename(); }; class StatusWindow : public Window { @@ -303,13 +304,18 @@ private: }; struct IRCNetworkConfig { - char hostname[512]; - char nickname[128]; - char username[128]; - char realname[128]; - char password[128]; + std::string hostname, username, realname; + std::string nickname, altNick; + std::string password; int port; bool useTls; + + IRCNetworkConfig() { + username = "user"; + realname = "VulpIRC User"; + port = 6667; + useTls = false; + } }; class IRCServer : public Server { diff --git a/bouncer/ircserver.cpp b/bouncer/ircserver.cpp index 63d5c90..8279484 100644 --- a/bouncer/ircserver.cpp +++ b/bouncer/ircserver.cpp @@ -27,7 +27,9 @@ void IRCServer::attachedToCore() { void IRCServer::connect() { status.pushMessage("Connecting..."); - Server::connect(config.hostname, config.port, config.useTls); + Server::connect( + config.hostname.c_str(), config.port, + config.useTls); } @@ -92,13 +94,16 @@ void IRCServer::connectedEvent() { char buf[2048]; - if (strlen(config.password) > 0) { - sprintf(buf, "PASS %s", config.password); + if (config.password.size() > 0) { + sprintf(buf, "PASS %s", config.password.c_str()); sendLine(buf); } sprintf(buf, "USER %s 0 * :%s\r\nNICK %s", - config.username, config.realname, config.nickname); + config.username.c_str(), + config.realname.c_str(), + config.nickname.c_str()); + sendLine(buf); } void IRCServer::disconnectedEvent() { diff --git a/bouncer/mobileclient.cpp b/bouncer/mobileclient.cpp index 65ddefe..0dbc35a 100644 --- a/bouncer/mobileclient.cpp +++ b/bouncer/mobileclient.cpp @@ -67,21 +67,9 @@ void MobileClient::handleDebugCommand(char *line, int size) { } else if (strcmp(line, "quit") == 0) { bouncer->quitFlag = true; - } else if (strncmp(&line[1], "ddsrv ", 6) == 0) { + } else if (strcmp(line, "addsrv") == 0) { IRCServer *srv = new IRCServer(bouncer); - strcpy(srv->config.hostname, &line[7]); - srv->config.useTls = (line[0] == 's'); - srv->config.port = (line[0] == 's') ? 1191 : 6667; - strcpy(srv->config.nickname, "Ninjifox"); - strcpy(srv->config.username, "boop"); - strcpy(srv->config.realname, "boop"); - strcpy(srv->config.password, ""); bouncer->registerServer(srv); - - Buffer pkt; - pkt.writeStr("Your wish is my command!"); - for (int i = 0; i < bouncer->clientCount; i++) - bouncer->clients[i]->sendPacket(Packet::B2C_STATUS, pkt); } } diff --git a/bouncer/window.cpp b/bouncer/window.cpp index 98f0418..88e8247 100644 --- a/bouncer/window.cpp +++ b/bouncer/window.cpp @@ -20,6 +20,15 @@ void Window::syncStateForClient(Buffer &output) { } } +void Window::notifyWindowRename() { + Buffer packet; + packet.writeU32(id); + packet.writeStr(getTitle()); + + core->sendToClients( + Packet::B2C_WINDOW_RENAME, packet); +} + void Window::pushMessage(const char *str) { messages.push_back(str); @@ -53,7 +62,10 @@ StatusWindow::StatusWindow(IRCServer *_server) : } const char *StatusWindow::getTitle() const { - return server->config.hostname; + if (server->config.hostname.size() == 0) + return "<New Server>"; + else + return server->config.hostname.c_str(); } int StatusWindow::getType() const { @@ -61,21 +73,100 @@ int StatusWindow::getType() const { } void StatusWindow::handleUserInput(const char *str) { + char buf[1024]; + if (str[0] == '/') { // moof if (strcmp(str, "/connect") == 0) { - server->connect(); + + // Check if we have everything needed... + if (server->config.nickname.size() == 0) { + pushMessage("Use /defaultnick <name> to set a nickname"); + } else if (server->config.altNick.size() == 0) { + pushMessage("Use /altnick <name> to set an alternate nickname"); + } else if (server->config.hostname.size() == 0) { + pushMessage("Use /server <name> to set an IRC server to connect to"); + } else { + server->connect(); + } + } else if (strcmp(str, "/disconnect") == 0) { server->close(); - } else if (strncmp(str, "/password ", 10) == 0) { - pushMessage("Password set."); - - // This is ugly, ugh - strncpy( - server->config.password, - &str[10], - sizeof(server->config.password)); - server->config.password[sizeof(server->config.password) - 1] = 0; + + } else if (strncmp(str, "/defaultnick ", 13) == 0) { + server->config.nickname = &str[13]; + + // generate a default altnick if we don't have one already + if (server->config.altNick.size() == 0) { + server->config.altNick = server->config.nickname + "_"; + } + + snprintf(buf, sizeof(buf), + "Default nickname changed to: %s", + server->config.nickname.c_str()); + pushMessage(buf); + + } else if (strncmp(str, "/altnick ", 9) == 0) { + server->config.altNick = &str[9]; + + snprintf(buf, sizeof(buf), + "Alternate nickname changed to: %s", + server->config.altNick.c_str()); + pushMessage(buf); + + } else if (strncmp(str, "/server ", 8) == 0) { + server->config.hostname = &str[8]; + + snprintf(buf, sizeof(buf), + "Server address changed to: %s", + server->config.hostname.c_str()); + pushMessage(buf); + + notifyWindowRename(); + + } else if (strncmp(str, "/port ", 6) == 0) { + const char *p = &str[6]; + if (*p == '+') { + server->config.useTls = true; + ++p; + } else { + server->config.useTls = false; + } + server->config.port = atoi(p); + + snprintf(buf, sizeof(buf), + "Server port changed to %d, TLS %s", + server->config.port, + server->config.useTls ? "on" : "off"); + pushMessage(buf); + + } else if (strncmp(str, "/username ", 10) == 0) { + server->config.username = &str[10]; + + snprintf(buf, sizeof(buf), + "Username changed to: %s", + server->config.username.c_str()); + pushMessage(buf); + + } else if (strncmp(str, "/realname ", 10) == 0) { + server->config.realname = &str[10]; + + snprintf(buf, sizeof(buf), + "Real name changed to: %s", + server->config.username.c_str()); + pushMessage(buf); + + } else if (strncmp(str, "/password", 9) == 0) { + + if (strlen(str) == 9) + server->config.password = ""; + else + server->config.password = &str[10]; + + if (server->config.password.size() > 0) + pushMessage("Server password changed."); + else + pushMessage("Server password cleared."); } } else { server->sendLine(str); @@ -697,12 +788,7 @@ void Query::handleCtcp(const char *type, const char *params) { } void Query::renamePartner(const char *_partner) { - Buffer packet; - packet.writeU32(id); - packet.writeStr(_partner); - - server->bouncer->sendToClients( - Packet::B2C_WINDOW_RENAME, packet); - partner = _partner; + + notifyWindowRename(); } |