/// <inheritdoc/>
        public Task <Result> RespondAsync(IGuildMemberUpdate gatewayEvent, CancellationToken ct = default)
        {
            var key = KeyHelpers.CreateGuildMemberKey(gatewayEvent.GuildID, gatewayEvent.User.ID);

            // Since this event isn't playing nice, we'll have to update by creating an object of our own.
            if (_cacheService.TryGetValue <IGuildMember>(key, out var cachedInstance))
            {
                cachedInstance = new GuildMember
                                 (
                    new Optional <IUser>(gatewayEvent.User),
                    gatewayEvent.Nickname.HasValue ? gatewayEvent.Nickname : cachedInstance.Nickname,
                    gatewayEvent.Roles,
                    gatewayEvent.JoinedAt,
                    gatewayEvent.PremiumSince.HasValue ? gatewayEvent.PremiumSince.Value : cachedInstance.PremiumSince,
                    cachedInstance.IsDeafened,
                    cachedInstance.IsMuted,
                    cachedInstance.IsPending,
                    cachedInstance.Permissions
                                 );
            }
            else if (gatewayEvent.PremiumSince.HasValue)
            {
                cachedInstance = new GuildMember
                                 (
                    new Optional <IUser>(gatewayEvent.User),
                    gatewayEvent.Nickname,
                    gatewayEvent.Roles,
                    gatewayEvent.JoinedAt,
                    gatewayEvent.PremiumSince.Value,
                    false,
                    false,
    /// <inheritdoc />
    public async Task <Result> RespondAsync(IGuildMemberUpdate gatewayEvent, CancellationToken ct = default)
    {
        var oldMemberKey = KeyHelpers.CreateGuildMemberKey(gatewayEvent.GuildID, gatewayEvent.User.ID);

        if (!_cache.TryGetValue(oldMemberKey, out IGuildMember oldMember))
        {
            return(Result.FromSuccess());
        }

        if (oldMember.Nickname != gatewayEvent.Nickname)
        {
            var notifyResult = await _channelLogging.NotifyUserNicknameChangedAsync
                               (
                gatewayEvent.GuildID,
                gatewayEvent.User.ID,
                oldMember.Nickname,
                gatewayEvent.Nickname
                               );

            if (!notifyResult.IsSuccess)
            {
                return(notifyResult);
            }
        }

        if (!oldMember.User.IsDefined(out var oldUser))
        {
            return(Result.FromSuccess());
        }

        if (oldUser.Discriminator != gatewayEvent.User.Discriminator)
        {
            return(await _channelLogging.NotifyUserDiscriminatorChangedAsync
                   (
                       gatewayEvent.GuildID,
                       gatewayEvent.User.ID,
                       oldUser.Discriminator,
                       gatewayEvent.User.Discriminator,
                       ct
                   ));
        }

        return(Result.FromSuccess());
    }