/** * Seen **/ char *do_seen(User * u, char *target) { char *split1 = NULL; char *seenhost = NULL; char *seennick = NULL; char *seenuname = NULL; struct tm tm; char buf[255]; int i; MYSQL_RES *mysql_res; char *sqltarget; char usrchans[1024] = "\0"; time_t tsnow = time(NULL); MYSQL_RES *mysql_res2; MYSQL_ROW mysql_row2; char cmodep[32] = "\0"; char cmodes[32] = "\0"; char cmodeA[32] = "\0"; char cmodeO[32] = "\0"; char umodep[32] = "\0"; char umodeQ[32] = "\0"; char umodeI[32] = "\0"; double ctsdiff; time_t time0 = time(NULL); time_t time1 = time(NULL); time_t tt = time(NULL); char *message; char *uname = NULL; message = malloc(1024); sqltarget = rdb_escape(rdb_escape(target)); for (i = 0; sqltarget[i]; i++) if (sqltarget[i] == '*') sqltarget[i] = '%'; seenhost = myStrGetToken(sqltarget, '@', 1); split1 = myStrGetToken(sqltarget, '@', 0); seennick = myStrGetToken(split1, '!', 0); seenuname = myStrGetToken(split1, '!', 1); if (seenhost == NULL) seenhost = (char *) "%"; if (seennick == NULL) seennick = (char *) "%"; if (seenuname == NULL) seenuname = (char *) "%"; free(sqltarget); if (!strcmp(seennick, "%")) { uname = sstrdup("%"); } else { rdb_query(QUERY_LOW, "SELECT uname FROM %s WHERE nick LIKE \'%s\' ", AliasesTable, seennick); mysql_res = mysql_store_result(mysql); if (mysql_res && mysql_num_rows(mysql_res)) { mysql_row = mysql_fetch_row(mysql_res); uname = rdb_escape(mysql_row[0]); } } if (uname) { rdb_query(QUERY_LOW, "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s,%s WHERE %s.uname LIKE \"%s\" AND %s.nick = %s.nick AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;", UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, ServerTable, AliasesTable, AliasesTable, uname, UserTable, AliasesTable, UserTable, seenuname, UserTable, seenhost, UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable); mysql_res = mysql_store_result(mysql); } else { rdb_query(QUERY_LOW, "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s WHERE %s.nick LIKE \"%s\" AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;", UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, UserTable, ServerTable, UserTable, seennick, UserTable, seenuname, UserTable, seenhost, UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable); mysql_res = mysql_store_result(mysql); } if (mysql_num_rows(mysql_res) > 0) { SET_SEGV_LOCATION(); while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) { double tsdiff; if (mysql_row[5] != NULL) { time0 = atoi(mysql_row[5]); /* connect time */ } if (mysql_row[9] != NULL) { time1 = atoi(mysql_row[9]); /* quit time */ } if (strlen(mysql_row[3]) <= 1) mysql_row[3] = mysql_row[2]; /* no vhost, so using real host */ if (stricmp(mysql_row[8], "Y") == 0) { if (mysql_row[5] != NULL) { tt = atoi(mysql_row[5]); tm = *localtime(&tt); strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm); mysql_row[5] = buf; } /* Display channels the user is in */ /* check for ircd compatibility: chanmodes +AOsp and usermode +p */ if (denora_cmode(CMODE_p) == 1) sprintf(cmodep, "AND %s.mode_lp = 'N' ", ChanTable); if (denora_cmode(CMODE_s) == 1) sprintf(cmodes, "AND %s.mode_ls = 'N' ", ChanTable); if (denora_cmode(CMODE_A) == 1) sprintf(cmodeA, "AND %s.mode_ua = 'N' ", ChanTable); if (denora_cmode(CMODE_O) == 1) sprintf(cmodeO, "AND %s.mode_uo = 'N' ", ChanTable); if (denora_umode(UMODE_p) == 1) sprintf(umodep, "AND %s.mode_lp = 'N' ", UserTable); if (denora_get_ircd() == IRC_INSPIRCD11 || denora_get_ircd() == IRC_INSPIRCD12) { if (denora_umode(UMODE_Q) == 1) sprintf(umodeQ, "AND %s.mode_uq = 'N' ", UserTable); if (denora_umode(UMODE_I) == 1) sprintf(umodeI, "AND %s.mode_ui = 'N' ", UserTable); } rdb_query(QUERY_LOW, "SELECT %s.channel FROM %s,%s,%s WHERE %s.nickid =%s AND %s.chanid = %s.chanid AND %s.nickid = %s.nickid %s%s%s%s%s%s%s ORDER BY %s.channel ASC", ChanTable, ChanTable, UserTable, IsOnTable, IsOnTable, mysql_row[0], ChanTable, IsOnTable, UserTable, IsOnTable, cmodep, cmodes, cmodeA, cmodeO, umodep, umodeQ, umodeI, ChanTable); mysql_res2 = mysql_store_result(mysql); while ((mysql_row2 = mysql_fetch_row(mysql_res2)) != NULL) { strlcat(usrchans, mysql_row2[0], sizeof(usrchans)); strlcat(usrchans, " ", sizeof(usrchans)); } mysql_free_result(mysql_res2); ctsdiff = difftime(tsnow, time0); /* total online time */ /* Prepare the reply for the user */ if (stricmp(mysql_row[6], "N") == 0) { if (strlen(usrchans) < 3) { sprintf(message, moduleGetLangString(u, SEEN_ONLINE), mysql_row[1], mysql_row[4], mysql_row[3], get_timestring(u, ctsdiff), mysql_row[5]); } else { sprintf(message, moduleGetLangString(u, SEEN_ONLINEC), mysql_row[1], mysql_row[4], mysql_row[3], get_timestring(u, ctsdiff), mysql_row[5], usrchans); } } else { if (strlen(usrchans) < 3) { sprintf(message, moduleGetLangString(u, SEEN_AWAY), mysql_row[1], mysql_row[4], mysql_row[3], get_timestring(u, ctsdiff), mysql_row[5], mysql_row[7]); } else { sprintf(message, moduleGetLangString(u, SEEN_AWAYC), mysql_row[1], mysql_row[4], mysql_row[3], get_timestring(u, ctsdiff), mysql_row[5], mysql_row[7], usrchans); } } } else { double dtsdiff; if (mysql_row[9] != NULL && mysql_row[5] != NULL) { tt = atoi(mysql_row[9]); tm = *localtime(&tt); strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm); mysql_row[9] = buf; dtsdiff = difftime(tsnow, time1); /* total offline time */ tsdiff = difftime(time1, time0); /* total online time */ sprintf(message, moduleGetLangString(u, SEEN_OFFLINE), mysql_row[1], mysql_row[4], mysql_row[3], get_timestring(u, dtsdiff), mysql_row[9], get_timestring(u, tsdiff), mysql_row[10]); } else { sprintf(message, moduleGetLangString(u, SEEN_UNKNOWN), mysql_row[1], mysql_row[4], mysql_row[3]); } } } } else { sprintf(message, moduleGetLangString(u, SEEN_EMPTY), target); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); return message; }
int cs_user_modes(int ac, char **av) { int add; char *modes; User *u; SET_SEGV_LOCATION(); if (!ConnectServConnected) { return MOD_CONT; } u = user_find(av[1]); if (!u) { return MOD_CONT; } if (!stricmp(u->nick, s_ConnectServ)) { return MOD_CONT; } add = (!stricmp(EVENT_MODE_ADD, av[0]) ? 1 : 0); modes = (char *)(av[2]); switch (*modes) { case 'N': if (denora_get_ircd() == IRC_UNREAL32) { cs_report_mode(u, add, "N", "Network Administrator"); } break; case 'C': if (denora_get_ircd() == IRC_UNREAL32) { cs_report_mode(u, add, "C", "Co-Network Administrator"); } break; case 'A': if (denora_get_ircd() == IRC_UNREAL32) { cs_report_mode(u, add, "A", "Server Administrator"); } break; case 'B': if (denora_get_ircd() == IRC_UNREAL32) { cs_report_mode(u, add, "B", "Bot"); } break; case 'a': if (denora_get_ircd() == IRC_UNREAL32) { cs_report_mode(u, add, "a", "Services Administrator"); } break; case 'o': cs_report_mode(u, add, "o", "global operator"); break; case 'O': cs_report_mode(u, add, "O", "local operator"); break; case 'S': if (denora_get_ircd() == IRC_UNREAL32) { cs_report_mode(u, add, "S", "Network Service"); } break; default: break; } return MOD_CONT; }