1
0
Fork 0
mirror of https://gitlab.com/niansa/asbots.git synced 2025-03-06 20:48:25 +01:00

Minor improvements

This commit is contained in:
Nils 2021-06-20 18:12:24 +02:00
parent fadab89638
commit d2f38b272b
4 changed files with 27 additions and 17 deletions

View file

@ -130,7 +130,7 @@ void User::parse_euid(const Event& event, NetworkInfo& netInfo) {
} }
void User::removeChannel(const u_Channel& channel) { 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; u_User& member = *res;
// Append member to list // Append member to list
members.push_back(member); members.push_back(&member);
} }
} }
void Channel::removeMember(const u_User& 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<void> Instance::process(const Event event) {
} }
// Delete user from all channels // Delete user from all channels
for (auto& channel : res->get()->channels) { for (auto& channel : res->get()->channels) {
channel.get()->removeMember({*res}); channel->get()->removeMember({*res});
} }
// Delete user from cache // Delete user from cache
cache.users.erase(res); cache.users.erase(res);
@ -435,19 +435,20 @@ async::result<void> Instance::process(const Event event) {
throw DesyncError(); throw DesyncError();
} }
// Assign user to channel and vice versa // Assign user to channel and vice versa
c_res->get()->members.push_back(*u_res); c_res->get()->members.push_back(&*u_res);
u_res->get()->channels.push_back(*c_res); u_res->get()->channels.push_back(&*c_res);
// Update channel modes // Update channel modes
c_res->get()->mode.parse<true>(split[2], netInfo); c_res->get()->mode.parse<true>(split[2], netInfo);
} else if (event.name == "PART" || event.name == "KICK") { } else if (event.name == "PART" || event.name == "KICK") {
// User left channel // User left channel
auto split = strSplit(event.args, ' ', 1);
// Get channel from cache // 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()) { if (c_res == cache.channels.end()) {
throw DesyncError(); throw DesyncError();
} }
// Get user from cache // Get user from cache
auto u_res = cache.find_user_by_uid(std::get<UUID>(event.sender.id)); auto u_res = cache.find_user_by_uid((event.name=="PART")?std::get<UUID>(event.sender.id):split[1]);
if (u_res == cache.users.end()) { if (u_res == cache.users.end()) {
throw DesyncError(); throw DesyncError();
} }

View file

@ -73,7 +73,7 @@ struct Channel {
std::string name; std::string name;
ModeSet mode; ModeSet mode;
std::string topic; std::string topic;
std::vector<std::reference_wrapper<u_User>> members; std::vector<u_User*> members;
void parse_sjoin(const Event &event, Cache& cache, NetworkInfo& netInfo); void parse_sjoin(const Event &event, Cache& cache, NetworkInfo& netInfo);
void removeMember(const u_User& member); void removeMember(const u_User& member);
@ -98,7 +98,7 @@ struct User {
std::string realhost; std::string realhost;
UUID uid; UUID uid;
std::string realname; std::string realname;
std::vector<std::reference_wrapper<u_Channel>> channels; std::vector<u_Channel*> channels;
void parse_euid(const Event &event, NetworkInfo& netInfo); void parse_euid(const Event &event, NetworkInfo& netInfo);
void removeChannel(const u_Channel &channel); void removeChannel(const u_Channel &channel);
@ -141,6 +141,14 @@ struct User {
.text = std::string(message) .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 { struct Cache {

View file

@ -28,7 +28,7 @@ async::result<void> TestService::intitialize() {
co_await mark_ready(user); co_await mark_ready(user);
co_await i->send_event(serviceChannel.get_sjoin(uuid)); 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_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<void> TestService::on_event(const Event& event) { async::result<void> TestService::on_event(const Event& event) {

13
uid.hpp
View file

@ -70,23 +70,23 @@ struct AnyUID {
return str() == other.str(); return str() == other.str();
} }
auto operator =(const SUID& val) { void assign(const SUID& val) {
type = SERVER; type = SERVER;
id = val; id = val;
} }
auto operator =(const UUID& val) { void assign(const UUID& val) {
type = USER; type = USER;
id = val; id = val;
} }
auto operator =(std::string_view val) { void assign(std::string_view val) {
type = OTHER; type = OTHER;
id = std::string(val); id = std::string(val);
} }
auto operator =(const char *val) { void assign(const char *val) {
type = OTHER; type = OTHER;
id = std::string(val); id = std::string(val);
} }
auto operator =(std::nullptr_t) { void assign(std::nullptr_t) {
type = NUL; type = NUL;
id = nullptr; id = nullptr;
} }
@ -94,7 +94,8 @@ struct AnyUID {
AnyUID() {} AnyUID() {}
template<typename T> template<typename T>
AnyUID(const T& val) { AnyUID(const T& val) {
*this = val; assign(val);
} }
explicit AnyUID(const AnyUID& o) : id(o.id), type(o.type) {}
}; };
#endif #endif