diff --git a/Server/Server.hpp b/Server/Server.hpp index 6fd8ed1..1f332ea 100644 --- a/Server/Server.hpp +++ b/Server/Server.hpp @@ -6,7 +6,7 @@ /* By: aortigos # include +# include + # include "../User/User.hpp" -# define SERVER_NAME irc.server +# define SERVER_NAME "irc.server" # define PORT_DEFAULT 9898 class Server diff --git a/cmds/nick.cpp b/cmds/nick.cpp index f80a896..13649de 100644 --- a/cmds/nick.cpp +++ b/cmds/nick.cpp @@ -6,7 +6,7 @@ /* By: aortigos > args; if (args.empty()) return (client.send(":" SERVER_NAME " 431 * :Not nickname given\r\n")); - // Invalid characters in nick - // 432 * badnick : Erroneous nickname - // If nick exists - // 4233 * takenick :Nickname is already in use - if (client.getUsername()) - return (); // Broadcast in channels :oldnick!user@host NICK newnick + if (!isValidNick(args)) + return (client.send(":" SERVER_NAME " 432 * " + args + ":Erroneous nickname\r\n")) + for (std::map::iterator it = clients_.begin(); it != clients_.end(); it++) + { + if (it->second.getNick() == args) + return (client.send(":" SERVER_NAME " 433 * " + args + " :Nickname is already in use\r\n")) + } + + std::string oldNick = client.getNick(); + client.setNick(args); + + if (client.isRegistered()) + { + // Change nick to an already registered user + // Send message to his channels + //client.broadcast(":" + oldNick + "!~" + client.getUsername() + "@hostt NICK " + args + "\r\n"); + return ; + } + + if (!client.getUsername().empty()) + { + client.setRegistered(true); + client.send(":" SERVER_NAME " 001 " + args + " :Welcome to the IRC Network " + args + "\r\n"); + client.send(":" SERVER_NAME " 002 " + args + " :Your host is " SERVER_NAME ", running version 1.0\r\n"); + client.send(":" SERVER_NAME " 003 " + args + " :This server was created May 2026\r\n"); + client.send(":" SERVER_NAME " 004 " + args + " :" SERVER_NAME " 1.0\r\n"); + } +} + +static bool isValidNick(const std::string &nick) +{ + const std::string special = "[]\\`_^{|}"; + + if (!isalpha(nick[0]) && special.find(nick[0]) == std::string::npos) + return (false); + for (size_t i = 1; i < nick.size(); i++) + { + if (!isalnum(nick[i])) && special.find(nick[i] == std::string::npos && nick[i] != '-') + return (false); + } + return (true); } \ No newline at end of file