Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
levensta committed Oct 13, 2021
2 parents f895da1 + 1cf08dd commit 28c7e1a
Show file tree
Hide file tree
Showing 20 changed files with 672 additions and 185 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ SOURCEFILES= main.cpp \
sendError.cpp \
sendReply.cpp \
Channel.cpp \
History.cpp \
commands/channelCommands.cpp \
commands/otherCommands.cpp \
commands/registrationCommands.cpp \
Expand All @@ -30,7 +31,7 @@ $(OSOURCEFOLDER):
mkdir objects/commands

$(OSOURCEFOLDER)%.o: $(SOURCEFOLDER)%.cpp
clang++ -Wall -Werror -Wextra -c $< -o $@ -std=c++11 -I $(INCLUDEFOLDER)
clang++ -Wall -Werror -Wextra -c $< -o $@ -std=c++98 -I $(INCLUDEFOLDER)

$(NAME): $(OSOURCEFOLDER) $(OSOURCE)
clang++ $(OSOURCE) -o $(NAME)
Expand Down
44 changes: 30 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ IRC (Internet Relay Chat) – устаревший протокол прикла
* [WALLOPS](#wallops)
* [PING / PONG](#ping-pong)
* [ISON](#ison)
* [USERS](#users)
* [USERHOST](#userhost)
* [VERSION](#version)
* [INFO](#info)
* [ADMIN](#admin)
* [TIME](#time)
Expand Down Expand Up @@ -114,6 +115,7 @@ IRC (Internet Relay Chat) – устаревший протокол прикла

Команда `USER` используется в начале соединения для указания имени пользователя, названия хоста, названия сервера и реального имени нового пользователя.

Параметры `<hostname>` `<servername>` не проверяются IRC-сервером, когда они используются клиентом, но могут использоваться при коммуникации *сервер-сервер*.
Должно быть объявлено, что параметр `<realname>` должен быть последним, потому что он может содержать пробелы и перед ним должен быть префикс `:`, делающим распознавание лучшим.

Числовые ответы:
Expand All @@ -132,7 +134,7 @@ IRC (Internet Relay Chat) – устаревший протокол прикла

Команда `OPER` используется для взятия операторских прав. Параметры `<user>` и `<password>` используются для идентификации пользователя, запрашивающего права IRC-оператора.

Если пользователь послал команду `OPER` с корректным паролем для текущего пользователя, сервер информирует сеть о новом операторе, используя `MODE +o` для никнейма клиента.
При коммуникации *сервер-сервер*, если пользователь послал команду `OPER` с корректным паролем для текущего пользователя, сервер информирует сеть о новом операторе, используя `MODE +o` для никнейма клиента.

Числовые ответы:

Expand Down Expand Up @@ -221,7 +223,7 @@ AWAY :Gone to lunch. Back in 5 // установка away-сообщени

### WHO <a name="who"></a>

**Параметры:** `[<name> [<o>]]`
**Параметры:** `[<nickmask> [<o>]]`

Возвращает список пользователей, совпадающих с параметром `name`, за исключением [невидимых пользователей (+i)](#user-modes)
Если установлен флаг `o`, возвращается информация только об IRC-операторах.
Expand All @@ -239,7 +241,7 @@ AWAY :Gone to lunch. Back in 5 // установка away-сообщени

### WHOIS <a name="whois"></a>

**Параметры:** `[<server>]` `<nickmask>[,<nickmask>[,...]]`
**Параметры:** `[<server>]` `<nickmask>`

Cервер ответит на это сообщение несколькими числовыми сообщениями с указанием разных статусов каждого пользователя.
Если в `<nickmask>` не указана никакая информация о том, какой никнейм опросить, вы получите
Expand Down Expand Up @@ -364,10 +366,10 @@ Cервер ответит на это сообщение несколькими

* i – делает пользователя невидимым;
* s – пользователь (не)получает [NOTICE](#notice) сообщения;
* o – флаг оператора;
* o – флаг IRC-оператора;
* w – пользователь (не)получает [WALLOPS](#wallops) сообщения;

Если пользователь пытается сделать себя оператором, используя "+o" флаг, его попытка будет проигнорирована. Это не разрешено, в отличие от чьего-либо сброса себя самого (используя "-o").
Если пользователь пытается сделать себя IRC-оператором, используя `+o` флаг, его попытка будет проигнорирована. Это не разрешено, в отличие от сброса себя самого (используя `-o`).

Примеры использования пользовательских режимов:
```
Expand Down Expand Up @@ -430,6 +432,8 @@ Cервер ответит на это сообщение несколькими

### INVITE <a name="invite"></a>

**Параметры:** `<nickname>` `<channel>`

Команда `INVITE` используется для приглашения пользователей на канал.
Параметр `<nickname>` – указание пользователя, которого требуется пригласить в канал `<channel>`.
Если канал является invite-only (MODE +i), приглашать в него может только оператор канала.
Expand Down Expand Up @@ -555,7 +559,6 @@ IRC-операторы, в отличие от остальных пользов

* С каких хостов допускать соединения клиентов.
* С каких хостов допускать серверные соединения.
* С какими хостами соединяться (как активно, так и пассивно).
* Местоположение сервера(университет, город/район, компания и т.п.).
* Администратор сервера и его e-mail.
* Никнеймы и пароли IRC-операторов.
Expand All @@ -566,7 +569,8 @@ IRC-операторы, в отличие от остальных пользов

**Параметры:** `<message>`

Команда отправляет сообщения всем операторам, находящимся в сети, кроме тех, кто отключил уведомления с помощью `MODE -w`.
Команда отправляет сообщения всем IRC-операторам, находящимся в сети, кроме тех, кто отключил уведомления с помощью `MODE -w`.
Чтобы избежать злоупотребления командой `WALLOPS`, рекомендуется ограничить его использование для обычных пользователей.

Числовые ответы:

Expand Down Expand Up @@ -595,18 +599,30 @@ IRC-операторы, в отличие от остальных пользов

RPL_ISON ERR_NEEDMOREPARAMS

### USERS <a name="users"></a>
### USERHOST <a name="userhost"></a>

**Параметры:** `<nickname>{<space><nickname>}`

Команда `USERHOST` требует список до 5-ти никнеймов, разделеных пробелами и возвращает информацию о каждом никнейме, который был найден.

Числовые ответы:

RPL_USERHOST ERR_NEEDMOREPARAMS

Примеры:
```
USERHOST Wiz Michael Marty p // USERHOST запрос информации о никнеймах "Wiz", "Michael", "Marty" и "p"
```

### VERSION <a name="version"></a>

**Параметры:** `[<server>]`

Возвращает список пользователей и информацию об этих пользователях в формате, похожем на UNIX-команды `who` и `finger`.
Возвращает версию сервера `<server>`, или текущего сервера, если этот параметр не определен.

Числовые ответы:

ERR_NOSUCHSERVER ERR_FILEERROR
RPL_USERSSTART RPL_USERS
RPL_NOUSERS RPL_ENDOFUSERS
ERR_USERSDISABLED
ERR_NOSUCHSERVER RPL_VERSION

### INFO <a name="info"></a>

Expand Down
31 changes: 31 additions & 0 deletions include/Hash.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#ifndef HASH_HPP
# define HASH_HPP

# include <string>
# include <sstream>
# include <iomanip>

namespace hash
{
typedef struct
{
unsigned char data[64];
uint datalen;
uint hash[8];
} SHA256;

const uint k[64] = {
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
};

std::string hash(const std::string &str);
}

#endif
13 changes: 8 additions & 5 deletions include/History.hpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#pragma once

class User;
#include <string>
#include <vector>

#include "User.hpp"
class User;

class UserInfo
{
Expand Down Expand Up @@ -36,12 +37,14 @@ class History
History(const History &copy);
History &operator=(const History &copy);

std::vector<UserInfo> historyList;
std::vector<UserInfo *> historyList;

public:
History();
~History();

void addUser(const User &user);
const std::vector<const UserInfo> getHistoryByName(const std::string &nickname) const;
};
const std::vector<const UserInfo *> getHistoryByName(const std::string &nickname) const;
};

#include "User.hpp"
58 changes: 43 additions & 15 deletions include/Server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

class User;
class Channel;
class UserInfo;
class History;

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstdlib>
#include <iostream>
#include <unistd.h>
Expand All @@ -14,6 +17,7 @@ class Channel;
#include <string>
#include <map>
#include "User.hpp"
#include "History.hpp"
#include "Channel.hpp"
#include "sendError.hpp"
#include "sendReply.hpp"
Expand All @@ -33,40 +37,37 @@ class Server
const id_t timeout;
std::string password;
std::string name;
std::string info;
std::string info; // TODO взять из конфига
std::string version; // TODO взять из конфига
std::string debuglvl; // TODO взять из конфига
std::string comments; // TODO взять из конфига
std::string discribe; // TODO взять из конфига
std::string adminName; // TODO взять из конфига
std::string adminNickname; // TODO взять из конфига
std::string adminEMail; // TODO взять из конфига
std::map<std::string, std::string> operators; // TODO взять из конфига
std::vector<std::string> motd;
std::map<std::string, Channel *> channels;
std::map<std::string, Method> commands;
History nicknamesHistory;

Server();
Server(const Server& copy);
Server &operator=(const Server& other);

// Helpful things for commands

int handleChanFlags(const Message &msg, User &user);
int handleUserFlags(const Message &msg, User &user);
int checkConnection(User &user);

public:
Server(int port, const std::string &password);
~Server();

// Getters

const int &getSockfd() const;

// Commands

int passCmd(const Message &msg, User &user);
int nickCmd(const Message &msg, User &user);
int userCmd(const Message &msg, User &user);
int operCmd(const Message &msg, User &user);
int quitCmd(const Message &msg, User &user);
int privmsgCmd(const Message &msg, User &user);
int awayCmd(const Message &msg, User &user);
int noticeCmd(const Message &msg, User &user);
int whoCmd(const Message &msg, User &user);
int whoisCmd(const Message &msg, User &user);
int whowasCmd(const Message &msg, User &user);
int modeCmd(const Message &msg, User &user);
int topicCmd(const Message &msg, User &user);
int joinCmd(const Message &msg, User &user);
Expand All @@ -75,6 +76,30 @@ class Server
int partCmd(const Message &msg, User &user);
int namesCmd(const Message &msg, User &user);
int listCmd(const Message &msg, User &user);
int wallopsCmd(const Message &msg, User &user);
int pingCmd(const Message &msg, User &user);
int pongCmd(const Message &msg, User &user);
int isonCmd(const Message &msg, User &user);
int userhostCmd(const Message &msg, User &user);
int versionCmd(const Message &msg, User &user);
int infoCmd(const Message &msg, User &user);
int adminCmd(const Message &msg, User &user);
int timeCmd(const Message &msg, User &user);

// Helpful things for commands

int handleChanFlags(const Message &msg, User &user);
int handleUserFlags(const Message &msg, User &user);
int checkConnection(User &user);
void notifyUsers(User &user, const std::string &notification);

public:
Server(int port, const std::string &password);
~Server();

// Getters

const int &getSockfd() const;

// Server setup

Expand All @@ -84,6 +109,9 @@ class Server
void grabConnection();
void processMessages();
int hadleMessages(User &user);
void deleteBrokenConnections();
void deleteEmptyChannels();
void checkConnectionWithUsers();

// Other methods

Expand Down
24 changes: 16 additions & 8 deletions include/User.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ class Channel;
#include "Channel.hpp"
#include "sendError.hpp"

#define REGISTERED 0b000001
#define INVISIBLE 0b000010
#define RECEIVENOTICE 0b000100
#define RECEIVEWALLOPS 0b001000
#define IRCOPERATOR 0b010000
#define AWAY 0b100000
#define REGISTERED 0b00000001
#define INVISIBLE 0b00000010
#define RECEIVENOTICE 0b00000100
#define RECEIVEWALLOPS 0b00001000
#define IRCOPERATOR 0b00010000
#define AWAY 0b00100000
#define PINGING 0b01000000
#define BREAKCONNECTION 0b10000000

class User
{
Expand All @@ -39,6 +41,8 @@ class User
std::string servername;
std::string realname;
time_t registrationTime;
time_t timeOfLastMessage;
time_t timeAfterPing;
std::string awayMessage;
std::string quitMessage;
std::queue<std::string> messages;
Expand All @@ -49,7 +53,7 @@ class User
User(const User& copy);
User &operator=(const User& other);
public:
User(int sockfd);
User(int sockfd, const std::string &host);
~User();

// Getters
Expand All @@ -64,6 +68,8 @@ class User
const std::vector<const Channel *> &getChannels() const;
const std::string &getAwayMessage() const;
const time_t &getRegistrationTime() const;
const time_t &getTimeOfLastMessage() const;
const time_t &getTimeAfterPing() const;
const std::queue<std::string> &getMessages() const;
int getSockfd() const;
unsigned char getFlags() const;
Expand All @@ -85,9 +91,11 @@ class User

bool isOnChannel(const std::string &name) const;
void sendMessage(const std::string &msg) const;
void readMessage();
int readMessage();
void removeChannel(const std::string &name);
void popMessage();
void addChannel(const Channel &channel);
void removeFlag(unsigned char flag);
void updateTimeOfLastMessage();
void updateTimeAfterPing();
};
2 changes: 1 addition & 1 deletion include/sendReply.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "User.hpp"
#include "answers.h"

void sendReply(const std::string &from, const User &user, int rpl, \
int sendReply(const std::string &from, const User &user, int rpl, \
const std::string &arg1 = "",const std::string &arg2 = "", \
const std::string &arg3 = "",const std::string &arg4 = "", \
const std::string &arg5 = "",const std::string &arg6 = "", \
Expand Down
Loading

0 comments on commit 28c7e1a

Please sign in to comment.