Hello There, Guest!
View New Posts  |  View Today's Posts
[Source] Create your own IRC Client [C#/VB.Net]

ii 
  • 1 Vote(s) - 5 Average


11-20-2015, 07:10 PM #171
KoBE
¯\_(ツ)_/¯
******
Global Moderators
Posts: 4,862 Threads:494 Joined: Jun 2011 Reputation: 67

RE: Create your own IRC Client [C#/VB.Net]
This is most definitely thread related. Without running the code myself I can't say exactly the cause, but I'd wager a bet that it's either the line Mazzn pointed out or the second GetStream() call.

I have an example somewhere that utilizes events and the AsyncOperation class to handle the multi-threading issue. Actually, I think the latest IrcClass has multi-threading. You could look at how it fires events..

It's 100% a good idea though to separate the client logic from the UI code. Do something similar to how I used events to update the UI.

11-27-2015, 03:26 PM #172
LibTiff
Junior Member
**
Posts: 15 Threads:0 Joined: Aug 2015 Reputation: 0

RE: Create your own IRC Client [C#/VB.Net]
Im working on your IrcClient-csharp project and im trying to implement there the SASL since i know now how it works...
The weird thing is that ive sorted out everything but for some reason your parsing never picks up the PRIVMSG command from server where it asks for the client verson in order to proceed with the sasl authentication.


Heres the debug where im printing everything splitted in ircData array using. Also i completely removed your case PRIVMSG to see if it caused any conflicts but still no luck.
Code:
foreach (string word in ircData)
{
    Console.WriteLine(word);
}

Code:
:x01.mirc.com.gr NOTICE Auth :*** Looking up your hostname...
:x01.mirc.com.gr NOTICE Auth :*** Could not resolve your hostname: Domain name not found; using your IP address (212.50.112.66) instead.
:x01.mirc.com.gr CAP 539AAFCO5 LS :multi-prefix sasl tls
:x01.mirc.com.gr
CAP
539AAFCO5
LS
:multi-prefix
sasl
tls
Token=539AAFCO5
Client: CAP REQ :multi-prefix SENT
:x01.mirc.com.gr 931 Guest151 :Malicious or potentially unwanted softwares are not WELCOME here!
:x01.mirc.com.gr PRIVMSG Guest151 :VERSION [b]<------------------------- THATS THE LINE THAT GETS COMPLETELY IGNORED[/b]
Malicious or potentially unwanted softwares are not WELCOME here!
VERSION
:x01.mirc.com.gr CAP Guest151 ACK :multi-prefix
:x01.mirc.com.gr
CAP
Guest151
ACK
:multi-prefix
The thread 0x293c has exited with code 259 (0x103).
ERROR :Closing link: (Guest151@ipaddress) [Registration timeout]
(Guest151@ipaddress) [Registration timeout]
The program '[3216] ClientDemo.vshost.exe' has exited with code 0 (0x0).
This post was last modified: 11-27-2015, 03:29 PM by LibTiff.

11-29-2015, 11:45 PM #173
AceInfinity
Developer
*******
Administrators
Posts: 9,733 Threads:1,026 Joined: Jun 2011 Reputation: 76

RE: Create your own IRC Client [C#/VB.Net]
(11-27-2015, 03:26 PM)LibTiff Wrote:  Im working on your IrcClient-csharp project and im trying to implement there the SASL since i know now how it works...
The weird thing is that ive sorted out everything but for some reason your parsing never picks up the PRIVMSG command from server where it asks for the client verson in order to proceed with the sasl authentication.


Heres the debug where im printing everything splitted in ircData array using. Also i completely removed your case PRIVMSG to see if it caused any conflicts but still no luck.
Code:
foreach (string word in ircData)
{
    Console.WriteLine(word);
}

Code:
:x01.mirc.com.gr NOTICE Auth :*** Looking up your hostname...
:x01.mirc.com.gr NOTICE Auth :*** Could not resolve your hostname: Domain name not found; using your IP address (212.50.112.66) instead.
:x01.mirc.com.gr CAP 539AAFCO5 LS :multi-prefix sasl tls
:x01.mirc.com.gr
CAP
539AAFCO5
LS
:multi-prefix
sasl
tls
Token=539AAFCO5
Client: CAP REQ :multi-prefix SENT
:x01.mirc.com.gr 931 Guest151 :Malicious or potentially unwanted softwares are not WELCOME here!
:x01.mirc.com.gr PRIVMSG Guest151 :VERSION [b]<------------------------- THATS THE LINE THAT GETS COMPLETELY IGNORED[/b]
Malicious or potentially unwanted softwares are not WELCOME here!
VERSION
:x01.mirc.com.gr CAP Guest151 ACK :multi-prefix
:x01.mirc.com.gr
CAP
Guest151
ACK
:multi-prefix
The thread 0x293c has exited with code 259 (0x103).
ERROR :Closing link: (Guest151@ipaddress) [Registration timeout]
(Guest151@ipaddress) [Registration timeout]
The program '[3216] ClientDemo.vshost.exe' has exited with code 0 (0x0).

Have you tried handling this case?
Code:
case "PRIVMSG": // message was sent to the channel or as private
{
    var from = ircData[0].Substring(1, ircData[0].IndexOf('!') - 1);
    var to = ircData[2];
    var message = JoinArray(ircData, 3);

    // if it's a private message
    if (String.Equals(to, _nick, StringComparison.CurrentCultureIgnoreCase))
        Fire_PrivateMessage(new PrivateMessageEventArgs(from, message));
    else
        Fire_ChannelMessage(new ChannelMessageEventArgs(to, from, message));
}
break;

It would appear that Fire_ChannelMessage() would be called in the case of above. You would need to handle the VERSION request yourself within that else block most likely. I don't see why it shouldn't be parsing that raw data because it should as far as the code structure goes. All raw data received gets parsed by that function, so to add further functionality you should start from there.
This post was last modified: 11-29-2015, 11:46 PM by AceInfinity.


Microsoft MVP .NET Programming - (2012 - Present)
®Crestron DMC-T Certified Automation Programmer

Development Site: aceinfinity.net

 ▲
 ▲ ▲

12-02-2015, 04:38 AM #174
KoBE
¯\_(ツ)_/¯
******
Global Moderators
Posts: 4,862 Threads:494 Joined: Jun 2011 Reputation: 67

RE: Create your own IRC Client [C#/VB.Net]
LibTiff, I have this wrote down on my list of things to look at. Unfortunately I haven't been following this thread as closely as I should.

I'm working atm, but I'll get get a response written soon!
This post was last modified: 12-02-2015, 04:40 AM by KoBE.

12-02-2015, 11:30 AM #175
LibTiff
Junior Member
**
Posts: 15 Threads:0 Joined: Aug 2015 Reputation: 0

RE: Create your own IRC Client [C#/VB.Net]
LONG POST INC.

Ok guys ill post here my exact code implemented on Kobes irc client and ill wait for your response since there is something (small or big) that im missing and this doesnt work for me. Even though the commands are all correct + the version command now gets executed correctly.

The mIRC debug screen which works perfectly:
Code:
x01.mirc.com.gr CAP LS
-> x01.mirc.com.gr NICK LibTiff
-> x01.mirc.com.gr USER LibTiff 0 * :...
<- :x01.mirc.com.gr NOTICE Auth :*** Looking up your hostname...
<- :x01.mirc.com.gr CAP 539AAFNEN LS :multi-prefix sasl tls
-> x01.mirc.com.gr CAP REQ :multi-prefix
<- :x01.mirc.com.gr NOTICE Auth :*** Could not resolve your hostname: Domain name not found; using your IP address (IP.ADDRESS.X.X) instead.
<- :x01.mirc.com.gr 931 LibTiff :Malicious or potentially unwanted softwares are not WELCOME here!
<- :x01.mirc.com.gr PRIVMSG LibTiff :VERSION
-> x01.mirc.com.gr NOTICE x01.mirc.com.gr :VERSION mIRC v7.43
<- :x01.mirc.com.gr CAP LibTiff ACK :multi-prefix
-> x01.mirc.com.gr CAP END
<- :x01.mirc.com.gr NOTICE LibTiff :*** Howdy buddy,you are authorized to use this server!
<- :x01.mirc.com.gr NOTICE Auth :Welcome to Hellenic!
<- :x01.mirc.com.gr 001 LibTiff :Welcome to the Hellenic IRC Network LibTiff!LibTiff@IP.ADDRESS.X.X
<- :x01.mirc.com.gr 002 LibTiff :Your host is x01.mirc.com.gr, running version InspIRCd-2.0

Current Status: C# Debug Output
Even though it says im passing the authentication instantly im getting the invalid sub command error
Code:
:x01.mirc.com.gr NOTICE Auth :*** Looking up your hostname...
:x01.mirc.com.gr CAP 539AAFNET LS :multi-prefix sasl tls
Token=539AAFNET
Client: CAP REQ :multi-prefix SENT
:x01.mirc.com.gr NOTICE Auth :*** Could not resolve your hostname: Domain name not found; using your IP address (IP.ADDRESS.X.X) instead.
:x01.mirc.com.gr 931 LibTiff :Malicious or potentially unwanted softwares are not WELCOME here!
:x01.mirc.com.gr PRIVMSG LibTiff :VERSION
Client: VERSION SENT
Malicious or potentially unwanted softwares are not WELCOME here!
:x01.mirc.com.gr CAP LibTiff ACK :multi-prefix
Client: CAP END SENT
:x01.mirc.com.gr NOTICE LibTiff :*** Howdy buddy,you are authorized to use this server!
:x01.mirc.com.gr 410 LibTiff END :Invalid CAP subcommand
END :Invalid CAP subcommand
The thread 0x2410 has exited with code 259 (0x103).
ERROR :Closing link: (LibTiff@IP.ADDRESS.X.X) [Registration timeout]
(LibTiff@IP.ADDRESS.X.X) [Registration timeout]

Heres the full Kobe's IrcClient.cs source with my changes:
Code:
//Everything untill DoConnect is the same

       private void DoConnect()
       {
           try
           {
               irc = new TcpClient(_server, _port);
               stream = irc.GetStream();
               reader = new StreamReader(stream);
               writer = new StreamWriter(stream);

               if (!string.IsNullOrEmpty(_ServerPass))
                   Send("PASS " + _ServerPass);

               Send("CAP LS" + "\r\n");
               Send("NICK " + _nick);
               Send("USER " + _nick + " 0 * :...");

               Listen();
           }
           catch (Exception ex)
           {
               Fire_ExceptionThrown(ex);
           }
       }
       /// <summary>
       /// Disconnect from the IRC server
       /// </summary>
       public void Disconnect()
       {
           if (irc != null)
           {
               if (irc.Connected)
               {
                   Send("QUIT Client Disconnected:");
               }
               irc = null;
           }
       }
       /// <summary>
       /// Sends the JOIN command to the server
       /// </summary>
       /// <param name="channel">Channel to join</param>
       public void JoinChannel(string channel)
       {
           if (irc != null && irc.Connected)
           {
               Send("JOIN " + channel);
           }
       }
       /// <summary>
       /// Sends the PART command for a given channel
       /// </summary>
       /// <param name="channel">Channel to leave</param>
       public void PartChannel(string channel)
       {
           Send("PART " + channel);
       }
       /// <summary>
       /// Send a notice to a user
       /// </summary>
       /// <param name="toNick">User to send the notice to</param>
       /// <param name="message">The message to send</param>
       public void SendNotice(string toNick, string message)
       {
           Send("NOTICE " + toNick + " :" + message);
       }

       /// <summary>
       /// Send a message to the channel
       /// </summary>
       /// <param name="channel">Channel to send message</param>
       /// <param name="message">Message to send</param>
       public void SendMessage(string channel, string message)
       {
           Send("PRIVMSG " + channel + " :" + message);
       }
       /// <summary>
       /// Send RAW IRC commands
       /// </summary>
       /// <param name="message"></param>
       public void SendRaw(string message)
       {
           Send(message);
       }

       public void Dispose()
       {
           stream.Dispose();
           writer.Dispose();
           reader.Dispose();
       }
       #endregion

       #region PrivateMethods
       /// <summary>
       /// Listens for messages from the server
       /// </summary>
       private void Listen()
       {

           while ((inputLine = reader.ReadLine()) != null)
           {
               try
               {
                   Console.Write(inputLine + "\n");
                   ParseData(inputLine);
               }
               catch (Exception ex)
               {
                   Fire_ExceptionThrown(ex);
               }
           }//end while
       }
       /// <summary>
       /// Parses data sent from the server
       /// </summary>
       /// <param name="data">message from the server</param>
       /////////////////////////////////////////////////
       //     VARS USED FOR THE SASL AUTHENTICATION   //
       String token = null;
       bool norepeat = false;
       bool Step2 = false;
       /// /////////////////////////////////////////////

       private void ParseData(string data)
       {
           // split the data into parts
           string[] ircData = data.Split(' ');

           var ircCommand = ircData[1];

           // if the message starts with PING we must PONG back
           if (data.Length > 4)
           {
               if (data.Substring(0, 4) == "PING")
               {
                   Send("PONG " + ircData[1]);
                   return;
               }

           }

           // re-act according to the IRC Commands
       
           switch (ircCommand)
           {  
               case "CAP":
               {

                   //foreach (string word in ircData)
                   //{
                   //    Console.WriteLine(word);
                   //}

                           if (norepeat == false)//Grab the token and save it to var token.
                           {
                               token = ircData[2];
                               Console.Write("Token=" + token + "\n");
                               norepeat = true;
                           }
                           //Stage 1 AUTHENTICATION
                           if (ircData[1] == "CAP" && ircData[2] == token && ircData[3] == "LS")
                           {
                               Send("CAP REQ :multi-prefix");
                               Console.Write("Client: CAP REQ :multi-prefix SENT \n");
                           }
                           //Stage 3 AUTHENTICATION EXECUTES ONLY IF STAGE2 IS DONE.
                           if (ircData[1] == "CAP" && ircData[2] == _nick && ircData[3]=="ACK" && Step2 == true)//IF THE STAGE2IS NOT COMPLETED THERE IS NO NEED TO PROCEED TO STAGE3
                           {
                                       Send("CAP END");
                                       Console.Write("Client: CAP END SENT" + "\n");
                           }
                           break;
                }
               case "001": // server welcome message, after this we can join
                   Send("MODE " + _nick + " +B");
                   Fire_Connected();    //TODO: this might not work
                   break;
               case "353": // member list
                   {
                       var channel = ircData[4];
                       var userList = JoinArray(ircData, 5).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                       Fire_UpdateUsers(new UpdateUsersEventArgs(channel, userList));
                   }
                   break;
               case "433":
                   var takenNick = ircData[3];

                   // notify user
                   Fire_NickTaken(takenNick);

                   // try alt nick if it's the first time
                   if (takenNick == _altNick)
                   {
                       var rand = new Random();
                       var randomNick = "Guest" + rand.Next(0, 9) + rand.Next(0, 9) + rand.Next(0, 9);
                       Send("NICK " + randomNick);
                       Send("USER " + randomNick + " 0 * :" + randomNick);
                       _nick = randomNick;
                   }
                   else
                   {
                       Send("NICK " + _altNick);
                       Send("USER " + _altNick + " 0 * :" + _altNick);
                       _nick = _altNick;
                   }
                   break;
               case "JOIN": // someone joined
                   {
                       var channel = ircData[2];
                       var user = ircData[0].Substring(1, ircData[0].IndexOf("!", StringComparison.Ordinal) - 1);
                       Fire_UserJoined(new UserJoinedEventArgs(channel, user));
                   }
                   break;
               case "MODE": // MODE was set
                   {
                       var channel = ircData[2];
                       if (channel != this.Nick)
                       {
                           string from;
                           if (ircData[0].Contains("!"))
                               from = ircData[0].Substring(1, ircData[0].IndexOf("!", StringComparison.Ordinal) - 1);
                           else
                               from = ircData[0].Substring(1);

                           var to = ircData[4];
                           var mode = ircData[3];
                           Fire_ChannelModeSet(new ModeSetEventArgs(channel, from, to, mode));
                       }

                       // TODO: event for userMode's
                   }
                   break;
               case "NICK": // someone changed their nick
                   var oldNick = ircData[0].Substring(1, ircData[0].IndexOf("!", StringComparison.Ordinal) - 1);
                   var newNick = JoinArray(ircData, 3);

                   Fire_NickChanged(new UserNickChangedEventArgs(oldNick, newNick));
                   break;
               case "NOTICE": // someone sent a notice
                   {
                       var from = ircData[0];
                       var message = JoinArray(ircData, 3);
                       if (from.Contains("!"))
                       {
                           from = from.Substring(1, ircData[0].IndexOf('!') - 1);
                           Fire_NoticeMessage(new NoticeMessageEventArgs(from, message));
                       }
                       else
                           Fire_NoticeMessage(new NoticeMessageEventArgs(_server, message));
                   }
                   break;


               case "PRIVMSG": //NEED TO ADD THE CHECK IF SASL IS ENABLED ELSE COMPLETELY IGNORE THE 1ST PART
                   {
                       if (Step2 == false)//1 time client check by the server
                       {
                           Send("NOTICE x01.mirc.com.gr :VERSION mIRC v7.43");
                           Console.Write("Client: VERSION SENT" + "\n");
                           Step2 = true;
                           
                       }
                       else
                       {
                           {
                               var from = ircData[0].Substring(1, ircData[0].IndexOf('!') - 1);
                               var to = ircData[2];
                               var message = JoinArray(ircData, 3);

                               // if it's a private message
                               if (String.Equals(to, _nick, StringComparison.CurrentCultureIgnoreCase))
                                   Fire_PrivateMessage(new PrivateMessageEventArgs(from, message));
                               else
                                   Fire_ChannelMessage(new ChannelMessageEventArgs(to, from, message));
                           }
                       }
                       break;
                   }
               case "PART":
               case "QUIT":// someone left
                   {
                       var channel = ircData[2];
                       var user = ircData[0].Substring(1, data.IndexOf("!") - 1);

                       Fire_UserLeft(new UserLeftEventArgs(channel, user));
                       Send("NAMES " + ircData[2]);
                   }
                   break;
               default:
                   // still using this while debugging

                   if (ircData.Length > 3)
                       Fire_ServerMesssage(JoinArray(ircData, 3));

                   break;
           }

       }
       /// <summary>
       /// Strips the message of unnecessary characters
       /// </summary>
       /// <param name="message">Message to strip</param>
       /// <returns>Stripped message</returns>
       private static string StripMessage(string message)
       {
           // remove IRC Color Codes
           foreach (Match m in new Regex((char)3 + @"(?:\d{1,2}(?:,\d{1,2})?)?").Matches(message))
               message = message.Replace(m.Value, "");

           // if there is nothing to strip
           if (message == "")
               return "";
           else if (message.Substring(0, 1) == ":" && message.Length > 2)
               return message.Substring(1, message.Length - 1);
           else
               return message;
       }
       /// <summary>
       /// Joins the array into a string after a specific index
       /// </summary>
       /// <param name="strArray">Array of strings</param>
       /// <param name="startIndex">Starting index</param>
       /// <returns>String</returns>
       private static string JoinArray(string[] strArray, int startIndex)
       {
           return StripMessage(String.Join(" ", strArray, startIndex, strArray.Length - startIndex));
       }
       /// <summary>
       /// Send message to server
       /// </summary>
       /// <param name="message">Message to send</param>
       private void Send(string message)
       {
           writer.WriteLine(message);
           writer.Flush();
       }
       #endregion
   }

}
This post was last modified: 12-02-2015, 11:33 AM by LibTiff.

12-02-2015, 09:23 PM #176
AceInfinity
Developer
*******
Administrators
Posts: 9,733 Threads:1,026 Joined: Jun 2011 Reputation: 76

RE: Create your own IRC Client [C#/VB.Net]
Do the server IRC daemon's support that CAP subcommand? It seems to me that it doesn't. Everything is fine otherwise by the looks of it. If you want to avoid that, send this:
Code:
RAW 410:*: { haltdef }

Also, you'll have to register or identify yourself to the server as it appears you are using a non-registered nick by that output.

CAP and all of its subcommands were added in IRCv3: http://ircv3.net/specs/core/capability-n...n-3.1.html

Might be worth a read as well.

edit: After copying the line you pasted in your output, it appears there is an extra character after the "D" in "END". Make sure to check this..

edit: Confirmed, your "CAP END" command has a start of heading unicode hidden character at the end of the string. Re-type that string out and it should work.

Copied from your code:

No idea how that could have happened.
This post was last modified: 12-02-2015, 09:39 PM by AceInfinity.


Microsoft MVP .NET Programming - (2012 - Present)
®Crestron DMC-T Certified Automation Programmer

Development Site: aceinfinity.net

 ▲
 ▲ ▲

12-03-2015, 06:54 AM #177
LibTiff
Junior Member
**
Posts: 15 Threads:0 Joined: Aug 2015 Reputation: 0

RE: Create your own IRC Client [C#/VB.Net]
(12-02-2015, 09:23 PM)AceInfinity Wrote:  Do the server IRC daemon's support that CAP subcommand? It seems to me that it doesn't. Everything is fine otherwise by the looks of it. If you want to avoid that, send this:
The server is fully implementing SASL auth. and you cant connect without it. (If that's what you mean)
If you check the mIRC debug screen i posted you can see that i can connect and all the basic CAP commands are working and being accepted.

Whats that? I dont really understand it tbh
Code:
RAW 410:*: { haltdef }


(12-02-2015, 09:23 PM)AceInfinity Wrote:  Also, you'll have to register or identify yourself to the server as it appears you are using a non-registered nick by that output.

CAP and all of its subcommands were added in IRCv3: http://ircv3.net/specs/core/capability-n...n-3.1.html

Might be worth a read as well.
About the registration thing , you can identify your self after the authentication by typing
Code:
/msg NickServ IDENTIFY password
so thats not causing any trouble. I did some tests and i never had a problem connecting to the server using unregistered usernames.

(12-02-2015, 09:23 PM)AceInfinity Wrote:  edit: After copying the line you pasted in your output, it appears there is an extra character after the "D" in "END". Make sure to check this..

edit: Confirmed, your "CAP END" command has a start of heading unicode hidden character at the end of the string. Re-type that string out and it should work.

Copied from your code:

No idea how that could have happened.

About the unicode character you mentioned i checked again all my code and i didnt spot any extra unicode characters anywhere near the CAP SASL Auth. Can you tell me exactly where did u find it? (Maybe the unicode appeared when i post it here , i have no idea)

EDIT: Unicode characters appear in the mIRC debug screen , but nowhere in my code.

REEDIT: ACTUALLY YOU ARE CORRECT!! Holy Sh*t. Theres a unicode character in the PRIVMSG VERSION Check Command I love you man. :P #NoHomo
This post was last modified: 12-03-2015, 08:14 AM by LibTiff.

12-03-2015, 08:31 AM #178
LibTiff
Junior Member
**
Posts: 15 Threads:0 Joined: Aug 2015 Reputation: 0

RE: Create your own IRC Client [C#/VB.Net]
So correcting the Unicode character gets me here. Surprisingly you are right (AGAIN) about the authentication thing but i still dont understand why. Since i can connect using mIRC to the server without a registered account. So what is the "NOTICE: You have not registered" mean??"

Also after some google ive found the server sources : https://github.com/NikosPapakonstantinou/inspircd
and the m_sasl.cpp: https://github.com/NikosPapakonstantinou...m_sasl.cpp

Code:
:x01.mirc.com.gr NOTICE Auth :*** Looking up your hostname...
:x01.mirc.com.gr NOTICE Auth :*** Could not resolve your hostname: Domain name not found; using your IP address (46.251.124.136) instead.
:x01.mirc.com.gr CAP 539AAFPDH LS :multi-prefix sasl tls
Token=539AAFPDH
Client: CAP REQ :multi-prefix SENT
:x01.mirc.com.gr 931 LibTiff :Malicious or potentially unwanted softwares are not WELCOME here!
:x01.mirc.com.gr PRIVMSG LibTiff :VERSION
Client: VERSION SENT
Malicious or potentially unwanted softwares are not WELCOME here!
:x01.mirc.com.gr CAP LibTiff ACK :multi-prefix
:x01.mirc.com.gr 451 LibTiff NOTICE :You have not registered
The thread 0x2538 has exited with code 259 (0x103).
ERROR :Closing link: (LibTiff@MY.IP.X.X) [If you are having problems connecting to this server, please get a better CLIENT or visit http://mirc.com.gr for more info.]
(LibTiff@MY.IP.X.X) [If you are having problems connecting to this server, please get a better CLIENT or visit http://mirc.com.gr for more info.]

12-03-2015, 04:57 PM #179
mansour9
Junior Member
**
Posts: 1 Threads:0 Joined: Dec 2015 Reputation: 0

RE: Create your own IRC Client [C#/VB.Net]
It gives me an error 'Type IrcClient is not defined.'

12-05-2015, 01:59 AM #180
KoBE
¯\_(ツ)_/¯
******
Global Moderators
Posts: 4,862 Threads:494 Joined: Jun 2011 Reputation: 67

RE: Create your own IRC Client [C#/VB.Net]
You are probably missing a namespace.


ii 


Forum Jump:


Possibly Related Threads...
Thread Author Replies Views Last Post
   IRC Client Class KoBE 110 77,618 10-01-2016, 06:52 PM
Last Post: AceInfinity
Star  Multi-Client Server Async Socket Example KoBE 165 173,597 09-10-2016, 05:17 AM
Last Post: R4TK3N
  Telnet Client AceInfinity 5 2,993 06-05-2016, 07:48 PM
Last Post: AceInfinity
   Twitch chat bot (irc client) dmgvol 11 19,790 08-24-2015, 11:59 PM
Last Post: Signal_20
   Justin.tv and Twitch.tv chat client. KoBE 41 23,683 07-13-2015, 11:02 PM
Last Post: KoBE


Users browsing this thread: 1 Guest(s)