#!/usr/bin/env python
#pidgintwitter from tomhodson.com v0.2
import dbus, gobject, httplib, urllib, base64, getpass, time, threading, dbus.glib
from dbus.mainloop.glib import DBusGMainLoop

banlist = [ 'nasty@tomhodson.com' ] #add people here seperated with ","'s
#emails on this list will appear by their email and not their alias

perdaylimit = 50
#this is the limit of texts per day (note: if program is restarted so is the counter)

queue = [ 'blank', 'blank', 'blank', 'blank', 'blank', 'blank', 'blank', 'blank', 'blank', 'blank' ]
queue2 = [ 0,0,0,0,0,0,0,0,0,0]
count = [ 0 ]
def activeaccount():
	account = purple.PurpleAccountsGetAllActive()
	j=0
	while purple.PurpleAccountGetProtocolName(account[j])!="MSN":
		j+=1
		if j != len(account): break
	name = purple.PurpleAccountGetUsername(account[j])
	return name

def updateTwitter(username, passwd, statusmsg):
	statusmsg = statusmsg.encode('ascii','ignore')
	if len(statusmsg) > 140:
		statusmsg = statusmsg[:140]
	# Generate Twitter authentication header string
	auth = {"Authorization": "Basic %s" % base64.encodestring("%s:%s" % (username, passwd)).strip()}

	# Create a connection to the Twitter web site

	connection = httplib.HTTPConnection("twitter.com", 80)
	# Use Twitter's REST API to post a status update
	connection.request("POST", "/statuses/update.xml", urllib.urlencode({"status":statusmsg}), auth)
	return

def sendmessage(text, acct, conversation):
#  	conv2 = purple.PurpleGetConversations()
#  	if conv2.count(conversation) != 1:
#  		acct, conversation = createconv(acct, )
	ims = purple.PurpleConversationGetImData(conversation)
	purple.PurpleConvImSend(ims, text)
	return

def createconv(acct, name):
	conv = purple.PurpleConversationNew(1,acct,name)
	trans = purple.PurpleConvIm(conv)
	return trans, conv

def stripper(message):
	mode = 0
	out = ''
	for letter in message:
		if mode == 0:
			if letter == '<':
				mode = 1
			else:
				out+=letter
		else:
			if letter == '>':
				mode = 0
	return out
def catcher(account, sender, message, conversation, flags):
	thread1 = threading.Thread(target=immsg, args=(account, sender, message, conversation, flags))
	thread1.start()
	return
def immsg(account, sender, message, conversation, flags):
	status = purple.PurpleSavedstatusGetCurrent()
	if purple.PurpleSavedstatusGetType(status) != 2:
		bud = purple.PurpleFindBuddy(account, sender)
		name2 = purple.PurpleBuddyGetAlias(bud)
		name = purple.PurpleBuddyGetName(bud)
		if conversation == 0:
			yout = purple.PurpleGetConversations()
			for pigs in yout:
				if name == purple.PurpleConversationGetName(pigs): conversation = pigs
		if count[0]>perdaylimit:
			sendmessage('Todays sms limit reached, sorry! :(', account, conversation)
		else:
			queue.pop(-1)
			queue.reverse()
			queue.append(sender)
			queue.reverse()
			if queue.count(sender) > 4:
				if queue.count(sender > 8):
					sendmessage('Flood attempt, wait a while and try again later', account, conversation)
					count[0]= count[0] + 1
					return
				queue.reverse()
				a = time.gmtime()
				b = queue.index(sender)
				queue.reverse()
				if a[4] - queue2[b] < 10:
					sendmessage('Flood attempt, wait a while and try again later', account, conversation)
					return
			message = stripper(message)
			if len(name2)-10 > len(name) or banlist.count(name) != 0:
				name2=name
			updateTwitter(accountname, password, name2 + "\n" + message)
			sendmessage('Your message has been forwarded to my mobile! :)', account, conversation)
			a = time.gmtime()
			queue2.pop(-1)
			queue2.reverse()
			queue2.append(a[4])
			queue2.reverse()
			count[0]= count[0] + 1
		return

accountname = raw_input('Username: ')
password = getpass.getpass()

DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")

# pig = purple.PurpleGetConversations()
# ims = purple.PurpleConvIm(pig[0])
# acct = purple.PurpleConversationGetAccount(pig[0]) 
# while True:
# 	r = raw_input('> ')
# 	sendmessage(r, ims, acct)
bus.add_signal_receiver(catcher,
		dbus_interface="im.pidgin.purple.PurpleInterface",
		signal_name="ReceivedImMsg")

gobject.threads_init()
dbus.glib.init_threads()

loop = gobject.MainLoop()
loop.run()






