public override ValueTask <RoleCreatedEventArgs> HandleDispatchAsync(IGatewayApiClient shard, GuildRoleCreateJsonModel model)
        {
            IRole role;

            if (CacheProvider.TryGetRoles(model.GuildId, out var cache))
            {
                role = new CachedRole(Client, model.GuildId, model.Role);
                cache.Add(role.Id, role as CachedRole);
            }
            else
            {
                role = new TransientRole(Client, model.GuildId, model.Role);
            }

            var e = new RoleCreatedEventArgs(role);

            return(new(e));
        }
        public override ValueTask <RoleUpdatedEventArgs> HandleDispatchAsync(IGatewayApiClient shard, GuildRoleUpdateJsonModel model)
        {
            CachedRole oldRole;
            IRole      newRole;

            if (CacheProvider.TryGetRoles(model.GuildId, out var cache) && cache.TryGetValue(model.Role.Id, out var role))
            {
                newRole = role;
                oldRole = role.Clone() as CachedRole;
                newRole.Update(model.Role);
            }
            else
            {
                oldRole = null;
                newRole = new TransientRole(Client, model.GuildId, model.Role);
            }

            var e = new RoleUpdatedEventArgs(model.GuildId, oldRole, newRole);

            return(new(e));
        }