- This wiki is out of date, use the continuation of this wiki instead
Tutorial:IRCchat
From FenixWiki
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 remain on the screen, this is because of Fenix' background restore system. Setting restore_type to complete_restore fixes that.
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.
Example code
// Network.dll include "network.fh"; /* Globals */ Global // Struct containing settings Struct settings string server = "irc.blitzed.org"; word port = 6667; string channel = "#bilge"; string nick = "Chatter"; string realname = "Chatter of the Chat"; End // IRC related data Struct IRC int connected; End End /* Declares */ Declare Function String textinput(); End Private int netID; // NET ID Begin // Set target FPS at 100fps set_fps(100,0); restore_type = complete_restore; // Connect to server and join channel net_init(0,10,1); netid = irc_connect(); // Start input process input(netid); // Wait until key ESC Repeat frame; Until(key(_ESC)); // Disconnect and quit. irc_disconnect(netid,"Ended"); net_quit(); let_me_alone(); End //Input process Process input(int netid) Private string message; Begin Loop if( (message = textinput()) != "" ) irc_chat(netid,message); end frame; End End // Connect to IRC Function int irc_connect() Begin // Check if already connected if(irc.connected) return -1; end // Connect x=net_connect(settings.server,settings.port,false); if(x<0) return x; end net_separator(x,chr(13)+chr(10),2); // Start the message receiver process irc_receiver(x); // Send nick data irc_send(x,"USER " + settings.nick + " 8 * :" + settings.realname); irc_send(x,"NICK " + settings.nick); // Wait until connectec while(!irc.connected) frame; end // Join the channel irc_send(x,"JOIN " + settings.channel); return x; End // Disconnect from IRC Function int irc_disconnect(int netid, string message) Begin irc_send(netid,"QUIT :" + message); return net_disconnect(netid); End // Receive and handle incoming messages from the IRC server Process irc_receiver(int netid) Private string message; Begin Loop Switch(Net.Incoming[netid]) case NET_STATUS_DISCONNECTED: out("# Disconnected!"); end case NET_STATUS_INACTIVE: end case NET_STATUS_ACTIVE: while( len(message=net_recv(netid))>0 ) irc_handlemessage(netid,message); end end case NET_STATUS_ESTABLISHED: out("# Connected!"); end End frame; End End // Handle a message Function int irc_handlemessage(int netid, string message) Private int params; string pointer param_original; string pointer param; string sender; string command; string all_params; Begin // Obtain list of parameters param = param_original = alloc(100*sizeof(string)); params = split(" ",message,param,100); // Obtain sender if(param[0][0]==":") sender = substr(param[0],1,len(param[0])-1); param++; end // Obtain command and all params command = param[0]; all_params = substr(message,len(sender)+len(command)+3); say("% " + message); // Handle commands if(param[0]=="PING") // According to IRC protocol irc_send(netid,"PONG " + param[1]); return 0; elseif(param[0]=="PRIVMSG") // Handles incoming chat message // Strips the sender of not wanted information for(x=len(sender)-1; x>0; x--) if(sender[x]=="!") break; end end sender = substr(sender,0,x); // Strips the all_params to just the chat message all_params = substr(all_params,len(param[1])+1,len(all_params)-1); if(all_params[0]==":") all_params = substr(all_params,1,len(all_params)-1); end // Output message out(sender + "> " + all_params); return 0; elseif(param[0]=="MODE") // According to IRC protocol // MODE commands get sent when done connecting irc.connected = true; return 0; end return -1; OnExit free(param_original); End // Write message onscreen Global out_txt[99]; max_txt = 18; End Function out(string message) Begin if(out_txt[max_txt-1]!=0) delete_text(out_txt[max_txt-1]); end for(x=max_txt-1; x>0; x--) out_txt[x] = out_txt[x-1]; move_text(out_txt[x],10,190-x*10); end out_txt[0] = write(0,10,190,0,message); say("< " + out_txt[0] + " > " + message); End // Sends a message to the IRC server Function int irc_send(int netid,string message) Begin out("<<< " + message); return net_sendrn(netid,message); End // Sends a chatmessage to the IRC server, to the channel Function int irc_chat(int netid,string message) Begin out(settings.nick + "> " + message); return net_sendrn(netid,"PRIVMSG " + settings.channel + " :" + message); End // Obtains text input Function String textinput() Private String str; int t; int t2; byte last_ascii; int txtid; Begin // show what you type in top left corner txtid = write_string(0,0,0,0,&str); // clean the string str = ""; // get input from the user // pressing enter will end the loop Loop if(ascii!=0&&last_ascii==ascii) // check if a key is pressed and if the same key was pressed last frame if(t==0||t>fps/4) // check if the key was just pressed or it has been pressed for 0.25 seconds if(t==0||t2>fps/30) // check if the key was just pressed or it has been pressed for the last 0.03 seconds t2=0; switch(ascii) // handle input case 8: //backspace str = substr(str,0,len(str)-1); end case 13: //enter break; end default: //addkey say(ascii); str+=chr(ascii); end end end t2++; end t++; else t = t2 = 0; // reset end last_ascii = ascii; frame; End // delete the text used delete_text(txtid); // return the typed string return str; End
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
This will result in something like: Media:IRCchat.PNG