The complete source code of IdealIRC
http://www.idealirc.org/
85 lines
1.8 KiB
85 lines
1.8 KiB
#include "IRCChannel.h"
|
|
#include "IRCMember.h"
|
|
#include "IRCBase.h"
|
|
#include <algorithm>
|
|
|
|
IRCChannel::IRCChannel(const std::string& name, IRCBase& owner)
|
|
: m_name(name)
|
|
, m_owner(&owner)
|
|
{}
|
|
|
|
const std::string& IRCChannel::name() const
|
|
{
|
|
return m_name;
|
|
}
|
|
|
|
std::optional<IRCMemberEntryRef> IRCChannel::getMember(const std::string& nickname)
|
|
{
|
|
auto it = std::find_if(m_members.begin(), m_members.end(),
|
|
[&nickname](const IRCMemberEntry& entry){
|
|
return entry.member()->prefix().nickname() == nickname;
|
|
});
|
|
|
|
return it == m_members.end() ? std::nullopt
|
|
: std::make_optional<IRCMemberEntryRef>(*it);
|
|
}
|
|
|
|
IRCMemberEntry& IRCChannel::addMember(std::shared_ptr<IRCMember> member)
|
|
{
|
|
m_members.emplace_back(member, *m_owner);
|
|
return m_members.back();
|
|
}
|
|
|
|
void IRCChannel::delMember(std::shared_ptr<IRCMember> member)
|
|
{
|
|
auto newEnd = std::remove_if(m_members.begin(), m_members.end(), [&member](const IRCMemberEntry& e){
|
|
return member.get() == e.member().get();
|
|
});
|
|
|
|
m_members.erase(newEnd, m_members.end());
|
|
}
|
|
|
|
const std::vector<IRCMemberEntry>& IRCChannel::members() const
|
|
{
|
|
return m_members;
|
|
}
|
|
|
|
void IRCChannel::setTopic(const std::string& topic)
|
|
{
|
|
m_topic = topic;
|
|
}
|
|
|
|
const std::string& IRCChannel::topic() const
|
|
{
|
|
return m_topic;
|
|
}
|
|
|
|
const std::unordered_map<char, std::string>& IRCChannel::modes() const
|
|
{
|
|
return m_modes;
|
|
}
|
|
|
|
void IRCChannel::setMode(char m, const std::string& parameter)
|
|
{
|
|
/*
|
|
* Note that if a mode requiring an argument is already set,
|
|
* the server will always send an 'unset' before setting a new value.
|
|
* But let's use insert_or_assign anyway.
|
|
*/
|
|
m_modes.insert_or_assign(m, parameter);
|
|
}
|
|
|
|
void IRCChannel::delMode(char m)
|
|
{
|
|
m_modes.erase(m);
|
|
}
|
|
|
|
bool IRCChannel::isPopulating() const
|
|
{
|
|
return m_populating;
|
|
}
|
|
|
|
void IRCChannel::donePopulating()
|
|
{
|
|
m_populating = false;
|
|
}
|
|
|