pesterchum/updatecheck.py

133 lines
4.9 KiB
Python

# Adapted from Eco-Mono's F5Stuck RSS Client
from libs import feedparser
import pickle
import os
import threading
from time import mktime
from PyQt4 import QtCore, QtGui
class MSPAChecker(QtGui.QWidget):
def __init__(self, parent=None):
QtCore.QObject.__init__(self, parent)
self.mainwindow = parent
self.refreshRate = 30 # seconds
self.status = None
self.lock = False
self.timer = QtCore.QTimer(self)
self.connect(self.timer, QtCore.SIGNAL('timeout()'),
self, QtCore.SLOT('check_site_wrapper()'))
self.timer.start(1000*self.refreshRate)
def save_state(self):
try:
current_status = open("status_new.pkl","w")
pickle.dump(self.status, current_status)
current_status.close()
try:
os.rename("status.pkl","status_old.pkl")
except:
pass
try:
os.rename("status_new.pkl","status.pkl")
except:
if os.path.exists("status_old.pkl"):
os.rename("status_old.pkl","status.pkl")
raise
if os.path.exists("status_old.pkl"):
os.remove("status_old.pkl")
except Exception, e:
print e
msg = QtGui.QMessageBox(self)
msg.setText("Problems writing save file.")
msg.show()
@QtCore.pyqtSlot()
def check_site_wrapper(self):
if not self.mainwindow.config.checkMSPA():
return
if self.lock:
return
print "Checking MSPA updates..."
s = threading.Thread(target=self.check_site)
s.start()
def check_site(self):
rss = None
must_save = False
try:
self.lock = True
rss = feedparser.parse("http://www.mspaintadventures.com/rss/rss.xml")
except:
return
finally:
self.lock = False
if len(rss.entries) == 0:
return
entries = sorted(rss.entries,key=(lambda x: mktime(x.updated_parsed)))
if self.status == None:
self.status = {}
self.status['last_visited'] = {'pubdate':mktime(entries[-1].updated_parsed),'link':entries[-1].link}
self.status['last_seen'] = {'pubdate':mktime(entries[-1].updated_parsed),'link':entries[-1].link}
must_save = True
elif mktime(entries[-1].updated_parsed) > self.status['last_seen']['pubdate']:
#This is the first time the app itself has noticed this update.
self.status['last_seen'] = {'pubdate':mktime(entries[-1].updated_parsed),'link':entries[-1].link}
must_save = True
if self.status['last_seen']['pubdate'] > self.status['last_visited']['pubdate']:
if not hasattr(self, "mspa"):
self.mspa = None
if not self.mspa:
self.mspa = MSPAUpdateWindow(self.parent())
self.connect(self.mspa, QtCore.SIGNAL('accepted()'),
self, QtCore.SLOT('visit_site()'))
self.connect(self.mspa, QtCore.SIGNAL('rejected()'),
self, QtCore.SLOT('nothing()'))
self.mspa.show()
else:
#print "No new updates :("
pass
if must_save:
self.save_state()
@QtCore.pyqtSlot()
def visit_site(self):
print self.status['last_visited']['link']
QtGui.QDesktopServices.openUrl(QtCore.QUrl(self.status['last_visited']['link'], QtCore.QUrl.TolerantMode))
if self.status['last_seen']['pubdate'] > self.status['last_visited']['pubdate']:
#Visited for the first time. Untrip the icon and remember that we saw it.
self.status['last_visited'] = self.status['last_seen']
self.save_state()
self.mspa = None
@QtCore.pyqtSlot()
def nothing(self):
self.mspa = None
class MSPAUpdateWindow(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.mainwindow = parent
self.setStyleSheet(self.mainwindow.theme["main/defaultwindow/style"])
self.setWindowTitle("MSPA Update!")
self.setModal(False)
self.title = QtGui.QLabel("You have an unread MSPA update! :o)")
layout_0 = QtGui.QVBoxLayout()
layout_0.addWidget(self.title)
self.ok = QtGui.QPushButton("GO READ NOW!", self)
self.ok.setDefault(True)
self.connect(self.ok, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('accept()'))
self.cancel = QtGui.QPushButton("LATER", self)
self.connect(self.cancel, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('reject()'))
layout_2 = QtGui.QHBoxLayout()
layout_2.addWidget(self.cancel)
layout_2.addWidget(self.ok)
layout_0.addLayout(layout_2)
self.setLayout(layout_0)