<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://fenixdocs.com/skins/common/feed.css?63"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://fenixdocs.com/index.php?action=history&amp;feed=atom&amp;title=Tutorial%3AIRCchat</id>
		<title>Tutorial:IRCchat - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://fenixdocs.com/index.php?action=history&amp;feed=atom&amp;title=Tutorial%3AIRCchat"/>
		<link rel="alternate" type="text/html" href="http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;action=history"/>
		<updated>2026-05-01T09:48:04Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.10.1</generator>

	<entry>
		<id>http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;diff=4582&amp;oldid=prev</id>
		<title>Sandman: /* Example code */</title>
		<link rel="alternate" type="text/html" href="http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;diff=4582&amp;oldid=prev"/>
				<updated>2008-03-27T09:15:50Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Example code&lt;/span&gt;&lt;/p&gt;

			&lt;table border='0' width='98%' cellpadding='0' cellspacing='4' style=&quot;background-color: white;&quot;&gt;
			&lt;tr&gt;
				&lt;td colspan='2' width='50%' align='center' style=&quot;background-color: white;&quot;&gt;←Older revision&lt;/td&gt;
				&lt;td colspan='2' width='50%' align='center' style=&quot;background-color: white;&quot;&gt;Revision as of 09:15, 27 March 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; align=&quot;left&quot;&gt;&lt;strong&gt;Line 38:&lt;/strong&gt;&lt;/td&gt;
&lt;td colspan=&quot;2&quot; align=&quot;left&quot;&gt;&lt;strong&gt;Line 38:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;End&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;End&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; font-size: smaller;&quot;&gt;Process Main()&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;Private&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;Private&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;    int netID; // NET ID&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; font-size: smaller;&quot;&gt;    int netID; // NET ID&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sandman</name></author>	</entry>

	<entry>
		<id>http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;diff=3868&amp;oldid=prev</id>
		<title>Sandman: /* Example code */</title>
		<link rel="alternate" type="text/html" href="http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;diff=3868&amp;oldid=prev"/>
				<updated>2007-11-21T19:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Example code&lt;/span&gt;&lt;/p&gt;
&lt;a href=&quot;http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;amp;diff=3868&amp;amp;oldid=3866&quot;&gt;(Difference between revisions)&lt;/a&gt;</summary>
		<author><name>Sandman</name></author>	</entry>

	<entry>
		<id>http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;diff=3866&amp;oldid=prev</id>
		<title>Sandman: New page: Category:tutorials  This is an example for making an IRC chat client with Network.dll. Note that this is a ''very'' basic client, so no userlist, etc.  Should traces of message rem...</title>
		<link rel="alternate" type="text/html" href="http://fenixdocs.com/index.php?title=Tutorial:IRCchat&amp;diff=3866&amp;oldid=prev"/>
				<updated>2007-11-21T19:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;New page: &lt;a href=&quot;/index.php/Category:Tutorials&quot; title=&quot;Category:Tutorials&quot;&gt;Category:tutorials&lt;/a&gt;  This is an example for making an IRC chat client with &lt;a href=&quot;/index.php/Network.dll&quot; title=&quot;Network.dll&quot;&gt;Network.dll&lt;/a&gt;. Note that this is a ''very'' basic client, so no userlist, etc.  Should traces of message rem...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:tutorials]]&lt;br /&gt;
&lt;br /&gt;
This is an example for making an IRC chat client with [[Network.dll]]. Note that this is a ''very'' basic client, so no userlist, etc.&lt;br /&gt;
&lt;br /&gt;
Should traces of message remain on the screen, this is because of Fenix' background restore system. Setting [[restore_type]] to [[complete_restore]] fixes that.&lt;br /&gt;
&lt;br /&gt;
Note that this is code for Fenix versions [[0.93]] and up. Should the code work for other versions as well, be so kind to note this here.&lt;br /&gt;
&lt;br /&gt;
== Example code ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Network.dll&lt;br /&gt;
include &amp;quot;network.fh&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* Globals */&lt;br /&gt;
&lt;br /&gt;
Global&lt;br /&gt;
	&lt;br /&gt;
	// Struct containing settings&lt;br /&gt;
	Struct settings&lt;br /&gt;
		string server = &amp;quot;irc.blitzed.org&amp;quot;;&lt;br /&gt;
		word port = 6667;&lt;br /&gt;
		string channel = &amp;quot;#bilge&amp;quot;;&lt;br /&gt;
		string nick = &amp;quot;Chatter&amp;quot;;&lt;br /&gt;
		string realname = &amp;quot;Chatter of the Chat&amp;quot;;&lt;br /&gt;
	End&lt;br /&gt;
&lt;br /&gt;
	// IRC related data&lt;br /&gt;
	Struct IRC&lt;br /&gt;
		int connected;&lt;br /&gt;
	End&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
/* Declares */&lt;br /&gt;
&lt;br /&gt;
Declare Function String textinput();&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
Private&lt;br /&gt;
	int netID; // NET ID&lt;br /&gt;
Begin&lt;br /&gt;
&lt;br /&gt;
	// Set target FPS at 100fps&lt;br /&gt;
	set_fps(100,0);&lt;br /&gt;
	restore_type = complete_restore;&lt;br /&gt;
&lt;br /&gt;
	// Connect to server and join channel&lt;br /&gt;
	net_init(0,10,1);&lt;br /&gt;
	netid = irc_connect();&lt;br /&gt;
&lt;br /&gt;
	// Start input process&lt;br /&gt;
	input(netid);&lt;br /&gt;
&lt;br /&gt;
	// Wait until key ESC&lt;br /&gt;
	Repeat&lt;br /&gt;
		frame;&lt;br /&gt;
	Until(key(_ESC));&lt;br /&gt;
&lt;br /&gt;
	// Disconnect and quit.&lt;br /&gt;
	irc_disconnect(netid,&amp;quot;Ended&amp;quot;);&lt;br /&gt;
	net_quit();&lt;br /&gt;
	let_me_alone();&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
//Input process&lt;br /&gt;
Process input(int netid)&lt;br /&gt;
Private&lt;br /&gt;
	string message;&lt;br /&gt;
Begin&lt;br /&gt;
	Loop&lt;br /&gt;
		if( (message = textinput()) != &amp;quot;&amp;quot; )&lt;br /&gt;
			irc_chat(netid,message);&lt;br /&gt;
		end&lt;br /&gt;
		frame;&lt;br /&gt;
	End&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Connect to IRC&lt;br /&gt;
Function int irc_connect()&lt;br /&gt;
Begin&lt;br /&gt;
&lt;br /&gt;
	// Check if already connected&lt;br /&gt;
	if(irc.connected)&lt;br /&gt;
		return -1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	// Connect&lt;br /&gt;
	x=net_connect(settings.server,settings.port,false);&lt;br /&gt;
	if(x&amp;lt;0)&lt;br /&gt;
		return x;&lt;br /&gt;
	end&lt;br /&gt;
	net_separator(x,chr(13)+chr(10),2);&lt;br /&gt;
&lt;br /&gt;
	// Start the message receiver process&lt;br /&gt;
	irc_receiver(x);&lt;br /&gt;
&lt;br /&gt;
	// Send nick data&lt;br /&gt;
	irc_send(x,&amp;quot;USER &amp;quot; + settings.nick + &amp;quot; 8 * :&amp;quot; + settings.realname);&lt;br /&gt;
	irc_send(x,&amp;quot;NICK &amp;quot; + settings.nick);&lt;br /&gt;
&lt;br /&gt;
	// Wait until connectec&lt;br /&gt;
	while(!irc.connected)&lt;br /&gt;
		frame;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	// Join the channel&lt;br /&gt;
	irc_send(x,&amp;quot;JOIN &amp;quot; + settings.channel);&lt;br /&gt;
&lt;br /&gt;
	return x;&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Disconnect from IRC&lt;br /&gt;
Function int irc_disconnect(int netid, string message)&lt;br /&gt;
Begin&lt;br /&gt;
&lt;br /&gt;
	irc_send(netid,&amp;quot;QUIT :&amp;quot; + message);&lt;br /&gt;
	return net_disconnect(netid);&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Receive and handle incoming messages from the IRC server&lt;br /&gt;
Process irc_receiver(int netid)&lt;br /&gt;
Private&lt;br /&gt;
	string message;&lt;br /&gt;
