Bug reporting system

This commit is contained in:
Kiooeht 2011-06-01 01:31:43 -07:00
parent 029cc95a16
commit aedb054d90
5 changed files with 358 additions and 209 deletions

View file

@ -37,6 +37,7 @@ CHANGELOG
* Check for Pesterchum updates - Kiooeht [evacipatedBox] * Check for Pesterchum updates - Kiooeht [evacipatedBox]
* Memo OP options: Secret, Invite-only, Mute - Kiooeht [evacipatedBox] * Memo OP options: Secret, Invite-only, Mute - Kiooeht [evacipatedBox]
* Notify user if channel blocks message - Kiooeht [evacipatedBox] * Notify user if channel blocks message - Kiooeht [evacipatedBox]
* Bug reporter - Kiooeht [evacipatedBox]
* Bug fixes * Bug fixes
* Logviewer updates - Kiooeht [evacipatedBox] * Logviewer updates - Kiooeht [evacipatedBox]
* Memo scrollbar thing - Kiooeht [evacipatedBox] * Memo scrollbar thing - Kiooeht [evacipatedBox]

View file

@ -10,6 +10,7 @@ Features
* More complex quirks: by-sound * More complex quirks: by-sound
* Spy mode * Spy mode
* Turn @ and # links on/off? * Turn @ and # links on/off?
* "someone has friended you" notifier
Bugs Bugs
---- ----

74
bugreport.py Normal file
View file

