#!/usr/bin/env python

#--------------------------------------------------------------------
# twit-growl: read your twitter put it in growl
#--------------------------------------------------------------------
# (c) Patrick Mueller - pmuellr@yahoo.com
# license: public domain
#--------------------------------------------------------------------
# 2007-03-22 initial release
#--------------------------------------------------------------------

import os
import sys
import shutil
import simplejson

#--------------------------------------------------------------------
# uses:
#    growlnotify
#    wget
#    simplejson - http://undefined.org/python/#simplejson
#
# files:
#    ~/.twit-growl          - directory for config, cached info 
#    ~/.twit-growl/passwd   - file with userid:password on first line 
#--------------------------------------------------------------------

#--------------------------------------------------------------------
# print an error message and leave
#--------------------------------------------------------------------
def error(message):
	print message
	sys.exit(1)

#--------------------------------------------------------------------
# main program
#--------------------------------------------------------------------

# directory where all the goodies are stored
workDir = os.path.expanduser("~/.twit-growl")

# read the passwd file
iFileName = "%s/passwd" % workDir
if (not os.path.exists(iFileName)):
	error("File not found: %s" % iFileName)

iFile = file(iFileName)
line = iFile.readline().strip()
iFile.close()

userPass = line.split(':')
if (2 != len(userPass)):
	error("File %s expected to contain userid:password on the first line." % iFileName)
	
user   = userPass[0]
passwd = userPass[1]

# make sure the images and messages directories exist
imageDir   = "%s/images"   % workDir
messageDir = "%s/messages" % workDir

if (not os.path.exists(imageDir)):   os.mkdir(imageDir)
if (not os.path.exists(messageDir)): os.mkdir(messageDir)

# read the latest gossip

oFileName = "%s/friends_timeline.json" % workDir

if (os.path.exists(oFileName)): os.unlink(oFileName)

tmpFileName = "messages.json"
if (os.path.exists(tmpFileName)):
	shutil.copyfile(tmpFileName, oFileName)
else:
	os.spawnlp(os.P_WAIT, "curl", 
		"curl", 
		"-o", 
		oFileName,
		"http://%s:%s@twitter.com/statuses/friends_timeline.json" % (user, passwd)
		)

if (not os.path.exists(oFileName)):
	error("Error during twitter download")

oFile = file(oFileName)
contents = oFile.read()
oFile.close()

messageList = simplejson.loads(contents)

for message in messageList:

	messageText   = message["text"]
	messageId     = message["id"]
	messageUser   = message["user"]["name"]
	messageUserid = message["user"]["id"]
	messageImage  = message["user"]["profile_image_url"]

	imageFile   = "%s/%s.jpg"  % (imageDir,   messageUserid)
	messageFile = "%s/%s.json" % (messageDir, messageId)
	
	if (not os.path.exists(imageFile)):
		cmd = "curl -o %s %s" % (imageFile, messageImage)
		os.system(cmd)
		
	if (not os.path.exists(messageFile)):
		messageJson = simplejson.dumps(message)
		oFile = file(messageFile, "w")
		oFile.write(messageJson)
		oFile.close();
	
		print "added:"
		print 
		print "message: %d: %s (%d)" % (messageId, messageUser, messageUserid) 
		print "   image: %s" % messageImage
		print messageText
		
		titleText   = "twitter from %s" % messageUser
		os.spawnlp(os.P_WAIT, "/usr/local/bin/growlnotify",
			"/usr/local/bin/growlnotify",
			"--name",
			"twit-growl",
			"--message",
			messageText,
			"--image",
			imageFile,
			titleText
			)
	