2005-03-15 12:37:07 +00:00
/* SeenServ - Nickname Seen Service - NeoStats Addon Module
2007-01-11 10:42:07 +00:00
* * Copyright ( c ) 2003 - 2006 Justin Hammond , Mark Hetherington , Jeff Lang
2005-03-15 12:37:07 +00:00
* *
* * This program is free software ; you can redistribute it and / or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation ; either version 2 of the License , or
* * ( at your option ) any later version .
* *
* * This program is distributed in the hope that it will be useful ,
* * but WITHOUT ANY WARRANTY ; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* * GNU General Public License for more details .
* *
* * You should have received a copy of the GNU General Public License
* * along with this program ; if not , write to the Free Software
* * Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
* * USA
* *
* * SeenServ CVS Identification
* * $ Id $
*/
# include "neostats.h" /* Required for bot support */
# include "seenserv.h"
2005-05-25 17:45:52 +00:00
# define MAX_NICK_HISTORY 5
# define SEEN_ENTRY_NICK_SIZE ( ( MAXNICK + 3 ) * MAX_NICK_HISTORY )
2005-03-15 12:37:07 +00:00
static list_t * seenlist ;
2005-05-10 03:30:03 +00:00
static char combinedtimetext [ SS_GENCHARLEN ] ;
2005-03-17 23:27:28 +00:00
static char matchstr [ USERHOSTLEN ] ;
2005-05-10 03:30:03 +00:00
static char currentlyconnectedtext [ SS_GENCHARLEN ] ;
2005-05-25 17:45:52 +00:00
static char seenentrynick [ SEEN_ENTRY_NICK_SIZE ] ;
2005-05-10 03:30:03 +00:00
static char matchednickstr [ SS_MESSAGESIZE ] ;
2005-08-09 06:11:58 +00:00
static char nicklower [ MAXNICK ] ;
2005-03-17 07:10:18 +00:00
2005-05-01 21:51:36 +00:00
/** @brief findnick
*
* list sorting helper
*
* @ param key1
* @ param key2
*
* @ return results of strcmp
*/
int findnick ( const void * key1 , const void * key2 )
{
2005-05-10 03:30:03 +00:00
SeenData * sd = ( SeenData * ) key1 ;
return ircstrcasecmp ( sd - > nick , key2 ) ;
2005-05-01 21:51:36 +00:00
}
/*
* Removes SeenData for nickname if exists
2005-06-10 04:10:17 +00:00
*
* returns NS_SUCCESS if nick removed or NS_FAILURE if nick not in list
2005-05-01 21:51:36 +00:00
*/
2005-06-10 04:10:17 +00:00
int removepreviousnick ( char * nick )
2005-05-01 21:51:36 +00:00
{
lnode_t * ln ;
SeenData * sd ;
2005-08-05 04:12:41 +00:00
ln = list_last ( seenlist ) ;
2005-05-10 03:30:03 +00:00
while ( ln )
2005-05-01 21:51:36 +00:00
{
2005-05-10 03:30:03 +00:00
sd = lnode_get ( ln ) ;
if ( ! ircstrcasecmp ( nick , sd - > nick ) )
{
ns_free ( sd ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
2005-06-10 04:10:17 +00:00
return NS_SUCCESS ;
2005-05-10 03:30:03 +00:00
}
2005-08-05 04:12:41 +00:00
ln = list_prev ( seenlist , ln ) ;
2005-05-01 21:51:36 +00:00
}
2005-06-10 04:10:17 +00:00
return NS_FAILURE ;
2005-05-01 21:51:36 +00:00
}
2005-03-15 12:37:07 +00:00
/*
* add new seen entry to list
*/
2005-05-01 21:51:36 +00:00
void addseenentry ( char * nick , char * host , char * vhost , char * message , int type )
{
2005-03-15 12:37:07 +00:00
SeenData * sd ;
2005-06-10 04:10:17 +00:00
int nickremoved ;
2005-03-15 12:37:07 +00:00
2005-06-10 04:10:17 +00:00
nickremoved = removepreviousnick ( nick ) ;
2005-03-15 12:37:07 +00:00
sd = ns_calloc ( sizeof ( SeenData ) ) ;
strlcpy ( sd - > nick , nick , MAXNICK ) ;
2005-03-17 23:27:28 +00:00
strlcpy ( sd - > userhost , host , USERHOSTLEN ) ;
strlcpy ( sd - > uservhost , vhost , USERHOSTLEN ) ;
2005-03-20 02:36:34 +00:00
strlcpy ( sd - > message , message ? message : " " , SS_MESSAGESIZE ) ;
2005-03-15 12:37:07 +00:00
sd - > seentype = type ;
sd - > seentime = me . now ;
2005-08-05 04:12:41 +00:00
sd - > recordsaved = 0 ;
2005-03-15 12:37:07 +00:00
lnode_create_append ( seenlist , sd ) ;
2005-06-10 04:10:17 +00:00
/* only check list limit if the nick wasn't already in the list */
if ( nickremoved = = NS_FAILURE )
checkseenlistlimit ( SS_LISTLIMIT_COUNT ) ;
return ;
2005-03-15 12:37:07 +00:00
}
2005-08-05 04:12:41 +00:00
/*
* Save Data to DB on timer
2005-08-09 06:11:58 +00:00
*
* remove records from list if set to work from DB only
2005-08-05 04:12:41 +00:00
*/
2005-08-09 12:25:20 +00:00
int dbsavetimer ( void * userptr )
2005-08-05 04:12:41 +00:00
{
lnode_t * ln , * ln2 ;
SeenData * sd ;
2005-08-16 22:13:53 +00:00
SET_SEGV_LOCATION ( ) ;
2005-08-05 04:12:41 +00:00
ln = list_last ( seenlist ) ;
while ( ln )
{
sd = lnode_get ( ln ) ;
2005-08-09 06:11:58 +00:00
ln2 = list_prev ( seenlist , ln ) ;
2005-08-05 04:12:41 +00:00
if ( sd - > recordsaved = = 0 )
{
sd - > recordsaved = 1 ;
2005-08-09 06:11:58 +00:00
strlcpy ( nicklower , sd - > nick , MAXNICK ) ;
2005-11-14 22:40:36 +00:00
DBAStore ( " seendata " , ns_strlwr ( nicklower ) , ( void * ) sd , sizeof ( SeenData ) ) ;
2005-08-09 06:11:58 +00:00
if ( ! SeenServ . memorylist )
{
ns_free ( sd ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
}
2005-08-05 04:12:41 +00:00
} else {
2005-08-09 06:11:58 +00:00
if ( ! SeenServ . memorylist )
{
ns_free ( sd ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
} else {
return NS_SUCCESS ;
}
2005-08-05 04:12:41 +00:00
}
2005-08-09 06:11:58 +00:00
ln = ln2 ;
2005-08-05 04:12:41 +00:00
}
return NS_SUCCESS ;
}
2005-03-15 12:37:07 +00:00
/*
* Removes SeenData if records past max entries setting
*/
2005-06-10 04:10:17 +00:00
void checkseenlistlimit ( int checktype )
2005-05-01 21:08:44 +00:00
{
2005-05-10 03:30:03 +00:00
int currentlistcount ;
int maxageallowed ;
2005-05-01 21:08:44 +00:00
lnode_t * ln , * ln2 ;
2005-03-15 12:37:07 +00:00
SeenData * sd ;
2005-05-10 03:30:03 +00:00
currentlistcount = list_count ( seenlist ) ;
2005-05-25 19:05:16 +00:00
maxageallowed = me . now - ( SeenServ . expiretime * TS_ONE_DAY ) ;
2005-05-01 21:08:44 +00:00
ln = list_first ( seenlist ) ;
sd = lnode_get ( ln ) ;
2005-06-10 04:10:17 +00:00
while ( ( checktype = = SS_LISTLIMIT_COUNT & & currentlistcount > SeenServ . maxentries ) | | ( checktype = = SS_LISTLIMIT_AGE & & SeenServ . expiretime > 0 & & maxageallowed > sd - > seentime ) )
2005-05-01 21:08:44 +00:00
{
ln2 = list_next ( seenlist , ln ) ;
2007-07-27 13:20:14 +00:00
strlcpy ( nicklower , sd - > nick , MAXNICK ) ;
DBADelete ( " seendata " , ns_strlwr ( nicklower ) ) ;
2005-05-01 21:08:44 +00:00
ns_free ( sd ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
2005-05-10 03:30:03 +00:00
ln = ln2 ;
sd = lnode_get ( ln ) ;
currentlistcount - - ;
2005-03-15 12:37:07 +00:00
}
2005-06-10 04:10:17 +00:00
return ;
2005-03-15 12:37:07 +00:00
}
/*
* Load Saved Seen Records
*/
2005-03-17 19:54:17 +00:00
int loadseenrecords ( void * data , int size )
2005-03-15 12:37:07 +00:00
{
SeenData * sd ;
sd = ns_calloc ( sizeof ( SeenData ) ) ;
os_memcpy ( sd , data , sizeof ( SeenData ) ) ;
2005-08-05 04:12:41 +00:00
sd - > recordsaved = 1 ;
2005-03-15 12:37:07 +00:00
lnode_create_append ( seenlist , sd ) ;
return NS_FALSE ;
}
2005-05-01 21:51:36 +00:00
2005-08-09 06:11:58 +00:00
void createseenlist ( void )
2005-05-01 21:51:36 +00:00
{
2005-10-11 22:11:33 +00:00
seenlist = list_create ( LISTCOUNT_T_MAX ) ;
2005-08-09 06:11:58 +00:00
}
void loadseendata ( void )
{
2005-05-01 21:51:36 +00:00
DBAFetchRows ( " seendata " , loadseenrecords ) ;
list_sort ( seenlist , sortlistbytime ) ;
2005-06-10 04:10:17 +00:00
return ;
2005-05-01 21:51:36 +00:00
}
2005-03-15 12:37:07 +00:00
int sortlistbytime ( const void * key1 , const void * key2 )
{
const SeenData * sd1 = key1 ;
const SeenData * sd2 = key2 ;
return ( sd1 - > seentime - sd2 - > seentime ) ;
}
/*
* Destroy Seen List
*/
2005-05-01 21:51:36 +00:00
void destroyseenlist ( void )
{
lnode_t * ln , * ln2 ;
2005-03-20 02:36:34 +00:00
SeenData * sd ;
2005-05-01 21:51:36 +00:00
ln = list_first ( seenlist ) ;
while ( ln )
{
2005-03-20 02:36:34 +00:00
sd = lnode_get ( ln ) ;
2005-05-01 21:51:36 +00:00
ln2 = list_next ( seenlist , ln ) ;
2005-03-20 02:36:34 +00:00
ns_free ( sd ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
2005-05-01 21:51:36 +00:00
ln = ln2 ;
2005-03-20 02:36:34 +00:00
}
2005-03-15 12:37:07 +00:00
list_destroy_auto ( seenlist ) ;
}
2007-08-01 03:17:25 +00:00
#if 0
2005-05-01 22:31:09 +00:00
/** seen_report
*
* handles channel / user message selection
*/
2007-08-01 03:17:25 +00:00
/* we do this via a macro now, to avoid possible exploits,
* see seenserv . h . If the macro isn ' t portable , then we can use this function now
* without having the exploit present , but its spins more CPU cycles !
*/
2005-05-01 22:31:09 +00:00
static char seen_report_buf [ BUFSIZE ] ;
2005-10-13 22:30:23 +00:00
void seen_report ( const CmdParams * cmdparams , const char * fmt , . . . )
2005-05-01 22:31:09 +00:00
{
va_list ap ;
va_start ( ap , fmt ) ;
ircvsnprintf ( seen_report_buf , BUFSIZE , fmt , ap ) ;
va_end ( ap ) ;
if ( cmdparams - > channel = = NULL )
2007-08-01 03:17:25 +00:00
irc_prefmsg ( sns_bot , cmdparams - > source , " %s " , seen_report_buf ) ;
2005-05-01 22:31:09 +00:00
else
2007-08-01 03:17:25 +00:00
irc_chanprivmsg ( sns_bot , cmdparams - > channel - > name , " %s " seen_report_buf ) ;
2005-05-01 22:31:09 +00:00
}
2007-08-01 03:17:25 +00:00
# endif
2005-05-25 17:45:52 +00:00
/*
* Check whether we can run the seen command
*/
2005-10-13 22:30:23 +00:00
static int SeenAvailable ( const CmdParams * cmdparams )
2005-05-25 17:45:52 +00:00
{
2007-08-01 03:17:25 +00:00
#if 0
2007-07-30 12:48:48 +00:00
if ( strstr ( cmdparams - > av [ 0 ] , " % " ) ! = NULL )
return NS_FALSE ;
2007-08-01 03:17:25 +00:00
# endif
2005-05-25 17:45:52 +00:00
if ( cmdparams - > source - > user - > ulevel < NS_ULEVEL_LOCOPER )
{
if ( ! SeenServ . enable & & cmdparams - > channel = = NULL )
return NS_FALSE ;
if ( ! SeenServ . enableseenchan & & cmdparams - > channel ! = NULL )
return NS_FALSE ;
}
return NS_TRUE ;
}
2005-05-01 22:31:09 +00:00
2005-03-16 00:34:03 +00:00
/*
2005-05-25 17:45:52 +00:00
* Seen for wildcarded Host
2005-03-16 00:34:03 +00:00
*/
2005-10-13 22:30:23 +00:00
int sns_cmd_seenhost ( const CmdParams * cmdparams )
2005-05-25 17:45:52 +00:00
{
2005-06-10 02:26:24 +00:00
Client * u ;
2005-05-25 17:45:52 +00:00
SET_SEGV_LOCATION ( ) ;
2005-08-09 06:11:58 +00:00
/* do lookup on nick only if working from DB and not memory list */
if ( ! SeenServ . memorylist )
return sns_cmd_seennick ( cmdparams ) ;
2005-05-25 17:45:52 +00:00
if ( SeenAvailable ( cmdparams ) = = NS_FALSE )
return NS_SUCCESS ;
2005-08-05 04:12:41 +00:00
/* ensure DB is saved before doing lookup */
2005-08-09 12:25:20 +00:00
dbsavetimer ( NULL ) ;
2005-06-10 02:26:24 +00:00
if ( ValidateNick ( cmdparams - > av [ 0 ] ) = = NS_SUCCESS )
{
u = FindUser ( cmdparams - > av [ 0 ] ) ;
if ( u )
{
seen_report ( cmdparams , " %s (%s@%s) is connected right now " , u - > name , u - > user - > username , u - > user - > vhost ) ;
return NS_SUCCESS ;
}
}
2005-05-25 17:45:52 +00:00
if ( CheckSeenData ( cmdparams , SS_CHECK_WILDCARD ) = = NS_FAILURE )
seen_report ( cmdparams , " Sorry %s, I can't remember seeing anyone matching that mask (%s) " , cmdparams - > source - > name , matchstr ) ;
return NS_SUCCESS ;
}
/*
* Seen for valid nickname
*/
2005-10-13 22:30:23 +00:00
int sns_cmd_seennick ( const CmdParams * cmdparams )
2005-05-01 23:03:25 +00:00
{
2005-03-15 12:37:07 +00:00
Client * u ;
2005-05-25 17:45:52 +00:00
SET_SEGV_LOCATION ( ) ;
if ( SeenAvailable ( cmdparams ) = = NS_FALSE )
2005-03-15 12:37:07 +00:00
return NS_SUCCESS ;
2005-08-05 04:12:41 +00:00
/* ensure DB is saved before doing lookup */
2005-08-09 12:25:20 +00:00
dbsavetimer ( NULL ) ;
2005-05-25 17:45:52 +00:00
if ( ValidateNick ( cmdparams - > av [ 0 ] ) = = NS_FAILURE )
{
seen_report ( cmdparams , " %s is not a valid nickname " , cmdparams - > av [ 0 ] ) ;
2005-03-17 07:10:18 +00:00
return NS_SUCCESS ;
2005-05-25 17:45:52 +00:00
}
u = FindUser ( cmdparams - > av [ 0 ] ) ;
if ( u )
2005-05-10 03:30:03 +00:00
{
2005-05-25 17:45:52 +00:00
seen_report ( cmdparams , " %s (%s@%s) is connected right now " , u - > name , u - > user - > username , u - > user - > vhost ) ;
return NS_SUCCESS ;
2005-03-15 12:37:07 +00:00
}
2005-05-25 17:45:52 +00:00
if ( CheckSeenData ( cmdparams , SS_CHECK_NICK ) = = NS_FAILURE )
seen_report ( cmdparams , " Sorry %s, I can't remember seeing anyone called %s " , cmdparams - > source - > name , cmdparams - > av [ 0 ] ) ;
return NS_SUCCESS ;
}
/*
* Build time string
*/
void BuildTimeString ( int ts )
{
static char temptimetext [ 12 ] ;
int d , h , m , s ;
combinedtimetext [ 0 ] = ' \0 ' ;
if ( ts > 0 )
2005-05-10 03:30:03 +00:00
{
2005-05-25 17:45:52 +00:00
s = ( ts % 60 ) ;
ts - = s ;
ts = ( ts / 60 ) ;
m = ( ts % 60 ) ;
ts - = m ;
ts = ( ts / 60 ) ;
h = ( ts % 24 ) ;
ts - = h ;
d = ( ts / 24 ) ;
if ( d )
2005-05-10 03:30:03 +00:00
{
2005-05-25 17:45:52 +00:00
ircsnprintf ( temptimetext , 12 , " %d Days " , d ) ;
strlcat ( combinedtimetext , temptimetext , SS_GENCHARLEN ) ;
2005-03-16 00:34:03 +00:00
}
2005-05-25 17:45:52 +00:00
if ( h )
{
ircsnprintf ( temptimetext , 12 , " %d Hours " , h ) ;
strlcat ( combinedtimetext , temptimetext , SS_GENCHARLEN ) ;
}
if ( m )
{
ircsnprintf ( temptimetext , 12 , " %d Minutes " , m ) ;
strlcat ( combinedtimetext , temptimetext , SS_GENCHARLEN ) ;
}
if ( s )
{
ircsnprintf ( temptimetext , 12 , " %d Seconds " , s ) ;
strlcat ( combinedtimetext , temptimetext , SS_GENCHARLEN ) ;
}
} else {
ircsnprintf ( combinedtimetext , SS_GENCHARLEN , " 0 Seconds " ) ;
2005-03-16 00:34:03 +00:00
}
2005-05-25 17:45:52 +00:00
}
/*
* Check For Seen Records
*/
2005-10-13 22:30:23 +00:00
int CheckSeenData ( const CmdParams * cmdparams , SEEN_CHECK checktype )
2005-05-25 17:45:52 +00:00
{
2005-06-10 04:10:17 +00:00
lnode_t * ln , * oln [ MAX_NICK_HISTORY ] ;
2005-07-01 09:35:53 +00:00
SeenData * sd , * sdo = NULL ;
2005-05-25 17:45:52 +00:00
Client * u ;
Channel * c ;
2005-06-10 04:10:17 +00:00
int matchfound = 0 , seenentriesfound = 0 , maxageallowed = 0 ;
int isopersource = 0 , i ;
2005-05-25 17:45:52 +00:00
if ( cmdparams - > source - > user - > ulevel > = NS_ULEVEL_LOCOPER )
isopersource = 1 ;
2005-06-10 04:10:17 +00:00
/* used for expiring records on age if shown in request */
for ( i = 0 ; i < MAX_NICK_HISTORY ; i + + )
oln [ i ] = NULL ;
2005-05-25 17:45:52 +00:00
seenentrynick [ 0 ] = ' \0 ' ;
2005-05-10 03:30:03 +00:00
currentlyconnectedtext [ 0 ] = ' \0 ' ;
if ( checktype = = SS_CHECK_WILDCARD )
{
if ( strchr ( cmdparams - > av [ 0 ] , ' * ' ) )
2005-03-17 23:27:28 +00:00
ircsnprintf ( matchstr , USERHOSTLEN , " %s " , cmdparams - > av [ 0 ] ) ;
2005-05-10 03:30:03 +00:00
else
2005-03-17 23:27:28 +00:00
ircsnprintf ( matchstr , USERHOSTLEN , " *%s* " , cmdparams - > av [ 0 ] ) ;
2005-03-15 12:37:07 +00:00
}
2005-08-09 06:11:58 +00:00
if ( ! SeenServ . memorylist )
2005-05-10 03:30:03 +00:00
{
2005-08-09 06:11:58 +00:00
sdo = ns_calloc ( sizeof ( SeenData ) ) ;
strlcpy ( nicklower , cmdparams - > av [ 0 ] , MAXNICK ) ;
2005-11-14 22:40:36 +00:00
if ( DBAFetch ( " seendata " , ns_strlwr ( nicklower ) , ( void * ) sdo , sizeof ( SeenData ) ) ! = NS_FAILURE )
2005-08-09 06:11:58 +00:00
seenentriesfound = 1 ;
} else {
ln = list_last ( seenlist ) ;
while ( ln ! = NULL & & seenentriesfound < MAX_NICK_HISTORY )
2005-05-25 17:45:52 +00:00
{
2005-08-09 06:11:58 +00:00
sd = lnode_get ( ln ) ;
if ( checktype = = SS_CHECK_NICK )
{
if ( ! ircstrcasecmp ( cmdparams - > av [ 0 ] , sd - > nick ) )
matchfound = 1 ;
}
else if ( checktype = = SS_CHECK_WILDCARD )
2005-05-25 17:45:52 +00:00
{
2005-08-09 06:11:58 +00:00
if ( isopersource )
{
2005-12-11 12:06:21 +00:00
if ( match ( matchstr , sd - > userhost ) )
matchfound = 1 ;
}
if ( match ( matchstr , sd - > uservhost ) )
2005-05-25 17:45:52 +00:00
matchfound = 1 ;
}
2005-08-09 06:11:58 +00:00
if ( matchfound )
2005-05-10 03:30:03 +00:00
{
2005-08-09 06:11:58 +00:00
oln [ seenentriesfound ] = ln ;
seenentriesfound + + ;
if ( seenentriesfound = = 1 )
{
sdo = sd ;
if ( checktype = = SS_CHECK_NICK )
break ;
else
strlcpy ( seenentrynick , sd - > nick , SEEN_ENTRY_NICK_SIZE ) ;
} else {
strlcat ( seenentrynick , " , " , SEEN_ENTRY_NICK_SIZE ) ;
strlcat ( seenentrynick , sd - > nick , SEEN_ENTRY_NICK_SIZE ) ;
}
matchfound = 0 ;
2005-03-15 12:37:07 +00:00
}
2005-08-09 06:11:58 +00:00
ln = list_prev ( seenlist , ln ) ;
2005-03-17 07:10:18 +00:00
}
}
2005-05-26 14:32:20 +00:00
if ( seenentriesfound = = 0 )
2005-05-25 17:45:52 +00:00
return NS_FAILURE ;
BuildTimeString ( ( int ) ( me . now - sdo - > seentime ) ) ;
matchednickstr [ 0 ] = ' \0 ' ;
if ( seenentriesfound > 1 )
2005-05-26 14:32:20 +00:00
ircsnprintf ( matchednickstr , SS_MESSAGESIZE , " The %d most recent matches are - %s : " , seenentriesfound , seenentrynick ) ;
2005-05-25 17:45:52 +00:00
switch ( sdo - > seentype )
2005-05-10 03:30:03 +00:00
{
2005-05-25 17:45:52 +00:00
case SS_CONNECTED :
u = FindUser ( sdo - > nick ) ;
if ( u )
{
if ( ! ircstrcasecmp ( sdo - > userhost , u - > user - > userhostmask ) )
ircsnprintf ( currentlyconnectedtext , SS_GENCHARLEN , " , %s is currently connected " , u - > name ) ;
}
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen connecting %s ago%s " , matchednickstr , sdo - > userhost , combinedtimetext , currentlyconnectedtext ) ;
else
seen_report ( cmdparams , " %s%s was last seen connecting %s ago%s " , matchednickstr , sdo - > nick , combinedtimetext , currentlyconnectedtext ) ;
break ;
case SS_QUIT :
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen quiting %s ago, stating %s " , matchednickstr , sdo - > userhost , combinedtimetext , sdo - > message ) ;
else
seen_report ( cmdparams , " %s%s was last seen quiting %s ago, stating %s " , matchednickstr , sdo - > uservhost , combinedtimetext , sdo - > message ) ;
break ;
case SS_KILLED :
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen being killed %s ago %s " , matchednickstr , sdo - > userhost , combinedtimetext , sdo - > message ) ;
else
seen_report ( cmdparams , " %s%s was last seen being killed %s ago %s " , matchednickstr , sdo - > uservhost , combinedtimetext , sdo - > message ) ;
break ;
case SS_NICKCHANGE :
u = FindUser ( sdo - > message ) ;
if ( u )
{
if ( ! ircstrcasecmp ( sdo - > userhost , u - > user - > userhostmask ) )
ircsnprintf ( currentlyconnectedtext , SS_GENCHARLEN , " , %s is currently connected " , u - > name ) ;
}
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen changing Nickname %s ago to %s%s " , matchednickstr , sdo - > userhost , combinedtimetext , sdo - > message , currentlyconnectedtext ) ;
else
seen_report ( cmdparams , " %s%s was last seen changing Nickname %s ago to %s%s " , matchednickstr , sdo - > uservhost , combinedtimetext , sdo - > message , currentlyconnectedtext ) ;
break ;
case SS_JOIN :
u = FindUser ( sdo - > nick ) ;
if ( u )
{
if ( ! ircstrcasecmp ( sdo - > userhost , u - > user - > userhostmask ) )
2005-05-10 03:30:03 +00:00
{
2005-05-25 17:45:52 +00:00
c = FindChannel ( sdo - > message ) ;
if ( c )
2005-05-10 03:30:03 +00:00
{
2005-05-25 17:45:52 +00:00
if ( IsChannelMember ( c , u ) & & ! is_hidden_chan ( c ) )
ircsnprintf ( currentlyconnectedtext , SS_GENCHARLEN , " , %s is currently in %s " , u - > name , c - > name ) ;
2005-03-15 12:37:07 +00:00
}
}
2005-05-25 17:45:52 +00:00
}
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen Joining %s %s ago%s " , matchednickstr , sdo - > userhost , sdo - > message , combinedtimetext , currentlyconnectedtext ) ;
else
seen_report ( cmdparams , " %s%s was last seen Joining %s %s ago%s " , matchednickstr , sdo - > uservhost , sdo - > message , combinedtimetext , currentlyconnectedtext ) ;
break ;
case SS_PART :
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen Parting %s %s ago " , matchednickstr , sdo - > userhost , sdo - > message , combinedtimetext ) ;
else
seen_report ( cmdparams , " %s%s was last seen Parting %s %s ago " , matchednickstr , sdo - > uservhost , sdo - > message , combinedtimetext ) ;
break ;
case SS_KICKED :
if ( isopersource & & cmdparams - > channel = = NULL )
irc_prefmsg ( sns_bot , cmdparams - > source , " %s%s was last seen being Kicked From %s %s ago " , matchednickstr , sdo - > userhost , sdo - > message , combinedtimetext ) ;
else
seen_report ( cmdparams , " %s%s was last seen Kicked From %s %s " , matchednickstr , sdo - > uservhost , sdo - > message , combinedtimetext ) ;
break ;
2005-07-01 09:35:53 +00:00
default :
break ;
2005-03-15 12:37:07 +00:00
}
2005-08-09 06:11:58 +00:00
if ( ! SeenServ . memorylist )
2005-06-10 04:10:17 +00:00
{
2005-08-09 06:20:57 +00:00
/* delete record if DB Only and past expiration date */
if ( SeenServ . expiretime > 0 & & ( ( me . now - ( SeenServ . expiretime * TS_ONE_DAY ) ) > sdo - > seentime ) )
{
2007-07-27 13:20:14 +00:00
strlcpy ( nicklower , sdo - > nick , MAXNICK ) ;
2005-11-14 22:40:36 +00:00
DBADelete ( " seendata " , ns_strlwr ( nicklower ) ) ;
2005-08-09 06:20:57 +00:00
}
2005-08-09 06:11:58 +00:00
ns_free ( sdo ) ;
} else {
/* expire displayed records on age if required */
if ( SeenServ . expiretime > 0 )
2005-06-10 04:10:17 +00:00
{
2005-08-09 06:11:58 +00:00
maxageallowed = me . now - ( SeenServ . expiretime * TS_ONE_DAY ) ;
i = 0 ;
while ( i < MAX_NICK_HISTORY & & oln [ i ] ! = NULL )
2005-06-10 04:10:17 +00:00
{
2005-08-09 06:11:58 +00:00
ln = oln [ i ] ;
sd = lnode_get ( ln ) ;
if ( maxageallowed > sd - > seentime )
{
2007-07-27 13:20:14 +00:00
strlcpy ( nicklower , sd - > nick , MAXNICK ) ;
DBADelete ( " seendata " , ns_strlwr ( nicklower ) ) ;
2005-08-09 06:11:58 +00:00
ns_free ( sd ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
}
i + + ;
2005-06-10 04:10:17 +00:00
}
}
}
2005-03-15 12:37:07 +00:00
return NS_SUCCESS ;
}
/*
2005-03-18 00:34:05 +00:00
* Delete all matching entries
2005-03-15 12:37:07 +00:00
*/
2005-10-13 22:30:23 +00:00
int sns_cmd_del ( const CmdParams * cmdparams )
2005-05-10 03:30:03 +00:00
{
2005-03-15 12:37:07 +00:00
lnode_t * ln , * ln2 ;
SeenData * sd ;
int i ;
2005-05-10 03:30:03 +00:00
SET_SEGV_LOCATION ( ) ;
2005-03-15 12:37:07 +00:00
i = 0 ;
ln = list_first ( seenlist ) ;
2005-05-10 03:30:03 +00:00
while ( ln ! = NULL )
{
2005-03-15 12:37:07 +00:00
sd = lnode_get ( ln ) ;
2005-05-10 03:30:03 +00:00
if ( match ( cmdparams - > av [ 0 ] , sd - > userhost ) | | match ( cmdparams - > av [ 0 ] , sd - > uservhost ) )
{
2007-07-27 13:20:14 +00:00
strlcpy ( nicklower , sd - > nick , MAXNICK ) ;
DBADelete ( " seendata " , ns_strlwr ( nicklower ) ) ;
2005-03-15 12:37:07 +00:00
i + + ;
ns_free ( sd ) ;
ln2 = list_next ( seenlist , ln ) ;
list_delete ( seenlist , ln ) ;
lnode_destroy ( ln ) ;
ln = ln2 ;
} else {
ln = list_next ( seenlist , ln ) ;
}
}
2005-05-01 22:31:09 +00:00
seen_report ( cmdparams , " %d matching entries deleted " , i ) ;
2005-03-15 12:37:07 +00:00
return NS_SUCCESS ;
}
/*
* Display Seen Statistics
*/
2005-10-13 22:30:23 +00:00
int sns_cmd_status ( const CmdParams * cmdparams )
2005-05-01 22:50:02 +00:00
{
2005-05-02 17:26:09 +00:00
int seenstats [ SEEN_TYPE_MAX ] ;
2005-03-15 12:37:07 +00:00
lnode_t * ln ;
SeenData * sd ;
2005-05-10 03:30:03 +00:00
SET_SEGV_LOCATION ( ) ;
2005-08-09 06:11:58 +00:00
if ( ! SeenServ . memorylist )
{
seen_report ( cmdparams , " Seen Statistics Unavailable when using DB only " ) ;
return NS_SUCCESS ;
}
2005-05-02 17:26:09 +00:00
os_memset ( seenstats , 0 , sizeof ( seenstats ) ) ;
2005-03-15 12:37:07 +00:00
ln = list_first ( seenlist ) ;
2005-05-10 03:30:03 +00:00
while ( ln )
{
2005-03-15 12:37:07 +00:00
sd = lnode_get ( ln ) ;
2005-05-02 17:26:09 +00:00
seenstats [ sd - > seentype ] + + ;
2005-03-15 12:37:07 +00:00
ln = list_next ( seenlist , ln ) ;
}
2005-05-01 23:42:51 +00:00
seen_report ( cmdparams , " Seen Statistics (Current Records Per Type) " ) ;
2005-05-02 17:26:09 +00:00
seen_report ( cmdparams , " %d Connections " , seenstats [ SS_CONNECTED ] ) ;
seen_report ( cmdparams , " %d Quits " , seenstats [ SS_QUIT ] ) ;
seen_report ( cmdparams , " %d Kills " , seenstats [ SS_KILLED ] ) ;
seen_report ( cmdparams , " %d Nick Changes " , seenstats [ SS_NICKCHANGE ] ) ;
seen_report ( cmdparams , " %d Channel Joins " , seenstats [ SS_JOIN ] ) ;
seen_report ( cmdparams , " %d Channel Parts " , seenstats [ SS_PART ] ) ;
seen_report ( cmdparams , " %d Channel Kicks " , seenstats [ SS_KICKED ] ) ;
2005-05-01 22:31:09 +00:00
seen_report ( cmdparams , " End Of Statistics " ) ;
2005-03-15 12:37:07 +00:00
return NS_SUCCESS ;
}