diff --git a/instance.cpp b/instance.cpp index 4c12b4e..ab73b2a 100644 --- a/instance.cpp +++ b/instance.cpp @@ -130,7 +130,7 @@ void User::parse_euid(const Event& event, NetworkInfo& netInfo) { } void User::removeChannel(const u_Channel& channel) { - std::remove_if(channels.begin(), channels.end(), [&] (auto obj) {return obj.get() == channel;}); + std::remove_if(channels.begin(), channels.end(), [&] (auto obj) {return obj == &channel;}); } @@ -161,12 +161,12 @@ void Channel::parse_sjoin(const Event& event, Cache& cache, NetworkInfo& netInfo } u_User& member = *res; // Append member to list - members.push_back(member); + members.push_back(&member); } } void Channel::removeMember(const u_User& member) { - std::remove_if(members.begin(), members.end(), [&] (auto obj) {return obj.get() == member;}); + std::remove_if(members.begin(), members.end(), [&] (auto obj) {return *obj == member;}); } @@ -377,7 +377,7 @@ async::result Instance::process(const Event event) { } // Delete user from all channels for (auto& channel : res->get()->channels) { - channel.get()->removeMember({*res}); + channel->get()->removeMember({*res}); } // Delete user from cache cache.users.erase(res); @@ -435,19 +435,20 @@ async::result Instance::process(const Event event) { throw DesyncError(); } // Assign user to channel and vice versa - c_res->get()->members.push_back(*u_res); - u_res->get()->channels.push_back(*c_res); + c_res->get()->members.push_back(&*u_res); + u_res->get()->channels.push_back(&*c_res); // Update channel modes c_res->get()->mode.parse(split[2], netInfo); } else if (event.name == "PART" || event.name == "KICK") { // User left channel + auto split = strSplit(event.args, ' ', 1); // Get channel from cache - auto c_res = cache.find_channel_by_name(strSplit(event.args, ' ', 1)[0]); + auto c_res = cache.find_channel_by_name(split[0]); if (c_res == cache.channels.end()) { throw DesyncError(); } // Get user from cache - auto u_res = cache.find_user_by_uid(std::get(event.sender.id)); + auto u_res = cache.find_user_by_uid((event.name=="PART")?std::get(event.sender.id):split[1]); if (u_res == cache.users.end()) { throw DesyncError(); } diff --git a/instance.hpp b/instance.hpp index 03d1905..914c908 100644 --- a/instance.hpp +++ b/instance.hpp @@ -73,7 +73,7 @@ struct Channel { std::string name; ModeSet mode; std::string topic; - std::vector> members; + std::vector members; void parse_sjoin(const Event &event, Cache& cache, NetworkInfo& netInfo); void removeMember(const u_User& member); @@ -98,7 +98,7 @@ struct User { std::string realhost; UUID uid; std::string realname; - std::vector> channels; + std::vector channels; void parse_euid(const Event &event, NetworkInfo& netInfo); void removeChannel(const u_Channel &channel); @@ -141,6 +141,14 @@ struct User { .text = std::string(message) }; } + Event get_notice(std::string_view message, AnyUID target) { + return { + .sender = uid, + .name = "NOTICE", + .args = std::string(target.str()), + .text = std::string(message) + }; + } }; struct Cache { diff --git a/services/test.cpp b/services/test.cpp index e15139d..3f35a12 100644 --- a/services/test.cpp +++ b/services/test.cpp @@ -28,7 +28,7 @@ async::result TestService::intitialize() { co_await mark_ready(user); co_await i->send_event(serviceChannel.get_sjoin(uuid)); co_await i->send_event(user.get_join(serviceChannelName)); - co_await i->send_event(user.get_privmsg("Test... Hello world!", serviceChannelName)); + co_await i->send_event(user.get_notice("Test... Hello world!", serviceChannelName)); } async::result TestService::on_event(const Event& event) { diff --git a/uid.hpp b/uid.hpp index 43aa7e9..186c742 100644 --- a/uid.hpp +++ b/uid.hpp @@ -70,23 +70,23 @@ struct AnyUID { return str() == other.str(); } - auto operator =(const SUID& val) { + void assign(const SUID& val) { type = SERVER; id = val; } - auto operator =(const UUID& val) { + void assign(const UUID& val) { type = USER; id = val; } - auto operator =(std::string_view val) { + void assign(std::string_view val) { type = OTHER; id = std::string(val); } - auto operator =(const char *val) { + void assign(const char *val) { type = OTHER; id = std::string(val); } - auto operator =(std::nullptr_t) { + void assign(std::nullptr_t) { type = NUL; id = nullptr; } @@ -94,7 +94,8 @@ struct AnyUID { AnyUID() {} template AnyUID(const T& val) { - *this = val; + assign(val); } + explicit AnyUID(const AnyUID& o) : id(o.id), type(o.type) {} }; #endif