-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathjoin.cpp
More file actions
112 lines (101 loc) · 5.23 KB
/
join.cpp
File metadata and controls
112 lines (101 loc) · 5.23 KB
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
#include "server.hpp"
#include "Channel.hpp"
#include "Client.hpp"
#include "Tools.hpp"
#include "numeric_replies.hpp"
void sendUserList(const std::string& channel, int client_socket, Server& server) {
std::vector<Channel>& channels = server.get_channels();
std::map<int, Client>& clients = server.get_clients();
std::string userList = "= " + channel + " :";
for (std::vector<Channel>::iterator it = channels.begin(); it != channels.end(); ++it) {
if (it->get_name() == channel) {
std::vector<Client>& users = it->get_users();
for (std::vector<Client>::iterator it2 = users.begin(); it2 != users.end(); ++it2) {
if(it->search_client_in_channel(it2->get_nickname()) == 2)
userList += "@" + it2->get_nickname() + " ";
else
userList += it2->get_nickname() + " ";
}
break;
}
}
std::string message = ":" + server.get_srv_ip() + " " + RPL_NAMREPLY + " " + clients[client_socket].get_nickname() + " " + userList + "\r\n";
send(client_socket, message.c_str(), message.length(), 0);
message = ":" + server.get_srv_ip() + " " + RPL_ENDOFNAMES + " " + clients[client_socket].get_nickname() + " " + channel + " :End of NAMES list\r\n";
send(client_socket, message.c_str(), message.length(), 0);
}
void create_channel(int client_socket, std::string channel_name, std::string key, Server &server)
{
std::map<int, Client> &clients = server.get_clients();
std::vector<Channel> &channels = server.get_channels();
Client client_caller = clients[client_socket];
Channel new_channel(channel_name, "");
if (key != "")
{
new_channel.set_key_flag(1);
new_channel.set_password(key);
}
new_channel.add_operator(client_caller);
new_channel.add_user(client_caller);
channels.push_back(new_channel);
std::string message = ":" + client_caller.get_nickname()+"!"+ client_caller.get_username() + "@" + client_caller.get_hostname() + " JOIN " + channel_name + "\r\n";
send(client_socket, message.c_str(), message.length(), 0);
sendUserList(channel_name, client_socket, server);
}
void join_channel(int client_socket, std::string channel_name, std::string key, Server& server) {
std::map<int, Client>& clients = server.get_clients();
std::vector<Channel>& channels = server.get_channels();
Client client_caller = clients[client_socket];
for (std::vector<Channel>::iterator it = channels.begin(); it != channels.end(); ++it) {
if (it->get_name() == channel_name)
{
if(it->get_invite_flag() == 1 && it->search_invited(client_caller.get_nickname()) == 0)
{
std::string message = ":" + server.get_srv_ip() + " " + ERR_INVITEONLYCHAN + " " + client_caller.get_nickname() + " " + channel_name + " :Cannot join channel (+i)\r\n";
send(client_socket, message.c_str(), message.length(), 0);
return;
}
if(it->get_limit_flag() == 1 && it->get_users().size() >= static_cast<size_t>(atoi(it->get_limit_value().c_str())))
{
std::string message = ":" + server.get_srv_ip() + " " + ERR_CHANNELISFULL + " " + client_caller.get_nickname() + " " + channel_name + " :Cannot join channel (+l)\r\n";
send(client_socket, message.c_str(), message.length(), 0);
return;
}
if(it->search_client_in_channel(client_caller.get_nickname()) != 0)
{
std::string message = ":" + server.get_srv_ip() + " " + ERR_USERONCHANNEL + " " + client_caller.get_nickname() + " " + channel_name + " :is already on channel\r\n";
send(client_socket, message.c_str(), message.length(), 0);
return;
}
if (it->get_password() == key)
{
if(it->get_users().size() == 0)
it->add_operator(client_caller);
it->add_user(client_caller);
std::string message = ":" + client_caller.get_nickname()+"!"+ client_caller.get_username() + "@" + client_caller.get_hostname() + " JOIN " + channel_name + "\r\n";
send(client_socket, message.c_str(), message.length(), 0);
sendUserList(channel_name, client_socket, server);
return;
}
}
}
create_channel(client_socket, channel_name, key, server);
}
void Server::join_cmd(int client_socket, std::string buffer)
{
Client client_caller = clients[client_socket];
std::string channel_name = buffer.substr(0, buffer.find(" "));
buffer.erase(0, channel_name.length() + 1);
std::string key = buffer.substr(0, buffer.length());
buffer.erase(0, key.length() + 1);
std::vector<std::string> channel_targets = split_multiple_targets(channel_name);
std::vector<std::string> key_targets = split_multiple_targets(key);
for(unsigned int i = 0; i < channel_targets.size(); i++)
{
if(key_targets.size() == 0 || i >= key_targets.size())
key_targets.push_back("");
if(channel_targets[i].find_first_of("#&") != 0)
channel_targets[i] = "#" + channel_targets[i];
join_channel(client_socket, channel_targets[i], key_targets[i], *this);
}
}