171 lines
7.7 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|