{"id":421,"date":"2014-03-16T01:17:56","date_gmt":"2014-03-16T01:17:56","guid":{"rendered":"http:\/\/phoenixgamedevelopment.com\/blog\/?p=421"},"modified":"2014-03-16T01:17:56","modified_gmt":"2014-03-16T01:17:56","slug":"project-138-irc-client-program","status":"publish","type":"post","link":"https:\/\/phoenixgamedevelopment.com\/blog\/project-138-irc-client-program\/","title":{"rendered":"Project 138: IRC Client Program"},"content":{"rendered":"<p>I hadn&#8217;t intended to start this project, but I just got the idea for it and thought it would be a simple one-day project. It actually took most of the week, but I did learn a lot, and hopefully I can reuse this knowledge in other aspects of my work. The program is a simple IRC client. It can connect to any server on any port. Commands are sent through the standard &#8220;\/&#8221; prefix, so \/join #garagegames, for example. Members in a channel are automatically displayed in the users menu, and updated as they join or leave. Since the program is text only, there is no multiple tab functionality, but users can manually specify a target, and change this target, to control where the default messages go. In this way, a user could join a channel and have one on one chats, etc, at the same time.<\/p>\n<p>There are no real advanced features in the program, but the IRC protocol is quite powerful, and I can see a lot of potential in this type of technology.<\/p>\n<p>The only problem that I can see is that the IRC protocol seems to be non-standardised, or at least the standards are not strictly enforced, so it is very difficult to write a client that can correctly parse incoming message from an IRC server. In the images below, you can see that the initial text downloaded from the IRC server after joining is not formatted correctly. The reason for this is due to this non-standard message formate, developing code to correctly parse all IRC messages would be a project in itself.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_132-Mar.-07-00.24.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-416\" alt=\"ScreenHunter_132 Mar. 07 00.24\" src=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_132-Mar.-07-00.24-300x197.jpg\" width=\"300\" height=\"197\" srcset=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_132-Mar.-07-00.24-300x197.jpg 300w, https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_132-Mar.-07-00.24-1024x672.jpg 1024w, https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_132-Mar.-07-00.24.jpg 1088w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a> <a href=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_21-Mar.-09-21.56.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-415\" alt=\"ScreenHunter_21 Mar. 09 21.56\" src=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_21-Mar.-09-21.56-300x197.jpg\" width=\"300\" height=\"197\" srcset=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_21-Mar.-09-21.56-300x197.jpg 300w, https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_21-Mar.-09-21.56-1024x672.jpg 1024w, https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_21-Mar.-09-21.56.jpg 1088w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><a href=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_20-Mar.-09-21.54.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"ScreenHunter_20 Mar. 09 21.54\" src=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_20-Mar.-09-21.54-300x197.jpg\" width=\"300\" height=\"197\" \/><\/a><a href=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_08-Mar.-08-18.03.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"ScreenHunter_08 Mar. 08 18.03\" src=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_08-Mar.-08-18.03-300x197.jpg\" width=\"300\" height=\"197\" \/><\/a><a href=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_03-Mar.-07-19.49.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"ScreenHunter_03 Mar. 07 19.49\" src=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_03-Mar.-07-19.49-300x197.jpg\" width=\"300\" height=\"197\" \/><\/a><a href=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_02-Mar.-07-19.49.jpg\"><img loading=\"lazy\" decoding=\"async\" alt=\"ScreenHunter_02 Mar. 07 19.49\" src=\"https:\/\/phoenixgamedevelopment.com\/blog\/wp-content\/uploads\/2014\/03\/ScreenHunter_02-Mar.-07-19.49-300x197.jpg\" width=\"300\" height=\"197\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I hadn&#8217;t intended to start this project, but I just got the idea for it and thought it would be a simple one-day project. It actually took most of the week, but I did learn a lot, and hopefully I can reuse this knowledge in other aspects of my work. The program is a simple [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-421","post","type-post","status-publish","format-standard","hentry","category-software-and-games","has-post-title","has-post-date","has-post-category","has-post-tag","has-post-comment","has-post-author",""],"aioseo_notices":[],"builder_content":"","_links":{"self":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts\/421"}],"collection":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/comments?post=421"}],"version-history":[{"count":2,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts\/421\/revisions"}],"predecessor-version":[{"id":423,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/posts\/421\/revisions\/423"}],"wp:attachment":[{"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/media?parent=421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/categories?post=421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/phoenixgamedevelopment.com\/blog\/wp-json\/wp\/v2\/tags?post=421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}