/// <inheritdoc/> public ValueTask DisposeAsync() => _timer.DisposeAsync();
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(); } }