@ -0,0 +1,74 @@
from PyQt4 import QtGui, QtCore
import urllib
import version
class BugReporter(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("Report a Bug")
self.setModal(False)
self.title = QtGui.QLabel("Bug Report:")
layout_0 = QtGui.QVBoxLayout()
layout_0.addWidget(self.title)
layout_0.addWidget(QtGui.QLabel("Operating System (ex. Windows 7, Ubuntu 10.10):"))
self.os = QtGui.QLineEdit(self)
self.os.setStyleSheet("background:white; font-weight:bold; color:black; font-size: 10pt;")
layout_0.addWidget(self.os)
layout_0.addWidget(QtGui.QLabel("Description of bug:"))
descLabel = QtGui.QLabel("Include as much information as possible\n(theme, related options, what you were doing at the time, etc.)")
font = descLabel.font()
font.setPointSize(8)
descLabel.setFont(font)
layout_0.addWidget(descLabel)
self.textarea = QtGui.QTextEdit(self)
self.textarea.setStyleSheet("background:white; font-weight:normal; color:black; font-size: 10pt;")
layout_0.addWidget(self.textarea)
self.ok = QtGui.QPushButton("SEND", self)
self.ok.setDefault(True)
self.connect(self.ok, QtCore.SIGNAL('clicked()'),
self, QtCore.SLOT('sendReport()'))
self.cancel = QtGui.QPushButton("CANCEL", 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)
@QtCore.pyqtSlot()
def sendReport(self):
name = unicode(self.mainwindow.profile().handle)
os = unicode(self.os.text())
msg = unicode(self.textarea.toPlainText())
if len(os) <= 0 or len(msg) <= 0:
msgbox = QtGui.QMessageBox()
msgbox.setStyleSheet(self.mainwindow.theme["main/defaultwindow/style"])
msgbox.setText("You must fill out all fields first!")
msgbox.setStandardButtons(QtGui.QMessageBox.Ok)
ret = msgbox.exec_()
return
QtGui.QDialog.accept(self)
data = urllib.urlencode({"name":name, "version": version._pcVersion, "os":os, "msg":msg})
print "Sending..."
f = urllib.urlopen("http://distantsphere.com/pc/reporter.php", data)
text = f.read()
print text
if text == "success!":
print "Sent!"
else:
print "Problems ):"

View file

@ -5,218 +5,279 @@
# and/or modify it under the terms of the Do What The Fuck You Want # and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See # To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details. # http://sam.zoy.org/wtfpl/COPYING for more details.
import sys, traceback
error = 0
try:
import os, shutil
from stat import *
from string import Template
import os, sys, shutil _PLATFORM = sys.platform
from stat import * if _PLATFORM in ['win32','cygwin','darwin','os2','os2emx','riscos','atheos']:
from string import Template print "Whoa there buddy! This installation script isn't meant to be run on your OS."
_PLATFORM = sys.platform
if _PLATFORM in ['win32','cygwin','darwin','os2','os2emx','riscos','atheos']:
print "Whoa there buddy! This installation script isn't meant to be run on your OS."
exit()
if os.getuid() != 0:
print "This program must be run as root (sudo)."
exit()
_HOME = os.environ['HOME']
_USER = os.environ['SUDO_USER']
_UID = int(os.environ['SUDO_UID'])
_GID = int(os.environ['SUDO_GID'])
# fix home if it's root weirdness
if _HOME.find("root") != -1:
_HOME = "/home/"+_USER
def setPermissions(path):
os.chown(path, _UID, _GID)
for file_ in os.listdir(path):
filePath = os.path.join(path,file_)
if os.path.isdir(filePath):
setPermissions(filePath)
else:
os.chown(filePath, _UID, _GID)
def findPesterchum(path):
for f in os.listdir(path):
filePath = os.path.join(path, f)
if os.path.isdir(filePath):
if os.path.exists(filePath+"/pesterchum.py"):
return filePath
else:
a=findPesterchum(filePath)
if a: return a
elif f == "pesterchum.py":
return path
if not os.path.exists(_HOME+"/.pcInstallLoc"):
print "Welcome to the Pesterchum 3.14 Easy Installer (for Linux)!\n\
Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\
License: WTFPL\n\
\n\
Leaving an option blank will accept it's default [in brackets]\n\
Are you ready to begin your MAGICAL JOURNEY?!\n\
Of course you are!!! ::::D"
# ask user about things
while 1:
install = raw_input("Install location [~/.pesterchum]: ")
if install == "":
instLoc = _HOME+"/.pesterchum"
break
else:
if install[0] == "~":
install = _HOME+install[1:]
if os.path.exists(install[:install.rfind("/")]):
instLoc = install
break
print "No can do"
if os.path.exists("/usr/share/applications"):
while 1:
gnome = raw_input("Create a GNOME menu item? [Y/n]: ")
if gnome.lower() == "y" or gnome == "":
gnome = True;break
elif gnome.lower() == "n":
gnome = False;break
else:
print "herpaderp"
while 1:
shortcut = raw_input("Create launcher in home directory? [Y/n]: ")
if shortcut.lower() == "y" or shortcut == "":
shortcut = True;break
elif shortcut.lower() == "n":
shortcut = False;break
else:
print "u jelly?"
# do some shitty install
try:
fileLoc = findPesterchum(".")
except RuntimeError:
print "I'm sorry! I was unable to find the pesterchum files :("
print "Please put them where I can find them"
exit() exit()
if not fileLoc:
print "I'm sorry! I was unable to find the pesterchum files :(" if os.getuid() != 0:
print "Please put them where I can find them" print "This program must be run as root (sudo)."
exit() exit()
print "Copying files..."
ignore = shutil.ignore_patterns('*.pyc') _HOME = os.environ['HOME']
if not os.path.exists(instLoc): _USER = os.environ['SUDO_USER']
shutil.copytree(fileLoc, instLoc, ignore=ignore) _UID = int(os.environ['SUDO_UID'])
if os.path.exists(instLoc+"/pesterchum.js"): _GID = int(os.environ['SUDO_GID'])
f = open(instLoc+"/pesterchum.js") # fix home if it's root weirdness
js = f.read() if _HOME.find("root") != -1:
f.close() _HOME = "/home/"+_USER
defa = js.find("\"defaultprofile\"")
if defa != -1: def setPermissions(path):
start = js.find("\"", js.find(":", defa+1)) os.chown(path, _UID, _GID)
end = js.find("\"", start+1) for file_ in os.listdir(path):
party = js[start+1:end] filePath = os.path.join(path,file_)
if not os.path.exists(instLoc+"/profiles") or \ if os.path.isdir(filePath):
party+".js" not in os.listdir(instLoc+"/profiles"): setPermissions(filePath)
print "Protecting you from stupidity..." else:
print " (aka. Deleting reference to non-existant default profile)" os.chown(filePath, _UID, _GID)
#os.remove(instLoc+"/pesterchum.js")
f = open(instLoc+"/pesterchum.js", "w") def findPesterchum(path):
f.write(js[:defa-1]+js[js.find(",", end)+1:]) for f in os.listdir(path):
f.close() filePath = os.path.join(path, f)
else: if os.path.isdir(filePath):
if not os.path.exists(instLoc+"/logs") and os.path.exists(fileLoc+"/logs"): if os.path.exists(filePath+"/pesterchum.py"):
shutil.copytree(fileLoc+"/logs", instLoc+"/logs", ignore=ignore) return filePath
if not os.path.exists(instLoc+"/profiles") and os.path.exists(fileLoc+"/profiles"):
shutil.copytree(fileLoc+"/profiles", instLoc+"/profiles", ignore=ignore)
if not os.path.exists(instLoc+"/pesterchum.js") and os.path.exists(fileLoc+"/pesterchum.js"):
shutil.copy(fileLoc+"/pesterchum.js", instLoc)
shutil.copytree(fileLoc+"/oyoyo", instLoc+"/oyoyo", ignore=ignore)
shutil.copytree(fileLoc+"/smilies", instLoc+"/smilies", ignore=ignore)
shutil.copytree(fileLoc+"/themes", instLoc+"/themes", ignore=ignore)
for f in os.listdir(fileLoc):
filePath = os.path.join(fileLoc, f)
if not os.path.isdir(filePath) and f != "pesterchum.js":
shutil.copy(filePath, instLoc)
setPermissions(instLoc)
# save the install location
f = open(_HOME+"/.pcInstallLoc", "w")
f.write(instLoc)
f.close()
#create a cool executable
print "Creating executable... (/usr/local/bin/pesterchum)"
f = open("/usr/local/bin/pesterchum", 'w')
f.write("#!/bin/sh\ncd "+instLoc+"\n./pesterchum $@")
f.close()
os.chmod("/usr/local/bin/pesterchum", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
# Create a fancy menu item in gnome
if gnome:
print "Creating menu item..."
t = Template("[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=/usr/local/bin/pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application")
f = open("/usr/share/applications/pesterchum.desktop", "w")
f.write(t.safe_substitute(loc=instLoc))
f.close()
# create shortcut launcher
if shortcut:
print "Creating launcher..."
t = Template("#!/usr/bin/env xdg-open\n[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application")
f = open(_HOME+"/Pesterchum.desktop", "w")
f.write(t.safe_substitute(loc=instLoc))
f.close()
os.chown(_HOME+"/Pesterchum.desktop", _UID, _GID)
os.chmod(_HOME+"/Pesterchum.desktop", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
else:
print "Welcome to the Pesterchum 3.14 Easy Uninstaller (for Linux)!\n\
Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\
License: WTFPL\n"
while 1:
remove = raw_input("Would you like to uninstall Pesterchum? [y/n]: ")
if remove.lower() == "y":
while 1:
killdata = raw_input("Purge your settings, profiles, and logs? [y/N]: ")
if killdata.lower() == "n" or killdata == "":
killdata = False;break
elif killdata.lower() == "y":
killdata = True;break
else: else:
print "Hmmmmm...?" a=findPesterchum(filePath)
f = open(_HOME+"/.pcInstallLoc") if a: return a
instLoc = f.readline() elif f == "pesterchum.py":
f.close() return path
os.remove(_HOME+"/.pcInstallLoc")
if killdata: if not os.path.exists(_HOME+"/.pcInstallLoc"):
print "Removing files..." print "Welcome to the Pesterchum 3.14 Easy Installer (for Linux)!\n\
shutil.rmtree(instLoc) Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\
License: WTFPL\n\
\n\
Leaving an option blank will accept it's default [in brackets]\n\
Are you ready to begin your MAGICAL JOURNEY?!\n\
Of course you are!!! ::::D"
# ask user about things
while 1:
install = raw_input("Install location [~/.pesterchum]: ")
if install == "":
instLoc = _HOME+"/.pesterchum"
break
else: else:
print "Backing up settings, profiles, and logs..." if install[0] == "~":
if os.path.exists(instLoc+"/logs"): install = _HOME+install[1:]
shutil.move(instLoc+"/logs", "_easyBackupLOGS") if os.path.exists(install[:install.rfind("/")]):
if os.path.exists(instLoc+"/profiles"): instLoc = install
shutil.move(instLoc+"/profiles", "_easyBackupPROFILES") break
if os.path.exists(instLoc+"/pesterchum.js"): print "No can do"
shutil.move(instLoc+"/pesterchum.js", "_easyBackupSETTINGS") if os.path.exists("/usr/share/applications"):
print "Removing files..." while 1:
shutil.rmtree(instLoc) gnome = raw_input("Create a GNOME menu item? [Y/n]: ")
print "Restoring up settings, profiles, and logs..." if gnome.lower() == "y" or gnome == "":
os.mkdir(instLoc) gnome = True;break
if os.path.exists("_easyBackupLOGS"): elif gnome.lower() == "n":
shutil.move("_easyBackupLOGS", instLoc+"/logs") gnome = False;break
if os.path.exists("_easyBackupPROFILES"): else:
shutil.move("_easyBackupPROFILES", instLoc+"/profiles") print "herpaderp"
if os.path.exists("_easyBackupSETTINGS"): while 1:
shutil.move("_easyBackupSETTINGS", instLoc+"/pesterchum.js") shortcut = raw_input("Create launcher in home directory? [Y/n]: ")
setPermissions(instLoc) if shortcut.lower() == "y" or shortcut == "":
print "Trashing executable..." shortcut = True;break
os.remove("/usr/local/bin/pesterchum") elif shortcut.lower() == "n":
if os.path.exists("/usr/share/applications/pesterchum.desktop"): shortcut = False;break
print "Maiming menu item..." else:
os.remove("/usr/share/applications/pesterchum.desktop") print "u jelly?"
if os.path.exists(_HOME+"/Pesterchum.desktop"):
print "Destroying launcher..." # do some shitty install
os.remove(_HOME+"/Pesterchum.desktop") try:
elif os.path.exists(_HOME+"/Desktop/Pesterchum.desktop"): fileLoc = findPesterchum(".")
print "Destroying launcher..." except RuntimeError:
os.remove(_HOME+"/Desktop/Pesterchum.desktop") print "I'm sorry! I was unable to find the pesterchum files :("
else: print "Please put them where I can find them"
print "Unable to find launcher, non destroyed" exit()
break if not fileLoc:
elif remove.lower() == "n": print "I'm sorry! I was unable to find the pesterchum files :("
print "Aborting uninstallation process" print "Please put them where I can find them"
break exit()
print "Copying files..."
ignore = shutil.ignore_patterns('*.pyc')
if not os.path.exists(instLoc):
shutil.copytree(fileLoc, instLoc, ignore=ignore)
if os.path.exists(instLoc+"/pesterchum.js"):
f = open(instLoc+"/pesterchum.js")
js = f.read()
f.close()
defa = js.find("\"defaultprofile\"")
if defa != -1:
start = js.find("\"", js.find(":", defa+1))
end = js.find("\"", start+1)
party = js[start+1:end]
if not os.path.exists(instLoc+"/profiles") or \
party+".js" not in os.listdir(instLoc+"/profiles"):
print "Protecting you from stupidity..."
print " (aka. Deleting reference to non-existant default profile)"
#os.remove(instLoc+"/pesterchum.js")
f = open(instLoc+"/pesterchum.js", "w")
f.write(js[:defa-1]+js[js.find(",", end)+1:])
f.close()
else: else:
print "Invalid input, try again" if not os.path.exists(instLoc+"/logs") and os.path.exists(fileLoc+"/logs"):
shutil.copytree(fileLoc+"/logs", instLoc+"/logs", ignore=ignore)
if not os.path.exists(instLoc+"/profiles") and os.path.exists(fileLoc+"/profiles"):
shutil.copytree(fileLoc+"/profiles", instLoc+"/profiles", ignore=ignore)
if not os.path.exists(instLoc+"/pesterchum.js") and os.path.exists(fileLoc+"/pesterchum.js"):
shutil.copy(fileLoc+"/pesterchum.js", instLoc)
shutil.copytree(fileLoc+"/oyoyo", instLoc+"/oyoyo", ignore=ignore)
shutil.copytree(fileLoc+"/smilies", instLoc+"/smilies", ignore=ignore)
shutil.copytree(fileLoc+"/themes", instLoc+"/themes", ignore=ignore)
for f in os.listdir(fileLoc):
filePath = os.path.join(fileLoc, f)
if not os.path.isdir(filePath) and f != "pesterchum.js":
shutil.copy(filePath, instLoc)
setPermissions(instLoc)
# save the install location
f = open(_HOME+"/.pcInstallLoc", "w")
f.write(instLoc)
f.close()
#create a cool executable
print "Creating executable... (/usr/local/bin/pesterchum)"
f = open("/usr/local/bin/pesterchum", 'w')
f.write("#!/bin/sh\ncd "+instLoc+"\n./pesterchum $@")
f.close()
os.chmod("/usr/local/bin/pesterchum", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
# Create a fancy menu item in gnome
if gnome:
print "Creating menu item..."
t = Template("[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=/usr/local/bin/pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application")
f = open("/usr/share/applications/pesterchum.desktop", "w")
f.write(t.safe_substitute(loc=instLoc))
f.close()
# create shortcut launcher
if shortcut:
print "Creating launcher..."
t = Template("#!/usr/bin/env xdg-open\n[Desktop Entry]\nEncoding=UTF-8\nVersion=3.14.2\nName=Pesterchum\nComment=IM client based on Homestuck Pesterchum\nCategories=Network;InstantMessaging;\nExec=pesterchum\nIcon=$loc/pesterchum.ico\nTerminal=false\nType=Application")
f = open(_HOME+"/Pesterchum.desktop", "w")
f.write(t.safe_substitute(loc=instLoc))
f.close()
os.chown(_HOME+"/Pesterchum.desktop", _UID, _GID)
os.chmod(_HOME+"/Pesterchum.desktop", S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
else:
print "Welcome to the Pesterchum 3.14 Easy Uninstaller (for Linux)!\n\
Created by Kiooeht [evacipatedBox] May 28th-29th, 2011.\n\
License: WTFPL\n"
while 1:
remove = raw_input("Would you like to uninstall Pesterchum? [y/n]: ")
if remove.lower() == "y":
while 1:
killdata = raw_input("Purge your settings, profiles, and logs? [y/N]: ")
if killdata.lower() == "n" or killdata == "":
killdata = False;break
elif killdata.lower() == "y":
killdata = True;break
else:
print "Hmmmmm...?"
f = open(_HOME+"/.pcInstallLoc")
instLoc = f.readline()
f.close()
os.remove(_HOME+"/.pcInstallLoc")
if killdata:
print "Removing files..."
shutil.rmtree(instLoc)
else:
print "Backing up settings, profiles, and logs..."
if os.path.exists(instLoc+"/logs"):
shutil.move(instLoc+"/logs", "_easyBackupLOGS")
if os.path.exists(instLoc+"/profiles"):
shutil.move(instLoc+"/profiles", "_easyBackupPROFILES")
if os.path.exists(instLoc+"/pesterchum.js"):
shutil.move(instLoc+"/pesterchum.js", "_easyBackupSETTINGS")
print "Removing files..."
shutil.rmtree(instLoc)
print "Restoring up settings, profiles, and logs..."
os.mkdir(instLoc)
if os.path.exists("_easyBackupLOGS"):
shutil.move("_easyBackupLOGS", instLoc+"/logs")
if os.path.exists("_easyBackupPROFILES"):
shutil.move("_easyBackupPROFILES", instLoc+"/profiles")
if os.path.exists("_easyBackupSETTINGS"):
shutil.move("_easyBackupSETTINGS", instLoc+"/pesterchum.js")
setPermissions(instLoc)
print "Trashing executable..."
os.remove("/usr/local/bin/pesterchum")
if os.path.exists("/usr/share/applications/pesterchum.desktop"):
print "Maiming menu item..."
os.remove("/usr/share/applications/pesterchum.desktop")
if os.path.exists(_HOME+"/Pesterchum.desktop"):
print "Destroying launcher..."
os.remove(_HOME+"/Pesterchum.desktop")
elif os.path.exists(_HOME+"/Desktop/Pesterchum.desktop"):
print "Destroying launcher..."
os.remove(_HOME+"/Desktop/Pesterchum.desktop")
else:
print "Unable to find launcher, non destroyed"
break
elif remove.lower() == "n":
print "Aborting uninstallation process"
break
else:
print "Invalid input, try again"
except KeyboardInterrupt:
print ""
except Exception, e:
error = -1
finally:
if error == -1:
print "Oh noes!! It seems an error has occurred!"
lineN = traceback.extract_tb(sys.exc_info()[2])[-1][1]
print "The error occurred on line %s:" % lineN
formatted_lines = traceback.format_exc().splitlines()
print " '" + formatted_lines[-2] + "'"
print formatted_lines[-1]
while 1:
print "\nWould you like to (s)end a bug report,"
send = raw_input("view the (f)ull error message, or (n)either? [s/f/n]: ")
if send.lower() == "n":
act = 2;break
elif send.lower() == "s":
act = 0;break
elif send.lower() == "f":
print "!---------------BEGIN ERROR MESSAGE---------------!"
for l in formatted_lines:
print l
print "!----------------END ERROR MESSAGE----------------!"
send = raw_input("Would you like to send this error message? [y/n]: ")
if send.lower() == "y":
act = 0;break
elif send.lower() == "n":
act = 2;break
else:
print "What was that?"
if act == 2:
print "Okay"
elif act == 0:
print "Thank you for taking time out of your day to complete a bug report."
print "Fields marked with an asterisk (*) are required."
name = raw_input("Your Name: ")
while 1:
os = raw_input("OS (include version) (ex. Ubuntu 10.10) [*]: ")
if os: break
else: print "This field is required."
while 1:
msg = raw_input("Short description of problem [*]: ")
if msg: break
else: print "This field is required."
import urllib, json
data = urllib.urlencode({"name":name, "os":os, "msg":msg, "short":formatted_lines[-1], "long":json.dumps(formatted_lines)})
try:
print "Sending..."
f = urllib.urlopen("http://distantsphere.com/pc/easyInstall.php", data)
text = f.read()
print text
if text == "success!":
print "Sent!"
else:
print "There seems to have been a problem sending your bug report! ):"
except:
print "There seems to have been a problem sending your bug report! ):"

View file

@ -52,6 +52,7 @@ from parsetools import convertTags, addTimeInitial, themeChecker, ThemeException
from memos import PesterMemo, MemoTabWindow, TimeTracker from memos import PesterMemo, MemoTabWindow, TimeTracker
from irc import PesterIRC from irc import PesterIRC
from logviewer import PesterLogUserSelect, PesterLogViewer from logviewer import PesterLogUserSelect, PesterLogViewer
from bugreport import BugReporter
_datadir = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.DataLocation)+"Pesterchum/" _datadir = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.DataLocation)+"Pesterchum/"
canon_handles = ["apocalypseArisen", "arsenicCatnip", "arachnidsGrip", "adiosToreador", \ canon_handles = ["apocalypseArisen", "arsenicCatnip", "arachnidsGrip", "adiosToreador", \
@ -1507,12 +1508,16 @@ class PesterWindow(MovingWindow):
self.aboutAction = QtGui.QAction(self.theme["main/menus/help/about"], self) self.aboutAction = QtGui.QAction(self.theme["main/menus/help/about"], self)
self.connect(self.aboutAction, QtCore.SIGNAL('triggered()'), self.connect(self.aboutAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('aboutPesterchum()')) self, QtCore.SLOT('aboutPesterchum()'))
self.reportBugAction = QtGui.QAction("REPORT BUG", self)
self.connect(self.reportBugAction, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('reportBug()'))
helpmenu = self.menu.addMenu(self.theme["main/menus/help/_name"]) helpmenu = self.menu.addMenu(self.theme["main/menus/help/_name"])
self.helpmenu = helpmenu self.helpmenu = helpmenu
self.helpmenu.addAction(self.helpAction) self.helpmenu.addAction(self.helpAction)
self.helpmenu.addAction(self.botAction) self.helpmenu.addAction(self.botAction)
self.helpmenu.addAction(self.nickServAction) self.helpmenu.addAction(self.nickServAction)
self.helpmenu.addAction(self.aboutAction) self.helpmenu.addAction(self.aboutAction)
self.helpmenu.addAction(self.reportBugAction)
self.closeButton = WMButton(PesterIcon(self.theme["main/close/image"]), self) self.closeButton = WMButton(PesterIcon(self.theme["main/close/image"]), self)
self.setButtonAction(self.closeButton, self.config.closeAction(), -1) self.setButtonAction(self.closeButton, self.config.closeAction(), -1)
@ -2709,6 +2714,13 @@ class PesterWindow(MovingWindow):
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def launchHelp(self): def launchHelp(self):
QtGui.QDesktopServices.openUrl(QtCore.QUrl("http://nova.xzibition.com/~illuminatedwax/help.html", QtCore.QUrl.TolerantMode)) QtGui.QDesktopServices.openUrl(QtCore.QUrl("http://nova.xzibition.com/~illuminatedwax/help.html", QtCore.QUrl.TolerantMode))
@QtCore.pyqtSlot()
def reportBug(self):
if hasattr(self, 'bugreportwindow') and self.bugreportwindow:
return
self.bugreportwindow = BugReporter(self)
self.bugreportwindow.exec_()
self.bugreportwindow = None
@QtCore.pyqtSlot(QtCore.QString, QtCore.QString) @QtCore.pyqtSlot(QtCore.QString, QtCore.QString)
def nickCollision(self, handle, tmphandle): def nickCollision(self, handle, tmphandle):