- 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 |
Revision as of 19:47, 21 November 2007 (edit) (undo) Sandman (Talk | contribs) (→Example code) Next diff → |
||
| 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 39: | Line 39: | ||
| 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 67: | ||
| 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 81: | ||
| 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 116: | ||
| Begin | Begin | ||
| - | + | irc_send(netid,"QUIT :" + message); | |
| - | + | return net_disconnect(netid); | |
| End | End | ||
| Line 125: | Line 124: | ||
| 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 151: | ||
| 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 231: | ||
| 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 238: | ||
| 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 273: | ||
| end | end | ||
| default: //addkey | default: //addkey | ||
| - | + | say(ascii); | |
| str+=chr(ascii); | str+=chr(ascii); | ||
| end | end | ||
| Line 299: | Line 298: | ||
| 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]] | ||
Revision as of 19:47, 21 November 2007
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);
// 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.
