Exemple #1
0
 /// <inheritdoc/>
 public ValueTask DisposeAsync()
 => _timer.DisposeAsync();
Exemple #2
0
        public async Task StartAsync()
        {
            // Clear out our members
            _channels.Clear();
            _mumbleUsers.Clear();
            _mumbleChannels.Clear();

            // Connect
            _logger.LogInformation("Connecting to Mumble server {server}...",
                                   _serverHostname);

            TcpClient tcpClient = new TcpClient();
            await tcpClient.ConnectAsync(_serverHostname, (int)_serverPort);

            NetworkStream networkStream = tcpClient.GetStream();

            _sslStream = new SslStream(
                networkStream,
                false,
                (object sender, X509Certificate certificate, X509Chain chain,
                 SslPolicyErrors errors) => true,
                (object sender, string targetHost, X509CertificateCollection localCertificates,
                 X509Certificate remoteCertificate, string[] acceptableIssuers) => null);
            await _sslStream.AuthenticateAsClientAsync(_serverHostname);

            _streamWriteSemaphor = new SemaphoreSlim(1, 1);

            // Send version
            await sendAsync <Version>(
                PacketType.Version,
                new Version
            {
                Release   = "Theorem",
                version   = (1 << 16) | (2 << 8) | (0 & 0xFF),
                Os        = Environment.OSVersion.ToString(),
                OsVersion = Environment.OSVersion.VersionString
            });

            // Send auth
            await sendAsync <Authenticate>(
                PacketType.Authenticate,
                new Authenticate
            {
                Username = _username,
                Password = _serverPassword,
                Opus     = false
            });

            // We need to send pings every so often, otherwise the server disconnects us
            var pingTimer = new System.Threading.Timer(async(state) => await sendPingAsync(),
                                                       null, 5000, 5000);

            // Now just read incoming data forever
            try
            {
                await listenAsync();
            }
            finally
            {
                await pingTimer.DisposeAsync();
            }
        }