Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading;
- using System.Windows.Forms;
- using System.Net.Sockets;
- using Twitcher.Properties;
- namespace Twitcher
- {
- public partial class frmMain : Form
- {
- Queue<string> sendMessageQueue;
- DateTime lastMessage;
- Settings mySettings = Settings.Default;
- TcpClient tcpClient;
- StreamReader reader;
- StreamWriter writer;
- readonly string serverIP, userName, password,
- defaultChannelName, chatCommandID,
- messageFromServer;
- string serverMessagePrefix;
- string chatMessagePrefix;
- string channelName;
- string channelNameText;
- string channelToSendTo;
- string speaker;
- string chatMessage;
- readonly int serverPort;
- bool isConnected = false;
- bool isPresent = false;
- IList<RichTextBox> _ChatWindows = new List<RichTextBox>();
- IList<ListBox> _UserLists = new List<ListBox>();
- public frmMain()
- {
- sendMessageQueue = new Queue<string>(); //Initiate Message Queue
- tcpClient = new TcpClient(); //Initiate TCP Protocoll
- this.serverIP = mySettings["ServerIP"].ToString();
- this.serverPort = Convert.ToInt32(mySettings["ServerPort"]);
- this.userName = mySettings["Username"].ToString();
- this.password = mySettings["Password"].ToString();
- this.defaultChannelName = mySettings["DefaultChannel"].ToString();
- this.chatCommandID = "PRIVMSG";
- this.messageFromServer = "tmi.twitch.tv";
- InitializeComponent();
- }
- private void frmMain_Load(object sender, EventArgs e)
- {
- lblStatus.Text = "Disconnected...";
- }
- #region Menu Controls
- private void mnuConnect_Click(object sender, EventArgs e)
- {
- Connect();
- }
- private void mnuDisconnect_Click(object sender, EventArgs e)
- {
- Disconnect();
- }
- private void mnuJoin_Click(object sender, EventArgs e)
- {
- //Show Input Box
- //Send "JOIN #" Message
- }
- private void mnuPart_Click(object sender, EventArgs e)
- {
- //Show Input Box
- //Send "PART #" Message
- }
- private void mnuSettings_Click(object sender, EventArgs e)
- {
- frmSettings Settings = new frmSettings();
- Settings.Show();
- }
- private void testFunctionToolStripMenuItem_Click(object sender, EventArgs e)
- {
- MessageBox.Show("Message: " + chatMessage, "Debug Window");
- }
- private void mnuAbout_Click(object sender, EventArgs e)
- {
- MessageBox.Show(
- "Twitcher v1.0\n" +
- "Created by: K0D3R\n" +
- "Copyright: ©2016 - K0D3R Productions\n\n" +
- "Twitcher is a Twitch Chat, Bot, and Statistics Tool\n" +
- "created for Streamers & Viewers alike! It can be used for simple\n" +
- "chatting by viewers, or a full out channel moderation bot for streamers\n" +
- "or moderators of a stream. It was inspired by the lack of features from\n" +
- "the current bots on the market, and mainly the will to learn how to\n" +
- "do those things, and do them better!\n\n" +
- "Special Thanks to:\n" +
- "Ducksauce: For being an awesome fucking dude!\n" +
- "",
- "About Twitcher",
- MessageBoxButtons.OK);
- }
- private void mnuExit_Click(object sender, EventArgs e)
- {
- Application.Exit();
- }
- #endregion
- #region Form Controls
- private void tmrUpdate_Tick(object sender, EventArgs e)
- {
- if (!tcpClient.Connected) //If TCP Connection Drops → Reconnect
- {
- isConnected = false;
- Connect();
- }
- if(tcpClient.Connected)
- {
- isConnected = true;
- }
- if (isConnected)
- {
- btnSend.Enabled = true;
- }
- else if(!isConnected)
- {
- btnSend.Enabled = false;
- }
- TrySendingMessages();
- TryReceiveMessages();
- }
- private void tmrDelayJoin_Tick(object sender, EventArgs e)
- {
- /*Join Default Channel*/
- CreateTab(defaultChannelName);
- writer.WriteLine("JOIN #" + defaultChannelName);
- tmrDelayJoin.Enabled = false;
- }
- private void btnSend_Click(object sender, EventArgs e)
- {
- SendMessage(txtMessage.Text); //Send the Message
- txtMessage.Text = string.Empty; //Clear our previously sent Message
- }
- private void txtMessage_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyCode == Keys.Enter)
- {
- btnSend.PerformClick();
- e.SuppressKeyPress = true;
- e.Handled = true;
- }
- }
- private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
- {
- channelToSendTo = tabControl.SelectedTab.Text;
- }
- private void CreateTab(string name)
- {
- TabPage newPage = new TabPage();
- newPage.Text = "#" + name;
- newPage.Name = "tb" + name;
- tabControl.TabPages.Add(newPage);
- RichTextBox chatWindow = new RichTextBox();
- chatWindow.BackColor = System.Drawing.Color.Black;
- chatWindow.ForeColor = System.Drawing.Color.White;
- chatWindow.Location = new System.Drawing.Point(6, 6);
- chatWindow.Name = name + "ChatArea";
- chatWindow.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
- chatWindow.Size = new System.Drawing.Size(539,395);
- chatWindow.ReadOnly = true;
- chatWindow.WordWrap = true;
- chatWindow.Text = "";
- newPage.Controls.Add(chatWindow);
- ListBox userList = new ListBox();
- userList.BackColor = System.Drawing.Color.Black;
- userList.ForeColor = System.Drawing.Color.White;
- userList.FormattingEnabled = true;
- userList.Location = new System.Drawing.Point(551, 6);
- userList.Name = name + "UserList";
- userList.Size = new System.Drawing.Size(156, 394);
- newPage.Controls.Add(userList);
- chatWindow.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
- userList.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right);
- _ChatWindows.Add(chatWindow);
- _UserLists.Add(userList);
- }
- #endregion
- #region IRC Commands
- private void Connect()
- {
- lblStatus.Text = "Connecting...";
- ServerChatArea.AppendText("Connecting to Twitch Chat...\n");
- tcpClient.Connect(serverIP, serverPort); //Connect to IRC
- reader = new StreamReader(tcpClient.GetStream()); //Read TCP Packets
- writer = new StreamWriter(tcpClient.GetStream()); //Write TCP Packets
- writer.AutoFlush = true; //Auto Flush the Writer Stream
- /*Authenticate & Connect to Server*/
- writer.WriteLine("PASS " + password + Environment.NewLine +
- "NICK " + userName + Environment.NewLine +
- "USER " + userName + " * * :" + userName);
- /*CAP Requests*/
- writer.WriteLine("CAP REQ :twitch.tv/membership");
- writer.WriteLine("CAP REQ :twitch.tv/commands");
- writer.WriteLine("CAP REQ :twitch.tv/tags");
- tmrDelayJoin.Enabled = true;
- tmrUpdate.Enabled = true; //Enable our Connection Check
- lastMessage = DateTime.Now; //Being Flood Protection
- lblStatus.Text = "Connected!";
- }
- private void Disconnect()
- {
- tmrUpdate.Enabled = false; //Disable our Connection Check
- tcpClient.Close(); //Disconnect from IRC
- ServerChatArea.AppendText("\nDisconnected...\n");
- lblStatus.Text = "Disconnected...";
- isPresent = false;
- }
- void SendMessage(string message)
- {
- sendMessageQueue.Enqueue(message);
- } //Enqueue's The Message to Send
- void TrySendingMessages() //Actually Sends The Message
- {
- serverMessagePrefix = $":{userName}!{userName}@{userName}.tmi.twitch.tv ";
- chatMessagePrefix = $":{userName}!{userName}@{userName}.tmi.twitch.tv {chatCommandID} {channelName} :";
- if (DateTime.Now - lastMessage > TimeSpan.FromSeconds(2))
- {
- if (sendMessageQueue.Count > 0)
- {
- /*Control Variables*/
- RichTextBox chatBox;
- if (tabControl.SelectedTab.Name == "tbServer")
- {
- var message = sendMessageQueue.Dequeue();
- chatBox = ServerChatArea;
- writer.WriteLine($"{serverMessagePrefix}{message}");
- chatBox.AppendText($"\r\n{message}");
- }
- else {
- for (int i = 0; i < tabControl.TabPages.Count; i++)
- {
- if (tabControl.TabPages[i].Name == "tb" + channelNameText)
- {
- isPresent = true;
- break;
- }
- }
- if (isPresent)
- {
- foreach (Control RTB in _ChatWindows)
- {
- chatBox = (RichTextBox)RTB;
- if (chatBox.Name.StartsWith(channelNameText))
- {
- var message = sendMessageQueue.Dequeue();
- writer.WriteLine($"{chatMessagePrefix}{message}");
- chatBox.AppendText($"\r\n{userName}: {message}");
- //
- // Add Function to Create a New Tab on Message = JOIN #Channel
- //
- lastMessage = DateTime.Now;
- }
- }
- }
- else
- {
- tabControl.SelectTab(tabControl.TabIndex - 1);
- }
- }
- }
- }
- }
- private void TryReceiveMessages()
- {
- if (tcpClient.Available > 0 || reader.Peek() >= 0) //Check for New Messages
- {
- var message = reader.ReadLine(); //Get the message from the server
- var iColon = message.IndexOf(" ", 1); //Initial character of Server Message
- var channel = message.IndexOf("#", 0); //Initial Character of Channel Name
- if (iColon > 0)
- {
- var command = message.Substring(1, iColon);
- //var command = message.Split(' ')[2];
- #region Server Messages
- if (command.StartsWith(messageFromServer))
- {
- var parseFrom = message.IndexOf(messageFromServer) + messageFromServer.Length;
- var parseTo = message.Length;
- speaker = "Server: ";
- chatMessage = message;
- ReceiveMessage(messageFromServer, speaker, chatMessage);
- }
- #endregion
- #region GetChannelName
- if (channel > 0 && !(message.Split(' ')[2].Contains(chatCommandID)))
- {
- if (!command.StartsWith(messageFromServer) && command.Contains("#"))
- {
- var parseFrom = command.IndexOf("#") + "#".Length;
- var parseTo = command.LastIndexOf(" :");
- channelNameText = command.Substring(parseFrom, parseTo - parseFrom); //Set The Channel Name TEXT from Received Message
- channelName = ("#" + channelNameText); //Set The Channel Name from Received Message
- }
- }
- #endregion
- #region NormalChatMessage
- if (message.Split(' ')[2].Contains(chatCommandID))
- {
- var iBang = command.IndexOf("!"); //Get Text Between ":" & "!" (Speaker's Name)
- //if (iBang > 0)
- //{
- // speaker = command.Substring(0, iBang);
- // chatMessage = message.Substring(iColon + 1); //Trim the Chat Prefix
- // ReceiveMessage(channelName, speaker, chatMessage);
- //}
- channelName = message.Split(' ')[3].Substring(1);
- channelNameText = channelName;
- var temp = message.Split(' ');
- speaker = temp[1].Split(':', '!')[1];
- temp[0] = "";
- temp[1] = "";
- temp[2] = "";
- temp[3] = "";
- chatMessage = string.Join(" ", temp).Substring(5);
- ReceiveMessage(channelName, speaker, chatMessage);
- }
- #endregion
- }
- }
- } //Actually Receive The Message
- void ReceiveMessage(string fromChannel, string speaker, string message) //Read, Append, Reply
- {
- /*Control Variables*/
- RichTextBox chatBox;
- /*If it's a Server Message, Put it in the Server Log*/
- #region ServerMessages
- if (fromChannel.Equals(messageFromServer))
- {
- ServerChatArea.AppendText($"\r\n{speaker}: {message}");
- }
- #endregion
- /*If it's a message for a channel, Put it in the proper channel*/
- #region ChannelChat (Problem Area)
- for (int i = 0; i < tabControl.TabPages.Count; i++)
- {
- if (tabControl.TabPages[i].Name == "tb" + channelNameText)
- {
- isPresent = true;
- //break;
- }
- }
- if (isPresent)
- {
- foreach (Control RTB in _ChatWindows)
- {
- chatBox = (RichTextBox)RTB;
- /*Begin Problem Area*/
- if (chatBox.Name.StartsWith(channelNameText))
- {
- if (fromChannel.Equals(channelName)) //#xk0d3rx
- {
- chatBox.AppendText($"\r\n{speaker}: {message}");
- }
- }
- /*End Problem Area*/
- }
- }
- else
- {
- tabControl.SelectTab(tabControl.TabIndex - 1);
- }
- #endregion
- /*Bot Commands*/
- if (message.StartsWith("!test"))
- {
- SendMessage($"Hello, {speaker}!");
- }
- }
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement