#
# Simple seen type script
#

##############################################
# LICENSE: 
# This code is bound to be ugly, have mistakes,
# and generally just be plain _wrong_.
#
# What do you care though?  It works, and you
# got it for free. ;-)  Feel free to make any
# changes and re-release. Just keep this header
# in your source..
#
# Original version by mak at kha0s dot org
##############################################


# import what we need
import XChat
import string
import DateTime
import sys

# setup some common instance stuff
offline_list = {}
script_name = "seen"
script_version = "v0.2"
script_desc = "Simple seen script.  Keeps track of users while you are online"

# Semi-private methods
def getSession(chan, serv):
       	try:  
	    sess = XChat.Session()
	    sess.set(serv.info()['hostname'], serv.info()['port'], serv.info()['nick'], chan)
	except:
	    userSession.print_text("Couldn't lock current session, defaulting to users session..")
	    return userSession
	return sess

def getTimeElapsed(fromTime):
	timeString = ""
	timeElapsed = DateTime.now() - fromTime
	hours = timeElapsed.strftime('%H')
	minutes =  timeElapsed.strftime('%M')
	seconds = timeElapsed.strftime('%S')
	if hours != "00" : timeString = timeString + "%s hours " % hours
	if minutes != "00" : timeString  = timeString + "%s minutes " % minutes
	if seconds != "00" : timeString = timeString + "%s seconds " % seconds
	timeString=timeString+"ago"
	return timeString
	

def isOnline(nick,chan,serv):
	sess = getSession(chan, serv)
	for tmpnick in sess.get_users().keys():
	    if string.lower(nick) == string.lower(tmpnick):
		return 1
	return 0

def isOffline(nick):
	for tmpnick in offline_list.keys():
	    if string.lower(nick) == string.lower(tmpnick):
		return 1
	return 0
		
# Here come our IRC handlers
def partreason_handler(name, flags, args):
	sess = args[0].get_session()
	nick = args[1].get_string()
	ip = args[2].get_string()
	chan = args[3].get_string()
	message = args[4].get_string()
	offline_list[string.lower(nick)] = [chan, sess.info()['servername'], message, DateTime.now()]
	return

def part_handler(name, flags, args):
	sess = args[0].get_session()
	nick = args[1].get_string()
	ip = args[2].get_string()
	chan = args[3].get_string()
	message = "Parted channel %s" % chan
	offline_list[string.lower(nick)] = [chan, sess.info()['servername'], message, DateTime.now()]
	return

def quit_handler(name, flags, args):
	try:
	   chan = "#" + string.split(args[0].get_string(), "#")[-1]
	except:
	   chan = args[0].get_string()
	nick = args[1].get_string()
	message = args[2].get_string()
	sess = Xob.get_current_session()
	offline_list[string.lower(nick)] = [chan, sess.info()['servername'], message, DateTime.now()]
	return

def seen_listener(name, flags, args):
	serv = args[0].get_server()
	chan = args[1].get_string()
	nick = args[2].get_string()
	message = args[3].get_string()
	if string.find(string.split(message)[0], "seen") != -1:
	    sess = getSession(chan, serv)
	    findNick = string.split(message)[1]
	    if string.lower(nick) == string.lower(findNick):
		sess.handle_cmd (nick + ": Trying to find oneself requires zen.")
	    elif string.lower(findNick) == string.lower(sess.info()['nick']):
	        sess.handle_cmd (nick + ": Umm..you wouldn't be seeing this unless I was online") 
	    elif isOnline(findNick, chan, serv): 	
		sess.handle_cmd (nick + ": Open your eyes dude.. %s is on %s(%s) right now!" % (findNick, sess.info()['channel'], sess.info()['servername']))
	    elif isOffline(findNick):
		offline_data = offline_list[string.lower(findNick)]
		timeElapsed = getTimeElapsed(offline_data[3])
		sess.handle_cmd (nick + ": %s was last on %s(%s) at %s (%s) leaving with reason: %s" %(findNick, offline_data[0], offline_data[1], offline_data[3], timeElapsed, offline_data[2]))
	    else:
		sess.handle_cmd (nick + ": Sorry, I've never seen %s" % findNick)
	return

# Now let's set up some stuff
Xob = XChat.XChat()
Xob.register(script_name +"-"+ script_version, script_desc)
Xob.hook_signal("XP_TE_PART", part_handler)
Xob.hook_signal("XP_TE_PARTREASON", partreason_handler)
Xob.hook_signal("XP_TE_QUIT", quit_handler)
Xob.hook_signal("XP_CHANMSG", seen_listener)
userSession = Xob.get_current_session()

# Got this far, we must be loaded
userSession.print_text("\0035:: Loaded %s (%s) ::\003\n" %(script_name, script_version))

