Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2016
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.95 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Windows.Forms;
  8. using System.Net.Sockets;
  9. using Twitcher.Properties;
  10.  
  11. namespace Twitcher
  12. {
  13.     public partial class frmMain : Form
  14.     {
  15.         Queue<string> sendMessageQueue;
  16.         DateTime lastMessage;
  17.  
  18.         Settings mySettings = Settings.Default;
  19.  
  20.         TcpClient tcpClient;
  21.         StreamReader reader;
  22.         StreamWriter writer;
  23.  
  24.         readonly string serverIP, userName, password,
  25.                         defaultChannelName, chatCommandID,
  26.                         messageFromServer;
  27.  
  28.         string serverMessagePrefix;
  29.         string chatMessagePrefix;
  30.         string channelName;
  31.         string channelNameText;
  32.         string channelToSendTo;
  33.         string speaker;
  34.         string chatMessage;
  35.         readonly int serverPort;
  36.  
  37.         bool isConnected = false;
  38.         bool isPresent = false;
  39.  
  40.         IList<RichTextBox> _ChatWindows = new List<RichTextBox>();
  41.         IList<ListBox> _UserLists = new List<ListBox>();
  42.  
  43.         public frmMain()
  44.         {
  45.             sendMessageQueue = new Queue<string>(); //Initiate Message Queue
  46.             tcpClient = new TcpClient(); //Initiate TCP Protocoll
  47.  
  48.             this.serverIP = mySettings["ServerIP"].ToString();
  49.             this.serverPort = Convert.ToInt32(mySettings["ServerPort"]);
  50.             this.userName = mySettings["Username"].ToString();
  51.             this.password = mySettings["Password"].ToString();
  52.             this.defaultChannelName = mySettings["DefaultChannel"].ToString();
  53.             this.chatCommandID = "PRIVMSG";
  54.             this.messageFromServer = "tmi.twitch.tv";
  55.  
  56.             InitializeComponent();
  57.         }
  58.  
  59.         private void frmMain_Load(object sender, EventArgs e)
  60.         {
  61.             lblStatus.Text = "Disconnected...";
  62.         }
  63.         #region Menu Controls
  64.         private void mnuConnect_Click(object sender, EventArgs e)
  65.         {
  66.             Connect();
  67.         }
  68.         private void mnuDisconnect_Click(object sender, EventArgs e)
  69.         {
  70.             Disconnect();
  71.         }
  72.         private void mnuJoin_Click(object sender, EventArgs e)
  73.         {
  74.             //Show Input Box
  75.             //Send "JOIN #" Message
  76.         }
  77.         private void mnuPart_Click(object sender, EventArgs e)
  78.         {
  79.             //Show Input Box
  80.             //Send "PART #" Message
  81.         }
  82.         private void mnuSettings_Click(object sender, EventArgs e)
  83.         {
  84.             frmSettings Settings = new frmSettings();
  85.             Settings.Show();
  86.         }
  87.         private void testFunctionToolStripMenuItem_Click(object sender, EventArgs e)
  88.         {
  89.             MessageBox.Show("Message: " + chatMessage, "Debug Window");
  90.         }
  91.         private void mnuAbout_Click(object sender, EventArgs e)
  92.         {
  93.             MessageBox.Show(
  94.                 "Twitcher v1.0\n" +
  95.                 "Created by: K0D3R\n" +
  96.                 "Copyright: ©2016 - K0D3R Productions\n\n" +
  97.  
  98.                 "Twitcher is a Twitch Chat, Bot, and Statistics Tool\n" +
  99.                 "created for Streamers & Viewers alike! It can be used for simple\n" +
  100.                 "chatting by viewers, or a full out channel moderation bot for streamers\n" +
  101.                 "or moderators of a stream. It was inspired by the lack of features from\n" +
  102.                 "the current bots on the market, and mainly the will to learn how to\n" +
  103.                 "do those things, and do them better!\n\n" +
  104.  
  105.                 "Special Thanks to:\n" +
  106.                 "Ducksauce: For being an awesome fucking dude!\n" +
  107.                 "",
  108.                 "About Twitcher",
  109.                 MessageBoxButtons.OK);
  110.         }
  111.         private void mnuExit_Click(object sender, EventArgs e)
  112.         {
  113.             Application.Exit();
  114.         }
  115.         #endregion
  116.         #region Form Controls
  117.         private void tmrUpdate_Tick(object sender, EventArgs e)
  118.         {
  119.             if (!tcpClient.Connected) //If TCP Connection Drops → Reconnect
  120.             {
  121.                 isConnected = false;
  122.                 Connect();
  123.             }
  124.             if(tcpClient.Connected)
  125.             {
  126.                 isConnected = true;
  127.             }
  128.  
  129.             if (isConnected)
  130.             {
  131.                 btnSend.Enabled = true;
  132.             }
  133.             else if(!isConnected)
  134.             {
  135.                 btnSend.Enabled = false;
  136.             }
  137.  
  138.             TrySendingMessages();
  139.             TryReceiveMessages();
  140.         }
  141.         private void tmrDelayJoin_Tick(object sender, EventArgs e)
  142.         {
  143.             /*Join Default Channel*/
  144.             CreateTab(defaultChannelName);
  145.             writer.WriteLine("JOIN #" + defaultChannelName);
  146.  
  147.             tmrDelayJoin.Enabled = false;
  148.         }
  149.         private void btnSend_Click(object sender, EventArgs e)
  150.         {
  151.             SendMessage(txtMessage.Text); //Send the Message
  152.             txtMessage.Text = string.Empty; //Clear our previously sent Message
  153.         }
  154.         private void txtMessage_KeyDown(object sender, KeyEventArgs e)
  155.         {
  156.             if (e.KeyCode == Keys.Enter)
  157.             {
  158.                 btnSend.PerformClick();
  159.                 e.SuppressKeyPress = true;
  160.                 e.Handled = true;
  161.             }
  162.         }
  163.         private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
  164.         {
  165.             channelToSendTo = tabControl.SelectedTab.Text;
  166.         }
  167.         private void CreateTab(string name)
  168.         {
  169.             TabPage newPage = new TabPage();
  170.             newPage.Text = "#" + name;
  171.             newPage.Name = "tb" + name;
  172.             tabControl.TabPages.Add(newPage);
  173.  
  174.             RichTextBox chatWindow = new RichTextBox();
  175.             chatWindow.BackColor = System.Drawing.Color.Black;
  176.             chatWindow.ForeColor = System.Drawing.Color.White;
  177.             chatWindow.Location = new System.Drawing.Point(6, 6);
  178.             chatWindow.Name = name + "ChatArea";
  179.             chatWindow.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
  180.             chatWindow.Size = new System.Drawing.Size(539,395);
  181.             chatWindow.ReadOnly = true;
  182.             chatWindow.WordWrap = true;
  183.             chatWindow.Text = "";
  184.             newPage.Controls.Add(chatWindow);
  185.  
  186.             ListBox userList = new ListBox();
  187.             userList.BackColor = System.Drawing.Color.Black;
  188.             userList.ForeColor = System.Drawing.Color.White;
  189.             userList.FormattingEnabled = true;
  190.             userList.Location = new System.Drawing.Point(551, 6);
  191.             userList.Name = name + "UserList";
  192.             userList.Size = new System.Drawing.Size(156, 394);
  193.             newPage.Controls.Add(userList);
  194.  
  195.             chatWindow.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
  196.             userList.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right);
  197.  
  198.             _ChatWindows.Add(chatWindow);
  199.             _UserLists.Add(userList);
  200.         }
  201.         #endregion
  202.         #region IRC Commands
  203.         private void Connect()
  204.         {
  205.             lblStatus.Text = "Connecting...";
  206.             ServerChatArea.AppendText("Connecting to Twitch Chat...\n");
  207.  
  208.             tcpClient.Connect(serverIP, serverPort); //Connect to IRC
  209.  
  210.             reader = new StreamReader(tcpClient.GetStream()); //Read TCP Packets
  211.             writer = new StreamWriter(tcpClient.GetStream()); //Write TCP Packets
  212.             writer.AutoFlush = true; //Auto Flush the Writer Stream
  213.  
  214.             /*Authenticate & Connect to Server*/
  215.             writer.WriteLine("PASS " + password + Environment.NewLine +
  216.                 "NICK " + userName + Environment.NewLine +
  217.                 "USER " + userName + " * * :" + userName);
  218.  
  219.             /*CAP Requests*/
  220.             writer.WriteLine("CAP REQ :twitch.tv/membership");
  221.             writer.WriteLine("CAP REQ :twitch.tv/commands");
  222.             writer.WriteLine("CAP REQ :twitch.tv/tags");
  223.  
  224.             tmrDelayJoin.Enabled = true;
  225.  
  226.             tmrUpdate.Enabled = true; //Enable our Connection Check
  227.             lastMessage = DateTime.Now; //Being Flood Protection
  228.  
  229.             lblStatus.Text = "Connected!";
  230.         }
  231.         private void Disconnect()
  232.         {
  233.             tmrUpdate.Enabled = false; //Disable our Connection Check
  234.  
  235.             tcpClient.Close(); //Disconnect from IRC
  236.  
  237.             ServerChatArea.AppendText("\nDisconnected...\n");
  238.             lblStatus.Text = "Disconnected...";
  239.  
  240.             isPresent = false;
  241.         }
  242.         void SendMessage(string message)
  243.         {
  244.             sendMessageQueue.Enqueue(message);
  245.         } //Enqueue's The Message to Send
  246.         void TrySendingMessages() //Actually Sends The Message
  247.         {
  248.             serverMessagePrefix = $":{userName}!{userName}@{userName}.tmi.twitch.tv ";
  249.             chatMessagePrefix = $":{userName}!{userName}@{userName}.tmi.twitch.tv {chatCommandID} {channelName} :";
  250.  
  251.             if (DateTime.Now - lastMessage > TimeSpan.FromSeconds(2))
  252.             {
  253.                 if (sendMessageQueue.Count > 0)
  254.                 {
  255.                     /*Control Variables*/
  256.                     RichTextBox chatBox;
  257.  
  258.                     if (tabControl.SelectedTab.Name == "tbServer")
  259.                     {
  260.                         var message = sendMessageQueue.Dequeue();
  261.                         chatBox = ServerChatArea;
  262.  
  263.                         writer.WriteLine($"{serverMessagePrefix}{message}");
  264.                         chatBox.AppendText($"\r\n{message}");
  265.                     }
  266.                     else {
  267.                    
  268.                     for (int i = 0; i < tabControl.TabPages.Count; i++)
  269.                     {
  270.                         if (tabControl.TabPages[i].Name == "tb" + channelNameText)
  271.                         {
  272.                             isPresent = true;
  273.                             break;
  274.                         }
  275.                     }
  276.  
  277.                     if (isPresent)
  278.                     {
  279.                         foreach (Control RTB in _ChatWindows)
  280.                         {
  281.                             chatBox = (RichTextBox)RTB;
  282.  
  283.                             if (chatBox.Name.StartsWith(channelNameText))
  284.                             {
  285.                                 var message = sendMessageQueue.Dequeue();
  286.  
  287.                                 writer.WriteLine($"{chatMessagePrefix}{message}");
  288.                                 chatBox.AppendText($"\r\n{userName}: {message}");
  289.                                 //
  290.                                 // Add Function to Create a New Tab on Message = JOIN #Channel
  291.                                 //
  292.                                 lastMessage = DateTime.Now;
  293.                             }
  294.                         }
  295.                     }
  296.                     else
  297.                     {
  298.                         tabControl.SelectTab(tabControl.TabIndex - 1);
  299.                     }
  300.                     }
  301.                 }
  302.             }
  303.         }
  304.  
  305.         private void TryReceiveMessages()
  306.         {
  307.             if (tcpClient.Available > 0 || reader.Peek() >= 0) //Check for New Messages
  308.             {
  309.                 var message = reader.ReadLine(); //Get the message from the server
  310.                 var iColon = message.IndexOf(" ", 1); //Initial character of Server Message
  311.                 var channel = message.IndexOf("#", 0); //Initial Character of Channel Name
  312.  
  313.                 if (iColon > 0)
  314.                 {
  315.                     var command = message.Substring(1, iColon);
  316.                     //var command = message.Split(' ')[2];
  317.  
  318.                     #region Server Messages
  319.                     if (command.StartsWith(messageFromServer))
  320.                     {
  321.                         var parseFrom = message.IndexOf(messageFromServer) + messageFromServer.Length;
  322.                         var parseTo = message.Length;
  323.  
  324.                         speaker = "Server: ";
  325.                         chatMessage = message;
  326.  
  327.                         ReceiveMessage(messageFromServer, speaker, chatMessage);
  328.                     }
  329.                     #endregion
  330.                     #region GetChannelName
  331.                     if (channel > 0 && !(message.Split(' ')[2].Contains(chatCommandID)))
  332.                     {
  333.                         if (!command.StartsWith(messageFromServer) && command.Contains("#"))
  334.                         {
  335.                             var parseFrom = command.IndexOf("#") + "#".Length;
  336.                             var parseTo = command.LastIndexOf(" :");
  337.                             channelNameText = command.Substring(parseFrom, parseTo - parseFrom); //Set The Channel Name TEXT from Received Message
  338.                             channelName = ("#" + channelNameText); //Set The Channel Name from Received Message
  339.                         }
  340.                     }
  341.                     #endregion
  342.                     #region NormalChatMessage
  343.                     if (message.Split(' ')[2].Contains(chatCommandID))
  344.                     {
  345.                         var iBang = command.IndexOf("!"); //Get Text Between ":" & "!" (Speaker's Name)
  346.                         //if (iBang > 0)
  347.                         //{
  348.                         //    speaker = command.Substring(0, iBang);
  349.                         //    chatMessage = message.Substring(iColon + 1); //Trim the Chat Prefix
  350.  
  351.                         //    ReceiveMessage(channelName, speaker, chatMessage);
  352.                         //}
  353.                         channelName = message.Split(' ')[3].Substring(1);
  354.                         channelNameText = channelName;
  355.                         var temp = message.Split(' ');
  356.                         speaker = temp[1].Split(':', '!')[1];
  357.                         temp[0] = "";
  358.                         temp[1] = "";
  359.                         temp[2] = "";
  360.                         temp[3] = "";
  361.                         chatMessage = string.Join(" ", temp).Substring(5);
  362.                         ReceiveMessage(channelName, speaker, chatMessage);
  363.                     }
  364.                     #endregion
  365.  
  366.                 }
  367.             }
  368.         } //Actually Receive The Message
  369.         void ReceiveMessage(string fromChannel, string speaker, string message) //Read, Append, Reply
  370.         {
  371.             /*Control Variables*/
  372.             RichTextBox chatBox;
  373.  
  374.             /*If it's a Server Message, Put it in the Server Log*/
  375.             #region ServerMessages
  376.             if (fromChannel.Equals(messageFromServer))
  377.             {
  378.                 ServerChatArea.AppendText($"\r\n{speaker}: {message}");
  379.             }
  380.             #endregion
  381.             /*If it's a message for a channel, Put it in the proper channel*/
  382.             #region ChannelChat (Problem Area)
  383.  
  384.             for (int i = 0; i < tabControl.TabPages.Count; i++)
  385.             {
  386.                 if (tabControl.TabPages[i].Name == "tb" + channelNameText)
  387.                 {
  388.                     isPresent = true;
  389.                     //break;
  390.                 }
  391.             }
  392.  
  393.             if (isPresent)
  394.             {
  395.                 foreach (Control RTB in _ChatWindows)
  396.                 {
  397.                     chatBox = (RichTextBox)RTB;
  398.  
  399.                     /*Begin Problem Area*/
  400.                     if (chatBox.Name.StartsWith(channelNameText))
  401.                     {
  402.                         if (fromChannel.Equals(channelName)) //#xk0d3rx
  403.                         {
  404.                             chatBox.AppendText($"\r\n{speaker}: {message}");
  405.                         }
  406.                     }
  407.                     /*End Problem Area*/
  408.                 }
  409.             }
  410.             else
  411.             {
  412.                 tabControl.SelectTab(tabControl.TabIndex - 1);
  413.             }
  414.             #endregion
  415.            
  416.             /*Bot Commands*/
  417.             if (message.StartsWith("!test"))
  418.             {
  419.                 SendMessage($"Hello, {speaker}!");
  420.             }
  421.         }
  422.         #endregion
  423.     }
  424. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement