using System.Threading.Tasks;
using System.Net.Sockets;
namespace SimpleTwitchBot
static async Task Main(string[] args)
string password = "oauth:jor16mfv8znts4vypbmel40tluld8q";
string botUsername = "bofaboysbot";
var twitchBot = new TwitchBot(botUsername, password);
twitchBot.Start().SafeFireAndForget();
await twitchBot.JoinChannel("bofadeemboys");
await twitchBot.SendMessage("bofadeemboys", "Hey my bot has started up");
twitchBot.OnMessage += async (sender, twitchChatMessage) =>
Console.WriteLine($"{twitchChatMessage.Sender} said '{twitchChatMessage.Message}'");
if (twitchChatMessage.Message.StartsWith("!hey"))
await twitchBot.SendMessage(twitchChatMessage.Channel, $"Hey there {twitchChatMessage.Sender}");
const string ip = "irc.chat.twitch.tv";
private StreamReader streamReader;
private StreamWriter streamWriter;
private TaskCompletionSource<int> connected = new TaskCompletionSource<int>();
public event TwitchChatEventHandler OnMessage = delegate { };
public delegate void TwitchChatEventHandler(object sender, TwitchChatMessage e);
public class TwitchChatMessage : EventArgs
public string Sender { get; set; }
public string Message { get; set; }
public string Channel { get; set; }
public TwitchBot(string nick, string password)
this.password = password;
public async Task Start()
var tcpClient = new TcpClient();
await tcpClient.ConnectAsync(ip, port);
streamReader = new StreamReader(tcpClient.GetStream());
streamWriter = new StreamWriter(tcpClient.GetStream()) { NewLine = "\r\n", AutoFlush = true};
await streamWriter.WriteLineAsync($"PASS {password}");
await streamWriter.WriteLineAsync($"NICK {nick}");
string line = await streamReader.ReadLineAsync();
string[] split = line.Split(" ");
if (line.StartsWith("PING"))
Console.WriteLine("PONG");
await streamWriter.WriteLineAsync($"PONG {split[1]}");
if (split.Length > 2 && split[1] == "PRIVMSG")
int exclamationPointPosition = split[0].IndexOf("!");
string username = split[0].Substring(1, exclamationPointPosition - 1);
int secondColonPosition = line.IndexOf(':', 1);
string message = line.Substring(secondColonPosition + 1);
string channel = split[2].TrimStart('#');
OnMessage(this, new TwitchChatMessage
public async Task SendMessage(string channel, string message)
await streamWriter.WriteLineAsync($"PRIVMSG #{channel} :{message}");
public async Task JoinChannel(string channel)
await streamWriter.WriteLineAsync($"JOIN #{channel}");