사이드바 열기

'IRC bot'에 해당되는 글 1건

#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <unistd.h>
#include    <arpa/inet.h>
#include    <sys/types.h>
#include    <sys/socket.h>
#include    <netdb.h>

void    error_handling( char *message );
void    response( char *recv );
void    pong ( char *ping );

#define MAX 8192

int     sockfd;


int     main( int argc, char *argv[] )
{
    const   char    address[64]    =   "irc.hanirc.org";

    char    nickname[64]    =   "Luna_bot";
    char    channel[64]     =   "#프겔";

    int     port            =   6664;

    struct  sockaddr_in sock;
    struct  hostent     *host_st;

    char    rcv_data[MAX]  =   {0x00, };
    char    send[1024]      =   {0x00, };

    char    *ping;

    host_st     =   gethostbyname( address );
    if( host_st == NULL)
    {
        error_handling( "gethostbyname() error" );
    }

    sockfd      =   socket( AF_INET, SOCK_STREAM, 0 );
    if( sockfd == -1 )
    {
        error_handling( "socket() error" );
    }

    memset( &sock, 0x0, sizeof(sock) );
    sock.sin_family     =   AF_INET;
    sock.sin_port       =   htons( port );
    sock.sin_addr       =   *((struct in_addr*)host_st->h_addr);

    if( connect( sockfd, (struct sockaddr *)&sock, sizeof(sock) ) == -1 )
    {
        error_handling( "connect() error" );
    }

    strncpy( send, "NICK Luna_bot \n", sizeof(send) - 1 );
    printf( "Request : %s", send);
    write( sockfd, send, strlen(send) );
    memset( send, 0x0, sizeof(send) );

    strncpy( send, "USER iam5duck \"naver.com\" \"irc.hanric.org\" : Luna\n", sizeof(send) -1 );
    printf( "Request : %s\n", send);
    write( sockfd, send, strlen(send) );
    memset( send, 0x0, sizeof(send) );

    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    strncpy( send, "NICK Luna_bot \n", sizeof(send) - 1 );
    printf( "Request : %s", send);
    write( sockfd, send, strlen(send) );
    memset( send, 0x0, sizeof(send) );

    /*    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );
    */
    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    strncpy( send, "USERHOST LaLuna\n", sizeof(send) - 1 );
    printf( "Request : %s", send);
    write( sockfd, send, strlen(send) );
    memset( send, 0x0, sizeof(send) );

    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    strncpy( send, "JOIN #프갤\n", sizeof(send) - 1 );
    printf( "Request : %s", send );
    write( sockfd, send, strlen(send) );

    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    read( sockfd, rcv_data, sizeof(rcv_data) );
    response( rcv_data );
    memset( rcv_data, 0x0, sizeof( rcv_data ) );

    strncpy( send, "PRIVMSG #프갤 :HI I'am LaLuna Bot\n", sizeof(send) - 1 );
    printf( "Request : %s", send );
    write( sockfd, send, strlen(send) );
    memset( send, 0x0, sizeof( send ) );

    while( 1 )
    {
        read( sockfd, rcv_data, sizeof(rcv_data) );
        response( rcv_data );

        if( strstr( rcv_data, "!out" ) )
        {
            memset(send, 0x0, sizeof(send) );
            strncpy( send, "PRIVMSG #프갤 :Luna_bot 갑니다 ㅂ2ㅂ2\n", sizeof(send) - 1 );
            break;
        }

        if( strstr( rcv_data, "Luna_bot" ) )
        {
            strncpy( send, "PRIVMSG #프갤 :I am so hot, 난 너무 예뻐요\n ", sizeof(send) -1 );
            write( sockfd, send, strlen( send ) );
            memset( send, 0x0, sizeof( send ) );
        }
        memset( rcv_data, 0x0, sizeof( rcv_data ) );
    }

    close( sockfd );
    return 0;
}

void    error_handling( char *message )
{
    fputs( message, stderr );
    fputc( '\n', stderr );
    exit( 1 );
}

void    response( char *recv )
{
    char    temp[MAX];
    char    *parsing;
    char    *ping;

    printf( "-----------------------------------------------\n");
    strncpy( temp, recv, sizeof(temp) - 1);

    parsing     =   strtok( temp, "\n");

    while( parsing != NULL )
    {
        if( parsing )   printf( "Response : %s\n", parsing );
        if( (strstr( parsing, "PING " )) != NULL )
        {
            pong( parsing );
        }
        parsing =   strtok( NULL, "\n" );
    }
    printf( "-----------------------------------------------\n");
}

void    pong( char *ping )
{
    char    temp[MAX]  =   {0x00, };
    char    *parsing;

    strncpy( temp, ping, strlen( ping ) + 1 );
    parsing     =   strtok( temp, "\n" );
    memcpy( parsing, "PONG", 4 );

    printf( "PINGPONG : %s\n", parsing );
    write( sockfd, parsing, strlen( parsing ) + 1 );
}
Posted by LaLuna
이전페이지 1 다음페이지
위로

사이드바 열기