package javabot;
import java.io.*;
import java.util.*;
/**
* Simple parser for InfoBot factoid files
* TODO: recursive loading of "factoids" dir
*
* This is actually a really crappy way of doing this, generating the database
* from a flatfile at runtime, but it was the quickest thing I could think of.
* Sue me.
*
* @author dydx
*/
public class Factoids
{
private static Map database;
/**
* Generate a small database of facts to be searchable by users in IRC
*
* This is actually a main feature of my bot, and I am pondering making
* a recursive include for the .fact files, so that I could just enter
* the location (directory) of several files and have it compile them
* all into the database.
*
* Or maybe create a new instance of Factoids for every subject area?
* Factoids sports = new Factoids( "sports.fact" );
* Factoids movies = new Factoids( "movies.fact" );
* etc etc etc
*
* then just create new regex based string searching to differentiate
*
* @param file
*/
Factoids( String file )
{
try {
String root = System.getProperty( "user.dir" );//get docroot
String filename = root + File.separator + file;
database = getDatabase( filename );//get our database!
} catch( Exception e ) {
System.err.println( "Please check the path to the .fact file to make sure it is correct." );
}
}
/**
* Create a BufferedReader from given filepath
*
* @param filepath
* @return
*/
private static BufferedReader getReader( String filepath )
{
filepath = filepath.replace( '/', File.separatorChar );
try {
BufferedReader reader = new BufferedReader(
new FileReader( filepath) );
return reader;
} catch( FileNotFoundException e ) {
System.err.println( "File Not Found at: " + filepath );
return null;
}
}
/**
* Parse .fact files and create miniature database(HashMap) from it
*
* @param reader
* @return
*/
private static Map getDatabase( String filepath )
{
try {
BufferedReader reader = getReader( filepath );//create this on a more local level
Map _database = new HashMap();//our local database
String line;
while( ( line = reader.readLine() ) != null )
{
String[] data = line.split( " => " );// .fact files are "key => value"
_database.put( data[0], data[1] );//populate the database
}
return _database;//this will be referenced over to the main database
} catch( NullPointerException e ) {
//3 hours of recoding to try to figure out why i was getting a NullPointerException.
System.err.println( "Check fact file for extraneous whitespace or newlines" );
//Turns out it was an issue with the .fact file i was using to test with
return null;
} catch( IOException e ) {
System.err.println( "There was an issue generating the database" );
return null;
}
}
/**
* public accessible method for querying the database
*
* @param search
* @return
*/
public String query( String search )
{
String recordset = (String)database.get( search );
if( recordset != null )
return search + ": " + recordset;
else
return "Search Term \""+ search + "\" Not Found";
}
}