// Path: vilebot/src/main/java/com/oldterns/vilebot/util/BaseNick.java
// public class BaseNick
// {
//     // This would grab the leading x out of a nick that actually contains it
//     private static Pattern nickPattern = Pattern.compile( "(?:x|)([a-zA-Z0-9]+)(?:\\p{Punct}+[a-zA-Z0-9]*|)" );
// 
//     private static String primaryBotNick;
// 
//     private static Set<String> allBotNicks = new HashSet<>();
// 
//     public static String toBaseNick( String nick )
//     {
//         if ( allBotNicks.contains( nick ) )
//         {
//             nick = primaryBotNick;
//         }
//         else
//         {
//             Matcher nickMatcher = nickPattern.matcher( nick );
// 
//             if ( nickMatcher.find() )
//             {
//                 return nickMatcher.group( 1 );
//             }
//         }
//         return nick;
//     }
// 
//     public static String getPrimaryBotNick()
//     {
//         return primaryBotNick;
//     }
// 
//     public static void setPrimaryBotNick( String primaryNick )
//     {
//         primaryBotNick = primaryNick;
//     }
// 
//     public static Set<String> getBotNicks()
//     {
//         return allBotNicks;
//     }
// 
//     public static void addBotNick( String nick )
//     {
//         allBotNicks.add( nick );
//     }
// }
// 
// Path: vilebot/src/main/java/com/oldterns/vilebot/util/Ignore.java
// public class Ignore
// {
//     private static Set<String> onJoin = new ConcurrentSkipListSet<String>();
// 
//     private static Set<String> autoOp = new ConcurrentSkipListSet<String>();
// 
//     public static Set<String> getOnJoin()
//     {
//         return onJoin;
//     }
// 
//     public static Set<String> getAutoOp()
//     {
//         return autoOp;
//     }
// 
//     public static void addOnJoin( String nick )
//     {
//         onJoin.add( nick );
//     }
// 
//     public static void addAutoOp( String channel )
//     {
//         autoOp.add( channel );
//     }
// }


import com.oldterns.vilebot.db.LastSeenDB;
import com.oldterns.vilebot.util.BaseNick;
import com.oldterns.vilebot.util.Ignore;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.events.JoinEvent;
import org.pircbotx.hooks.types.GenericMessageEvent;
import org.pircbotx.output.OutputIRC;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
package com.oldterns.vilebot.handlers.user;



public class LastSeen
    extends ListenerAdapter
{

    private static TimeZone timeZone = TimeZone.getTimeZone( "America/Toronto" );

    private static DateFormat dateFormat = makeDateFormat();

    @Override
    public void onGenericMessage( final GenericMessageEvent event )
    {
        String userNick = BaseNick.toBaseNick( event.getUser().getNick() );
        String botNick = event.getBot().getNick();

        if ( !botNick.equals( userNick ) )
        {
            LastSeenDB.updateLastSeenTime( userNick );
        }

        if ( event instanceof JoinEvent && !botNick.equals( userNick ) && !Ignore.getOnJoin().contains( userNick ) )
        {
            longTimeNoSee( (JoinEvent) event, userNick );
        }
    }

    private void longTimeNoSee( JoinEvent event, String joiner )
    {
        OutputIRC outputQ = event.getBot().send();
        String replyTarget = event.getChannel().getName();

        long lastSeen = LastSeenDB.getLastSeenTime( joiner );
        long now = System.currentTimeMillis();
        long timeAgo = now - lastSeen;

// Path: vilebot/src/main/java/com/oldterns/vilebot/util/BaseNick.java
// public class BaseNick
// {
//     // This would grab the leading x out of a nick that actually contains it
//     private static Pattern nickPattern = Pattern.compile( "(?:x|)([a-zA-Z0-9]+)(?:\\p{Punct}+[a-zA-Z0-9]*|)" );
// 
//     private static String primaryBotNick;
// 
//     private static Set<String> allBotNicks = new HashSet<>();
// 
//     public static String toBaseNick( String nick )
//     {
//         if ( allBotNicks.contains( nick ) )
//         {
//             nick = primaryBotNick;
//         }
//         else
//         {
//             Matcher nickMatcher = nickPattern.matcher( nick );
// 
//             if ( nickMatcher.find() )
//             {
//                 return nickMatcher.group( 1 );
//             }
//         }
//         return nick;
//     }
// 
//     public static String getPrimaryBotNick()
//     {
//         return primaryBotNick;
//     }
// 
//     public static void setPrimaryBotNick( String primaryNick )
//     {
//         primaryBotNick = primaryNick;
//     }
// 
//     public static Set<String> getBotNicks()
//     {
//         return allBotNicks;
//     }
// 
//     public static void addBotNick( String nick )
//     {
//         allBotNicks.add( nick );
//     }
// }
// 
// Path: vilebot/src/main/java/com/oldterns/vilebot/util/Ignore.java
// public class Ignore
// {
//     private static Set<String> onJoin = new ConcurrentSkipListSet<String>();
// 
//     private static Set<String> autoOp = new ConcurrentSkipListSet<String>();
// 
//     public static Set<String> getOnJoin()
//     {
//         return onJoin;
//     }
// 
//     public static Set<String> getAutoOp()
//     {
//         return autoOp;
//     }
// 
//     public static void addOnJoin( String nick )
//     {
//         onJoin.add( nick );
//     }
// 
//     public static void addAutoOp( String channel )
//     {
//         autoOp.add( channel );
//     }
// }


// Path: vilebot/src/main/java/com/oldterns/vilebot/handlers/user/LastSeen.java
import com.oldterns.vilebot.db.LastSeenDB;
import com.oldterns.vilebot.util.BaseNick;
import com.oldterns.vilebot.util.Ignore;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.events.JoinEvent;
import org.pircbotx.hooks.types.GenericMessageEvent;
import org.pircbotx.output.OutputIRC;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

package com.oldterns.vilebot.handlers.user;



public class LastSeen
    extends ListenerAdapter
{

    private static TimeZone timeZone = TimeZone.getTimeZone( "America/Toronto" );

    private static DateFormat dateFormat = makeDateFormat();

    @Override
    public void onGenericMessage( final GenericMessageEvent event )
    {
        String userNick = BaseNick.toBaseNick( event.getUser().getNick() );
        String botNick = event.getBot().getNick();

        if ( !botNick.equals( userNick ) )
        {
            LastSeenDB.updateLastSeenTime( userNick );
        }

        if ( event instanceof JoinEvent && !botNick.equals( userNick ) && !Ignore.getOnJoin().contains( userNick ) )
        {
            longTimeNoSee( (JoinEvent) event, userNick );
        }
    }

    private void longTimeNoSee( JoinEvent event, String joiner )
    {
        OutputIRC outputQ = event.getBot().send();
        String replyTarget = event.getChannel().getName();

        long lastSeen = LastSeenDB.getLastSeenTime( joiner );
        long now = System.currentTimeMillis();
        long timeAgo = now - lastSeen;

        long daysAgo = TimeUnit.MILLISECONDS.toDays( timeAgo );