Files
MiniChat/Srcs/Modes.cpp
2024-05-03 16:25:20 +01:00

171 lines
7.7 KiB
C++

#include "Server.hpp"
void Server::processModeCmd(Client& client, const std::string& command, int fd) {
std::string channelName, mode , nick;
std::istringstream iss(command.substr(5));
iss >> channelName >> mode >> nick;
if (channelName[0] != '#') {
client.clearCommand();
return;
}
channelName = channelName.substr(1);
channelName = trim(channelName);
mode = trim(mode);
size_t opt = mode.length() - 1;
if (mode[opt] == 'o')
handleOpPrivilege(nick, channelName, mode, fd);
else if (mode[opt] == 't')
handleTopicRestriction(nick, channelName, mode, fd);
else if (mode[opt] == 'i')
handleInviteOnly(nick, channelName, mode, fd);
else if (mode[opt] == 'k')
handleChannelKey(nick, channelName, mode, fd);
else if (mode[opt] == 'l')
handleChannelLimit(nick, channelName, mode, fd);
}
void Server::handleOpPrivilege(const std::string& nick, const std::string& channelName, const std::string& mode, int fd) {
if (mode == "+o") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
channels[channelName].addOperator(nick, channels[channelName].getUserFd(nick));
abaaba = channels[channelName].getUserFd(nick);
std::string modeChangeMessage = MODE_SET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
}
else {
std::string errorMessage = ERROR_MESSAGE7(channelName, fd);
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
else if (mode == "-o") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
channels[channelName].removeOperator(nick);
std::string modeChangeMessage = MODE_UNSET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
}
void Server::handleTopicRestriction(const std::string& nick, const std::string& channelName, const std::string& mode, int fd) {
if (mode == "-t") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = TOPIC_CHANGE_MESSAGE(channelName, mode, fd);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
issettop = 1;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
else if (mode == "+t") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = TOPIC_CHANGE_MESSAGE(channelName, mode, fd);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
issettop = 0;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
}
void Server::handleInviteOnly(const std::string& nick, const std::string& channelName, const std::string& mode, int fd) {
if (mode == "+i") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = MODE_SET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
isinvited = 1;
}
else if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd) == false) {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
else if (mode == "-i") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = MODE_UNSET_MESSAGE(channelName, mode, fd, nick);;
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
isinvited = 0;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
}
void Server::handleChannelKey(std::string& nick, const std::string& channelName, const std::string& mode, int fd) {
if (mode == "-k") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = MODE_UNSET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
itHasPass = 0;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
else if (mode == "+k") {
nick = trim(nick);
channels[channelName].setPass(nick);
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = MODE_SET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
itHasPass = 1;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
}
void Server::handleChannelLimit(const std::string& nick, const std::string& channelName, const std::string& mode, int fd) {
if (mode == "+l") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
int limit = stringToInt(nick);
channels[channelName].setlimitchannel(limit);
std::string modeChangeMessage = MODE_SET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
channelLimit = 1;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
else if (mode == "-l") {
if (channels.find(channelName) != channels.end() && channels[channelName].isOperator(fd)) {
std::string modeChangeMessage = MODE_UNSET_MESSAGE(channelName, mode, fd, nick);
send(fd, modeChangeMessage.c_str(), modeChangeMessage.size(), 0);
smallbroadcastMOOD(channels[channelName].getNickname(fd), channelName, mode, nick);
channelLimit = 0;
limitchannelforincrement = 0;
}
else {
std::string errorMessage = ERROR_MESSAGE5();
send(fd, errorMessage.c_str(), errorMessage.size(), 0);
}
}
}