/// <summary> /// Connect to the given stream, returns true if we successfully connected. Note /// that this function executes synchronously, and will block until fully connected /// to the IRC server. /// </summary> /// <param name="stream">The stream to connect to.</param> /// <param name="user">The twitch username this connection will use.</param> /// <param name="auth">The twitch API token used to log in. This must begin with 'oauth:'.</param> public ConnectResult Connect(string stream, string user, string auth, int timeout = 10000) { if (m_shutdown) { throw new InvalidOperationException("Attempted to connect while disconnecting."); } user = user.ToLower(); m_stream = stream.ToLower(); if (m_data == null) { m_data = new TwitchUsers(m_stream); } // Create client and hook up events. m_client = new IrcClient(); m_client.Connected += client_Connected; m_client.UnsuccessfulLogin += m_client_UnsuccessfulLogin; m_client.ConnectFailed += client_ConnectFailed; m_client.Error += client_Error; m_client.Registered += client_Registered; m_client.ErrorMessageReceived += client_ErrorMessageReceived; m_client.PongReceived += m_client_PongReceived; m_client.PingReceived += m_client_PingReceived; m_flood = new FloodPreventer(this); m_flood.RejectedMessage += m_flood_RejectedMessage; m_client.FloodPreventer = m_flood; int currTimeout = timeout; DateTime started = DateTime.Now; m_connectedEvent.Reset(); m_registeredEvent.Reset(); m_joinedEvent.Reset(); // Connect to server. m_client.Connect("irc.twitch.tv", 6667, false, new IrcUserRegistrationInfo() { NickName = user, UserName = user, RealName = user, Password = auth }); // Wait for the server to connect. The connect function on client operates asynchronously, so we // wait on s_connectedEvent which is set when client_Connected is called. if (!m_connectedEvent.Wait(currTimeout)) { WriteDiagnosticMessage("Connecting to the Twitch IRC server timed out."); return(ConnectResult.NetworkFailed); } currTimeout = timeout - (int)started.Elapsed().TotalMilliseconds; /// Wait for the client to be registered. if (!m_registeredEvent.Wait(currTimeout)) { // Shouldn't really happen WriteDiagnosticMessage("Registration timed out."); return(ConnectResult.Failed); } if (m_loginFailed) { return(ConnectResult.LoginFailed); } // Attempt to join the channel. We'll try for roughly 10 seconds to join. This really shouldn't ever fail. m_client.Channels.Join("#" + m_stream); currTimeout = timeout - (int)started.Elapsed().TotalMilliseconds; if (!m_joinedEvent.Wait(currTimeout)) { // Shouldn't really happen WriteDiagnosticMessage("Failed to join channel {0}.", m_stream); return(ConnectResult.Failed); } TwitchSource.Log.Connected(stream); // This command tells twitch that we are a chat bot capable of understanding subscriber/turbo/etc // messages. Without sending this raw command, we would not get that data. m_client.SendRawMessage("TWITCHCLIENT 3"); UpdateMods(); return(ConnectResult.Success); }
/// <summary> /// Connect to the given stream, returns true if we successfully connected. Note /// that this function executes synchronously, and will block until fully connected /// to the IRC server. /// </summary> /// <param name="stream">The stream to connect to.</param> /// <param name="user">The twitch username this connection will use.</param> /// <param name="auth">The twitch API token used to log in. This must begin with 'oauth:'.</param> public ConnectResult Connect(string stream, string user, string auth, int timeout = 10000) { if (m_shutdown) throw new InvalidOperationException("Attempted to connect while disconnecting."); user = user.ToLower(); m_stream = stream.ToLower(); if (m_data == null) m_data = new TwitchUsers(m_stream); // Create client and hook up events. m_client = new IrcClient(); m_client.Connected += client_Connected; m_client.UnsuccessfulLogin += m_client_UnsuccessfulLogin; m_client.ConnectFailed += client_ConnectFailed; m_client.Error += client_Error; m_client.Registered += client_Registered; m_client.ErrorMessageReceived += client_ErrorMessageReceived; m_client.PongReceived += m_client_PongReceived; m_client.PingReceived += m_client_PingReceived; m_flood = new FloodPreventer(this); m_flood.RejectedMessage += m_flood_RejectedMessage; m_client.FloodPreventer = m_flood; int currTimeout = timeout; DateTime started = DateTime.Now; m_connectedEvent.Reset(); m_registeredEvent.Reset(); m_joinedEvent.Reset(); // Connect to server. m_client.Connect("irc.twitch.tv", 6667, false, new IrcUserRegistrationInfo() { NickName = user, UserName = user, RealName = user, Password = auth }); // Wait for the server to connect. The connect function on client operates asynchronously, so we // wait on s_connectedEvent which is set when client_Connected is called. if (!m_connectedEvent.Wait(currTimeout)) { WriteDiagnosticMessage("Connecting to the Twitch IRC server timed out."); return ConnectResult.NetworkFailed; } currTimeout = timeout - (int)started.Elapsed().TotalMilliseconds; /// Wait for the client to be registered. if (!m_registeredEvent.Wait(currTimeout)) { // Shouldn't really happen WriteDiagnosticMessage("Registration timed out."); return ConnectResult.Failed; } if (m_loginFailed) return ConnectResult.LoginFailed; // Attempt to join the channel. We'll try for roughly 10 seconds to join. This really shouldn't ever fail. m_client.Channels.Join("#" + m_stream); currTimeout = timeout - (int)started.Elapsed().TotalMilliseconds; if (!m_joinedEvent.Wait(currTimeout)) { // Shouldn't really happen WriteDiagnosticMessage("Failed to join channel {0}.", m_stream); return ConnectResult.Failed; } TwitchSource.Log.Connected(stream); // This command tells twitch that we are a chat bot capable of understanding subscriber/turbo/etc // messages. Without sending this raw command, we would not get that data. m_client.SendRawMessage("TWITCHCLIENT 3"); UpdateMods(); return ConnectResult.Success; }