Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using UnityEngine.Events;
- using System.Collections;
- using System.Collections.Generic;
- using System.Threading;
- using System.IO;
- using System.Net.Sockets;
- using System;
- public class IRCClient {
- public enum ConnectionState { DISCONNECTED, CONNECTING, CONNECTED };
- public UnityEvent OnConnected = new UnityEvent();
- public UnityEvent OnDisconnected = new UnityEvent();
- public MessageEvent OnMessage = new MessageEvent();
- public UnityEvent OnAuthenticationFailed = new UnityEvent();
- public UserStateReceivedEvent OnUserStateReceived = new UserStateReceivedEvent();
- public volatile ConnectionState connectionState = ConnectionState.DISCONNECTED;
- private string server;
- private int port;
- private string nickname;
- private string password;
- private TcpClient client;
- private NetworkStream socket;
- private StreamReader socketIn;
- private StreamWriter socketOut;
- private Thread readThread;
- public IRCClient(string server, int port, string nickname, string password) {
- this.server = server;
- this.port = port;
- this.nickname = nickname;
- this.password = password;
- OnConnected.AddListener(() => {
- connectionState = ConnectionState.CONNECTED;
- });
- }
- public void Connect() {
- if (connectionState != ConnectionState.DISCONNECTED)
- throw new Exception("irc client connected or connecting");
- connectionState = ConnectionState.CONNECTING;
- client = new TcpClient(server, port);
- socket = client.GetStream();
- socketIn = new StreamReader(socket);
- socketOut = new StreamWriter(socket);
- SendRaw("PASS "+password);
- SendRaw("NICK "+nickname);
- SendRaw("USER "+nickname+" 0 * :"+nickname);
- readThread = new Thread(() => ReadThread());
- readThread.Start();
- }
- private void ReadThread() {
- // :joefrompixelmaniacs!joefrompixelmaniacs@joefrompixelmaniacs.tmi.twitch.tv PRIVMSG #pixel_maniacs :MVGame
- // @badges=;color=#1E90FF;display-name=Niceguy_3210;emotes=;id=cbda9782-8021-44a3-9e43-04dac248ce33;mod=0;room-id=122085144;sent-ts=1481462264220;subscriber=0;tmi-sent-ts=1481462262017;turbo=0;user-id=72111011;user-type= :niceguy_3210!niceguy_3210@niceguy_3210.tmi.twitch.tv PRIVMSG #pixel_maniacs :Registration is now open. Type !dance <Number of beers> to enter
- // @badges=premium/1;color=#57001D;display-name=Joe16_;emotes=;id=ec9dac1c-ab89-433d-91de-f3737a77e479;mod=0;room-id=122085144;sent-ts=1481462307547;subscriber=0;tmi-sent-ts=1481462296699;turbo=0;user-id=115813457;user-type= :joe16_!joe16_@joe16_.tmi.twitch.tv PRIVMSG #pixel_maniacs :!dance math.sqrt(pi)
- // @badges=moderator/1;color=#0000FF;display-name=Lumiangames;emotes=;id=94a3815a-955e-419e-b282-b9abb7ba7f48;mod=1;room-id=122085144;sent-ts=1481462296568;subscriber=0;tmi-sent-ts=1481462297531;turbo=0;user-id=64742088;user-type=mod :lumiangames!lumiangames@lumiangames.tmi.twitch.tv PRIVMSG #pixel_maniacs :lel, du droll XD
- //@badges=broadcaster/1;color=;display-name=pixel_maniacs;emotes=;id=52a3a89b-2c4f-4cd3-8f9d-dc366e57d02d;mod=0;room-id=122085144;sent-ts=1481467694637;subscriber=0;tmi-sent-ts=1481467694820;turbo=0;user-id=122085144;user-type= :pixel_maniacs!pixel_maniacs@pixel_maniacs.tmi.twitch.tv PRIVMSG #pixel_maniacs :bello
- //@badges=broadcaster/1;color=;display-name=pixel_maniacs;emotes=;id=afc572a6-efa0-4cbf-b16d-be6fcfa162a2;mod=0;room-id=122085144;sent-ts=1481467695965;subscriber=0;tmi-sent-ts=1481467696143;turbo=0;user-id=122085144;user-type= :pixel_maniacs!pixel_maniacs@pixel_maniacs.tmi.twitch.tv PRIVMSG #pixel_maniacs :test
- string line;
- while (connectionState != ConnectionState.DISCONNECTED && (line = socketIn.ReadLine()) != null) {
- //Debug.Log("> "+line);
- string[] parts = line.Split(' ');
- //for(int i = 0; i < parts.Length; i++)
- //{
- // Debug.Log("part " + i + " => " + parts[i]);
- //}
- if (parts[0] == "PING") {
- SendRaw("PONG "+parts[1]);
- } else if (parts[1] == "001") {
- Debug.LogWarning("Connected " + line);
- UnityMainThreadDispatcher.Instance().Enqueue(() => {
- OnConnected.Invoke();
- });
- continue;
- } else if (parts[0].StartsWith("@") && parts[2] == "PRIVMSG") {
- string channel = parts[3];
- Dictionary<string,string> data = ParseQueryString(parts[0].Substring(1));
- string color = data["color"];
- if (color == "") color = "#000000";
- string username = parts[1].Substring(1, parts[1].IndexOf('!') - 1);
- User user = new User(Int32.Parse(data["user-id"]), username, data["display-name"], color, data["user-type"] == "mod" || data["badges"].Contains("broadcaster"), data["badges"].Contains("broadcaster"), data["subscriber"] == "1");
- string message = String.Join(" ", new List<string>(parts).GetRange(4, parts.Length-4).ToArray()).Substring(1);
- UnityMainThreadDispatcher.Instance().Enqueue(() => {
- OnMessage.Invoke(channel, user, message);
- });
- continue;
- } else if (parts[0].StartsWith("@") && parts[2] == "USERSTATE") {
- //@badges=moderator/1;color=;display-name=metalmoshpitbot;emote-sets=0;mod=1;subscriber=0;user-type=mod :tmi.twitch.tv USERSTATE #pixel_maniacs
- string channel = parts[3];
- Dictionary<string,string> data = ParseQueryString(parts[0].Substring(1));
- string color = data["color"];
- if (color == "") color = "#000000";
- string username = data["display-name"].ToLower();
- User user = new User(0, username, data["display-name"], color, data["user-type"] == "mod" || data["badges"].Contains("broadcaster"), data["badges"].Contains("broadcaster"), data["subscriber"] == "1");
- UnityMainThreadDispatcher.Instance().Enqueue(() => {
- OnUserStateReceived.Invoke(user, channel);
- });
- continue;
- } else if (parts[0].StartsWith(":") && parts[1] == "PRIVMSG") {
- string channel = parts[2];
- User user = new User(parts[0].Substring(1, parts[0].IndexOf('!') - 1));
- string message = String.Join(" ", new List<string>(parts).GetRange(3, parts.Length-3).ToArray()).Substring(1);
- UnityMainThreadDispatcher.Instance().Enqueue(() => {
- OnMessage.Invoke(channel, user, message);
- });
- continue;
- } else if (parts[0] == ":tmi.twitch.tv" && parts[1] == "NOTICE" && parts[3] == ":Login") {
- UnityMainThreadDispatcher.Instance().Enqueue(() => {
- OnAuthenticationFailed.Invoke();
- });
- continue;
- }
- }
- if (connectionState != ConnectionState.DISCONNECTED) {
- Debug.LogWarning("IRCClient disconnected");
- UnityMainThreadDispatcher.Instance().Enqueue(() => {
- Disconnect();
- OnDisconnected.Invoke();
- });
- }
- }
- public void SendRaw(string message) {
- //Debug.Log("< "+message);
- socketOut.WriteLine(message);
- socketOut.Flush();
- }
- public void Join(string channel) {
- SendRaw("JOIN "+channel);
- }
- public void RequestCapability(string capability) {
- SendRaw("CAP REQ :"+capability);
- }
- public void Part(string channel) {
- SendRaw("PART "+channel);
- }
- public void SendMessage(string channel, string message) {
- SendRaw("PRIVMSG "+channel+" :"+message);
- }
- public void Disconnect() {
- if (connectionState == ConnectionState.DISCONNECTED)
- throw new Exception("irc client disconnected");
- connectionState = ConnectionState.DISCONNECTED;
- readThread.Abort();
- socket.Close();
- client.Close();
- }
- private Dictionary<string,string> ParseQueryString(string qs) {
- Dictionary<string,string> data = new Dictionary<string,string>();
- string[] args = qs.Split(';');
- foreach (string arg in args) {
- string[] parts = arg.Split('=');
- data[parts[0]] = parts[1];
- }
- return data;
- }
- public class MessageEvent : UnityEvent<string,User,string> {}
- public class UserStateReceivedEvent : UnityEvent<User,string> {}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement