This wiki is out of date, use the continuation of this wiki instead

Tutorial:IRCchat

From FenixWiki

(Difference between revisions)
Jump to: navigation, search
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 containing settings
- Struct settings+ Struct settings
- string server = "irc.blitzed.org";+ string server = "irc.blitzed.org";
- word port = 6667;+ word port = 6667;
- string channel = "#bilge";+ string channel = "#bilge";
- string nick = "Chatter";+ string nick = "Chatter";
- string realname = "Chatter of the Chat";+ string realname = "Chatter of the Chat";
- End+ End
- // IRC related data+ // IRC related data
- Struct IRC+ Struct IRC
- int connected;+ int connected;
- End+ End
End End
Line 39: Line 39:
Private Private
- int netID; // NET ID+ int netID; // NET ID
Begin Begin
- // Set target FPS at 100fps+ // Set target FPS at 100fps
- set_fps(100,0);+ set_fps(100,0);
- restore_type = complete_restore;+
- // Connect to server and join channel+ // Connect to server and join channel
- net_init(0,10,1);+ net_init(0,10,1);
- netid = irc_connect();+ netid = irc_connect();
- // Start input process+ // Start input process
- input(netid);+ input(netid);
- // Wait until key ESC+ // Wait until key ESC
- Repeat+ Repeat
- frame;+ frame;
- Until(key(_ESC));+ Until(key(_ESC));
- // Disconnect and quit.+ // Disconnect and quit.
- irc_disconnect(netid,"Ended");+ irc_disconnect(netid,"Ended");
- net_quit();+ net_quit();
- let_me_alone();+ let_me_alone();
End End
Line 68: Line 67:
Process input(int netid) Process input(int netid)
Private Private
- string message;+ string message;
Begin Begin
- Loop+ Loop
- if( (message = textinput()) != "" )+ if( (message = textinput()) != "" )
- irc_chat(netid,message);+ irc_chat(netid,message);
- end+ end
- frame;+ frame;
- End+ End
End End
Line 82: Line 81:
Begin Begin
- // Check if already connected+ // Check if already connected
- if(irc.connected)+ if(irc.connected)
- return -1;+ return -1;
- end+ end
- // Connect+ // Connect
- x=net_connect(settings.server,settings.port,false);+ x=net_connect(settings.server,settings.port,false);
- if(x<0)+ if(x<0)
- return x;+ return x;
- end+ end
- net_separator(x,chr(13)+chr(10),2);+ net_separator(x,chr(13)+chr(10),2);
- // Start the message receiver process+ // Start the message receiver process
- irc_receiver(x);+ irc_receiver(x);
- // Send nick data+ // Send nick data
- irc_send(x,"USER " + settings.nick + " 8 * :" + settings.realname);+ irc_send(x,"USER " + settings.nick + " 8 * :" + settings.realname);
- irc_send(x,"NICK " + settings.nick);+ irc_send(x,"NICK " + settings.nick);
- // Wait until connectec+ // Wait until connectec
- while(!irc.connected)+ while(!irc.connected)
- frame;+ frame;
- end+ end
- // Join the channel+ // Join the channel
- irc_send(x,"JOIN " + settings.channel);+ irc_send(x,"JOIN " + settings.channel);
- return x;+ return x;
End End
Line 117: Line 116:
Begin Begin
- irc_send(netid,"QUIT :" + message);+ irc_send(netid,"QUIT :" + message);
- return net_disconnect(netid);+ return net_disconnect(netid);
End End
Line 125: Line 124:
Process irc_receiver(int netid) Process irc_receiver(int netid)
Private Private
- string message;+ string message;
Begin Begin
- Loop+ Loop
- Switch(Net.Incoming[netid])+ Switch(Net.Incoming[netid])
- case NET_STATUS_DISCONNECTED:+ case NET_STATUS_DISCONNECTED:
- out("# Disconnected!");+ out("# Disconnected!");
- end+ end
- case NET_STATUS_INACTIVE:+ case NET_STATUS_INACTIVE:
- end+ end
- case NET_STATUS_ACTIVE:+ case NET_STATUS_ACTIVE:
- while( len(message=net_recv(netid))>0 )+ while( len(message=net_recv(netid))>0 )
- irc_handlemessage(netid,message);+ irc_handlemessage(netid,message);
- end+ end
- end+ end
- case NET_STATUS_ESTABLISHED:+ case NET_STATUS_ESTABLISHED:
- out("# Connected!");+ out("# Connected!");
- end+ end
- End+ End
- frame;+ frame;
- End+ 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;+ int params;
- string pointer param_original;+ string pointer param_original;
- string pointer param;+ string pointer param;
- string sender;+ string sender;
- string command;+ string command;
- string all_params;+ string all_params;
Begin Begin
- // Obtain list of parameters+ // Obtain list of parameters
- param = param_original = alloc(100*sizeof(string));+ param = param_original = alloc(100*sizeof(string));
- params = split(" ",message,param,100);+ params = split(" ",message,param,100);
- // Obtain sender+ // Obtain sender
- if(param[0][0]==":")+ if(param[0][0]==":")
- sender = substr(param[0],1,len(param[0])-1);+ sender = substr(param[0],1,len(param[0])-1);
- param++;+ param++;
- end+ end
- // Obtain command and all params+ // Obtain command and all params
- command = param[0];+ command = param[0];
- all_params = substr(message,len(sender)+len(command)+3);+ all_params = substr(message,len(sender)+len(command)+3);
- say("% " + message);+ say("% " + message);
- // Handle commands+ // Handle commands
- if(param[0]=="PING") // According to IRC protocol+ if(param[0]=="PING") // According to IRC protocol
- irc_send(netid,"PONG " + param[1]);+ irc_send(netid,"PONG " + param[1]);
- return 0;+ return 0;
- elseif(param[0]=="PRIVMSG") // Handles incoming chat message+ elseif(param[0]=="PRIVMSG") // Handles incoming chat message
- // Strips the sender of not wanted information+ // Strips the sender of not wanted information
- for(x=len(sender)-1; x>0; x--)+ for(x=len(sender)-1; x>0; x--)
- if(sender[x]=="!")+ if(sender[x]=="!")
- break;+ break;
- end+ end
- end+ end
- sender = substr(sender,0,x);+ sender = substr(sender,0,x);
- // Strips the all_params to just the chat message+ // Strips the all_params to just the chat message
- all_params = substr(all_params,len(param[1])+1,len(all_params)-1);+ all_params = substr(all_params,len(param[1])+1,len(all_params)-1);
- if(all_params[0]==":")+ if(all_params[0]==":")
- all_params = substr(all_params,1,len(all_params)-1);+ all_params = substr(all_params,1,len(all_params)-1);
- end+ end
- // Output message+ // Output message
- out(sender + "> " + all_params);+ out(sender + "> " + all_params);
- return 0;+ return 0;
- elseif(param[0]=="MODE") // According to IRC protocol+ elseif(param[0]=="MODE") // According to IRC protocol
- // MODE commands get sent when done connecting+ // MODE commands get sent when done connecting
- irc.connected = true;+ irc.connected = true;
- return 0;+ return 0;
- end+ end
- return -1;+ return -1;
OnExit OnExit
- free(param_original);+ free(param_original);
End End
// Write message onscreen // Write message onscreen
Global Global
- out_txt[99];+ out_txt[99];
- max_txt = 18;+ max_txt = 18;
End End
Function out(string message) Function out(string message)
Begin Begin
- if(out_txt[max_txt-1]!=0)+ if(out_txt[max_txt-1]!=0)
- delete_text(out_txt[max_txt-1]);+ delete_text(out_txt[max_txt-1]);
- end+ end
- for(x=max_txt-1; x>0; x--)+ for(x=max_txt-1; x>0; x--)
- out_txt[x] = out_txt[x-1];+ out_txt[x] = out_txt[x-1];
- move_text(out_txt[x],10,190-x*10);+ move_text(out_txt[x],10,190-x*10);
- end+ end
- out_txt[0] = write(0,10,190,0,message);+ out_txt[0] = write(0,10,190,0,message);
- say("< " + out_txt[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);+ out("<<< " + message);
- return net_sendrn(netid,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);+ out(settings.nick + "> " + message);
- return net_sendrn(netid,"PRIVMSG " + settings.channel + " :" + message);+ return net_sendrn(netid,"PRIVMSG " + settings.channel + " :" + message);
End End
Line 274: Line 273:
end end
default: //addkey default: //addkey
- say(ascii);+ 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]].
-[[Media:IRCchat.PNG]]+ 
 +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.

This will result in something like:
Image:IRCchat.PNG

Personal tools