12 #include "aegis/config.hpp"
13 #include "aegis/utility.hpp"
14 #include "aegis/gateway/objects/role.hpp"
15 #include "aegis/snowflake.hpp"
16 #include "aegis/rest/rest_reply.hpp"
17 #include "aegis/ratelimit/ratelimit.hpp"
18 #include "aegis/gateway/objects/permission_overwrite.hpp"
19 #include "aegis/gateway/objects/member.hpp"
22 #include <shared_mutex>
23 #include "aegis/futures.hpp"
28 #if (AEGIS_HAS_STD_SHARED_MUTEX == 1)
29 using shared_mutex = std::shared_mutex;
31 using shared_mutex = std::shared_timed_mutex;
34 using json = nlohmann::json;
36 #pragma region rest params
39 modify_guild_t & name(
const std::string & param) { _name = param;
return *
this; }
40 modify_guild_t & voice_region(
const std::string & param) { _voice_region = param;
return *
this; }
41 modify_guild_t & verification_level(
int param) { _verification_level = param;
return *
this; }
42 modify_guild_t & default_message_notifications(
int param) { _default_message_notifications = param;
return *
this; }
43 modify_guild_t & explicit_content_filter(
int param) { _explicit_content_filter = param;
return *
this; }
45 modify_guild_t & afk_timeout(
int param) { _afk_timeout = param;
return *
this; }
46 modify_guild_t & icon(
const std::string & param) { _icon = param;
return *
this; }
48 modify_guild_t & splash(
const std::string & param) { _splash = param;
return *
this; }
50 lib::optional<std::string> _name;
51 lib::optional<std::string> _voice_region;
52 lib::optional<int> _verification_level;
53 lib::optional<int> _default_message_notifications;
54 lib::optional<int> _explicit_content_filter;
55 lib::optional<snowflake> _afk_channel_id;
56 lib::optional<int> _afk_timeout;
57 lib::optional<std::string> _icon;
58 lib::optional<snowflake> _owner_id;
59 lib::optional<std::string> _splash;
67 create_text_channel_t & permission_overwrites(
const std::vector<gateway::objects::permission_overwrite> & param)
68 { _permission_overwrites = param;
return *
this; }
70 int64_t _parent_id = 0;
72 std::vector<gateway::objects::permission_overwrite> _permission_overwrites;
81 create_voice_channel_t & permission_overwrites(
const std::vector<gateway::objects::permission_overwrite> & param)
82 { _permission_overwrites = param;
return *
this; }
85 int32_t _user_limit = 0;
86 int64_t _parent_id = 0;
87 std::vector<gateway::objects::permission_overwrite> _permission_overwrites;
95 { _permission_overwrites = param;
return *
this; }
97 int64_t _parent_id = 0;
98 std::vector<gateway::objects::permission_overwrite> _permission_overwrites;
107 modify_guild_member_t & roles(
const std::vector<snowflake> & param) { _roles = param;
return *
this; }
110 lib::optional<std::string> _nick;
111 lib::optional<bool> _mute;
112 lib::optional<bool> _deaf;
113 lib::optional<std::vector<snowflake>> _roles;
114 lib::optional<snowflake> _channel_id;
120 create_guild_ban_t & delete_message_days(int8_t param) { _delete_message_days = param;
return *
this; }
121 create_guild_ban_t & reason(
const std::string & param) { _reason = param;
return *
this; }
123 int8_t _delete_message_days;
138 bool _mentionable =
false;
154 bool _mentionable =
false;
169 AEGIS_DECL
explicit guild(
const int32_t _shard_id,
const snowflake _id,
core * _bot, asio::io_context & _io);
173 guild(
const guild &) =
delete;
174 guild(guild &&) =
delete;
175 guild & operator=(
const guild &) =
delete;
180 #if !defined(AEGIS_DISABLE_ALL_CACHE)
194 AEGIS_DECL
user *
self()
const;
202 std::shared_lock<shared_mutex> l(_m);
203 std::string _name = name;
204 return std::move(_name);
213 std::shared_lock<shared_mutex> l(_m);
214 std::string _icon = icon;
215 return std::move(_icon);
224 std::shared_lock<shared_mutex> l(_m);
225 std::string _splash = splash;
226 return std::move(_splash);
235 std::shared_lock<shared_mutex> l(_m);
236 std::string _region = region;
237 return std::move(_region);
276 std::shared_lock<shared_mutex> l(_m);
286 std::shared_lock<shared_mutex> l(_m);
358 lib::optional<std::string> name = {},
359 lib::optional<std::string> voice_region = {}, lib::optional<int> verification_level = {},
360 lib::optional<int> default_message_notifications = {}, lib::optional<int> explicit_content_filter = {},
361 lib::optional<snowflake> afk_channel_id = {}, lib::optional<int> afk_timeout = {},
362 lib::optional<std::string> icon = {}, lib::optional<snowflake> owner_id = {},
363 lib::optional<std::string> splash = {}
374 return modify_guild(obj._name, obj._voice_region, obj._verification_level, obj._default_message_notifications,
375 obj._explicit_content_filter, obj._afk_channel_id, obj._afk_timeout, obj._icon,
376 obj._owner_id, obj._splash);
394 const std::vector<gateway::objects::permission_overwrite> & permission_overwrites = {});
404 return create_text_channel(obj._name, obj._parent_id, obj._nsfw, obj._permission_overwrites);
418 const std::vector<gateway::objects::permission_overwrite> & permission_overwrites = {});
428 return create_voice_channel(obj._name, obj._bitrate, obj._user_limit, obj._parent_id, obj._permission_overwrites);
439 const std::vector<gateway::objects::permission_overwrite> & permission_overwrites);
470 lib::optional<bool> deaf, lib::optional<std::vector<snowflake>> roles,
471 lib::optional<snowflake> channel_id);
482 return modify_guild_member(obj._user_id, obj._nick, obj._mute, obj._deaf, obj._roles, obj._channel_id);
531 return create_guild_ban(obj._user_id, obj._delete_message_days, obj._reason);
562 return create_guild_role(obj._name, obj._perms, obj._color, obj._hoist, obj._mentionable);
585 bool hoist,
bool mentionable);
596 return modify_guild_role(obj._role_id, obj._name, obj._perms, obj._color, obj._hoist, obj._mentionable);
708 AEGIS_DECL lib::optional<gateway::objects::role>
find_role(
snowflake role_id) const noexcept;
715 AEGIS_DECL lib::optional<gateway::objects::role>
find_role(std::
string role_name) const noexcept;
723 std::shared_lock<shared_mutex> l(_m);
724 std::unordered_map<snowflake, channel*> _list = channels;
725 return std::move(_list);
728 #if !defined(AEGIS_DISABLE_ALL_CACHE)
735 std::shared_lock<shared_mutex> l(_m);
736 std::unordered_map<snowflake, user*> _list = members;
737 return std::move(_list);
744 std::unordered_map<snowflake, gateway::objects::role>
get_roles() const noexcept
746 std::shared_lock<shared_mutex> l(_m);
747 std::unordered_map<snowflake, gateway::objects::role> _list = roles;
748 return std::move(_list);
755 std::unordered_map<snowflake, gateway::objects::voice_state>
get_voicestates() const noexcept
757 std::shared_lock<shared_mutex> l(_m);
758 std::unordered_map<snowflake, gateway::objects::voice_state> _list = voice_states;
759 return std::move(_list);
775 const std::unordered_map<snowflake, gateway::objects::role> &
get_roles_nocopy() const noexcept
799 std::unordered_map<snowflake, channel*> channels;
800 #if !defined(AEGIS_DISABLE_ALL_CACHE)
801 std::unordered_map<snowflake, user*> members;
802 std::unordered_map<snowflake, gateway::objects::role> roles;
803 std::unordered_map<snowflake, gateway::objects::emoji> emojis;
804 std::unordered_map<snowflake, gateway::objects::voice_state> voice_states;
807 #if !defined(AEGIS_DISABLE_ALL_CACHE)
808 AEGIS_DECL
void _add_member(user * _member) noexcept;
810 AEGIS_DECL
void _add_member_nolock(user * _member) noexcept;
812 AEGIS_DECL
void _remove_member(snowflake member_id) noexcept;
814 AEGIS_DECL
void _load_presence(
const json & obj) noexcept;
816 AEGIS_DECL
void _load_emoji(
const json & obj) noexcept;
818 AEGIS_DECL
void _load_role(
const json & obj) noexcept;
820 AEGIS_DECL
void _remove_role(snowflake role_id) noexcept;
822 AEGIS_DECL
void _load_voicestate(
const json & obj) noexcept;
825 AEGIS_DECL
void _load(
const json & obj, shards::shard * _shard) noexcept;
828 AEGIS_DECL user * _find_member(snowflake member_id)
const noexcept;
831 AEGIS_DECL channel * _find_channel(snowflake channel_id)
const noexcept;
833 AEGIS_DECL
void _remove_channel(snowflake channel_id) noexcept;
835 #if !defined(AEGIS_DISABLE_ALL_CACHE)
839 snowflake owner_id = 0;
841 snowflake afk_channel_id = 0;
842 uint32_t afk_timeout = 0;
843 bool embed_enabled =
false;
844 snowflake embed_channel_id = 0;
845 uint32_t verification_level = 0;
846 uint32_t default_message_notifications = 0;
847 uint32_t mfa_level = 0;
848 std::string joined_at;
850 bool unavailable =
false;
851 uint32_t member_count = 0;
856 asio::io_context & _io_context;
857 mutable shared_mutex _m;
aegis::future< rest::rest_reply > modify_my_nick(const std::string &newname)
Modify own nickname.
Definition: guild.cpp:823
aegis::future< gateway::objects::role > create_guild_role(const std::string &name, permission _perms, int32_t color, bool hoist, bool mentionable)
Create a guild role.
Definition: guild.cpp:898
std::unordered_map< snowflake, user * > get_members() const noexcept
Obtain map of members.
Definition: guild.hpp:733
Stores creation time and extra data specific to Discord for entities.
Definition: snowflake.hpp:21
aegis::future< gateway::objects::role > modify_guild_role(snowflake role_id, const std::string &name, permission _perms, int32_t color, bool hoist, bool mentionable)
Modify a guild role.
Definition: guild.cpp:924
aegis::future< rest::rest_reply > modify_guild_integration()
Modify a guild integration.
Definition: guild.cpp:1011
Utility class for permission checks.
Definition: permission.hpp:57
aegis::future< gateway::objects::member > modify_guild_member(snowflake user_id, lib::optional< std::string > nick, lib::optional< bool > mute, lib::optional< bool > deaf, lib::optional< std::vector< snowflake >> roles, lib::optional< snowflake > channel_id)
Definition: guild.cpp:768
aegis::future< rest::rest_reply > modify_guild_embed()
Modify the guild embed settings.
Definition: guild.cpp:1059
aegis::future< rest::rest_reply > create_guild_ban(snowflake user_id, int8_t delete_message_days=0, const std::string &reason="")
Create a new guild ban.
Definition: guild.cpp:872
std::string get_name() const noexcept
Get name of guild.
Definition: guild.hpp:200
aegis::future< rest::rest_reply > modify_guild_role_positions(snowflake role_id, int16_t position)
Modify the guild role positions.
Definition: guild.cpp:911
guild(const int32_t _shard_id, const snowflake _id, core *_bot, asio::io_context &_io)
Create a new guild.
Definition: guild.cpp:25
aegis::future< gateway::objects::channel > create_voice_channel(const std::string &name, int32_t bitrate=0, int32_t user_limit=0, int64_t parent_id=0, const std::vector< gateway::objects::permission_overwrite > &permission_overwrites={})
Create a voice channel.
Definition: guild.cpp:675
lib::optional< gateway::objects::role > find_role(snowflake role_id) const noexcept
Obtain a role by snowflake.
Definition: guild.cpp:192
aegis::future< rest::rest_reply > create_guild_ban(create_guild_ban_t obj)
Create a new guild ban.
Definition: guild.hpp:529
aegis::future< rest::rest_reply > get_guild_embed()
Get the guild embed settings.
Definition: guild.cpp:1047
std::unordered_map< snowflake, channel * > get_channels() const noexcept
Obtain map of channels.
Definition: guild.hpp:721
aegis::future< gateway::objects::guild > modify_guild(lib::optional< std::string > name={}, lib::optional< std::string > voice_region={}, lib::optional< int > verification_level={}, lib::optional< int > default_message_notifications={}, lib::optional< int > explicit_content_filter={}, lib::optional< snowflake > afk_channel_id={}, lib::optional< int > afk_timeout={}, lib::optional< std::string > icon={}, lib::optional< snowflake > owner_id={}, lib::optional< std::string > splash={})
Modify guild information.
Definition: guild.cpp:581
Class for performing actions pertaining to a specified guild.
Definition: guild.hpp:159
aegis::future< rest::rest_reply > get_guild_integrations()
Get guild integrations.
Definition: guild.cpp:987
aegis::future< gateway::objects::role > add_guild_member_role(snowflake user_id, snowflake role_id)
Add a role to guild member.
Definition: guild.cpp:836
const snowflake get_owner() const noexcept
Get owner of guild.
Definition: guild.cpp:144
channel * get_channel(snowflake id) const noexcept
Get channel internally.
Definition: guild.cpp:564
aegis::future< rest::rest_reply > delete_guild_integration()
Delete a guild integration.
Definition: guild.cpp:1023
Primary class for managing a bot interface.
Definition: core.hpp:157
permission perms()
Get bot's current permissions for this guild.
Definition: guild.hpp:185
aegis::future< rest::rest_reply > get_guild_invites()
Get active guild invites.
Definition: guild.cpp:975
const gateway::objects::role get_role(const int64_t r) const
Get role.
Definition: guild.cpp:329
permission get_permissions(snowflake member_id, snowflake channel_id) const
Get guild permissions for member in channel.
Definition: guild.cpp:210
aegis::future< gateway::objects::channel > create_text_channel(create_text_channel_t obj)
Create a text channel.
Definition: guild.hpp:402
Class for performing actions pertaining to a specified channel.
Definition: channel.hpp:170
aegis::future< gateway::objects::guild > modify_guild(modify_guild_t obj)
Modify guild information.
Definition: guild.hpp:372
bool member_has_role(snowflake member_id, snowflake role_id) const noexcept
Check if member has role.
Definition: guild.cpp:79
Stores user-specific and guild-specific attributes of users.
Definition: user.hpp:37
aegis::future< rest::rest_reply > delete_guild()
Delete a guild.
Definition: guild.cpp:617
int64_t base_permissions(const user *_member) const noexcept
Get base guild permissions for self.
Definition: guild.hpp:284
aegis::future< gateway::objects::channel > create_category_channel(const std::string &name, int64_t parent_id, const std::vector< gateway::objects::permission_overwrite > &permission_overwrites)
Create a category.
Definition: guild.cpp:720
aegis::future< rest::rest_reply > get_guild_prune_count(int16_t days)
Get a count of members that would be pruned.
Definition: guild.cpp:951
aegis::future< rest::rest_reply > remove_guild_member(snowflake user_id)
Remove guild member (kick)
Definition: guild.cpp:860
int64_t base_permissions() const
Get base guild permissions for member.
Definition: guild.hpp:274
aegis::future< rest::rest_reply > remove_guild_member_role(snowflake user_id, snowflake role_id)
Remove a role from guild member.
Definition: guild.cpp:848
aegis::future< gateway::objects::channel > create_voice_channel(create_voice_channel_t obj)
Create a voice channel.
Definition: guild.hpp:426
snowflake get_id() const noexcept
Get the snowflake of this guild.
Definition: guild.hpp:323
const std::unordered_map< snowflake, user * > & get_members_nocopy() const noexcept
Obtain map of members - caller must lock guild._m to ensure no race conditions.
Definition: guild.hpp:766
aegis::future< rest::rest_reply > sync_guild_integration()
Get the guild integrations.
Definition: guild.cpp:1035
aegis::future< gateway::objects::role > create_guild_role(create_guild_role_t obj)
Create a guild role.
Definition: guild.hpp:560
std::string get_region() const noexcept
Get region of guild.
Definition: guild.hpp:233
const std::unordered_map< snowflake, channel * > & get_channels_nocopy() const noexcept
Obtain map of channels - caller must lock guild._m to ensure no race conditions.
Definition: guild.hpp:785
core & get_bot() const noexcept
Gets the Bot object.
Definition: guild.cpp:44
aegis::future< gateway::objects::channel > create_text_channel(const std::string &name, int64_t parent_id=0, bool nsfw=false, const std::vector< gateway::objects::permission_overwrite > &permission_overwrites={})
Create a text channel.
Definition: guild.cpp:630
future
Definition: futures.hpp:41
channel * find_channel(snowflake channel_id) const noexcept
Obtain a pointer to a channel by snowflake.
Definition: guild.cpp:174
aegis::future< rest::rest_reply > remove_guild_ban(snowflake user_id)
Remove a guild ban.
Definition: guild.cpp:886
Definition: guild.hpp:127
std::unordered_map< snowflake, gateway::objects::role > get_roles() const noexcept
Obtain map of roles.
Definition: guild.hpp:744
Definition: guild.hpp:117
Definition: guild.hpp:141
int32_t get_member_count() const noexcept
Get count of members in guild (potentially inaccurate)
Definition: guild.cpp:365
aegis::future< rest::rest_reply > leave()
Leave the guild this object is associated with.
Definition: guild.cpp:1069
const std::unordered_map< snowflake, gateway::objects::role > & get_roles_nocopy() const noexcept
Obtain map of roles - caller must lock guild._m to ensure no race conditions.
Definition: guild.hpp:775
user * find_member(snowflake member_id) const noexcept
Obtain a pointer to a member by snowflake.
Definition: guild.cpp:149
aegis::future< rest::rest_reply > create_guild_integration()
Create a new guild integration.
Definition: guild.cpp:999
std::string get_icon() const noexcept
Get icon of guild.
Definition: guild.hpp:211
aegis::future< gateway::objects::member > modify_guild_member(modify_guild_member_t obj)
Definition: guild.hpp:480
Stores info pertaining to guild roles.
Definition: role.hpp:34
Definition: guild.hpp:101
aegis::future< rest::rest_reply > begin_guild_prune(int16_t days)
Perform a guild prune.
Definition: guild.cpp:963
aegis::future< gateway::objects::role > modify_guild_role(modify_guild_role_t obj)
Modify a guild role.
Definition: guild.hpp:594
std::string get_splash() const noexcept
Get splash of guild.
Definition: guild.hpp:222
aegis::future< rest::rest_reply > delete_guild_role(snowflake role_id)
Delete a guild role.
Definition: guild.cpp:937
aegis::future< rest::rest_reply > modify_channel_positions()
Modify positions of channels.
Definition: guild.cpp:758
aegis::future< gateway::objects::channel > create_category_channel(create_category_channel_t obj)
Create a category.
Definition: guild.hpp:447
aegis::future< gateway::objects::guild > get_guild()
Get guild information.
Definition: guild.cpp:575
int64_t compute_overwrites(const int64_t _base_permissions, const user &_member, const channel &_channel) const noexcept
Calculate permission overrides for member in channel.
Definition: guild.cpp:267
std::unordered_map< snowflake, gateway::objects::voice_state > get_voicestates() const noexcept
Obtain map of voice states.
Definition: guild.hpp:755