char *db_getchannel_byid(int chanid) { char *res = NULL; #ifdef USE_MYSQL MYSQL_RES *mysql_res; MYSQL_ROW row; #endif if (!denora->do_sql) { return NULL; } SET_SEGV_LOCATION(); rdb_query(QUERY_HIGH, "SELECT channel FROM %s WHERE chanid=%d", ChanTable, chanid); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (!mysql_num_rows(mysql_res)) { alog(LOG_NONEXISTANT, "channel not found ! %d", chanid); } else { row = mysql_fetch_row(mysql_res); res = rdb_escape(row[0]); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return res; }
void db_removenick(char *nick, char *reason) { char *sqlreason; int nickid = db_getnick(nick); SET_SEGV_LOCATION(); if (!denora->do_sql) { return; } if (nickid == 0) { alog(LOG_DEBUG, "nickid 0"); return; } SET_SEGV_LOCATION(); db_removefromchans(nickid); if (UserCacheTime) { sqlreason = rdb_escape(reason); rdb_query(QUERY_LOW, "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d", UserTable, sqlreason, nickid); if (sqlreason) { free(sqlreason); } } else { rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d", UserTable, nickid); } SET_SEGV_LOCATION(); }
/** * Handle AWAY messages * * @param source is the nick of the person whom is now away * @param msg is the text of the away message * * @return always returns MOD_CONT */ int m_away(char *source, char *msg) { User *u; if (!source) { return MOD_CONT; } u = user_find(source); if (!u) { return MOD_CONT; } SET_SEGV_LOCATION(); if (msg) { stats->away++; u->isaway = 1; u->awaymsg = sstrdup(msg); } else { stats->away--; u->isaway = 0; u->awaymsg = NULL; } if (denora->do_sql) { rdb_query (QUERY_LOW, "UPDATE %s SET away=\'%s\', awaymsg=\'%s\' WHERE nickid=%d", UserTable, (u->isaway ? (char *) "Y" : (char *) "N"), rdb_escape(u->awaymsg), db_getnick(u->sqlnick)); } return MOD_CONT; }
/* chan is created if not exists */ int db_getchancreate(char *chan) { int res = -1; Channel *c; char *channel; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif SET_SEGV_LOCATION(); strtolwr(chan); c = findchan(chan); if (c) { if (c->sqlid) { return c->sqlid; } else { channel = sstrdup(c->sqlchan); } } else { channel = rdb_escape(chan); } if (!denora->do_sql) { return -1; } strtolwr(channel); rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE channel=\'%s\'", ChanTable, channel); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res)) res = atoi(*mysql_fetch_row(mysql_res)); mysql_free_result(mysql_res); } #endif SET_SEGV_LOCATION(); if (res == -1) { rdb_query(QUERY_HIGH, "INSERT INTO %s (channel) VALUES (\'%s\')", ChanTable, channel); res = rdb_insertid(); } SET_SEGV_LOCATION(); if (c && res) { c->sqlid = res; } free(channel); return res; }
void db_removefromchans(int nickid) { #ifdef USE_MYSQL MYSQL_RES *mysql_res; char **res; int chanid; #endif SET_SEGV_LOCATION(); if (!denora->do_sql) { return; } rdb_query (QUERY_HIGH, "SELECT %s.chanid, channel FROM %s, %s WHERE nickid=%d AND %s.chanid = %s.chanid", IsOnTable, IsOnTable, ChanTable, nickid, ChanTable, IsOnTable); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); #endif rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d", IsOnTable, nickid); SET_SEGV_LOCATION(); #ifdef USE_MYSQL if (mysql_res) { while ((res = mysql_fetch_row(mysql_res))) { char *chan = rdb_escape(res[1]); chanid = db_getchannel(chan); rdb_query(QUERY_LOW, "UPDATE %s SET currentusers=currentusers-1 WHERE chanid=%d", ChanTable, chanid); if (!ChanHasMode(chan, ircd->persist_char)) db_checkemptychan(atoi(res[0])); free(chan); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif }
/** * Handle KILL messages * * @param source is the server or nick that send the message * @param nick is the user name that was killed * @param msg is the text of the kill message * * @return void - no returend value */ void m_kill(char *source, char *nick, char *msg) { User *u; ServStats *s; int id; if ((u = user_find(source))) { if ((s = findserverstats(u->server->name))) { s->ircopskills++; } send_event(EVENT_GLOBAL_KILL, 3, source, nick, msg); } else if ((s = findserverstats(source))) { s->serverkills++; send_event(EVENT_SERVER_KILL, 3, source, nick, msg); } do_kill(nick, msg); if (denora->do_sql) { nick = rdb_escape(nick); db_removenick(nick, msg); if (UserCacheTime) { db_cleanuser(); } free(nick); } if (s && denora->do_sql) { id = db_getserver(s->name); if (id) { rdb_query (QUERY_LOW, "UPDATE %s SET ircopskills=%d, serverkills=%ld WHERE servid=%d", ServerTable, s->ircopskills, s->serverkills, id); } } if (nickIsServices(nick)) { introduce_user(nick); } }
/** * 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; }
/** * Handle seen fantasy command. * @param argc Argument count * @param argv Argument list * @return MOD_CONT or MOD_STOP **/ int do_fantasy(int argc, char **argv) { User *u; char *chan; #ifdef USE_MYSQL MYSQL_RES *mysql_res; int i = 1; #endif ChannelStats *cs; if (argc < 3) { return MOD_CONT; } if (!denora->do_sql) { return MOD_CONT; } if (stricmp(argv[0], "top10") == 0) { u = finduser(argv[1]); chan = rdb_escape(argv[2]); cs = find_cs(argv[2]); rdb_query (QUERY_HIGH, "SELECT * FROM %s WHERE chan=\'%s\' AND type=0 ORDER BY letters DESC LIMIT 10;", UStatsTable, chan); free(chan); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_num_rows(mysql_res) > 0) { if (cs->flags & CS_NOTICE) { notice_lang(s_StatServ, u, STATS_TOP10_CHANNEL, argv[2]); } else { denora_cmd_privmsg(s_StatServ, argv[2], getstring(NULL, STATS_TOP10_CHANNEL), argv[2]); } SET_SEGV_LOCATION(); while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) { if (cs->flags & CS_NOTICE) { notice_lang(s_StatServ, u, STATS_MESSAGE, i, mysql_row[0], mysql_row[3], mysql_row[4], mysql_row[5], mysql_row[7], mysql_row[6]); } else { denora_cmd_privmsg(s_StatServ, argv[2], getstring(NULL, STATS_MESSAGE), i, mysql_row[0], mysql_row[3], mysql_row[4], mysql_row[5], mysql_row[7], mysql_row[6]); } i++; } } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); #endif } return MOD_CONT; }
int chanstats_month(const char *name) { #ifdef USE_MYSQL MYSQL_RES *mysql_res; ChannelStats *cs; char *chan_; #endif time_t tbuf; if (!denora->do_sql) { return MOD_CONT; } if (!name) { return MOD_CONT; } SET_SEGV_LOCATION(); alog(LOG_NORMAL, langstr(ALOG_RESETTING_MONTHLY)); rdb_query (QUERY_LOW, "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, " "kicks=0, modes=0, topics=0, wasted=0, " "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, " "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, " "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, " "time22=0, time23=0 WHERE type=3;", UStatsTable); rdb_query(QUERY_LOW, "UPDATE %s SET letters=0, words=0, line=0, actions=0, smileys=0, " "kicks=0, modes=0, topics=0, " "time0=0, time1=0, time2=0, time3=0, time4=0, time5=0, time6=0, time7=0, " "time8=0, time9=0, time10=0, time11=0, time12=0, time13=0, time14=0, " "time15=0, time16=0, time17=0, time18=0, time19=0, time20=0, time21=0, " "time22=0, time23=0 WHERE type=3;", CStatsTable); /* request 109 - auto-delete channel after not used for 1 month */ tbuf = (time(NULL) - ClearChanInActive); rdb_query (QUERY_HIGH, "SELECT chan FROM %s WHERE (lastspoke > 0) AND (lastspoke < %i);", CStatsTable, tbuf); #ifdef USE_MYSQL 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) { if ((cs = find_cs(mysql_row[0]))) { alog(LOG_DEBUG, "chanstats monthly: channel %s is expired, statserv will leave this chan, all stats are deleted"); del_cs(cs); /* make statserv part the chan */ chan_ = rdb_escape(mysql_row[0]); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", CStatsTable, chan_); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", UStatsTable, chan_); free(chan_); if (LogChannel) { if (stricmp(LogChannel, mysql_row[0])) { denora_cmd_part(s_StatServ, mysql_row[0], getstring(NULL, STATS_CHANSTATS_PART), mysql_row[0]); } } } } save_cs_db(); } #endif return MOD_CONT; }
void db_removenick_nt(char *nick, char *reason) { char *sqlreason; int nickid = db_getnick(nick); User *u; #ifdef USE_MYSQL MYSQL_RES *mysql_res; MYSQL_RES *mysql_res2; #endif char *username, *host, *queryhost; char *newnick; char *olduser = (char *) ""; char *newuser = (char *) ""; u = user_find(nick); SET_SEGV_LOCATION(); if (!denora->do_sql) { return; } if (nickid == 0) { alog(LOG_DEBUG, "nickid 0"); return; } SET_SEGV_LOCATION(); db_removefromchans(nickid); if (UserCacheTime) { sqlreason = rdb_escape(reason); if (u) { username = rdb_escape(u->username); host = rdb_escape(u->host); queryhost = (myNumToken(host, '.') >= 2) ? strchr(host, '.') : host; queryhost = StrReverse(queryhost); rdb_query(QUERY_HIGH, "SELECT nick FROM %s WHERE username=\'%s\' AND REVERSE(hostname) LIKE \'%s%%\' AND online=\'Y\' AND nick != \'%s\' ORDER BY connecttime DESC", UserTable, username, queryhost, u->sqlnick); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res) > 0) { /* Getting nickname of user we found */ mysql_row = mysql_fetch_row(mysql_res); newnick = rdb_escape(mysql_row[0]); mysql_free_result(mysql_res); /* Deleting user as we got one with a similar mask which is still online */ alog(LOG_DEBUG, "db_removenick_nt(%s): There is %s with similar mask online, so we will delete %s.", nick, newnick, nick); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d", UserTable, nickid); /* Getting uname of the old and new users */ rdb_query(QUERY_LOW, "SELECT nick, uname FROM %s WHERE nick=\'%s\' OR nick=\'%s\'", AliasesTable, newnick, u->sqlnick); mysql_res2 = mysql_store_result(mysql); if (mysql_res2) { while ((mysql_row = mysql_fetch_row(mysql_res2)) != NULL) { if (stricmp(mysql_row[0], newnick) == 0) { newuser = rdb_escape(mysql_row[1]); } if (stricmp(mysql_row[0], u->sqlnick) == 0) { olduser = rdb_escape(mysql_row[1]); } } mysql_free_result(mysql_res2); } /* Summing old user to new user, if they differ */ /*if ((!BadPtr(newuser)) && (!BadPtr(olduser)) && (stricmp(newuser, olduser) != 0)) { alog(LOG_DEBUG, "db_removenick_nt(%s): summing old user %s and new user %s.", nick, olduser, newuser); sumuser(u, olduser, newuser); if (olduser) { free(olduser); } if (newuser) { free(newuser); } }*/ if (newnick) { free(newnick); } } else { mysql_free_result(mysql_res); rdb_query(QUERY_LOW, "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d", UserTable, sqlreason, nickid); } } if (username) { free(username); } if (host) { free(host); } SET_SEGV_LOCATION(); #endif } else { rdb_query(QUERY_LOW, "UPDATE %s SET online=\'N\', lastquit=NOW(), lastquitmsg=\'%s\', servid=0 WHERE nickid=%d", UserTable, sqlreason, nickid); } if (sqlreason) { free(sqlreason); } } else { rdb_query(QUERY_LOW, "DELETE FROM %s WHERE nickid=%d", UserTable, nickid); } SET_SEGV_LOCATION(); }
/* -1 if nick not found, nickid else */ int db_checknick_nt(char *nick) { int nickid = -1; User *u; #ifdef USE_MYSQL MYSQL_RES *mysql_res; MYSQL_RES *mysql_res2; #endif char *username, *host, *queryhost, *olduname; SET_SEGV_LOCATION(); u = user_find(nick); if (u && u->sqlid) { return u->sqlid; } if (!denora->do_sql) { return -1; } if (u) { username = rdb_escape(u->username); host = rdb_escape(u->host); queryhost = (myNumToken(host, '.') >= 2) ? strchr(host, '.') : host; queryhost = StrReverse(queryhost); rdb_query(QUERY_HIGH, "SELECT nickid,nick FROM %s WHERE (username=\'%s\' AND REVERSE(hostname) LIKE \'%s%%\' AND online=\'N\') OR nick=\'%s\' ORDER BY connecttime DESC", UserTable, username, queryhost, u->sqlnick); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res)) { mysql_row = mysql_fetch_row(mysql_res); nickid = strtol(mysql_row[0], NULL, 10); if (stricmp(mysql_row[1], u->sqlnick) != 0) { /* Removing old user to avoid duplicate on update, which will happen shortly */ rdb_query(QUERY_HIGH, "DELETE FROM %s WHERE nick=\'%s\' ", UserTable, u->sqlnick); /* Getting uname from alias table with old nick */ rdb_query(QUERY_HIGH, "SELECT uname FROM %s WHERE nick=\'%s\' ", AliasesTable, u->sqlnick); mysql_res2 = mysql_store_result(mysql); if (mysql_res2) { if (mysql_num_rows(mysql_res2)) { mysql_row = mysql_fetch_row(mysql_res2); olduname = rdb_escape(mysql_row[0]); /* Adding alias entry with new nick and old uname to avoid creation of new uname */ rdb_query(QUERY_HIGH, "INSERT INTO %s (nick, uname) VALUES (\'%s\', \'%s\') ON DUPLICATE KEY UPDATE uname=\'%s\'", AliasesTable, u->sqlnick, olduname, olduname); free(olduname); } mysql_free_result(mysql_res2); } } mysql_free_result(mysql_res); } SET_SEGV_LOCATION(); } else { nickid = -1; } if (username) { free(username); } if (host) { free(host); } #endif return nickid; } else { rdb_query(QUERY_HIGH, "SELECT nickid FROM %s WHERE nick=\'%s\'", UserTable, nick); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res)) { mysql_row = mysql_fetch_row(mysql_res); nickid = strtol(mysql_row[0], NULL, 10); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } else { nickid = -1; } #endif return nickid; } }
/** * Connect to SQL Database * * @return void - no returend value * */ void db_connect(void) { Exclude *e, *next; ChannelStats *cs; int tablecount = 0; char *sqlchan; if (!denora->do_sql) { alog(LOG_ERROR, langstring(ALOG_FAILED_SQL_CONNECT), rdb_error_msg()); return; } SET_SEGV_LOCATION(); /* Checking for missing tables */ if (!rdb_check_table(ChanTable)) tablecount++; if (!rdb_check_table(IsOnTable)) tablecount++; if (!rdb_check_table(ServerTable)) tablecount++; if (!rdb_check_table(UserTable)) tablecount++; if (!rdb_check_table(GlineTable)) tablecount++; if (!rdb_check_table(ChanBansTable)) tablecount++; if (!rdb_check_table(CTCPTable)) tablecount++; if (!rdb_check_table(SpamTable)) tablecount++; if (!rdb_check_table(ChanExceptTable)) tablecount++; if (!rdb_check_table(ChanInviteTable)) tablecount++; if (!rdb_check_table(TLDTable)) tablecount++; if (!rdb_check_table(SglineTable)) tablecount++; if (!rdb_check_table(SqlineTable)) tablecount++; if (!rdb_check_table(MaxValueTable)) tablecount++; if (!rdb_check_table(AliasesTable)) tablecount++; if (!rdb_check_table(CStatsTable)) tablecount++; if (!rdb_check_table(UStatsTable)) tablecount++; if (!rdb_check_table(StatsTable)) tablecount++; if (!rdb_check_table(CurrentTable)) tablecount++; if (!rdb_check_table(ChanStatsTable)) tablecount++; if (!rdb_check_table(ServerStatsTable)) tablecount++; if (!rdb_check_table(ChanQuietTable)) tablecount++; if (!rdb_check_table(AdminTable)) tablecount++; if (tablecount) { alog(LOG_ERROR, "Denora is missing %d required sql tables, disabling sql. Run ./mydbgen to update your sql db.", tablecount); denora->do_sql = 0; return; } /* Cleaning up the database */ rdb_clear_table(ChanTable); rdb_clear_table(IsOnTable); rdb_clear_table(ServerTable); rdb_clear_table(UserTable); rdb_clear_table(GlineTable); rdb_clear_table(ChanBansTable); rdb_clear_table(CTCPTable); rdb_clear_table(SpamTable); rdb_clear_table(ChanExceptTable); rdb_clear_table(ChanInviteTable); rdb_clear_table(TLDTable); rdb_clear_table(SglineTable); rdb_clear_table(SqlineTable); e = first_exclude(); while (e) { next = next_exclude(); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'", UStatsTable, e->name); e = next; } rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'", UStatsTable, s_StatServ); if (s_StatServ_alias) { rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'", UStatsTable, s_StatServ_alias); } if (LogChannel) { if (!(cs = find_cs(LogChannel))) { if (cs) { del_cs(cs); } sqlchan = rdb_escape(LogChannel); save_cs_db(); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", CStatsTable, sqlchan); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", UStatsTable, sqlchan); free(sqlchan); } } if (!db_getcurrent_chans()) { rdb_query(QUERY_LOW, "INSERT INTO %s VALUES ('chans', 0, 0); ", CurrentTable); } SET_SEGV_LOCATION(); }
static int do_chanstats(User * u, int ac, char **av) { char *cmd1 = NULL; char *cmd2 = NULL; char *cmd3 = NULL; char *cmd4 = NULL; lnode_t *tn; ChannelStats *cs; Channel *c; int i; int x = 0; char *sqlchan; Uid *ud; char *modes; char nickbuf[BUFSIZE]; *nickbuf = '\0'; if (ac >= 1) { cmd1 = av[0]; } if (ac >= 2) { cmd2 = av[1]; } if (ac >= 3) { cmd3 = av[2]; } if (ac >= 4) { cmd4 = av[3]; } if (cmd1) { /* Since ChanStats does require SQL code... */ if (!denora->do_sql) { notice_lang(s_StatServ, u, SQL_DISABLED); return MOD_CONT; } if (!stricmp("ADD", cmd1)) { if (LargeNet) { notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_LARGENET); return MOD_CONT; } if (!cmd2) { syntax_error(s_StatServ, u, "CHANSTATS", STAT_CHANSTATS_ADD_SYNTAX); return MOD_CONT; } if (BadChanName(cmd2)) { notice_lang(s_StatServ, u, STAT_CHANSTATS_NOT_VALID_CHAN); return MOD_CONT; } if (strlen(cmd2) > CHANMAX) { notice_lang(s_StatServ, u, STAT_CHANSTATS_NOT_VALID_CHAN); return MOD_CONT; } if (LogChannel) { if (!stricmp(cmd2, LogChannel)) { notice_lang(s_StatServ, u, STAT_CHANSTATS_LOGCHAN); return MOD_CONT; } } if (!(cs = find_cs(cmd2))) { cs = makecs(cmd2); save_cs_db(); sqlchan = rdb_escape(cmd2); if (CSDefFlag) { if (CSDefFlag == 1) { cs->flags |= CS_FANTASY; cs->flags &= ~CS_NOTICE; } else if (CSDefFlag == 2) { cs->flags |= CS_FANTASY; cs->flags |= CS_NOTICE; } } rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", CStatsTable, sqlchan); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", UStatsTable, sqlchan); cs->timeadded = time(NULL); for (i = 0; i < 4; i++) { rdb_query (QUERY_LOW, "INSERT INTO %s SET chan=\'%s\', type=%i, timeadded=%ld;", CStatsTable, sqlchan, i, cs->timeadded); } notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_ADDED, cmd2); ud = find_uid(s_StatServ); if (PartOnEmpty) { c = findchan(cmd2); if (c) { denora_cmd_join(s_StatServ, cs->name, time(NULL)); if (AutoOp && AutoMode) { modes = sstrdup(AutoMode); while (*modes) { switch (*modes) { case '+': break; case '-': break; default: ircsnprintf(nickbuf, BUFSIZE, "%s %s", nickbuf, ((ircd->p10 && ud) ? ud->uid : s_StatServ)); } (void) *modes++; } denora_cmd_mode(ServerName, cs->name, "%s%s", AutoMode, nickbuf); } } } else { denora_cmd_join(s_StatServ, cs->name, time(NULL)); if (AutoOp && AutoMode) { modes = sstrdup(AutoMode); while (*modes) { switch (*modes) { case '+': break; case '-': break; default: ircsnprintf(nickbuf, BUFSIZE, "%s %s", nickbuf, ((ircd->p10 && ud) ? ud->uid : s_StatServ)); } (void) *modes++; } denora_cmd_mode(ServerName, cs->name, "%s%s", AutoMode, nickbuf); } } free(sqlchan); } else { notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_ALREADY, cmd2); } } else if (!stricmp("DEL", cmd1)) { if (!cmd2) { syntax_error(s_StatServ, u, "CHANSTATS", STAT_CHANSTATS_DEL_SYNTAX); return MOD_CONT; } sqlchan = rdb_escape(cmd2); if ((cs = find_cs(cmd2))) { del_cs(cs); save_cs_db(); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", CStatsTable, sqlchan); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chan=\'%s\'", UStatsTable, sqlchan); notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_DEL, cmd2); if (LogChannel) { if (stricmp(LogChannel, cmd2)) { denora_cmd_part(s_StatServ, cmd2, getstring(NULL, STATS_CHANSTATS_PART), cmd2); } } else { denora_cmd_part(s_StatServ, cmd2, getstring(NULL, STATS_CHANSTATS_PART), cmd2); } } else { notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_NOTFOUND, cmd2); } free(sqlchan); } else if (!stricmp("LIST", cmd1)) { tn = list_first(CStatshead); while (tn != NULL) { cs = lnode_get(tn); notice(s_StatServ, u->nick, "%d %s", x, cs->name); x++; tn = list_next(CStatshead, tn); } if (!x) { notice_lang(s_StatServ, u, STATS_CHANSTATS_NOCHANNELS); } } else if (!stricmp("SUMUSER", cmd1)) { if (!cmd3) { syntax_error(s_StatServ, u, "CHANSTATS", STATS_CHANSTATS_SUMUSER_SYNTAX); return MOD_CONT; } sumuser(u, cmd2, cmd3); } else if (!stricmp("RENAME", cmd1)) { if (!cmd3) { syntax_error(s_StatServ, u, "CHANSTATS", STATS_CHANSTATS_RENAMEUSER_SYNTAX); return MOD_CONT; } renameuser(u, cmd2, cmd3); } else if (!stricmp("SET", cmd1)) { if (!cmd3) { syntax_error(s_StatServ, u, "CHANSTATS", STATS_CHANSTATS_SET_SYNTAX); return MOD_CONT; } if (!(cs = find_cs(cmd2))) { notice_lang(s_StatServ, u, STAT_CHANSTATS_CHAN_NOTFOUND, cmd2); return MOD_CONT; } if (!stricmp("FANTASY", cmd3)) { if (!cmd4) { syntax_error(s_StatServ, u, "CHANSTATS", STATS_CHANSTATS_SET_SYNTAX); return MOD_CONT; } if (!stricmp("ON", cmd4)) { cs->flags |= CS_FANTASY; cs->flags &= ~CS_NOTICE; notice_lang(s_StatServ, u, STATS_CHANSTATS_FANTASY_ON, cmd2); } else if (!stricmp("OFF", cmd4)) { cs->flags &= ~CS_FANTASY; cs->flags &= ~CS_NOTICE; notice_lang(s_StatServ, u, STATS_CHANSTATS_FANTASY_OFF, cmd2); } else if (!stricmp("NOTICE", cmd4)) { cs->flags |= CS_FANTASY; cs->flags |= CS_NOTICE; notice_lang(s_StatServ, u, STATS_CHANSTATS_FANTASY_NOTICE, cmd2); } else { syntax_error(s_StatServ, u, "CHANSTATS", STATS_CHANSTATS_SET_SYNTAX); } } /* fantasy */ } else { syntax_error(s_StatServ, u, "CHANSTATS", STAT_CHANSTATS_SYNTAX); } } else { syntax_error(s_StatServ, u, "CHANSTATS", STAT_CHANSTATS_SYNTAX); } return MOD_CONT; }
static int do_exclude(User * u, int ac, char **av) { Exclude *e; char *tmp = NULL; char *s = NULL; int count = 0, from = 0, to = 0; int nnicks = 0, i; int disp = 1; char *name; char *ch = NULL; User *u2; if (ac < 1) { notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX); return MOD_CONT; } if (!stricmp(av[0], "ADD")) { if (ac < 2) { notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX); return MOD_CONT; } if (strlen(av[1]) > NICKMAX) { notice(s_StatServ, u->nick, "Invalid nick length"); return MOD_CONT; } if (isdigit(av[1][0]) || av[1][0] == '-') { notice(s_StatServ, u->nick, "Invalid nick"); return MOD_CONT; } for (ch = av[1]; *ch && (ch - av[1]) < NICKMAX; ch++) { if (!isvalidnick(*ch)) { notice(s_StatServ, u->nick, "Invalid nick"); return MOD_CONT; } } e = find_exclude(av[1], NULL); if (!e) { make_exclude(av[1]); notice_lang(s_StatServ, u, STAT_EXCLUDE_ADDED, av[1]); name = rdb_escape(av[1]); u2 = user_find(av[1]); rdb_query(QUERY_LOW, "DELETE FROM %s WHERE uname=\'%s\'", UStatsTable, u2 ? u2->sgroup : name); rdb_query(QUERY_LOW, "UPDATE `%s` SET `ignore`=\'Y\' WHERE `uname`=\'%s\'", AliasesTable, u2 ? u2->sgroup : name); free(name); } else { notice_lang(s_StatServ, u, STAT_EXCLUDE_ALREADY, av[1]); } } else if (!stricmp(av[0], "DEL")) { if (ac < 2) { notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX); return MOD_CONT; } e = find_exclude(av[1], NULL); if (e) { del_exclude(e); u->cstats = 0; notice_lang(s_StatServ, u, STAT_EXCLUDE_DELETED, av[1]); name = rdb_escape(av[1]); u2 = user_find(av[1]); rdb_query(QUERY_LOW, "UPDATE `%s` SET `ignore`=\'N\' WHERE `uname`=\'%s\'", AliasesTable, u2 ? u2->sgroup : name); for (i = 0; i < 4; i++) { rdb_query (QUERY_LOW, "INSERT IGNORE INTO %s SET uname=\'%s\', chan=\'global\', type=%i;", UStatsTable, u2 ? u2->sgroup : name, i); } free(name); } else { notice_lang(s_StatServ, u, STAT_EXCLUDE_NOT_FOUND, av[1]); } } else if (!stricmp(av[0], "LIST")) { if (ac >= 2) { if (*av[1] == '#') { tmp = myStrGetOnlyToken((av[1] + 1), '-', 0); /* Read FROM out */ if (!tmp) { return MOD_CONT; } for (s = tmp; *s; s++) { if (!isdigit(*s)) { free(tmp); return MOD_CONT; } } from = atoi(tmp); free(tmp); tmp = myStrGetTokenRemainder(av[1], '-', 1); /* Read TO out */ if (!tmp) { return MOD_CONT; } for (s = tmp; *s; s++) { if (!isdigit(*s)) { free(tmp); return MOD_CONT; } } to = atoi(tmp); free(tmp); } } notice_lang(s_StatServ, u, STAT_EXCLUDE_LIST_HEADER); for (i = 0; i < 1024; i++) { for (e = exlists[i]; e; e = e->next) { if ((count + 1 >= from) && (count + 1 <= to)) { notice(s_StatServ, u->nick, "%d %s", disp++, e->name); } else if (((from == 0) && (to == 0)) && (++nnicks <= 50)) { notice(s_StatServ, u->nick, "%d %s", disp++, e->name); } count++; } } } else { notice_lang(s_StatServ, u, STAT_EXCLUDE_SYNTAX); return MOD_CONT; } return MOD_CONT; }