#include #include #include #include #include #include #include #include #include "connap.h" #include "io.h" #include "connect.h" #include "message.h" #include "util.h" void whois(char *nick) { if (send_msg(MSG_CLIENT_WHOIS, nick)) disconnect(ws_strerror()); } void show_whois(char *data) { regmatch_t pmatch[30]; char *values[18], *time_str = (char*)malloc(256); char *tmp, *dtxt, *htxt; int i, j, r, len, link; int time, days, hours, minutes, seconds; char time_tmp[80]; char *titles[] = {"Nick", "Level", "Time", "Channels", "Status", "Shared", "Downloads", "Uploads", "Connection", "Client", "Tot Downloads", "Tot Uploads", "IP Address", "Conn Port", "Data Port", "E-Mail", "Server"}; enum {NICK, LEVEL, TIME, CHANNELS, STATUS, SHARED, DOWNLOADS, UPLOADS, CONNECTION, CLIENT, TOT_DOWNLOADS, TOT_UPLOADS, IP_ADDR, CONN_PORT, DATA_PORT, EMAIL, SERVER}; r = regex(data, "^([^ ]+) \"?([^ \"]+)\"? ([-0-9]+) \"(.*)\" \"([^ ]+)\"" " ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) \"(.+)\" *([0-9]*)" " *([0-9]*) *([^ ]*) *([0-9]*) *([0-9]*) *([^ ]*) *([^ ]*)$", 30, pmatch); if (r <= 0) { err_msg("show_whois: regex error"); free(time_str); return; } /* printf("whole match: %d %d\n", pmatch[0].rm_so, pmatch[0].rm_eo); for (i = 0, j = 1; i < 17; i++, j++) printf("%d: %d %d\n", j, pmatch[j].rm_so, pmatch[j].rm_eo); */ for (i = 0, j = 1; i < 17; i++, j++) { if (! (len = pmatch[j].rm_eo - pmatch[j].rm_so)) break; switch (i) { case TIME: tmp = (char*)calloc(len + 1, 1); strncpy(tmp, data + pmatch[j].rm_so, len); time = atol(tmp); free(tmp); days = time / 86400; hours = (time / 3600) % 24; minutes = (time / 60) % 60; seconds = time % 60; dtxt = "day"; if (days > 1) dtxt = "days"; htxt = "hr"; if (hours > 1) htxt = "hrs"; sprintf(time_str, "%d sec", seconds); if (minutes) { strcpy(time_tmp, time_str); sprintf(time_str, "%d min %s", minutes, time_tmp); } if (hours) { strcpy(time_tmp, time_str); sprintf(time_str, "%d %s %s", hours, htxt, time_tmp); } if (days) { strcpy(time_tmp, time_str); sprintf(time_str, "%d %s %s", days, dtxt, time_tmp); } values[i] = (char*)malloc(strlen(time_str) + 1); strcpy(values[i], time_str); break; case CONNECTION: tmp = (char*)calloc(len + 1, 1); strncpy(tmp, data + pmatch[j].rm_so, len); link = atoi(tmp); free(tmp); values[i] = (char*)malloc(strlen(link_str[link]) + 1); strcpy(values[i], link_str[link]); break; default: values[i] = (char*)calloc(len + 1, 1); tmp = data + pmatch[j].rm_so; if (i == CHANNELS) { while (*tmp == ' ') { tmp++; len--; } } strncpy(values[i], tmp, len); } } values[i] = NULL; tmp = (char*)malloc(4096); put_rcvd("", NORMAL_COLOR); for (j = 0; values[j]; j++) { sprintf(tmp, "%-15s%s", titles[j], values[j]); put_rcvd(tmp, INFO_COLOR); } put_rcvd("", NORMAL_COLOR); free(tmp); for (j = 0; j < i; j++) free(values[j]); free(time_str); } void show_whowas(char *data) { char *values[4]; char *tmp = (char*)malloc(4096); char time_str[80]; char *titles[] = {"Nick", "Level", "Last Seen"}; enum {NICK, LEVEL, LAST_SEEN, END}; struct tm *tm; time_t time; int i; strcpy(tmp, data); values[NICK] = strtok(tmp, " "); values[LEVEL] = strtok(NULL, " "); if (*(values[LEVEL]) == '\"') { *(values[LEVEL] + strlen(values[LEVEL]) - 1) = 0; (values[LEVEL])++; } time = (time_t)atol(strtok(NULL, " ")); tm = gmtime(&time); strftime(time_str, 80, "%Y-%m-%d %H:%M", tm); values[LAST_SEEN] = time_str; values[END] = NULL; put_rcvd("", NORMAL_COLOR); for (i = 0; values[i]; i++) { sprintf(tmp, "%-15s%s", titles[i], values[i]); put_rcvd(tmp, INFO_COLOR); } put_rcvd("", NORMAL_COLOR); free(tmp); } .