示例#1
0
        internal DiscordMember(TransportMember mbr)
        {
            this.Id         = mbr.User.Id;
            this.IsDeafened = mbr.IsDeafened;
            this.IsMuted    = mbr.IsMuted;
            this.JoinedAt   = mbr.JoinedAt;
            this.Nickname   = mbr.Nickname;

            this._role_ids      = mbr.Roles ?? new List <ulong>();
            this._role_ids_lazy = new Lazy <IReadOnlyList <ulong> >(() => new ReadOnlyCollection <ulong>(this._role_ids));
        }
示例#2
0
        internal DiscordMember(TransportMember mbr) : this()
        {
            Id           = mbr.User.Id;
            IsDeafened   = mbr.IsDeafened;
            IsMuted      = mbr.IsMuted;
            JoinedAt     = mbr.JoinedAt;
            Nickname     = mbr.Nickname;
            PremiumSince = mbr.PremiumSince;

            _role_ids = mbr.Roles ?? new List <ulong>();
        }
示例#3
0
 internal DiscordMember(TransportMember mbr)
 {
     this.Id                         = mbr.User.Id;
     this.IsDeafened                 = mbr.IsDeafened;
     this.IsMuted                    = mbr.IsMuted;
     this.JoinedAt                   = mbr.JoinedAt;
     this.Nickname                   = mbr.Nickname;
     this.PremiumSince               = mbr.PremiumSince;
     this.IsPending                  = mbr.IsPending;
     this._avatarHash                = mbr.AvatarHash;
     this._role_ids                  = mbr.Roles ?? new List <ulong>();
     this._role_ids_lazy             = new Lazy <IReadOnlyList <ulong> >(() => new ReadOnlyCollection <ulong>(this._role_ids));
     this.CommunicationDisabledUntil = mbr.CommunicationDisabledUntil;
 }
示例#4
0
        private void PopulateMessageReactionsAndCache(DiscordMessage message, TransportUser author, TransportMember member)
        {
            this.UpdateMessage(message, author, message.Channel?.Guild, member);

            if (message._reactions == null)
            {
                message._reactions = new List <DiscordReaction>();
            }
            foreach (var xr in message._reactions)
            {
                xr.Emoji.Discord = this;
            }

            if (this.Configuration.MessageCacheSize > 0 && message.Channel != null)
            {
                this.MessageCache?.Add(message);
            }
        }
示例#5
0
        private DiscordUser UpdateUser(DiscordUser usr, ulong?guildId, DiscordGuild guild, TransportMember mbr)
        {
            if (mbr != null)
            {
                if (mbr.User != null)
                {
                    usr = new DiscordUser(mbr.User)
                    {
                        Discord = this
                    };

                    _ = this.UserCache.AddOrUpdate(usr.Id, usr, (id, old) =>
                    {
                        old.Username      = usr.Username;
                        old.Discriminator = usr.Discriminator;
                        old.AvatarHash    = usr.AvatarHash;
                        return(old);
                    });

                    usr = new DiscordMember(mbr)
                    {
                        Discord = this, _guild_id = guildId.Value
                    };
                }

                var intents = this.Configuration.Intents;

                DiscordMember member = default;

                if (!intents.HasAllPrivilegedIntents() || guild.IsLarge) // we have the necessary privileged intents, no need to worry about caching here unless guild is large.
                {
                    if (guild?._members.TryGetValue(usr.Id, out member) == false)
                    {
                        if (intents.HasIntent(DiscordIntents.GuildMembers) || this.Configuration.AlwaysCacheMembers) // member can be updated by events, so cache it
                        {
                            guild._members.TryAdd(usr.Id, (DiscordMember)usr);
                        }
                    }
                    else if (intents.HasIntent(DiscordIntents.GuildPresences) || this.Configuration.AlwaysCacheMembers) // we can attempt to update it if it's already in cache.
                    {
                        if (!intents.HasIntent(DiscordIntents.GuildMembers))                                            // no need to update if we already have the member events
                        {
                            _ = guild._members.TryUpdate(usr.Id, (DiscordMember)usr, member);
                        }
                    }
                }
            }
            else if (usr.Username != null) // check if not a skeleton user
            {
                _ = this.UserCache.AddOrUpdate(usr.Id, usr, (id, old) =>
                {
                    old.Username      = usr.Username;
                    old.Discriminator = usr.Discriminator;
                    old.AvatarHash    = usr.AvatarHash;
                    return(old);
                });
            }

            return(usr);
        }
示例#6
0
        private void UpdateMessage(DiscordMessage message, TransportUser author, DiscordGuild guild, TransportMember member)
        {
            if (author != null)
            {
                var usr = new DiscordUser(author)
                {
                    Discord = this
                };

                if (member != null)
                {
                    member.User = author;
                }

                message.Author = this.UpdateUser(usr, guild?.Id, guild, member);
            }

            var channel = this.InternalGetCachedChannel(message.ChannelId);

            if (channel != null)
            {
                return;
            }

            if (!message.GuildId.HasValue)
            {
                channel = new DiscordDmChannel
                {
                    Id      = message.ChannelId,
                    Discord = this,
                    Type    = ChannelType.Private
                };
            }
            else
            {
                channel = new DiscordChannel
                {
                    Id      = message.ChannelId,
                    Discord = this
                };
            }

            message.Channel = channel;
        }
示例#7
0
        private void UpdateMessage(DiscordMessage message, TransportUser author, DiscordGuild guild, TransportMember member)
        {
            if (author != null)
            {
                var usr = new DiscordUser(author)
                {
                    Discord = this
                };

                if (member != null)
                {
                    member.User = author;
                }

                message.Author = this.UpdateUser(usr, guild?.Id, guild, member);
            }
        }