Skip to content
Snippets Groups Projects
Commit 90a751b4 authored by Nicolas Werner's avatar Nicolas Werner
Browse files

Fix: powerlevels can have more than 16bit

parent fb41d1a1
No related branches found
No related tags found
No related merge requests found
......@@ -11,14 +11,15 @@
namespace mtx {
namespace events {
namespace state {
using power_level_t = int64_t;
constexpr uint16_t EventsDefault = 0;
constexpr uint16_t UsersDefault = 0;
constexpr uint16_t StatesDefault = 50;
constexpr power_level_t EventsDefault = 0;
constexpr power_level_t UsersDefault = 0;
constexpr power_level_t StatesDefault = 50;
constexpr uint16_t User = 0;
constexpr uint16_t Moderator = 50;
constexpr uint16_t Admin = 100;
constexpr power_level_t User = 0;
constexpr power_level_t Moderator = 50;
constexpr power_level_t Admin = 100;
//! Content for the `m.room.power_levels` state event.
//
......@@ -28,7 +29,7 @@ constexpr uint16_t Admin = 100;
struct PowerLevels
{
//! Returns the power_level for a given event type.
inline uint16_t event_level(const std::string &event_type) const
inline power_level_t event_level(const std::string &event_type) const
{
if (events.find(event_type) == events.end())
return events_default;
......@@ -37,7 +38,7 @@ struct PowerLevels
}
//! Returns the power_level for a given event type.
inline uint16_t state_level(const std::string &event_type) const
inline power_level_t state_level(const std::string &event_type) const
{
if (events.find(event_type) == events.end())
return state_default;
......@@ -46,7 +47,7 @@ struct PowerLevels
}
//! Returns the power_level for a given user id.
inline uint16_t user_level(const std::string &user_id) const
inline power_level_t user_level(const std::string &user_id) const
{
if (users.find(user_id) == users.end())
return users_default;
......@@ -55,31 +56,31 @@ struct PowerLevels
}
//! The level required to ban a user. Defaults to **50** if unspecified.
uint16_t ban = Moderator;
power_level_t ban = Moderator;
//! The level required to invite a user.
//! Defaults to **50** if unspecified.
uint16_t invite = Moderator;
power_level_t invite = Moderator;
//! The level required to kick a user.
//! Defaults to **50** if unspecified.
uint16_t kick = Moderator;
power_level_t kick = Moderator;
//! The level required to redact an event.
//! Defaults to **50** if unspecified.
uint16_t redact = Moderator;
power_level_t redact = Moderator;
//! The default level required to send message events.
//! Defaults to **0** if unspecified.
uint16_t events_default = User;
power_level_t events_default = User;
//! The default power level for every user in the room,
//! unless their user_id is mentioned in the users key.
//! Defaults to **0** if unspecified.
uint16_t users_default = User;
power_level_t users_default = User;
//! The default level required to send state events.
uint16_t state_default = Moderator;
power_level_t state_default = Moderator;
//! The level required to send specific event types.
//! This is a mapping from event type to power level required.
std::map<std::string, uint16_t> events;
std::map<std::string, power_level_t> events;
//! The power levels for specific users.
//! This is a mapping from user_id to power level for that user.
std::map<std::string, uint16_t> users;
std::map<std::string, power_level_t> users;
};
void
......
......@@ -14,28 +14,28 @@ from_json(const json &obj, PowerLevels &power_levels)
{
// SPEC_BUG: Not always present.
if (obj.count("ban") != 0)
power_levels.ban = obj.at("ban").get<uint16_t>();
power_levels.ban = obj.at("ban").get<power_level_t>();
if (obj.count("invite") != 0)
power_levels.invite = obj.at("invite").get<uint16_t>();
power_levels.invite = obj.at("invite").get<power_level_t>();
if (obj.count("kick") != 0)
power_levels.kick = obj.at("kick").get<uint16_t>();
power_levels.kick = obj.at("kick").get<power_level_t>();
if (obj.count("redact") != 0)
power_levels.redact = obj.at("redact").get<uint16_t>();
power_levels.redact = obj.at("redact").get<power_level_t>();
if (obj.count("events") != 0)
power_levels.events = obj.at("events").get<std::map<std::string, uint16_t>>();
power_levels.events = obj.at("events").get<std::map<std::string, power_level_t>>();
if (obj.count("users") != 0)
power_levels.users = obj.at("users").get<std::map<std::string, uint16_t>>();
power_levels.users = obj.at("users").get<std::map<std::string, power_level_t>>();
if (obj.count("events_default") != 0)
power_levels.events_default = obj.at("events_default").get<uint16_t>();
power_levels.events_default = obj.at("events_default").get<power_level_t>();
if (obj.count("users_default") != 0)
power_levels.users_default = obj.at("users_default").get<uint16_t>();
power_levels.users_default = obj.at("users_default").get<power_level_t>();
if (obj.count("state_default") != 0)
power_levels.state_default = obj.at("state_default").get<uint16_t>();
power_levels.state_default = obj.at("state_default").get<power_level_t>();
}
void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment