# -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui import KTUtil import KTThreads import KTWidgets class KickTweet( QtGui.QApplication ): def __init__ ( self, args ): QtGui.QApplication.__init__(self, args); # Thread self.worker = KTThreads.Twitter( None, "KickTweet" ); self.worker.start(); QtCore.QObject.connect( self.worker, QtCore.SIGNAL( "done( bool, PyQt_PyObject )" ), self.workerDone, QtCore.Qt.QueuedConnection); # The user information from twitter self.user = None; self.Locked = False; self.TimelineTimer = None; # Windows and dialogs self.timelineWindow = KTWidgets.TimelineWindow(); self.timelineWorking = False; self.aboutDialog = KTWidgets.AboutWindow(); self.loginDialog = KTWidgets.LoginWindow(); self.connect( self.loginDialog, QtCore.SIGNAL( "PromptClose( bool, PyQt_PyObject )" ), self.doLogin ); self.tweetDialog = KTWidgets.TweetWindow(); self.connect( self.tweetDialog, QtCore.SIGNAL( "PromptClose( bool, PyQt_PyObject )" ), self.doTweet ); # Menus self.loggedOutMenu = QtGui.QMenu(); self.loginAction = self.loggedOutMenu.addAction( "Login" ); self.connect( self.loginAction, QtCore.SIGNAL( "triggered()" ), self.loginDialog.show ); aboutAction = self.loggedOutMenu.addAction( "About" ); self.connect( aboutAction, QtCore.SIGNAL( "triggered()" ), self.aboutDialog.show ); exitAction = self.loggedOutMenu.addAction( "Exit" ); self.connect( exitAction, QtCore.SIGNAL( "triggered()" ), self.quit ); self.loggedInMenu = QtGui.QMenu(); self.tweetAction = self.loggedInMenu.addAction( "Tweet" ); self.connect( self.tweetAction, QtCore.SIGNAL( "triggered()" ), self.tweetDialog.show ); self.updateAction = self.loggedInMenu.addAction( "Update" ); self.connect( self.updateAction, QtCore.SIGNAL( "triggered()" ), self.doTimeline ); logoutAction = self.loggedInMenu.addAction( "Logout" ); self.connect( logoutAction, QtCore.SIGNAL( "triggered()" ), self.doLogout ); aboutAction = self.loggedInMenu.addAction( "About" ); self.connect( aboutAction, QtCore.SIGNAL( "triggered()" ), self.aboutDialog.show ); exitAction = self.loggedInMenu.addAction( "Exit" ); self.connect( exitAction, QtCore.SIGNAL( "triggered()" ), self.quit ); # Tray icon self.tray = QtGui.QSystemTrayIcon( QtGui.QIcon( KTUtil.path( "resource/icon.png" ) ) ); self.tray.setContextMenu( self.loggedOutMenu ); self.connect( self.tray, QtCore.SIGNAL( "activated( QSystemTrayIcon::ActivationReason )" ), self.__icon_activated ); self.tray.show(); # Catch icon double click and show dialog or window def __icon_activated ( self, reason ): if reason == QtGui.QSystemTrayIcon.DoubleClick: if self.Locked: return; if None != self.user: if self.timelineWindow.isVisible(): self.timelineWindow.hide(); else: self.timelineWindow.show(); else: if self.loginDialog.isVisible(): self.loginDialog.hide(); else: self.loginDialog.show(); def Lock ( self ): self.Locked = True; self.loginAction.setEnabled( False ); self.tweetAction.setEnabled( False ); self.updateAction.setEnabled( False ); def UnLock ( self ): self.Locked = False; self.loginAction.setEnabled( True ); self.tweetAction.setEnabled( True ); self.updateAction.setEnabled( True ); #################[ Do ]################# def doLogin ( self, complete, values ): if complete: self.Lock(); self.tray.showMessage( "Logging In", "Please wait..." ); self.worker.action( "login", values ); def doLogout ( self ): self.Lock(); self.tray.showMessage( "Logging Out", "Please wait..." ); self.worker.action( "logout" ); self.tray.setContextMenu( self.loggedOutMenu ); def doTweet ( self, complete, values ): if complete: self.tray.showMessage( "Twitter Update", "Sending..." ); self.worker.action( "tweet", values ); def doTimeline ( self ): if False == self.timelineWorking: self.timelineWorking = True; self.worker.action( "timeline", [ KTUtil.getLastTimelineId( self.user['id'] ) ] ); ##############[ Callbacks ]############# # General callback, distributes to appropriate method def workerDone ( self, success, values ): if values[0] == "login": self.loginDone( success, values[1] ); elif values[0] == "tweet": self.tweetDone( success ); elif values[0] == "timeline": self.timelineDone( success, values[1] ); elif values[0] == "logout": self.logoutDone( success ); def logoutDone ( self, success ): if success: self.tray.showMessage( "Logged Out", "See you later." ); self.user = None; self.UnLock(); def loginDone ( self, success, user ): if success: self.tray.showMessage( "Logged In", "Success! Keep on tweetin`" ); self.tray.setContextMenu( self.loggedInMenu ); self.user = user; self.timelineWindow.preloadTimeline( self.user['id'] ); self.doTimeline(); self.TimelineTimer = QtCore.QTimer(); QtCore.QObject.connect( self.TimelineTimer, QtCore.SIGNAL( 'timeout()' ), self.doTimeline ); # 5 minutes = 1000ms * 60s * 5m self.TimelineTimer.start( 300000 ); else: self.tray.showMessage( "Log in failed.", "Could not log you in at this time." ); self.tray.setContextMenu( self.loggedOutMenu ); self.UnLock(); def tweetDone ( self, success ): if success: self.tray.showMessage( "Twitter Update", "Sent!" ); self.doTimeline(); else: self.tray.showMessage( "Twitter Update", "Uh oh, your tweet was not sent!" ); def timelineDone ( self, success, tweets ): self.timelineWorking = False; if success: if 0 == len( tweets ): return self.tray.showMessage( "Timeline Updated", "No New Tweets :-(" ); KTUtil.setLastTimelineId( self.user['id'], tweets[0]['id'] ); countTweets = self.timelineWindow.updateTimeline( tweets, self.user['id'] ); if 0 != countTweets: self.tray.showMessage( "Timeline Updated", str( countTweets ) + " New Tweets!" ); else: self.tray.showMessage( "Timeline Updated", "No New Tweets :-(" ); if __name__ == "__main__": app = KickTweet( sys.argv ); sys.exit( app.exec_() );