Skip to content

Commit

Permalink
fix(kick): missmatching params when parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
jdomingu98 authored May 10, 2024
1 parent 3f6a0fa commit 35cbe67
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 23 deletions.
6 changes: 3 additions & 3 deletions includes/commands/KickCommand.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ class User;
class KickCommand : public ACommand {
private:
const std::vector<std::string> _channels;
const std::vector<User *> _users;
const std::string _comment;
const std::vector<std::string> _users;
const std::string _comment;

void kickUserFromChannel(Channel &channel, const User &user, const std::string &kickedUser, const std::string &comment);

public:
KickCommand(const std::vector<std::string> &channels, const std::vector<User *> &users, const std::string &comment);
KickCommand(const std::vector<std::string> &channels, const std::vector<std::string> &users, const std::string &comment);

void execute(int clientFd);
};
Expand Down
51 changes: 31 additions & 20 deletions src/commands/KickCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* @param users The users to kick
* @param comment The comment for the kick
*/
KickCommand::KickCommand(const std::vector<std::string> &channels, const std::vector<User *> &users, const std::string &comment)
KickCommand::KickCommand(const std::vector<std::string> &channels, const std::vector<std::string> &users, const std::string &comment)
: ACommand(true), _channels(channels), _users(users), _comment(comment) {}

/**
Expand All @@ -20,29 +20,34 @@ KickCommand::KickCommand(const std::vector<std::string> &channels, const std::ve
* @throws `NoSuchChannelException` If the channel does not exist
*/
void KickCommand::execute(int clientFd) {

if (_channels.size() != _users.size() && _channels.size() != 1 && _users.size() != 1)
throw NeedMoreParamsException(KICK);

Server &server = Server::getInstance();
const User *user = server.getUserByFd(clientFd);
const User *me = server.getUserByFd(clientFd);

const std::string &nickname = user->getNickname();
const std::string &nickname = me->getNickname();
const std::string comment = _comment.empty() ? nickname : _comment;

for (size_t i = 0; i < _channels.size(); ++i) {
try {
Channel *channel = server.getChannelByName(_channels[i]);

if (!user->isOnChannel(_channels[i]))
if (!me->isOnChannel(_channels[i]))
throw NotOnChannelException(_channels[i]);

if (!channel->isOper(nickname))
throw ChanOPrivsNeededException(_channels[i]);

//std::vector<User *> users = initializeUsers(clientFd);
if (_channels.size() == 1) {
std::vector<User *>::const_iterator userIt;
std::vector<std::string>::const_iterator userIt;
for (userIt = _users.begin(); userIt != _users.end(); ++userIt)
kickUserFromChannel(*channel, *user, (*userIt)->getNickname(), comment);
kickUserFromChannel(*channel, *me, *userIt, comment);
} else {
const size_t pos = _channels.size() == _users.size() ? i : 0;
kickUserFromChannel(*channel, *user, _users[pos]->getNickname(), comment);
kickUserFromChannel(*channel, *me, _users[pos], comment);
}
} catch (const NoSuchChannelException &e) {
Logger::debug("Channel " + _channels[i] + " does not exist.");
Expand All @@ -61,20 +66,26 @@ void KickCommand::execute(int clientFd) {
*
* @throws `UserNotInChannelException` If the user is not in the channel
*/
void KickCommand::kickUserFromChannel(Channel &channel, const User &user,
const std::string &kickedUser, const std::string &comment) {
void KickCommand::kickUserFromChannel(Channel &channel, const User &me, const std::string &kickedUser, const std::string &comment) {
Server &server = Server::getInstance();
User *kicked = server.getUserByNickname(kickedUser);

if (!kicked->isOnChannel(channel.getName()))
throw UserNotInChannelException(kickedUser, channel.getName());

try {
User *kicked = server.getUserByNickname(kickedUser);
if (!kicked->isOnChannel(channel.getName()))
throw NotOnChannelException(channel.getName());

const std::vector<User *> allUsers = channel.getUsers();
for (std::vector<User *>::const_iterator it = allUsers.begin(); it != allUsers.end(); ++it) {
Logger::debug("Sending KICK message of user " + kickedUser + " to user " + (*it)->getNickname().c_str());
server.sendMessage((*it)->getFd(),
CMD_MSG(user.getNickname(), user.getUsername(), user.getHostname(),
KICK_MSG(channel.getName(), kickedUser, comment)));
}
const std::vector<User *> allUsers = channel.getUsers();
for (std::vector<User *>::const_iterator it = allUsers.begin(); it != allUsers.end(); ++it) {
Logger::debug("Sending KICK message of user " + kickedUser + " to user " + (*it)->getNickname().c_str());
server.sendMessage((*it)->getFd(),
CMD_MSG(me.getNickname(), me.getUsername(), me.getHostname(),
KICK_MSG(channel.getName(), kickedUser, comment)
)
);
}
channel.removeUser(kickedUser);
} catch (const IRCException& e) {
Logger::debug("User not found!. Continue parsing KICK command.");
server.sendExceptionMessage(me.getFd(), e);
}
}

0 comments on commit 35cbe67

Please sign in to comment.