Changed channel to a class.
I believe this interface is better to work with. Later I'll add the "send message" interfaces to the channel class.
This commit is contained in:
39
src/node.cpp
39
src/node.cpp
@ -31,22 +31,33 @@ node::~node() {
|
||||
network.join();
|
||||
}
|
||||
|
||||
void node::join_channel(const std::string &name) {
|
||||
channel *node::join_channel(const std::string &name) {
|
||||
// don't do anything if already joined
|
||||
if(get_channel(name))
|
||||
return;
|
||||
channels[name].key = dht::InfoHash::get(name);
|
||||
channels[name].token = network.listen<struct message>(
|
||||
channels[name].key,
|
||||
[&](struct message &&msg) {
|
||||
channels[name].messages.push_back(msg);
|
||||
return true;
|
||||
});
|
||||
return nullptr;
|
||||
|
||||
channels.push_back(new channel(name, &network));
|
||||
return channels.back();
|
||||
}
|
||||
|
||||
channel *node::get_channel(const std::string &name) {
|
||||
for(auto i : channels)
|
||||
{
|
||||
if(i->get_name() == name)
|
||||
return i;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void node::leave_channel(const std::string &name) {
|
||||
if(not get_channel(name))
|
||||
return;
|
||||
network.cancelListen(channels[name].key,
|
||||
channels[name].token.get());
|
||||
channels.erase(name);
|
||||
for(auto i = channels.begin();
|
||||
i not_eq channels.end(); ++i)
|
||||
{
|
||||
if((*i)->get_name() == name)
|
||||
{
|
||||
delete *i;
|
||||
channels.erase(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user