From c49efc19dea377e985ea6ee9ba3634f0ab4b8304 Mon Sep 17 00:00:00 2001 From: levensta Date: Thu, 16 Dec 2021 02:10:13 +0300 Subject: [PATCH] fix WHOWAS, KILL, update README --- README.md | 16 +++++++++++----- srcs/Server.cpp | 1 + srcs/commands/ircOperatorCommands.cpp | 8 ++++---- srcs/commands/userCommands.cpp | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e1e03cd..1210580 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ IRC (Internet Relay Chat) – устаревший протокол прикладного уровня для обмена сообщениями в режиме реального времени. Разработан в 1988 году и предназначен для группового общения, также позволяет общаться через личные сообщения и обмениваться файлами. Несмотря на устарелость, на основе IRC в дальнейшем разработано множество мессенджеров, такие как: ICQ, Skype, Discord, Telegram, Slack, etc... -Проект представляет собой IRC-сервер, написанный на основе стандарта [rfc1459](https://datatracker.ietf.org/doc/html/rfc1459).
-**ПРИМЕЧАНИЕ:** Сервер не поддерживает коммуникацию *сервер-сервер*. Ниже представлена сокращенная документация стандарта rfc1459. +Проект представляет собой IRC-сервер, написанный на основе стандарта [rfc1459](https://datatracker.ietf.org/doc/html/rfc1459).

Начало

@@ -30,7 +29,7 @@ make При необходимости можно менять конфиг сервера **IRConf.json** --- -К серверу прилагается бот, который, используя api.intra.42.fr, возвращает местоположение человека с отправленным никнеймом.
+К серверу прилагается бот, который, используя [api.intra.42.fr](https://api.intra.42.fr/), возвращает местоположение человека с отправленным никнеймом.
Запуск бота: ``` ./bot/bot IRCatBot.conf.json @@ -40,7 +39,13 @@ make PRIVMSG wherebot :levensta // :wherebot!where_is_bot@127.0.0.1 PRIVMSG lev :"Location: Russian Federation, Kazan, Spartakovskaya, 2b2 -> et-e1" ``` -

Содержание:

+--- + +

Документация rfc1459 (ред.)

+ +**ПРИМЕЧАНИЕ:** Cервер не поддерживает коммуникацию *сервер-сервер*. Ниже представлена сокращенная документация стандарта [rfc1459](https://datatracker.ietf.org/doc/html/rfc1459). + +

Содержание:

1. [Сообщения](#message) 2. [Регистрация соединения](#registration) @@ -113,7 +118,8 @@ PASS-сообщение не должно быть последним. **Параметры:** `` -Команда `PASS` используется для установки 'парольного соединения'. Пароль может и должен быть установлен перед любой попыткой регистрации установленного соединения. +Команда `PASS` используется для установки 'парольного соединения', в качестве пароля выступает второй аргумент, +переданный при запуске сервера. Пароль может и должен быть установлен перед любой попыткой регистрации соединения. В текущий момент, это требования к клиентам отправлять команду `PASS` перед отправкой комбинации `NICK`/`USER`. Числовые ответы: diff --git a/srcs/Server.cpp b/srcs/Server.cpp index f03e8eb..9d6a2a4 100644 --- a/srcs/Server.cpp +++ b/srcs/Server.cpp @@ -334,6 +334,7 @@ void Server::deleteBrokenConnections() { if (connectedUsers[i]->getFlags() & BREAKCONNECTION) { + this->nicknamesHistory.addUser(*(connectedUsers[i])); notifyUsers(*(connectedUsers[i]), ":" + connectedUsers[i]->getPrefix() + " QUIT :" + connectedUsers[i]->getQuitMessage() + "\n"); close(connectedUsers[i]->getSockfd()); std::map::iterator beg = channels.begin(); diff --git a/srcs/commands/ircOperatorCommands.cpp b/srcs/commands/ircOperatorCommands.cpp index 4323771..14471a5 100644 --- a/srcs/commands/ircOperatorCommands.cpp +++ b/srcs/commands/ircOperatorCommands.cpp @@ -22,14 +22,14 @@ int Server::killCmd(const Message &msg, User &user) { } string username = msg.getParams()[0]; - if (username == name) { + if (username == this->name) { return (sendError(user, ERR_CANTKILLSERVER)); } - User *userToKill = getUserByName(username); - if (userToKill == NULL) { - return (sendError(user, ERR_NOSUCHNICK)); + if (!containsNickname(username)) { + sendError(user, ERR_NOSUCHNICK, msg.getParams()[0]); } + User *userToKill = getUserByName(username); userToKill->sendMessage(msg.getParams()[1] + "\n"); userToKill->setFlag(BREAKCONNECTION); return 0; diff --git a/srcs/commands/userCommands.cpp b/srcs/commands/userCommands.cpp index b0466c1..3a2f329 100644 --- a/srcs/commands/userCommands.cpp +++ b/srcs/commands/userCommands.cpp @@ -180,7 +180,7 @@ int Server::whowasCmd(const Message &msg, User &user) n = atoi(msg.getParams()[1].c_str()); n = (n == 0) ? historyList.size() : n; - for (int i = 0; i < n; ++i) + for (int i = 0; i < n && i < static_cast(historyList.size()); ++i) { sendReply(user.getServername(), user, RPL_WHOWASUSER, historyList[i]->getNickname(), \ historyList[i]->getUsername(), historyList[i]->getHostname(), historyList[i]->getRealname());