/// <summary> Initializes a new instance of the DiscordClient class. </summary>
        public DiscordClient(DiscordClientConfig config = null)
            : base(config ?? new DiscordClientConfig())
        {
            _rand = new Random();
            _api  = new DiscordAPIClient(_config);
            if (Config.UseMessageQueue)
            {
                _pendingMessages = new ConcurrentQueue <Message>();
            }
            if (Config.EnableVoiceMultiserver)
            {
                _voiceClients = new ConcurrentDictionary <string, DiscordWSClient>();
            }

            object cacheLock = new object();

            _channels    = new Channels(this, cacheLock);
            _users       = new Users(this, cacheLock);
            _messages    = new Messages(this, cacheLock, Config.MessageCacheLength > 0);
            _roles       = new Roles(this, cacheLock);
            _servers     = new Servers(this, cacheLock);
            _globalUsers = new GlobalUsers(this, cacheLock);

            _status = UserStatus.Online;

            this.Connected += async(s, e) =>
            {
                _api.CancelToken = _cancelToken;
                await SendStatus().ConfigureAwait(false);
            };

            VoiceDisconnected += (s, e) =>
            {
                var server = _servers[e.ServerId];
                if (server != null)
                {
                    foreach (var member in server.Members)
                    {
                        if (member.IsSpeaking)
                        {
                            member.IsSpeaking = false;
                            RaiseUserIsSpeaking(member, _channels[_voiceSocket.CurrentChannelId], false);
                        }
                    }
                }
            };

            if (_config.LogLevel >= LogMessageSeverity.Info)
            {
                ServerCreated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                      $"Server Created: {e.Server?.Name ?? "[Private]"}");
                ServerDestroyed += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                        $"Server Destroyed: {e.Server?.Name ?? "[Private]"}");
                ServerUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                      $"Server Updated: {e.Server?.Name ?? "[Private]"}");
                ServerAvailable += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                        $"Server Available: {e.Server?.Name ?? "[Private]"}");
                ServerUnavailable += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                          $"Server Unavailable: {e.Server?.Name ?? "[Private]"}");
                ChannelCreated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                       $"Channel Created: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}");
                ChannelDestroyed += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                         $"Channel Destroyed: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}");
                ChannelUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                       $"Channel Updated: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}");
                MessageReceived += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                        $"Message Received: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}");
                MessageDeleted += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                       $"Message Deleted: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}");
                MessageUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                       $"Message Update: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}");
                RoleCreated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                    $"Role Created: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}");
                RoleUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                    $"Role Updated: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}");
                RoleDeleted += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                    $"Role Deleted: {e.Server?.Name ?? "[Private]"}/{e.Role?.Name}");
                UserBanned += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                   $"Banned User: {e.Server?.Name ?? "[Private]" }/{e.UserId}");
                UserUnbanned += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                     $"Unbanned User: {e.Server?.Name ?? "[Private]"}/{e.UserId}");
                UserAdded += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                  $"User Joined: {e.Server?.Name ?? "[Private]"}/{e.User.Name}");
                UserRemoved += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                    $"User Left: {e.Server?.Name ?? "[Private]"}/{e.User.Name}");
                UserUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                    $"User Updated: {e.Server?.Name ?? "[Private]"}/{e.User.Name}");
                UserVoiceStateUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                              $"User Updated (Voice State): {e.Server?.Name ?? "[Private]"}/{e.User.Name}");
                ProfileUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Info, LogMessageSource.Client,
                                                       "Profile Updated");
            }
            if (_config.LogLevel >= LogMessageSeverity.Verbose)
            {
                UserIsTypingUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Verbose, LogMessageSource.Client,
                                                            $"User Updated (Is Typing): {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.User?.Name}");
                MessageReadRemotely += (s, e) => RaiseOnLog(LogMessageSeverity.Verbose, LogMessageSource.Client,
                                                            $"Read Message (Remotely): {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}");
                MessageSent += (s, e) => RaiseOnLog(LogMessageSeverity.Verbose, LogMessageSource.Client,
                                                    $"Sent Message: {e.Server?.Name ?? "[Private]"}/{e.Channel?.Name}/{e.Message?.Id}");
                UserPresenceUpdated += (s, e) => RaiseOnLog(LogMessageSeverity.Verbose, LogMessageSource.Client,
                                                            $"User Updated (Presence): {e.Server?.Name ?? "[Private]"}/{e.User?.Name}");

                _api.RestClient.OnRequest += (s, e) =>
                {
                    if (e.Payload != null)
                    {
                        RaiseOnLog(LogMessageSeverity.Verbose, LogMessageSource.Rest, $"{e.Method.Method} {e.Path}: {Math.Round(e.ElapsedMilliseconds, 2)} ms ({e.Payload})");
                    }
                    else
                    {
                        RaiseOnLog(LogMessageSeverity.Verbose, LogMessageSource.Rest, $"{e.Method.Method} {e.Path}: {Math.Round(e.ElapsedMilliseconds, 2)} ms");
                    }
                };
            }
            if (_config.LogLevel >= LogMessageSeverity.Debug)
            {
                _channels.ItemCreated      += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Created Channel {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Id}");
                _channels.ItemDestroyed    += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Destroyed Channel {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Id}");
                _channels.Cleared          += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Cleared Channels");
                _users.ItemCreated         += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Created User {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Id}");
                _users.ItemDestroyed       += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Destroyed User {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Id}");
                _users.Cleared             += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Cleared Users");
                _messages.ItemCreated      += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Created Message {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Channel.Id}/{e.Item.Id}");
                _messages.ItemDestroyed    += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Destroyed Message {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Channel.Id}/{e.Item.Id}");
                _messages.ItemRemapped     += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Remapped Message {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Channel.Id}/[{e.OldId} -> {e.NewId}]");
                _messages.Cleared          += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Cleared Messages");
                _roles.ItemCreated         += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Created Role {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Id}");
                _roles.ItemDestroyed       += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Destroyed Role {e.Item.Server?.Id ?? "[Private]"}/{e.Item.Id}");
                _roles.Cleared             += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Cleared Roles");
                _servers.ItemCreated       += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Created Server {e.Item.Id}");
                _servers.ItemDestroyed     += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Destroyed Server {e.Item.Id}");
                _servers.Cleared           += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Cleared Servers");
                _globalUsers.ItemCreated   += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Created User {e.Item.Id}");
                _globalUsers.ItemDestroyed += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Destroyed User {e.Item.Id}");
                _globalUsers.Cleared       += (s, e) => RaiseOnLog(LogMessageSeverity.Debug, LogMessageSource.Cache, $"Cleared Users");
            }

            if (Config.UseMessageQueue)
            {
                _pendingMessages = new ConcurrentQueue <Message>();
            }

            _serializer = new JsonSerializer();
            _serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
#if TEST_RESPONSES
            _serializer.CheckAdditionalContent = true;
            _serializer.MissingMemberHandling  = MissingMemberHandling.Error;
#endif
        }
Exemple #2
0
 public SocketGuild()
 {
     OnClientUpdated += (sender, e) => Channels.SetClientsInList(Client);
 }