void db_checkemptychan(int chanid) { #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif SET_SEGV_LOCATION(); if (!denora->do_sql) { return; } rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE chanid=%d", IsOnTable, chanid); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { SET_SEGV_LOCATION(); if (!mysql_num_rows(mysql_res)) { rdb_query(QUERY_LOW, "DELETE FROM %s WHERE chanid=%d", ChanTable, chanid); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif }
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(); }
int chanstats_daily(const char *name) { if (!denora->do_sql) { return MOD_CONT; } if (!name) { return MOD_CONT; } SET_SEGV_LOCATION(); alog(LOG_NORMAL, langstr(ALOG_RESET_DAILY)); 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=1;", 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=1;", CStatsTable); return MOD_CONT; }
/* check if servs > servs_max */ void do_checkservsmax() { int diff1 = 0; SET_SEGV_LOCATION(); if (stats->servers > stats->servers_max) { stats->servers_max = stats->servers; stats->servers_max_time = time(NULL); diff1 = 1; } if (!stats->servers_max_time) { stats->servers_max_time = time(NULL); diff1 = 1; } SET_SEGV_LOCATION(); if (stats->servers > stats->daily_servers) { stats->daily_servers++; stats->daily_servers_time = time(NULL); } if (denora->do_sql) { rdb_query(QUERY_LOW, "UPDATE %s SET val=%d, time=%ld WHERE type='servers'", CurrentTable, stats->servers, time(NULL)); if (diff1) { rdb_query (QUERY_LOW, "UPDATE %s SET val=%d, time=FROM_UNIXTIME(%ld) WHERE type='servers'", MaxValueTable, stats->servers_max, (long int) stats->servers_max_time); } } }
/* check if chans > chans_max */ void do_checkchansmax() { int diff1 = 0; if (stats->chans > stats->chans_max) { stats->chans_max = stats->chans; stats->chans_max_time = time(NULL); diff1 = 1; } if (!stats->chans_max_time) { stats->chans_max_time = time(NULL); diff1 = 1; } SET_SEGV_LOCATION(); if (stats->chans > stats->daily_chans) { stats->daily_chans++; stats->daily_chans_time = time(NULL); } rdb_query(QUERY_LOW, "UPDATE %s SET val=%d, time=%ld WHERE type='chans'", CurrentTable, stats->chans, time(NULL)); if (diff1) { rdb_query (QUERY_LOW, "UPDATE %s SET val=%d, time=FROM_UNIXTIME(%ld) WHERE type='channels'", MaxValueTable, stats->chans_max, (long int) stats->chans_max_time); } }
int chanstats_weekly(const char *name) { if (!denora->do_sql) { return MOD_CONT; } if (!name) { return MOD_CONT; } SET_SEGV_LOCATION(); alog(LOG_NORMAL, langstr(ALOG_RESETTING_WEEKLY)); 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=2;", 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=2;", CStatsTable); rdb_query(QUERY_LOW, "DELETE %s.*,%s.* FROM %s,%s WHERE %s.uname = %s.uname AND %s.lastspoke < %i AND %s.ignore = 'N';", UStatsTable, AliasesTable, UStatsTable, AliasesTable, UStatsTable, AliasesTable, UStatsTable, (time(NULL) - ClearInActive), AliasesTable); return MOD_CONT; }
int chans_hourly(const char *name) { static struct tm mytime; time_t ts; int year; int month; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif ts = time(NULL); #ifdef _WIN32 localtime_s(&mytime, &ts); #else mytime = *localtime(&ts); #endif year = 1900 + mytime.tm_year; month = 1 + mytime.tm_mon; if (name) { alog(LOG_DEBUG, "Executing for %s", name); } if (!denora->do_sql) { return MOD_CONT; } rdb_query(QUERY_HIGH, "SELECT id FROM %s WHERE day=%d and month=%d and year=%d", ChanStatsTable, mytime.tm_mday, month, year); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res) > 0) { rdb_query (QUERY_LOW, "UPDATE %s SET time_%d=%d WHERE day=%d and month=%d and year=%d", ChanStatsTable, mytime.tm_hour, stats->chans, mytime.tm_mday, month, year); } else { rdb_query (QUERY_LOW, "INSERT INTO %s (day, month, year, time_%d) VALUES (%d, %d, %d, %d)", ChanStatsTable, mytime.tm_hour, mytime.tm_mday, month, year, stats->chans); } mysql_free_result(mysql_res); } SET_SEGV_LOCATION(); #endif SET_SEGV_LOCATION(); 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; }
/** * 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; }
/* -1 if server not found, servid else */ int db_checkserver_online(char *serv) { int servid = 0; Server *s; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif s = server_find(serv); if (s && s->sqlid) { return s->sqlid; } SET_SEGV_LOCATION(); if (!denora->do_sql) { return -1; } rdb_query(QUERY_HIGH, "SELECT servid FROM %s WHERE server=\'%s\' and online=\'Y\'", ServerTable, serv); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { SET_SEGV_LOCATION(); mysql_free_result(mysql_res); return 1; } #endif return servid; }
int db_getcurrent_chans(void) { int retcode = 0; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif if (!denora->do_sql) { return 0; } SET_SEGV_LOCATION(); rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s WHERE type=\'chans\'", CurrentTable); SET_SEGV_LOCATION(); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res)) { retcode = atoi(*mysql_fetch_row(mysql_res)); } else { retcode = -1; } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return retcode; }
/* chan should be db_escape'd before call */ int db_getchannel_users(char *chan) { int res = 0; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif SET_SEGV_LOCATION(); strtolwr(chan); if (!denora->do_sql) { return -1; } SET_SEGV_LOCATION(); rdb_query(QUERY_HIGH, "SELECT currentusers FROM %s WHERE channel=\'%s\'", ChanTable, chan); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); SET_SEGV_LOCATION(); if (mysql_res) { if (mysql_num_rows(mysql_res)) { res = strtol(*mysql_fetch_row(mysql_res), NULL, 10); } else { alog(LOG_DEBUG, "debug: unable to find the requested channel %s", chan); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return res; }
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; }
int db_getservfromnick(char *nick) { int res = 0; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif if (!denora->do_sql) { return -1; } SET_SEGV_LOCATION(); rdb_query(QUERY_HIGH, "SELECT servid 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); res = strtol(mysql_row[0], NULL, 10); } else { alog(LOG_NONEXISTANT, "nickname not found ! %s", nick); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return res; }
int denora_event_push(char *source, int ac, char **av) { /* Thanks to w00t from the inspircd team for helping me to write this function * debug: Received: :rock.musichat.net PUSH TestBOT ::rock.musichat.net 242 TestBOT :Server up 1 days, 07:47:54 */ Server *s; char *num; char buf[NET_BUFSIZE]; if (denora->protocoldebug) { protocol_debug(source, ac, av); } num = myStrGetToken(av[1], ' ', 1); av[1] = myStrGetTokenRemainder(av[1], ' ', 3); if (!num || !av[1]) { alog(LOG_ERROR, "ERROR: Something wicked while handling the PUSH message (truncated message)"); return MOD_CONT; } if (!strcmp(num, "375")) { rdb_query(QUERY_LOW, "UPDATE %s SET motd=\'\' WHERE server=\'%s\'", ServerTable, source); } else if (!strcmp(num, "372")) { s = server_find(source); if (!s) { return MOD_CONT; } av[1]++; if (ac >= 2) { if (s->motd) { ircsnprintf(buf, NET_BUFSIZE - 1, "%s\n\r%s", s->motd, av[1]); free(s->motd); s->motd = sstrdup(buf); } else { s->motd = sstrdup(av[1]); } } } else if (!strcmp(num, "376")) { s = server_find(source); if (!s) { return MOD_CONT; } sql_motd_store(s); } else if (!strcmp(num, "242")) { av[1]++; sql_do_uptime(source, av[1]); } else if (!strcmp(num, "248")) { av[2] = myStrGetTokenRemainder(av[1], ' ', 1); av[1] = myStrGetToken(av[1], ' ', 1); /* possible memleak at this location */ sql_uline(av[2]); } return MOD_CONT; }
void del_current_user(Server * s) { SET_SEGV_LOCATION(); if (!s) { return; } s->ss->currentusers--; stats->users--; SET_SEGV_LOCATION(); if (denora->do_sql) { rdb_query(QUERY_LOW, "UPDATE %s SET val=%d, time=%ld WHERE type='users'", CurrentTable, stats->users, time(NULL)); rdb_query(QUERY_LOW, "UPDATE %s SET currentusers=%d WHERE server='%s'", ServerTable, s->ss->currentusers, s->name); } }
/** * Process numeric 375 messages * * @param source is the server that sent the message * @param ac is the array count * @param av is the array * * @return return is always MOD_CONT * */ int denora_event_375(char *source, int ac, char **av) { SET_SEGV_LOCATION(); if (denora->protocoldebug) { protocol_debug(source, ac, av); } rdb_query(QUERY_LOW, "UPDATE %s SET motd=\'\' WHERE server=\'%s\'", ServerTable, source); return MOD_CONT; }
int db_getlusers(int type) { int retcode = 0; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif if (!denora->do_sql) { return 0; } SET_SEGV_LOCATION(); switch (type) { case LUSERS_USERS: rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s WHERE mode_li=\'N\'", UserTable); break; case LUSERS_USERSINV: rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s WHERE mode_li=\'Y\'", UserTable); break; case LUSERS_OPERS: rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s WHERE mode_lo=\'Y\'", UserTable); break; case LUSERS_CHAN: rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s", ChanTable); break; case LUSERS_SERV: rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s", ServerTable); break; case LUSERS_USERSGLOB: rdb_query(QUERY_HIGH, "SELECT COUNT(*) FROM %s", UserTable); break; case LUSERS_USERSMAX: rdb_query(QUERY_HIGH, "SELECT val FROM %s WHERE type='users'", MaxValueTable); break; } SET_SEGV_LOCATION(); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_res) { if (mysql_num_rows(mysql_res)) { retcode = atoi(*mysql_fetch_row(mysql_res)); } else { retcode = -1; } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return retcode; }
void del_oper_count(User * u) { SET_SEGV_LOCATION(); stats->opers--; if (u && u->server && u->server->ss) { u->server->ss->opers--; rdb_query (QUERY_LOW, "UPDATE %s SET opers=%d, maxopers=%ld, maxopertime=%ld WHERE server='%s'", ServerTable, u->server->ss->opers, u->server->ss->maxopers, (long int) u->server->ss->maxopertime, u->server->name); } SET_SEGV_LOCATION(); rdb_query(QUERY_LOW, "UPDATE %s SET val=%d, time=%ld WHERE type='opers'", CurrentTable, stats->opers, time(NULL)); }
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 }
/* cleanup the server table, removing old entries */ void db_cleanserver() { #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif int curtime = time(NULL); SET_SEGV_LOCATION(); if (!denora->do_sql) { return; } if (ServerLastClean == -1) { ServerLastClean = curtime; } SET_SEGV_LOCATION(); if (curtime > (ServerLastClean + ServerCleanFreq)) { ServerLastClean = curtime; rdb_query (QUERY_HIGH, "SELECT server FROM %s WHERE online=\'N\' AND lastsplit<FROM_UNIXTIME(%d)", ServerTable, curtime - ServerCacheTime); #ifdef USE_MYSQL mysql_res = mysql_store_result(mysql); if (mysql_num_rows(mysql_res)) { mysql_free_result(mysql_res); rdb_query (QUERY_LOW, "DELETE FROM %s WHERE online=\'N\' AND lastsplit<FROM_UNIXTIME(%d)", ServerTable, curtime - ServerCacheTime); } else { if (mysql_res) { mysql_free_result(mysql_res); } } #endif SET_SEGV_LOCATION(); } }
/* chan should be db_escape'd before call */ int db_getchannel(char *chan) { int res = 0; Channel *c; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif if (!chan) return -1; strtolwr(chan); SET_SEGV_LOCATION(); c = findchan(chan); if (c && c->sqlid) { return c->sqlid; } if (!denora->do_sql) { return -1; } rdb_query(QUERY_HIGH, "SELECT chanid FROM %s WHERE channel=\'%s\'", ChanTable, chan); #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); res = strtol(mysql_row[0], NULL, 10); } else { alog(LOG_NONEXISTANT, "channel not found ! %s", chan); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return res; }
/* serv should be db_escape'd before call */ int db_getserver(char *serv) { Server *s; int res = 0; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif SET_SEGV_LOCATION(); s = server_find(serv); if (s && s->sqlid) { return s->sqlid; } if (!denora->do_sql) { return res; } if (!serv) { return res; } rdb_query(QUERY_HIGH, "SELECT servid FROM %s WHERE server=\'%s\'", ServerTable, serv); #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); res = strtol(mysql_row[0], NULL, 10); } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return res; }
/** * 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); } }
/* nick should be db_escape'd before call */ int db_getnick_unsure(char *nick) { User *u; int res = 0; #ifdef USE_MYSQL MYSQL_RES *mysql_res; #endif SET_SEGV_LOCATION(); u = user_find(nick); if (u && u->sqlid) { return u->sqlid; } if (!denora->do_sql) { return -1; } 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); res = strtol(mysql_row[0], NULL, 10); } else { res = -1; } SET_SEGV_LOCATION(); mysql_free_result(mysql_res); } #endif return res; }
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(); }
/** * 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; }
/** * 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; }
/* -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; } }