-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJoin.cpp
150 lines (139 loc) · 6.44 KB
/
Join.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "Server.hpp"
#include "Client.hpp"
#include "Channel.hpp"
void Server::AddChannel(Channel *channel)
{
channels.push_back(channel);
}
void Server::CreateChannel(std::vector<std::string> command, Client *creator)
{
std::string name = command[1];
std::string key = command[2];
Channel *channel = new Channel(name, "nt", "", key, creator);
AddChannel(channel);
}
void Server::RemoveChannel(Channel *channel)
{
for (std::vector<Channel *>::iterator it = channels.begin(); it != channels.end(); it++)
{
if (*it == channel)
{
channels.erase(it);
delete channel;
break;
}
}
}
std::vector<std::string> Server::split(const std::string &s, char delimiter) {
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(s);
while (std::getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
void Server::AddUserToChannel(Channel *channel, Client *client, std::string channel_name)
{
channel->AddUser(client);
client->set_last_channel(channel);
// std::cout << channels.back()->GetUsersList() << std::endl;
// Add the JOIN, 332, 333, 353, and 366 responses here
std::string topicmessage;
std::string topicSetByMessage;
if (client->get_last_channel()->GetTopic() == "")
{
topicmessage = ":HALAL_TINDER 331 " + client->get_nick() + " " + channel_name + " :No topic is set\r\n";
topicSetByMessage = "";
}
else
{
topicmessage = ":HALAL_TINDER 332 " + client->get_nick() + " " + channel_name + " :" + client->get_last_channel()->GetTopic() + "\r\n";
topicSetByMessage = ":HALAL_TINDER 333 " + client->get_nick() + " " + channel_name + " " + client->get_last_channel()->GetTopicSetBy() + " " + client->get_last_channel()->GetTopicSetAt() + "\r\n";
}
std::string joinMessage = ":" + client->get_nick() + "!~" + client->get_user() + "@localhost JOIN " + channel_name + "\r\n";
std::string topicMessage = ":HALAL_TINDER 332 " + client->get_nick() + " " + channel_name + " :" + client->get_last_channel()->GetTopic() + "\r\n";
std::string namesMessage = ":HALAL_TINDER 353 " + client->get_nick() + " @ " + channel_name + " :" + client->get_last_channel()->GetUsersList() + "\r\n";
std::string endNamesMessage = ":HALAL_TINDER 366 " + client->get_nick() + " " + channel_name + " :End of /NAMES list.\r\n";
std::string message = topicMessage + topicSetByMessage + namesMessage + endNamesMessage;
client->get_last_channel()->SendChannelMessage(joinMessage);
SendUserMessage(message, client);
}
void Server::Join(std::vector<std::string> command, Client *client)
{
for (std::vector<std::string>::iterator it = command.begin(); it != command.end(); it++)
std::cout << (*it) << std::endl;
std::cout << "IN JOIN" << std::endl;
if (command.size() > 3)
{
//need to send
return;
}
std::vector<std::string> channels_string = split(command[1], ',');
std::vector<std::string> keys = split(command[2], ',');
for (size_t i = 0; i < channels_string.size(); i++)
{
std::string channel_name = channels_string[i];
std::string key = (i < keys.size()) ? keys[i] : "";
// std::cout << "Channel name: " << channel_name << std::endl;
// std::cout << "Key: " << key << std::endl;
if (channel_name.c_str()[0] == '#')
{
for (std::vector<Channel *>::iterator it = channels.begin(); it != channels.end(); it++)
{
if ((*it)->GetName() == channel_name)
{
if ((*it)->GetLimit() != 0 && (*it)->GetClientCount() >= (*it)->GetLimit())
{
std::string message = ":HALAL_TINDER 471 " + client->get_nick() + " " + channel_name + " :Cannot join channel (+l)\r\n";
send(client->get_fd(), message.c_str(), message.size(), 0);
return;
}
// found the channel
if (!((*it)->IsInviteOnly() && !(*it)->IsInvited(client)))
{
if ((*it)->HasKey())
{
if ((*it)->GetKey() == key)
AddUserToChannel(*it, client, channel_name);
else
{
std::string message = ":HALAL_TINDER 475 " + client->get_nick() + " " + channel_name + " :Cannot join channel (+k)\r\n";
send(client->get_fd(), message.c_str(), message.size(), 0);
return;
}
}
else
AddUserToChannel(*it, client, channel_name);
break;
}
else
{
std::string message = ":HALAL_TINDER 473 " + client->get_nick() + " " + channel_name + " :Cannot join channel (+i)\r\n";
send(client->get_fd(), message.c_str(), message.size(), 0);
return;
}
}
}
if (client->get_last_channel() == NULL)
{
std::cout << "CREATED CHANNEL" << std::endl;
CreateChannel(command, client);
// Add the JOIN, MODE, 353, and 366 responses here
std::string joinMessage = ":" + client->get_nick() + "!~" + client->get_user() + "@0::1 JOIN " + channel_name + "\r\n";
std::string modeMessage = ":HALAL_TINDER MODE " + channel_name + " +nt\r\n";
std::string namesMessage = ":HALAL_TINDER 353 " + client->get_nick() + " = " + channel_name + " :@" + client->get_nick() + "\r\n";
std::string endNamesMessage = ":HALAL_TINDER 366 " + client->get_nick() + " " + channel_name + " :End of /NAMES list.\r\n";
std::string message = joinMessage + modeMessage + namesMessage + endNamesMessage;
client->set_last_channel(channels.back());
channels.back()->SendChannelMessage(message);
// std::cout << channels.back()->GetUsersList() << std::endl;
}
}
else
{
std::string message = "Invalid channel name\r\n";
send(client->get_fd(), message.c_str(), message.size(), 0);
}
}
}