Beispiel #1
0
        private void UpdateCachedGuild(DiscordGuild newGuild, JArray rawMembers)
        {
            if (this._disposed)
            {
                return;
            }

            if (!this._guilds.ContainsKey(newGuild.Id))
            {
                this._guilds[newGuild.Id] = newGuild;
            }

            var guild = this._guilds[newGuild.Id];

            if (newGuild._channels != null && newGuild._channels.Count > 0)
            {
                foreach (var channel in newGuild._channels.Values)
                {
                    if (guild._channels.TryGetValue(channel.Id, out _))
                    {
                        continue;
                    }

                    foreach (var overwrite in channel._permissionOverwrites)
                    {
                        overwrite.Discord     = this;
                        overwrite._channel_id = channel.Id;
                    }

                    guild._channels[channel.Id] = channel;
                }
            }

            foreach (var newEmoji in newGuild._emojis.Values)
            {
                _ = guild._emojis.GetOrAdd(newEmoji.Id, _ => newEmoji);
            }

            if (rawMembers != null)
            {
                guild._members.Clear();

                foreach (var xj in rawMembers)
                {
                    var xtm = xj.ToObject <TransportMember>();

                    var xu = new DiscordUser(xtm.User)
                    {
                        Discord = this
                    };
                    _ = this.UserCache.AddOrUpdate(xtm.User.Id, xu, (id, old) =>
                    {
                        old.Username      = xu.Username;
                        old.Discriminator = xu.Discriminator;
                        old.AvatarHash    = xu.AvatarHash;
                        old.PremiumType   = xu.PremiumType;
                        return(old);
                    });

                    guild._members[xtm.User.Id] = new DiscordMember(xtm)
                    {
                        Discord = this, _guild_id = guild.Id
                    };
                }
            }

            foreach (var role in newGuild._roles.Values)
            {
                if (guild._roles.TryGetValue(role.Id, out _))
                {
                    continue;
                }

                role._guild_id        = guild.Id;
                guild._roles[role.Id] = role;
            }

            guild.Name         = newGuild.Name;
            guild.AfkChannelId = newGuild.AfkChannelId;
            guild.AfkTimeout   = newGuild.AfkTimeout;
            guild.DefaultMessageNotifications = newGuild.DefaultMessageNotifications;
            guild.Features                 = newGuild.Features;
            guild.IconHash                 = newGuild.IconHash;
            guild.MfaLevel                 = newGuild.MfaLevel;
            guild.OwnerId                  = newGuild.OwnerId;
            guild.VoiceRegionId            = newGuild.VoiceRegionId;
            guild.SplashHash               = newGuild.SplashHash;
            guild.VerificationLevel        = newGuild.VerificationLevel;
            guild.WidgetEnabled            = newGuild.WidgetEnabled;
            guild.WidgetChannelId          = newGuild.WidgetChannelId;
            guild.ExplicitContentFilter    = newGuild.ExplicitContentFilter;
            guild.PremiumTier              = newGuild.PremiumTier;
            guild.PremiumSubscriptionCount = newGuild.PremiumSubscriptionCount;
            guild.Banner                   = newGuild.Banner;
            guild.Description              = newGuild.Description;
            guild.VanityUrlCode            = newGuild.VanityUrlCode;
            guild.Banner                   = newGuild.Banner;
            guild.SystemChannelId          = newGuild.SystemChannelId;
            guild.SystemChannelFlags       = newGuild.SystemChannelFlags;
            guild.DiscoverySplashHash      = newGuild.DiscoverySplashHash;
            guild.MaxMembers               = newGuild.MaxMembers;
            guild.MaxPresences             = newGuild.MaxPresences;
            guild.ApproximateMemberCount   = newGuild.ApproximateMemberCount;
            guild.ApproximatePresenceCount = newGuild.ApproximatePresenceCount;
            guild.MaxVideoChannelUsers     = newGuild.MaxVideoChannelUsers;
            guild.PreferredLocale          = newGuild.PreferredLocale;
            guild.RulesChannelId           = newGuild.RulesChannelId;
            guild.PublicUpdatesChannelId   = newGuild.PublicUpdatesChannelId;

            // fields not sent for update:
            // - guild.Channels
            // - voice states
            // - guild.JoinedAt = new_guild.JoinedAt;
            // - guild.Large = new_guild.Large;
            // - guild.MemberCount = Math.Max(new_guild.MemberCount, guild._members.Count);
            // - guild.Unavailable = new_guild.Unavailable;
        }
        /// <summary>
        /// Initializes and connects all shards.
        /// </summary>
        /// <returns></returns>
        public async Task StartAsync()
        {
            var shardc = await this.InitializeShardsAsync();

            this.DebugLogger.LogMessage(LogLevel.Info, "Autoshard", $"Booting {shardc.ToString(CultureInfo.InvariantCulture)} shards", DateTime.Now);

            for (var i = 0; i < shardc; i++)
            {
                if (!this.Shards.TryGetValue(i, out var client))
                {
                    throw new Exception("Could not initialize shards");
                }

                if (this.CurrentUser != null)
                {
                    client._current_user = this.CurrentUser;
                }

                if (this._current_application != null)
                {
                    client._current_application = this.CurrentApplication;
                }

                client.ClientErrored                  += this.Client_ClientError;
                client.SocketErrored                  += this.Client_SocketError;
                client.SocketOpened                   += this.Client_SocketOpened;
                client.SocketClosed                   += this.Client_SocketClosed;
                client.Ready                          += this.Client_Ready;
                client.Resumed                        += this.Client_Resumed;
                client.ChannelCreated                 += this.Client_ChannelCreated;
                client.DmChannelCreated               += this.Client_DMChannelCreated;
                client.ChannelUpdated                 += this.Client_ChannelUpdated;
                client.ChannelDeleted                 += this.Client_ChannelDeleted;
                client.DmChannelDeleted               += this.Client_DMChannelDeleted;
                client.ChannelPinsUpdated             += this.Client_ChannelPinsUpdated;
                client.GuildCreated                   += this.Client_GuildCreated;
                client.GuildAvailable                 += this.Client_GuildAvailable;
                client.GuildUpdated                   += this.Client_GuildUpdated;
                client.GuildDeleted                   += this.Client_GuildDeleted;
                client.GuildUnavailable               += this.Client_GuildUnavailable;
                client.MessageCreated                 += this.Client_MessageCreated;
                client.PresenceUpdated                += this.Client_PresenceUpdate;
                client.GuildBanAdded                  += this.Client_GuildBanAdd;
                client.GuildBanRemoved                += this.Client_GuildBanRemove;
                client.GuildEmojisUpdated             += this.Client_GuildEmojisUpdate;
                client.GuildIntegrationsUpdated       += this.Client_GuildIntegrationsUpdate;
                client.GuildMemberAdded               += this.Client_GuildMemberAdd;
                client.GuildMemberRemoved             += this.Client_GuildMemberRemove;
                client.GuildMemberUpdated             += this.Client_GuildMemberUpdate;
                client.GuildRoleCreated               += this.Client_GuildRoleCreate;
                client.GuildRoleUpdated               += this.Client_GuildRoleUpdate;
                client.GuildRoleDeleted               += this.Client_GuildRoleDelete;
                client.MessageUpdated                 += this.Client_MessageUpdate;
                client.MessageDeleted                 += this.Client_MessageDelete;
                client.MessagesBulkDeleted            += this.Client_MessageBulkDelete;
                client.TypingStarted                  += this.Client_TypingStart;
                client.UserSettingsUpdated            += this.Client_UserSettingsUpdate;
                client.UserUpdated                    += this.Client_UserUpdate;
                client.VoiceStateUpdated              += this.Client_VoiceStateUpdate;
                client.VoiceServerUpdated             += this.Client_VoiceServerUpdate;
                client.GuildMembersChunked            += this.Client_GuildMembersChunk;
                client.UnknownEvent                   += this.Client_UnknownEvent;
                client.MessageReactionAdded           += this.Client_MessageReactionAdd;
                client.MessageReactionRemoved         += this.Client_MessageReactionRemove;
                client.MessageReactionsCleared        += this.Client_MessageReactionRemoveAll;
                client.WebhooksUpdated                += this.Client_WebhooksUpdate;
                client.Heartbeated                    += this.Client_HeartBeated;
                client.DebugLogger.LogMessageReceived += this.DebugLogger_LogMessageReceived;

                await client.ConnectAsync();

                this.DebugLogger.LogMessage(LogLevel.Info, "Autoshard", $"Booted shard {i.ToString(CultureInfo.InvariantCulture)}", DateTime.Now);

                if (this._current_user == null)
                {
                    this._current_user = client.CurrentUser;
                }

                if (this._current_application == null)
                {
                    this._current_application = client.CurrentApplication;
                }
            }
        }