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); }
void KviInputHistory::done() { delRef(); if(m_pSelf->count() == 0) delete m_pSelf; }