- This wiki is out of date, use the continuation of this wiki instead
Tutorial:IRCchat
From FenixWiki
| Revision as of 19:44, 21 November 2007 (edit) Sandman (Talk | contribs) (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...) ← Previous diff |
Current revision (09:15, 27 March 2008) (edit) (undo) Sandman (Talk | contribs) m (→Example code) |
||
| (One intermediate revision not shown.) | |||
| Line 16: | Line 16: | ||
| Global | 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 | End | ||
| Line 38: | Line 38: | ||
| End | End | ||
| + | Process Main() | ||
| Private | Private | ||
| - | + | int netID; // NET ID | |
| Begin | Begin | ||
| - | + | // Set target FPS at 100fps | |
| - | + | set_fps(100,0); | |
| - | + | ||
| - | + | // 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 | End | ||
| Line 68: | Line 68: | ||
| Process input(int netid) | Process input(int netid) | ||
| Private | Private | ||
| - | + | string message; | |
| Begin | Begin | ||
| - | + | Loop | |
| - | + | if( (message = textinput()) != "" ) | |
| - | + | irc_chat(netid,message); | |
| - | + | end | |
| - | + | frame; | |
| - | + | End | |
| End | End | ||
| Line 82: | Line 82: | ||
| Begin | 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 | End | ||
| Line 117: | Line 117: | ||
| Begin | Begin | ||
| - | + | irc_send(netid,"QUIT :" + message); | |
| - | + | return net_disconnect(netid); | |
| End | End | ||
| Line 125: | Line 125: | ||
| Process irc_receiver(int netid) | Process irc_receiver(int netid) | ||
| Private | Private | ||
| - | + | string message; | |
| Begin | 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 | End | ||
| Line 152: | Line 152: | ||
| Function int irc_handlemessage(int netid, string message) | Function int irc_handlemessage(int netid, string message) | ||
| Private | Private | ||
| - | + | int params; | |
| - | + | string pointer param_original; | |
| - | + | string pointer param; | |
| - | + | string sender; | |
| - | + | string command; | |
| - | + | string all_params; | |
| Begin | 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 | OnExit | ||
| - | + | free(param_original); | |
| End | End | ||
| // Write message onscreen | // Write message onscreen | ||
| Global | Global | ||
| - | + | out_txt[99]; | |
| - | + | max_txt = 18; | |
| End | End | ||
| Function out(string message) | Function out(string message) | ||
| Begin | 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 | End | ||
| Line 232: | Line 232: | ||
| Function int irc_send(int netid,string message) | Function int irc_send(int netid,string message) | ||
| Begin | Begin | ||
| - | + | out("<<< " + message); | |
| - | + | return net_sendrn(netid,message); | |
| End | End | ||
| Line 239: | Line 239: | ||
| Function int irc_chat(int netid,string message) | Function int irc_chat(int netid,string message) | ||
| Begin | Begin | ||
| - | + | out(settings.nick + "> " + message); | |
| - | + | return net_sendrn(netid,"PRIVMSG " + settings.channel + " :" + message); | |
| End | End | ||
| Line 274: | Line 274: | ||
| end | end | ||
| default: //addkey | default: //addkey | ||
| - | + | say(ascii); | |
| str+=chr(ascii); | str+=chr(ascii); | ||
| end | end | ||
| Line 299: | Line 299: | ||
| 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]] | 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: | + | Also used is the [[Tutorial:Textinput|textinput tutorial]]. |
| - | [[ | + | |
| + | This will result in something like:<br> | ||
| + | [[Image:IRCchat.PNG]] | ||
Current revision
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.
[edit] 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
Process Main()
Private
int netID; // NET ID
Begin
// Set target FPS at 100fps
set_fps(100,0);
// 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
Also used is the textinput tutorial.