Begin&lt;br /&gt;
&lt;br /&gt;
	Loop&lt;br /&gt;
		Switch(Net.Incoming[netid])&lt;br /&gt;
			case NET_STATUS_DISCONNECTED:&lt;br /&gt;
				out(&amp;quot;# Disconnected!&amp;quot;);&lt;br /&gt;
			end&lt;br /&gt;
			case NET_STATUS_INACTIVE:&lt;br /&gt;
			end&lt;br /&gt;
			case NET_STATUS_ACTIVE:&lt;br /&gt;
				while( len(message=net_recv(netid))&amp;gt;0 )&lt;br /&gt;
					irc_handlemessage(netid,message);&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			case NET_STATUS_ESTABLISHED:&lt;br /&gt;
				out(&amp;quot;# Connected!&amp;quot;);&lt;br /&gt;
			end&lt;br /&gt;
		End&lt;br /&gt;
		frame;&lt;br /&gt;
	End&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Handle a message&lt;br /&gt;
Function int irc_handlemessage(int netid, string message)&lt;br /&gt;
Private&lt;br /&gt;
	int params;&lt;br /&gt;
	string pointer param_original;&lt;br /&gt;
	string pointer param;&lt;br /&gt;
	string sender;&lt;br /&gt;
	string command;&lt;br /&gt;
	string all_params;&lt;br /&gt;
Begin&lt;br /&gt;
&lt;br /&gt;
	// Obtain list of parameters&lt;br /&gt;
	param = param_original = alloc(100*sizeof(string));&lt;br /&gt;
	params = split(&amp;quot; &amp;quot;,message,param,100);&lt;br /&gt;
&lt;br /&gt;
	// Obtain sender&lt;br /&gt;
	if(param[0][0]==&amp;quot;:&amp;quot;)&lt;br /&gt;
		sender = substr(param[0],1,len(param[0])-1);&lt;br /&gt;
		param++;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	// Obtain command and all params&lt;br /&gt;
	command = param[0];&lt;br /&gt;
	all_params = substr(message,len(sender)+len(command)+3);&lt;br /&gt;
&lt;br /&gt;
	say(&amp;quot;% &amp;quot; + message);&lt;br /&gt;
&lt;br /&gt;
	// Handle commands&lt;br /&gt;
	if(param[0]==&amp;quot;PING&amp;quot;) // According to IRC protocol&lt;br /&gt;
		irc_send(netid,&amp;quot;PONG &amp;quot; + param[1]);&lt;br /&gt;
		return 0;&lt;br /&gt;
	elseif(param[0]==&amp;quot;PRIVMSG&amp;quot;) // Handles incoming chat message&lt;br /&gt;
		// Strips the sender of not wanted information&lt;br /&gt;
		for(x=len(sender)-1; x&amp;gt;0; x--)&lt;br /&gt;
			if(sender[x]==&amp;quot;!&amp;quot;)&lt;br /&gt;
				break;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		sender = substr(sender,0,x);&lt;br /&gt;
&lt;br /&gt;
		// Strips the all_params to just the chat message&lt;br /&gt;
		all_params = substr(all_params,len(param[1])+1,len(all_params)-1);&lt;br /&gt;
		if(all_params[0]==&amp;quot;:&amp;quot;)&lt;br /&gt;
			all_params = substr(all_params,1,len(all_params)-1);&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		// Output message&lt;br /&gt;
		out(sender + &amp;quot;&amp;gt; &amp;quot; + all_params);&lt;br /&gt;
		return 0;&lt;br /&gt;
	elseif(param[0]==&amp;quot;MODE&amp;quot;) // According to IRC protocol&lt;br /&gt;
		// MODE commands get sent when done connecting&lt;br /&gt;
		irc.connected = true;&lt;br /&gt;
		return 0;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return -1;&lt;br /&gt;
&lt;br /&gt;
OnExit&lt;br /&gt;
	free(param_original);&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Write message onscreen&lt;br /&gt;
Global&lt;br /&gt;
	out_txt[99];&lt;br /&gt;
	max_txt = 18;&lt;br /&gt;
End&lt;br /&gt;
Function out(string message)&lt;br /&gt;
Begin&lt;br /&gt;
	if(out_txt[max_txt-1]!=0)&lt;br /&gt;
		delete_text(out_txt[max_txt-1]);&lt;br /&gt;
	end&lt;br /&gt;
	for(x=max_txt-1; x&amp;gt;0; x--)&lt;br /&gt;
		out_txt[x] = out_txt[x-1];&lt;br /&gt;
		move_text(out_txt[x],10,190-x*10);&lt;br /&gt;
	end&lt;br /&gt;
	out_txt[0] = write(0,10,190,0,message);&lt;br /&gt;
&lt;br /&gt;
	say(&amp;quot;&amp;lt; &amp;quot; + out_txt[0] + &amp;quot; &amp;gt; &amp;quot; + message);&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Sends a message to the IRC server&lt;br /&gt;
Function int irc_send(int netid,string message)&lt;br /&gt;
Begin&lt;br /&gt;
	out(&amp;quot;&amp;lt;&amp;lt;&amp;lt; &amp;quot; + message);&lt;br /&gt;
	return net_sendrn(netid,message);&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Sends a chatmessage to the IRC server, to the channel&lt;br /&gt;
Function int irc_chat(int netid,string message)&lt;br /&gt;
Begin&lt;br /&gt;
	out(settings.nick + &amp;quot;&amp;gt; &amp;quot; + message);&lt;br /&gt;
	return net_sendrn(netid,&amp;quot;PRIVMSG &amp;quot; + settings.channel + &amp;quot; :&amp;quot; + message);&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
// Obtains text input&lt;br /&gt;
Function String textinput()&lt;br /&gt;
Private&lt;br /&gt;
    String str;&lt;br /&gt;
    int t;&lt;br /&gt;
    int t2;&lt;br /&gt;
    byte last_ascii;&lt;br /&gt;
    int txtid;&lt;br /&gt;
Begin&lt;br /&gt;
&lt;br /&gt;
    // show what you type in top left corner&lt;br /&gt;
    txtid = write_string(0,0,0,0,&amp;amp;str);&lt;br /&gt;
&lt;br /&gt;
    // clean the string&lt;br /&gt;
    str = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // get input from the user&lt;br /&gt;
    // pressing enter will end the loop&lt;br /&gt;
    Loop&lt;br /&gt;
        if(ascii!=0&amp;amp;&amp;amp;last_ascii==ascii) // check if a key is pressed and if the same key was pressed last frame&lt;br /&gt;
            if(t==0||t&amp;gt;fps/4) // check if the key was just pressed or it has been pressed for 0.25 seconds&lt;br /&gt;
                if(t==0||t2&amp;gt;fps/30) // check if the key was just pressed or it has been pressed for the last 0.03 seconds&lt;br /&gt;
                    t2=0;&lt;br /&gt;
                    switch(ascii) // handle input&lt;br /&gt;
                        case 8: //backspace&lt;br /&gt;
                            str = substr(str,0,len(str)-1);&lt;br /&gt;
                        end&lt;br /&gt;
                        case 13: //enter&lt;br /&gt;
                            break;&lt;br /&gt;
                        end&lt;br /&gt;
                        default: //addkey&lt;br /&gt;
                        	say(ascii);&lt;br /&gt;
                            str+=chr(ascii);&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                t2++;&lt;br /&gt;
            end&lt;br /&gt;
            t++;&lt;br /&gt;
        else&lt;br /&gt;
            t = t2 = 0; // reset&lt;br /&gt;
        end&lt;br /&gt;
        last_ascii = ascii;&lt;br /&gt;
        frame;&lt;br /&gt;
    End&lt;br /&gt;
&lt;br /&gt;
    // delete the text used&lt;br /&gt;
    delete_text(txtid);&lt;br /&gt;
&lt;br /&gt;
    // return the typed string&lt;br /&gt;
    return str;&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Used in example: [[set_fps]](), [[net_init]](), [[key]](), [[net_quit]](), [[let_me_alone]](), [[net_connect]](), [[net_separator]](), [[chr]](), [[net_disconnect]](), [[len]](), [[net_recv]](), [[alloc]](), [[split]](), [[sizeof]](), [[substr]](), [[say]](), [[free]](), [[delete_text]](), [[move_text]](), [[write]](), [[net_sendrn]](), [[write_string]](), [[declare]], [[function]], [[switch]], [[ascii]], [[fps]]&lt;br /&gt;
&lt;br /&gt;
This will result in something like:&lt;br /&gt;
[[Media:IRCchat.PNG]]&lt;/div&gt;</summary>
		<author><name>Sandman</name></author>	</entry>

	</feed>