1
#include <irc/group_manager.h>
3
#include <irc/messenger.h>
4
#include <irc/group_chat.h>
13
#include <messaging/group.h>
14
#include <messaging/user.h>
16
#include <glog/logging.h>
19
std::shared_ptr<irc::GroupManager> irc::GroupManager::create(const std::shared_ptr<messaging::Group>& group,
20
const std::shared_ptr<Messenger>& messenger, irc_session_t *session)
22
return std::shared_ptr<irc::GroupManager>(new irc::GroupManager{group, messenger, session});
25
irc::GroupManager::GroupManager(const std::shared_ptr<messaging::Group>& group,
26
const std::shared_ptr<Messenger>& messenger, irc_session_t *session)
27
: messaging::GroupManager{}
28
, messenger_{messenger}
30
, irc_session(session)
31
, creator(group->creator()->id())
35
irc::GroupManager::~GroupManager()
39
void irc::GroupManager::on_plugged(const std::weak_ptr<messaging::HasInterfaces> &where)
41
auto sp = where.lock();
43
chat_ = std::dynamic_pointer_cast<irc::GroupChat>(sp);
47
std::string irc::GroupManager::group_id()
52
std::string irc::GroupManager::group_title()
57
std::string irc::GroupManager::group_subject()
62
std::shared_ptr<messaging::Member> irc::GroupManager::group_creator()
64
return std::make_shared<messaging::Member>(creator);
67
std::set<std::string> irc::GroupManager::group_admins()
69
std::set<std::string> admins;
74
messaging::Members irc::GroupManager::members()
79
void irc::GroupManager::set_observer(const std::shared_ptr<Observer> &observer)
81
messaging::GroupManager::set_observer(observer);
82
announce_group_permissions_changed(messaging::GroupManager::permissions());
85
void irc::GroupManager::change_group_title(const std::string &new_title)
89
void irc::GroupManager::change_group_subject(const std::string &new_subject)
94
void irc::GroupManager::add_members(const messaging::Members &members)
99
void irc::GroupManager::remove_members(const messaging::Members &members)
103
void irc::GroupManager::leave_group()
105
irc_cmd_part(irc_session, group_id().c_str());
108
void irc::GroupManager::dissolve_group()
113
void irc::GroupManager::handle_members_changed(messaging::Members new_participants)
115
for (auto participant : new_participants) {
116
participants.push_back(participant);
118
announce_members_updated(participants);
121
void irc::GroupManager::handle_member_joined(const std::shared_ptr<messaging::Member> &member)
123
participants.push_back(member);
124
announce_members_updated(participants);
127
void irc::GroupManager::handle_member_left(const std::shared_ptr<messaging::Member> &member)
129
auto it = std::find_if(participants.begin(), participants.end(), [member](const std::shared_ptr<messaging::Member>& m) {
130
return m->id() == member->id();
132
if (it != participants.end()) {
133
participants.erase(it);
134
announce_members_updated(participants);