Advertisement
Guest User

Untitled

a guest
Jun 9th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.64 KB | None | 0 0
  1. #!/usr/bin/env python2.5
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Copyright (c) 2010 Benoî HERVIER
  5. # Licenced under GPLv3
  6.  
  7. """A simple Twitter client made with pyqt4"""
  8.  
  9. from PyQt4.QtGui import *
  10. from PyQt4.QtCore import *
  11. from PyQt4.QtMaemo5 import *
  12.  
  13. import twitter
  14. import sys
  15. import os.path
  16. from urllib import urlretrieve
  17. import pickle
  18.  
  19. __version__ = '0.0.1'
  20. AVATAR_CACHE_FOLDER = os.path.join(os.path.expanduser("~"),'.khweeteur','cache')
  21. CACHE_PATH = os.path.join(os.path.expanduser("~"),'.khweeteur','tweets.cache')
  22.  
  23. class KhweeteurWorker(QThread):
  24.     def __init__(self, parent = None):
  25.         QThread.__init__(self, parent)
  26.         self.settings = QSettings()
  27.        
  28.     def run(self):
  29.         self.refresh_timeline()
  30.        
  31.     def downloadProfileImage(self,status):
  32.         if type(status)!=twitter.DirectMessage:
  33.             cache = os.path.join(AVATAR_CACHE_FOLDER,os.path.basename(status.user.profile_image_url))
  34.             if not(os.path.exists(cache)):
  35.                 urlretrieve(status.user.profile_image_url, cache)
  36.    
  37.     def refresh_timeline(self):
  38.         print 'Try to refresh'
  39.         mlist = []
  40.         avatars_url={}
  41.         api = twitter.Api(username=self.settings.value("login").toString(), password=self.settings.value("password").toString())
  42.         for status in api.GetFriendsTimeline(count=100):
  43.             mlist.append((status.created_at_in_seconds,status))
  44.         for status in api.GetReplies():
  45.             mlist.append((status.created_at_in_seconds,status))
  46.         for status in api.GetDirectMessages():
  47.             mlist.append((status.created_at_in_seconds,status))
  48.         mlist.sort()
  49.         mlist.reverse()
  50.  
  51.         #DOwnload avatar & add tweet to the model
  52.         for _,status in mlist:
  53.             self.downloadProfileImage(status)
  54.             #We are now in a thread
  55.             #self.tweetsModel.addStatus((_,status))
  56.             self.emit(SIGNAL("newStatus(QVariant)"),QVariant((_,status)))
  57.  
  58.            
  59.         #Serialize
  60.         #self.tweetsModel.serialize()
  61.  
  62. class KhweetsModel(QAbstractListModel):
  63.     def __init__(self, mlist=[]):
  64.         QAbstractListModel.__init__(self)
  65.  
  66.         # Cache the passed data list as a class member.
  67.         self._items = mlist
  68.  
  69.     def rowCount(self, parent = QModelIndex()):
  70.         return len(self._items)
  71.  
  72.     def addStatus(self,variant):
  73.         status_with_secondstamp = variant.toPyObject()
  74.         if status_with_secondstamp not in self._items:
  75.             self._items.insert(0,status_with_secondstamp)
  76.             QObject.emit(self, SIGNAL("dataChanged(const QModelIndex&, const QModelIndex &)"), self.createIndex(0,0), self.createIndex(0,len(self._items)))
  77.        
  78.     def setData(self,mlist):
  79.         self._items = mlist
  80.  
  81.         QObject.emit(self, SIGNAL("dataChanged(const QModelIndex&, const QModelIndex &)"), self.createIndex(0,0), self.createIndex(0,len(self._items)))
  82.    
  83.     def serialize(self):
  84.         output = open(CACHE_PATH, 'wb')
  85.         pickle.dump(self._items, output)
  86.         output.close()        
  87.        
  88.     def unSerialize(self):
  89.         try:
  90.             pkl_file = open(CACHE_PATH, 'rb')
  91.             self._items = pickle.load(pkl_file)
  92.         finally:
  93.             pkl_file.close()        
  94.             self._items.sort()
  95.             self._items.reverse()
  96.             QObject.emit(self, SIGNAL("dataChanged(const QModelIndex&, const QModelIndex &)"), self.createIndex(0,0), self.createIndex(0,len(self._items)))
  97.  
  98.     def data(self, index, role = Qt.DisplayRole):        
  99.         if role == Qt.DisplayRole:
  100.             return QVariant(self._items[index.row()][1].text)
  101.         elif role == Qt.DecorationRole:
  102.                 try:
  103.                     # return an icon, if the decoration role is used
  104.                     icon = os.path.join(AVATAR_CACHE_FOLDER,os.path.basename(self._items[index.row()][1].user.profile_image_url))
  105.                     return QVariant(QIcon(icon))
  106.                 except:
  107.                     return QVariant()
  108.         elif role == Qt.BackgroundRole:
  109.             if index.row() % 2 == 0:
  110.                 return QVariant(QColor(Qt.gray))
  111.             else:
  112.                 return QVariant(QColor(Qt.lightGray))
  113.         else:
  114.            return QVariant()
  115.  
  116. class KhweetsView(QListView):
  117.     def __init__(self,parent=None):
  118.         QListView.__init__(self,parent)
  119.         self.setIconSize(QSize(64, 64))
  120.         self.setWordWrap(True)
  121. #        self.setMaximumWidth(736)
  122. #        self.setWrapping(True)
  123.         self.setResizeMode(QListView.Adjust)
  124. #        self.setFlow(QListView.LeftToRight)
  125.         self.setViewMode(QListView.ListMode)
  126.         self.setUniformItemSizes(True)
  127.        
  128. class KhweeteurPref(QMainWindow):
  129.     def __init__(self, parent=None):
  130.         QMainWindow.__init__(self,parent)
  131.         self.parent = parent
  132.  
  133.         self.setAttribute(Qt.WA_Maemo5AutoOrientation, True)
  134.         self.setAttribute(Qt.WA_Maemo5StackedWindow, True)
  135.         self.setWindowTitle("Khweeteur")
  136.  
  137.         self.settings = QSettings()
  138.        
  139.         self.setupGUI()
  140.         self.loadPrefs()
  141.        
  142.     def loadPrefs(self):
  143.         self.login_value.setText(self.settings.value("login").toString())
  144.         self.password_value.setText(self.settings.value("password").toString())
  145.         self.refresh_value.setValue(self.settings.value("refreshInterval").toInt()[0])
  146.  
  147.     def savePrefs(self):
  148.         self.settings.setValue('login',self.login_value.text())
  149.         self.settings.setValue('password',self.password_value.text())
  150.         self.settings.setValue('refreshInterval',self.refresh_value.value())
  151.  
  152.     def closeEvent(self,widget,*args):
  153.         self.savePrefs()
  154.                      
  155.     def setupGUI(self):
  156.         self.aWidget = QWidget()
  157.         self._main_layout = QGridLayout(self.aWidget)
  158.  
  159.         self._main_layout.addWidget(QLabel('Login :'),0,0)
  160.         self.login_value = QLineEdit()
  161.         self._main_layout.addWidget(self.login_value,0,1)
  162.                
  163.         self._main_layout.addWidget(QLabel('Password :'),1,0)
  164.         self.password_value = QLineEdit()
  165.         self._main_layout.addWidget(self.password_value,1,1)
  166.  
  167.         self._main_layout.addWidget(QLabel('Refresh Interval (Minutes) :'),2,0)
  168.         self.refresh_value = QSpinBox()
  169.         self._main_layout.addWidget(self.refresh_value,2,1)
  170.  
  171.         self.aWidget.setLayout(self._main_layout)
  172.         self.setCentralWidget(self.aWidget)
  173.                
  174.  
  175. class KhweeteurWin(QMainWindow):
  176.     def __init__(self, parent=None):
  177.         QMainWindow.__init__(self,None)
  178.         self.parent = parent
  179.  
  180.         self.setAttribute(Qt.WA_Maemo5AutoOrientation, True)
  181.         self.setAttribute(Qt.WA_Maemo5StackedWindow, True)
  182.         self.setWindowTitle("Khweeteur")
  183.         self.setupMenu()
  184.         self.setupMain()
  185.        
  186.         self.worker = KhweeteurWorker()
  187.         self.connect(self.worker, SIGNAL("newStatus(QVariant)"), self.tweetsModel.addStatus)
  188.  
  189.         self.settings = QSettings()
  190.  
  191.     def setupMain(self):
  192.        
  193.         self.tweetsView = KhweetsView()
  194.         self.connect(self.tweetsView,SIGNAL('doubleClicked(const QModelIndex&)'),self.reply)
  195.         self.tweetsModel = KhweetsModel([])
  196.         self.tweetsView.setModel(self.tweetsModel)        
  197.         self.setCentralWidget(self.tweetsView)
  198.         self.tweetsModel.unSerialize()
  199.        
  200.         self.toolbar = self.addToolBar('Toolbar')
  201.  
  202.         self.tb_refresh = QAction('Refresh', self)
  203.         self.connect(self.tb_refresh, SIGNAL('triggered()'), self.refresh_timeline)
  204.         self.toolbar.addAction(self.tb_refresh)
  205.  
  206.         self.tb_text = QLineEdit()
  207.         self.toolbar.addWidget(self.tb_text)
  208.  
  209.         self.tb_tweet = QAction('Tweet', self)
  210.         self.connect(self.tb_tweet, SIGNAL('triggered()'), self.tweet)
  211.         self.toolbar.addAction(self.tb_tweet)
  212.  
  213.     def reply(self,index):        
  214.         self.tb_text.setText('@'+self.tweetsModel._items[index.row()][1].user.screen_name)
  215.                
  216.     def tweet(self):
  217.         print 'try to tweet'
  218.         try:
  219.             api = twitter.Api(username=self.settings.value("login").toString(), password=self.settings.value("password").toString())
  220.             api.SetSource('Khweeteur')
  221.             status = api.PostUpdate(self.tb_text.text())
  222.             self.tb_text.setText('')
  223.         except StandardError,e:            
  224.             print e
  225.    
  226.     # def downloadProfileImage(self,status):
  227.         # if type(status)!=twitter.DirectMessage:
  228.             # cache = os.path.join(AVATAR_CACHE_FOLDER,os.path.basename(status.user.profile_image_url))
  229.             # if not(os.path.exists(cache)):
  230.                 # urlretrieve(status.user.profile_image_url, cache)
  231.    
  232.     def refresh_timeline(self):
  233.         self.worker.start()
  234.        
  235.     # def refresh_timeline(self):
  236.         # print 'Try to refresh'
  237.         # mlist = []
  238.         # avatars_url={}
  239.         # api = twitter.Api(username=self.settings.value("login").toString(), password=self.settings.value("password").toString())
  240.         # for status in api.GetFriendsTimeline(count=100):
  241.             # mlist.append((status.created_at_in_seconds,status))
  242.         # for status in api.GetReplies():
  243.             # mlist.append((status.created_at_in_seconds,status))
  244.         # for status in api.GetDirectMessages():
  245.             # mlist.append((status.created_at_in_seconds,status))
  246.         # mlist.sort()
  247.         # mlist.reverse()
  248.  
  249.         #DOwnload avatar & add tweet to the model
  250.         # for _,status in mlist:
  251.             # self.downloadProfileImage(status)
  252.             # self.tweetsModel.addStatus((_,status))
  253.            
  254.         #Serialize
  255.         # self.tweetsModel.serialize()
  256.            
  257. #        self.tweetsModel.setData(mlist)
  258.                                
  259.     def setupMenu(self):
  260.         fileMenu = QMenu(self.tr("&Menu"), self)
  261.         self.menuBar().addMenu(fileMenu)
  262.  
  263.         fileMenu.addAction(self.tr("&Preferences"), self.do_show_pref,
  264.                 QKeySequence(self.tr("Ctrl+P", "Preferences")))
  265.         fileMenu.addAction(self.tr("&About"), self.do_about)
  266.        
  267.     def do_show_pref(self):
  268.         self.pref_win = KhweeteurPref(self)
  269.         self.pref_win.show()
  270.        
  271.     def do_about(self):
  272.         pass
  273.                
  274. class Khweeteur(QApplication):
  275.     def __init__(self):
  276.         QApplication.__init__(self,sys.argv)
  277.         self.setOrganizationName("Khertan Software")
  278.         self.setOrganizationDomain("khertan.net")
  279.         self.setApplicationName("Khweeteur")
  280.         self.version = __version__
  281.         self.run()
  282.  
  283.     def run(self):
  284.         self.win = KhweeteurWin()
  285.         self.win.show()        
  286.         sys.exit(self.exec_())
  287.  
  288. if __name__ == '__main__':
  289.     Khweeteur()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement