1
#include <libxml/xmlreader.h>
10
Stats() : sessions( 0 ), chats( 0 ), chatsThrough( 0 ), foundPrefixes( 0 ) { }
19
Stats Stats::stats = Stats();
22
tString ConvertXMLString( const xmlChar *x )
24
return tString( (const char *)x );
29
Session( int lineNumber ) :lineNumber_( lineNumber ), player_(), chatlog_() { }
31
void AddSaid( const tString & say , nTimeRolling time )
33
eChatSaidEntry entry( say, time, eChatMessageType_Public );
34
chatlog_.push_back( entry );
39
std::vector< eChatSaidEntry > chatlog_;
42
void TestSession( const Session & session )
44
Stats::stats.sessions += 1;
47
player.SetName( session.player_ );
49
for ( size_t i = 0; i < session.chatlog_.size(); i++)
51
Stats::stats.chats += 1;
53
const eChatSaidEntry & entry = session.chatlog_[i];
55
eChatPrefixSpamTester tester( &player, entry );
59
eChatPrefixSpamType typeOut;
61
if ( tester.Check( out, timeOut, typeOut ) )
63
if ( typeOut != eChatPrefixSpamType_Known )
65
std::cout << "Found from session starting at line number " << session.lineNumber_ << "\n\n";
66
Stats::stats.foundPrefixes += 1;
71
Stats::stats.chatsThrough += 1;
72
player.lastSaid_.AddSaid( entry );
77
void ProcessNode( xmlTextReaderPtr reader )
79
static Session currentSession( 0 );
81
int type = xmlTextReaderNodeType( reader );
83
if ( type == XML_READER_TYPE_END_ELEMENT && xmlStrEqual( xmlTextReaderConstName( reader ), BAD_CAST "Session" ) )
85
TestSession( currentSession );
88
if ( type != XML_READER_TYPE_ELEMENT )
91
if ( xmlStrEqual( xmlTextReaderConstName( reader ), BAD_CAST "Session" ) )
93
currentSession = Session( xmlTextReaderGetParserLineNumber( reader ) );
95
else if ( xmlStrEqual( xmlTextReaderConstName( reader ), BAD_CAST "Player" ) )
97
xmlChar *xmlPlayer = xmlTextReaderReadString( reader );
98
currentSession.player_ = ConvertXMLString( xmlPlayer );
101
else if ( xmlStrEqual( xmlTextReaderConstName( reader ), BAD_CAST "Said" ) )
103
xmlChar *xmlTime = xmlTextReaderGetAttribute( reader, BAD_CAST "time" );
104
xmlChar *xmlSaid = xmlTextReaderReadString( reader );
106
long time = atol( (const char *)xmlTime );
107
tString say = ConvertXMLString( xmlSaid );
109
currentSession.AddSaid( say, time );
116
bool Parse( const char *filename )
119
xmlTextReaderPtr reader = xmlNewTextReaderFilename( filename );
120
if ( reader != NULL )
122
status = xmlTextReaderRead( reader );
123
while ( status == 1 )
125
ProcessNode( reader );
126
status = xmlTextReaderRead(reader);
128
xmlFreeTextReader( reader );
132
std::cerr << "Parsing error\n";
138
std::cerr << "Unable to open '" << filename << "'\n";
145
int main( int argc, const char *argv[] )
149
std::cerr << "Usage: chat_prefix_test <chat.xml>\n";
153
int success = Parse( argv[1] ) ? 0 : 1;
155
std::cout << "chat_prefix_test done!\n";
156
std::cout << "Statistics:\n\tNumber of sessions tested: " << Stats::stats.sessions
157
<< "\n\tNumber of chats: " << Stats::stats.chats
158
<< "\n\tNumber of chats let through: " << Stats::stats.chatsThrough
159
<< "\n\tNumber of chats blocked: " << Stats::stats.chats - Stats::stats.chatsThrough
160
<< "\n\tNumber of chat prefixes found: " << Stats::stats.foundPrefixes << "\n";