示例#1
0
void parseMessage(char *line, clientNode *thisClient) {
    char *message[256];
    char *lineCopy = malloc(sizeof(char) * (strlen(line) + 1));
    char replie[256];
    char dia[3], mes[4], nMes[3], ano[5];
    int sendReplie = 1;
    int temp;

    //Quebra a linha em palavras
    strcpy(lineCopy, line);
    getStringArray(lineCopy, message, " ");

    replie[0] = '\0';
    for(int i = 0; message[0][i]; i++)
        message[0][i] = toupper(message[0][i]);
    if(strcmp(message[0], "NICK") == 0) {
        if(message[1] == NULL)
            sprintf(replie, ":%s %d * :Nickname não foi passado!\n", SERVER_NAME, ERR_NONICKNAMEGIVEN);

        pthread_mutex_lock(&clientMutex);
        if(clientWithNick(message[1], thisClient->head) != NULL)
            sprintf(replie, ":%s %d * %s :Nickname já está sendo usado!\n", SERVER_NAME, ERR_NICKNAMEINUSE, message[1]);
        else {
            strcpy(thisClient->nick, message[1]);
            sendReplie = 0;
        }

        pthread_mutex_unlock(&clientMutex);
    } else if(strcmp(message[0], "LIST") == 0) {
        listChannels(thisClient->socket);
        sendReplie = 0;
    } else if(strcmp(message[0], "JOIN") == 0) {
        if(message[1] == NULL)
            sprintf(replie, ":%s %d * JOIN :Parâmetros insuficientes!\n", SERVER_NAME, ERR_NEEDMOREPARAMS);
        else if(thisClient->nick[0] == '\0')
            sprintf(replie, ":%s %d * :Você não registrou seu NICK!\n", SERVER_NAME, ERR_NOTREGISTERED);
        else {
            sprintf(replie, ":%s JOIN %s\n", thisClient->nick, message[1]);
            printf("[Cliente %d entrou no canal %s]\n", thisClient->socket, message[1]);
            joinChannel(message[1], thisClient);
        }
    } else if(strcmp(message[0], "PRIVMSG") == 0) {
        if(thisClient->nick[0] == '\0')
            sprintf(replie, ":%s %d * :Você não registrou seu NICK!\n", SERVER_NAME, ERR_NOTREGISTERED);
        else {
            if(message[1][0] == '#')
                broadcastMessage(line, thisClient->nick, message[1]);
            else
                sendMessage(line, thisClient, message[1]);
            sendReplie = 0;
        }
    } else if(strcmp(message[0], "PART") == 0) {
        sprintf(replie, ":%s PART %s\n", thisClient->nick, message[1]);
        printf("[Cliente %d saiu do canal %s]\n", thisClient->socket, message[1]);
        delRef(thisClient->socket, message[1]);
    } else if(strcmp(message[0], "QUIT") == 0) {
        sprintf(replie, ":%s QUIT\n", thisClient->nick);
        close(thisClient->socket);
    } else if(strcmp(message[0], "MACDATA") == 0) {
        strncat(dia, __DATE__ +4, 2);
        strncat(mes, __DATE__, 3);
        strncat(ano, __DATE__ +7, 4);

        if(strcmp(mes, "Jan") == 0)
            strncpy(nMes, "01", 2);
        else if(strcmp(mes, "Feb") == 0)
            strncpy(nMes, "02", 2);
        else if(strcmp(mes, "Mar") == 0)
            strncpy(nMes, "03", 2);
        else if(strcmp(mes, "Apr") == 0)
            strncpy(nMes, "04", 2);
        else if(strcmp(mes, "May") == 0)
            strncpy(nMes, "05", 2);
        else if(strcmp(mes, "Jun") == 0)
            strncpy(nMes, "06", 2);
        else if(strcmp(mes, "Jul") == 0)
            strncpy(nMes, "07", 2);
        else if(strcmp(mes, "Aug") == 0)
            strncpy(nMes, "08", 2);
        else if(strcmp(mes, "Sep") == 0)
            strncpy(nMes, "09", 2);
        else if(strcmp(mes, "Oct") == 0)
            strncpy(nMes, "10", 2);
        else if(strcmp(mes, "Nov") == 0)
            strncpy(nMes, "11", 2);
        else
            strncpy(nMes, "12", 2);

        sprintf(replie, "%s/%s/%s\n", dia, nMes, ano);
    } else if(strcmp(message[0], "MACHORA") == 0) {
        sprintf(replie, "%s\n", __TIME__);
    } else if(strcmp(message[0], "MACTEMPERATURA") == 0) {
        temp = getTemp();

        sprintf(replie, "Temperatura atual: %dºC\nObitido de http://developers.agenciaideias.com.br/tempo/xml/saopaulo-sp\n", temp);
    }
   
    if(sendReplie) {
        if(replie[0] == '\0') {
            sprintf(replie, "%s\n", line);
        }

        printf("[Resposta para cliente %d] %s", thisClient->socket, replie);
        write(thisClient->socket, replie, strlen(replie));
    }

    replie[0] = '\0';
    free(lineCopy);
}
示例#2
0
void KviInputHistory::done()
{
	delRef();
	if(m_pSelf->count() == 0)
		delete m_pSelf;
}