This commit is contained in:
Dpeta 2022-08-07 17:38:45 +02:00
parent 1419c4985e
commit f78a9f97ac
6 changed files with 439 additions and 141 deletions

View file

@ -1,21 +1,23 @@
import logging
import logging.config
import ostools
_datadir = ostools.getDataDir()
logging.config.fileConfig(_datadir + "logging.ini")
PchumLog = logging.getLogger('pchumLogger')
from string import Template
from time import strftime
from datetime import datetime, timedelta
from PyQt6 import QtCore, QtGui, QtWidgets
import ostools
from dataobjs import PesterHistory
from parsetools import convertTags, lexMessage, mecmd, colorBegin, colorEnd, \
smiledict#, img2smiley
from parsetools import (convertTags, lexMessage, mecmd, colorBegin, colorEnd,
smiledict)
import parsetools
from pnc.dep.attrdict import AttrDict
_datadir = ostools.getDataDir()
logging.config.fileConfig(_datadir + "logging.ini")
PchumLog = logging.getLogger('pchumLogger')
class PesterTabWindow(QtWidgets.QFrame):
def __init__(self, mainwindow, parent=None, convo="convo"):
super(PesterTabWindow, self).__init__(parent)
@ -206,7 +208,9 @@ class PesterTabWindow(QtWidgets.QFrame):
return False
def notifyNewMessage(self, handle):
i = self.tabIndices[handle]
self.tabs.setTabTextColor(i, QtGui.QColor(self.mainwindow.theme["%s/tabs/newmsgcolor" % (self.type)]))
self.tabs.setTabTextColor(i,
QtGui.QColor(self.mainwindow.theme["%s/tabs/newmsgcolor"
% (self.type)]))
convo = self.convos[handle]
# Create a function for the icon to use
# TODO: Let us disable this.
@ -225,7 +229,9 @@ class PesterTabWindow(QtWidgets.QFrame):
self.resize(*theme["convo/size"])
self.setStyleSheet(theme["convo/tabwindow/style"])
self.tabs.setShape(QtWidgets.QTabBar.Shape(theme["convo/tabs/tabstyle"]))
self.tabs.setStyleSheet("QTabBar::tab{ %s } QTabBar::tab:selected { %s }" % (theme["convo/tabs/style"], theme["convo/tabs/selectedstyle"]))
self.tabs.setStyleSheet("QTabBar::tab{ %s } QTabBar::tab:selected { %s }"
% (theme["convo/tabs/style"],
theme["convo/tabs/selectedstyle"]))
def changeTheme(self, theme):
self.initTheme(theme)
@ -382,7 +388,20 @@ class PesterText(QtWidgets.QTextEdit):
self.textSelected = ready
def initTheme(self, theme):
if "convo/scrollbar" in theme:
self.setStyleSheet("QTextEdit { %s } QScrollBar:vertical { %s } QScrollBar::handle:vertical { %s } QScrollBar::add-line:vertical { %s } QScrollBar::sub-line:vertical { %s } QScrollBar:up-arrow:vertical { %s } QScrollBar:down-arrow:vertical { %s }" % (theme["convo/textarea/style"], theme["convo/scrollbar/style"], theme["convo/scrollbar/handle"], theme["convo/scrollbar/downarrow"], theme["convo/scrollbar/uparrow"], theme["convo/scrollbar/uarrowstyle"], theme["convo/scrollbar/darrowstyle"] ))
self.setStyleSheet("QTextEdit { %s }"
"QScrollBar:vertical { %s }"
"QScrollBar::handle:vertical { %s }"
"QScrollBar::add-line:vertical { %s }"
"QScrollBar::sub-line:vertical { %s }"
"QScrollBar:up-arrow:vertical { %s }"
"QScrollBar:down-arrow:vertical { %s }"
% (theme["convo/textarea/style"],
theme["convo/scrollbar/style"],
theme["convo/scrollbar/handle"],
theme["convo/scrollbar/downarrow"],
theme["convo/scrollbar/uparrow"],
theme["convo/scrollbar/uarrowstyle"],
theme["convo/scrollbar/darrowstyle"]))
else:
self.setStyleSheet("QTextEdit { %s }" % (theme["convo/textarea/style"]))
def addMessage(self, lexmsg, chum):
@ -453,7 +472,10 @@ class PesterText(QtWidgets.QTextEdit):
lexmsg[0:0] = [colorBegin("<c=%s>" % (color), color),
"%s: " % (initials)]
lexmsg.append(colorEnd("</c>"))
self.append("<span style=\"color:#000000\">" + time + convertTags(lexmsg) + "</span>")
self.append("<span style=\"color:#000000\">"
+ time
+ convertTags(lexmsg)
+ "</span>")
#self.append('<img src="/Users/lexi/pesterchum-lex/smilies/tab.gif" />'
# + '<img src="/Users/lexi/pesterchum/smilies/tab.gif" />'
# + '<img src="/Applications/Pesterchum.app/Contents/Resources/smilies/tab.gif" />'
@ -512,7 +534,8 @@ class PesterText(QtWidgets.QTextEdit):
if event.modifiers() == QtCore.Qt.KeyboardModifier.ControlModifier:
QtWidgets.QApplication.clipboard().setText(url)
else:
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.ParsingMode.TolerantMode))
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url,
QtCore.QUrl.ParsingMode.TolerantMode))
QtWidgets.QTextEdit.mousePressEvent(self, event)
def mouseMoveEvent(self, event):
QtWidgets.QTextEdit.mouseMoveEvent(self, event)
@ -569,7 +592,9 @@ class PesterConvo(QtWidgets.QFrame):
self.mainwindow = mainwindow
theme = self.mainwindow.theme
self.resize(*theme["convo/size"])
self.setStyleSheet("QtWidgets.QFrame#%s { %s }" % (chum.handle, theme["convo/style"]))
self.setStyleSheet("QtWidgets.QFrame#%s { %s }"
% (chum.handle,
theme["convo/style"]))
self.setWindowIcon(self.icon())
self.setWindowTitle(self.title())
@ -577,10 +602,12 @@ class PesterConvo(QtWidgets.QFrame):
self.chumLabel = QtWidgets.QLabel(t.safe_substitute(handle=chum.handle), self)
self.chumLabel.setStyleSheet(self.mainwindow.theme["convo/chumlabel/style"])
self.chumLabel.setAlignment(self.aligndict["h"][self.mainwindow.theme["convo/chumlabel/align/h"]] | self.aligndict["v"][self.mainwindow.theme["convo/chumlabel/align/v"]])
self.chumLabel.setAlignment(self.aligndict["h"][self.mainwindow.theme["convo/chumlabel/align/h"]]
| self.aligndict["v"][self.mainwindow.theme["convo/chumlabel/align/v"]])
self.chumLabel.setMaximumHeight(self.mainwindow.theme["convo/chumlabel/maxheight"])
self.chumLabel.setMinimumHeight(self.mainwindow.theme["convo/chumlabel/minheight"])
self.chumLabel.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.MinimumExpanding))
self.chumLabel.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding,
QtWidgets.QSizePolicy.Policy.MinimumExpanding))
self.textArea = PesterText(self.mainwindow.theme, self)
self.textInput = PesterInput(self.mainwindow.theme, self)
self.textInput.setFocus()
@ -909,7 +936,10 @@ class PesterConvo(QtWidgets.QFrame):
@QtCore.pyqtSlot()
def openChumLogs(self):
currentChum = self.chum.handle
self.mainwindow.chumList.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow)
self.mainwindow.chumList.pesterlogviewer = PesterLogViewer(currentChum,
self.mainwindow.config,
self.mainwindow.theme,
self.mainwindow)
self.mainwindow.chumList.pesterlogviewer.rejected.connect(self.mainwindow.chumList.closeActiveLog)
self.mainwindow.chumList.pesterlogviewer.show()
self.mainwindow.chumList.pesterlogviewer.raise_()

View file

@ -202,9 +202,9 @@ class pesterQuirks(object):
recvparts.append(q.apply(part))
# Reconstruct and update string.
string = ''
print("excludes: " + str(excludes))
print("sendparts: " + str(sendparts))
print("recvparts: " + str(recvparts))
#print("excludes: " + str(excludes))
#print("sendparts: " + str(sendparts))
#print("recvparts: " + str(recvparts))
for part in range(0, len(excludes)):
string += recvparts[part]
string += excludes[part].group()
@ -235,10 +235,6 @@ class pesterQuirks(object):
string = q.apply(string)
elif q.type == 'suffix' and lastStr:
string = q.apply(string)
newlist.append(string)
final = []
for n in newlist:

270
memos.py
View file

@ -11,8 +11,8 @@ import parsetools
from dataobjs import PesterProfile, PesterHistory
from generic import PesterIcon, RightClickList, mysteryTime
from convo import PesterConvo, PesterInput, PesterText, PesterTabWindow
from parsetools import convertTags, timeProtocol, \
lexMessage, colorBegin, mecmd, smiledict
from parsetools import (convertTags, timeProtocol, lexMessage, colorBegin,
mecmd, smiledict)
from logviewer import PesterLogViewer
_datadir = ostools.getDataDir()
@ -248,7 +248,8 @@ class MemoTabWindow(PesterTabWindow):
newindex = self.tabs.addTab(convo.channel)
self.tabIndices[convo.channel] = newindex
self.tabs.setCurrentIndex(newindex)
self.tabs.setTabIcon(newindex, PesterIcon(self.mainwindow.theme["memos/memoicon"]))
self.tabs.setTabIcon(newindex,
PesterIcon(self.mainwindow.theme["memos/memoicon"]))
def updateBlocked(self):
pass
def updateMood(self):
@ -275,19 +276,35 @@ class MemoText(PesterText):
self.copyAvailable[bool].connect(self.textReady)
self.urls = {}
for k in smiledict:
self.addAnimation(QtCore.QUrl("smilies/%s" % (smiledict[k])), "smilies/%s" % (smiledict[k]))
self.addAnimation(QtCore.QUrl("smilies/%s" % (smiledict[k])),
"smilies/%s" % (smiledict[k]))
#self.mainwindow.animationSetting[bool].connect(self.animateChanged)
def initTheme(self, theme):
if "memos/scrollbar" in theme:
self.setStyleSheet("QTextEdit { %s } QScrollBar:vertical { %s } QScrollBar::handle:vertical { %s } QScrollBar::add-line:vertical { %s } QScrollBar::sub-line:vertical { %s } QScrollBar:up-arrow:vertical { %s } QScrollBar:down-arrow:vertical { %s }" % (theme["memos/textarea/style"], theme["memos/scrollbar/style"], theme["memos/scrollbar/handle"], theme["memos/scrollbar/downarrow"], theme["memos/scrollbar/uparrow"], theme["memos/scrollbar/uarrowstyle"], theme["memos/scrollbar/darrowstyle"] ))
self.setStyleSheet("QTextEdit { %s }"
"QScrollBar:vertical { %s }"
"QScrollBar::handle:vertical { %s }"
"QScrollBar::add-line:vertical { %s }"
"QScrollBar::sub-line:vertical { %s }"
"QScrollBar:up-arrow:vertical { %s }"
"QScrollBar:down-arrow:vertical { %s }"
% (theme["memos/textarea/style"],
theme["memos/scrollbar/style"],
theme["memos/scrollbar/handle"],
theme["memos/scrollbar/downarrow"],
theme["memos/scrollbar/uparrow"],
theme["memos/scrollbar/uarrowstyle"],
theme["memos/scrollbar/darrowstyle"] ))
else:
self.setStyleSheet("QTextEdit { %s }" % theme["memos/textarea/style"])
# So it doesn't inherit the memo's background image.
# Fixes floating "PESTERLOG:"
try:
self.setStyleSheet(self.styleSheet() + " QMenu{" + theme["main/defaultwindow/style"] + "}")
self.setStyleSheet(self.styleSheet()
+ ("QMenu{ %s }"
% theme["main/defaultwindow/style"]))
except:
pass
@ -343,7 +360,10 @@ class MemoText(PesterText):
if time.isFirstTime():
grammar = time.getGrammar()
joinmsg = chum.memojoinmsg(systemColor, time.getTime(), grammar, window.theme["convo/text/joinmemo"])
joinmsg = chum.memojoinmsg(systemColor,
time.getTime(),
grammar,
window.theme["convo/text/joinmemo"])
self.append(convertTags(joinmsg))
parent.mainwindow.chatlog.log(parent.channel, joinmsg)
time.openCurrentTime()
@ -369,7 +389,6 @@ class MemoInput(PesterInput):
# karxi: Because of the use of stylesheet_path, we don't have to rewrite
# this code.
# Neat, huh?
pass # So vim recognizes the end of this class
class PesterMemo(PesterConvo):
# TODO: Clean up inheritance between these!! The inits are ugly.
@ -382,7 +401,8 @@ class PesterMemo(PesterConvo):
self.time = TimeTracker(txt2delta(timestr))
self.setWindowTitle(channel)
self.channelLabel = QtWidgets.QLabel(self)
self.channelLabel.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Expanding))
self.channelLabel.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding,
QtWidgets.QSizePolicy.Policy.Expanding))
self.textArea = MemoText(self.mainwindow.theme, self)
self.textInput = MemoInput(self.mainwindow.theme, self)
@ -395,7 +415,8 @@ class PesterMemo(PesterConvo):
self.userlist = RightClickList(self)
self.userlist.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding))
self.userlist.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed,
QtWidgets.QSizePolicy.Policy.Expanding))
self.userlist.optionsMenu = QtWidgets.QMenu(self)
self.pesterChumAction = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self)
self.pesterChumAction.triggered.connect(self.newPesterSlot)
@ -538,7 +559,11 @@ class PesterMemo(PesterConvo):
p = self.mainwindow.profile()
timeGrammar = self.time.getGrammar()
systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
msg = p.memoopenmsg(systemColor, self.time.getTime(), timeGrammar, self.mainwindow.theme["convo/text/openmemo"], self.channel)
msg = p.memoopenmsg(systemColor,
self.time.getTime(),
timeGrammar,
self.mainwindow.theme["convo/text/openmemo"],
self.channel)
self.time.openCurrentTime()
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg)
@ -558,11 +583,13 @@ class PesterMemo(PesterConvo):
if self.userlist.isHidden():
self.userlist.show()
self.miniUserlist.setText(">\n>")
self.miniUserlist.setStyleSheet("%s border-width: 2px 0px 2px 2px;" % self.miniUserlist.styleSheet())
self.miniUserlist.setStyleSheet("%s border-width: 2px 0px 2px 2px;"
% self.miniUserlist.styleSheet())
else:
self.userlist.hide()
self.miniUserlist.setText("<\n<")
self.miniUserlist.setStyleSheet("%s border-width: 2px;" % self.miniUserlist.styleSheet())
self.miniUserlist.setStyleSheet("%s border-width: 2px;"
% self.miniUserlist.styleSheet())
def title(self):
return self.channel
@ -603,25 +630,63 @@ class PesterMemo(PesterConvo):
else:
self.channelLabel.setText(t.safe_substitute(channel=self.channel))
self.channelLabel.setStyleSheet(theme["memos/label/style"])
self.channelLabel.setAlignment(self.aligndict["h"][theme["memos/label/align/h"]] | self.aligndict["v"][theme["memos/label/align/v"]])
self.channelLabel.setAlignment(self.aligndict["h"][theme["memos/label/align/h"]]
| self.aligndict["v"][theme["memos/label/align/v"]])
self.channelLabel.setMaximumHeight(theme["memos/label/maxheight"])
self.channelLabel.setMinimumHeight(theme["memos/label/minheight"])
self.userlist.optionsMenu.setStyleSheet(theme["main/defaultwindow/style"])
scrolls = "width: 12px; height: 12px; border: 0; padding: 0;"
if "main/chums/scrollbar" in theme:
self.userlist.setStyleSheet("QListWidget { %s } QScrollBar { %s } QScrollBar::handle { %s } QScrollBar::add-line { %s } QScrollBar::sub-line { %s } QScrollBar:up-arrow { %s } QScrollBar:down-arrow { %s }" % (theme["memos/userlist/style"], theme["main/chums/scrollbar/style"] + scrolls, theme["main/chums/scrollbar/handle"], theme["main/chums/scrollbar/downarrow"], theme["main/chums/scrollbar/uparrow"], theme["main/chums/scrollbar/uarrowstyle"], theme["main/chums/scrollbar/darrowstyle"] ))
self.userlist.setStyleSheet("QListWidget { %s }"
"QScrollBar { %s }"
"QScrollBar::handle { %s }"
"QScrollBar::add-line { %s }"
"QScrollBar::sub-line { %s }"
"QScrollBar:up-arrow { %s }"
"QScrollBar:down-arrow { %s }"
% (theme["memos/userlist/style"],
theme["main/chums/scrollbar/style"] + scrolls,
theme["main/chums/scrollbar/handle"],
theme["main/chums/scrollbar/downarrow"],
theme["main/chums/scrollbar/uparrow"],
theme["main/chums/scrollbar/uarrowstyle"],
theme["main/chums/scrollbar/darrowstyle"]))
elif "convo/scrollbar" in theme:
self.userlist.setStyleSheet("QListWidget { %s } QScrollBar { %s } QScrollBar::handle { %s } QScrollBar::add-line { %s } QScrollBar::sub-line { %s } QScrollBar:up-arrow { %s } QScrollBar:down-arrow { %s }" % (theme["memos/userlist/style"], theme["convo/scrollbar/style"] + scrolls, theme["convo/scrollbar/handle"], "display:none;", "display:none;", "display:none;", "display:none;" ))
self.userlist.setStyleSheet("QListWidget { %s }"
"QScrollBar { %s }"
"QScrollBar::handle { %s }"
"QScrollBar::add-line { %s }"
"QScrollBar::sub-line { %s }"
"QScrollBar:up-arrow { %s }"
"QScrollBar:down-arrow { %s }"
% (theme["memos/userlist/style"],
theme["convo/scrollbar/style"] + scrolls,
theme["convo/scrollbar/handle"],
"display: none;",
"display: none;",
"display: none;",
"display: none;"))
else:
self.userlist.setStyleSheet("QListWidget { %s } QScrollBar { %s } QScrollBar::handle { %s }" % (theme["memos/userlist/style"], scrolls, "background-color: black;"))
self.userlist.setStyleSheet("QListWidget { %s }"
"QScrollBar { %s }"
"QScrollBar::handle { %s }"
% (theme["memos/userlist/style"],
scrolls,
"background-color: black;"))
self.userlist.setFixedWidth(theme["memos/userlist/width"])
if self.userlist.isHidden():
borders = "border-width: 2px;"
else:
borders = "border-width: 2px 0px 2px 2px;"
self.miniUserlist.setStyleSheet("%s padding: 0px; margin: 0px; margin-left: 5px; width: 10px; height: 90px; %s" % (theme["memos/userlist/style"], borders))
self.miniUserlist.setStyleSheet("padding: 0px;"
"margin: 0px;"
"margin-left: 5px;"
"width: 10px;"
"height: 90px;"
+ borders
+ theme["memos/userlist/style"])
self.addchumAction.setText(theme["main/menus/rclickchumlist/addchum"])
self.banuserAction.setText(theme["main/menus/rclickchumlist/banuser"])
@ -639,7 +704,12 @@ class PesterMemo(PesterConvo):
self.timeinput.setFixedWidth(theme["memos/time/text/width"])
self.timeinput.setStyleSheet(theme["memos/time/text/style"])
slidercss = "QSlider { %s } QSlider::groove { %s } QSlider::handle { %s }" % (theme["memos/time/slider/style"], theme["memos/time/slider/groove"], theme["memos/time/slider/handle"])
slidercss = ("QSlider { %s }"
"Slider::groove { %s }"
"QSlider::handle { %s }"
% (theme["memos/time/slider/style"],
theme["memos/time/slider/groove"],
theme["memos/time/slider/handle"]))
self.timeslider.setStyleSheet(slidercss)
larrow = PesterIcon(self.mainwindow.theme["memos/time/arrows/left"])
@ -1012,7 +1082,8 @@ class PesterMemo(PesterConvo):
self.modes = "+" + "".join(chanmodes)
if self.mainwindow.advanced:
t = Template(self.mainwindow.theme["memos/label/text"])
self.channelLabel.setText(t.safe_substitute(channel=self.channel) + "(%s)" % (self.modes))
self.channelLabel.setText(t.safe_substitute(channel=self.channel)
+ "(%s)" % (self.modes))
def timeUpdate(self, handle, cmd):
window = self.mainwindow
@ -1051,7 +1122,9 @@ class PesterMemo(PesterConvo):
self.times[handle].setCurrent(close)
grammar = self.times[handle].getGrammar()
self.times[handle].removeTime(close)
msg = chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"])
msg = chum.memoclosemsg(systemColor,
grammar,
window.theme["convo/text/closememo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg)
elif timed not in self.times[handle]:
@ -1097,9 +1170,11 @@ class PesterMemo(PesterConvo):
else:
self.close()
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.mainwindow.theme["main/defaultwindow/style"] + "}")
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.mainwindow.theme["main/defaultwindow/style"])
msgbox.setText("%s: Invites only!" % (c))
msgbox.setInformativeText("This channel is invite-only. You must get an invitation from someone on the inside before entering.")
msgbox.setInformativeText("This channel is invite-only. "
"You must get an invitation from someone on the inside before entering.")
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
msgbox.exec()
@ -1115,7 +1190,8 @@ class PesterMemo(PesterConvo):
else:
self.close()
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.mainwindow.theme["main/defaultwindow/style"] + "}")
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.mainwindow.theme["main/defaultwindow/style"])
msgbox.setText("%s: D: CANT JOIN MEMO!!!" % (c))
msgbox.setInformativeText(reason)
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
@ -1216,7 +1292,9 @@ class PesterMemo(PesterConvo):
if update == "netsplit":
if not hasattr(self, "netsplit"):
self.netsplit = []
QtCore.QTimer.singleShot(1500, self, QtCore.SLOT('dumpNetsplit()'))
QtCore.QTimer.singleShot(1500,
self,
QtCore.SLOT('dumpNetsplit()'))
for c in chums:
chum = PesterProfile(h)
self.userlist.takeItem(self.userlist.row(c))
@ -1226,17 +1304,22 @@ class PesterMemo(PesterConvo):
while self.times[h].getTime() is not None:
t = self.times[h]
grammar = t.getGrammar()
allinitials.append("%s%s%s" % (grammar.pcf, chum.initials(), grammar.number))
allinitials.append("%s%s%s" % (grammar.pcf,
chum.initials(),
grammar.number))
self.times[h].removeTime(t.getTime())
if update == "netsplit":
self.netsplit.extend(allinitials)
else:
msg = chum.memoclosemsg(systemColor, allinitials, self.mainwindow.theme["convo/text/closememo"])
msg = chum.memoclosemsg(systemColor,
allinitials,
self.mainwindow.theme["convo/text/closememo"])
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg)
if update == "nick":
self.addUser(newnick)
newchums = self.userlist.findItems(newnick, QtCore.Qt.MatchFlag.MatchExactly)
newchums = self.userlist.findItems(newnick,
QtCore.Qt.MatchFlag.MatchExactly)
for nc in newchums:
for c in chums:
nc.founder = c.founder
@ -1277,7 +1360,8 @@ class PesterMemo(PesterConvo):
if chum is self.mainwindow.profile():
# are you next?
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.mainwindow.theme["main/defaultwindow/style"] + "}")
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.mainwindow.theme["main/defaultwindow/style"])
msgbox.setText(self.mainwindow.theme["convo/text/kickedmemo"])
# Add ban(kick) reason
@ -1319,7 +1403,11 @@ class PesterMemo(PesterConvo):
self.mainwindow.joinChannel.emit(self.channel)
me = self.mainwindow.profile()
self.time.openCurrentTime()
msg = me.memoopenmsg(systemColor, self.time.getTime(), self.time.getGrammar(), self.mainwindow.theme["convo/text/openmemo"], self.channel)
msg = me.memoopenmsg(systemColor,
self.time.getTime(),
self.time.getGrammar(),
self.mainwindow.theme["convo/text/openmemo"],
self.channel)
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg)
elif ret == QtWidgets.QMessageBox.StandardButton.Cancel:
@ -1349,9 +1437,10 @@ class PesterMemo(PesterConvo):
elif update == "+o":
if self.mainwindow.config.opvoiceMessages():
(chum, opchum, opgrammar) = self.chumOPstuff(h, op)
PchumLog.debug("chum.handle = %s\nopchum.handle = %s\nopgrammar = %s\n systemColor = %s\n" % (chum.handle, opchum.handle, opgrammar, systemColor))
#PchumLog.debug("chum.handle = %s\nopchum.handle = %s\nopgrammar = %s\n systemColor = %s\n"
# % (chum.handle, opchum.handle, opgrammar, systemColor))
msg = chum.memoopmsg(opchum, opgrammar, systemColor)
PchumLog.debug("post memoopmsg")
#PchumLog.debug("post memoopmsg")
self.textArea.append(convertTags(msg))
self.mainwindow.chatlog.log(self.channel, msg)
for c in chums:
@ -1469,7 +1558,9 @@ class PesterMemo(PesterConvo):
if not self.userlist.currentItem():
return
currentHandle = str(self.userlist.currentItem().text())
(reason, ok) = QtWidgets.QInputDialog.getText(self, "Ban User", "Enter the reason you are banning this user (optional):")
(reason, ok) = QtWidgets.QInputDialog.getText(self,
"Ban User",
"Enter the reason you are banning this user (optional):")
if ok:
self.mainwindow.kickUser.emit("%s:%s" % (currentHandle, reason), self.channel)
@QtCore.pyqtSlot()
@ -1500,7 +1591,10 @@ class PesterMemo(PesterConvo):
@QtCore.pyqtSlot()
def openChumLogs(self):
currentChum = self.channel
self.mainwindow.chumList.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow)
self.mainwindow.chumList.pesterlogviewer = PesterLogViewer(currentChum,
self.mainwindow.config,
self.mainwindow.theme,
self.mainwindow)
self.mainwindow.chumList.pesterlogviewer.rejected.connect(self.mainwindow.chumList.closeActiveLog)
self.mainwindow.chumList.pesterlogviewer.show()
self.mainwindow.chumList.pesterlogviewer.raise_()
@ -1511,7 +1605,9 @@ class PesterMemo(PesterConvo):
if not hasattr(self, 'invitechums'):
self.invitechums = None
if not self.invitechums:
(chum, ok) = QtWidgets.QInputDialog.getText(self, "Invite to Chat", "Enter the chumhandle of the user you'd like to invite:")
(chum, ok) = QtWidgets.QInputDialog.getText(self,
"Invite to Chat",
"Enter the chumhandle of the user you'd like to invite:")
if ok:
chum = str(chum)
self.mainwindow.inviteChum.emit(chum, self.channel)
@ -1581,7 +1677,107 @@ class PesterMemo(PesterConvo):
windowClosed = QtCore.pyqtSignal('QString')
timelist = ["0:00", "0:01", "0:02", "0:04", "0:06", "0:10", "0:14", "0:22", "0:30", "0:41", "1:00", "1:34", "2:16", "3:14", "4:13", "4:20", "5:25", "6:12", "7:30", "8:44", "10:25", "11:34", "14:13", "16:12", "17:44", "22:22", "25:10", "33:33", "42:00", "43:14", "50:00", "62:12", "75:00", "88:44", "100", "133", "143", "188", "200", "222", "250", "314", "333", "413", "420", "500", "600", "612", "888", "1000", "1025"]
timelist = ["0:00",
"0:01",
"0:02",
"0:04",
"0:06",
"0:10",
"0:14",
"0:22",
"0:30",
"0:41",
"1:00",
"1:34",
"2:16",
"3:14",
"4:13",
"4:20",
"5:25",
"6:12",
"7:30",
"8:44",
"10:25",
"11:34",
"14:13",
"16:12",
"17:44",
"22:22",
"25:10",
"33:33",
"42:00",
"43:14",
"50:00",
"62:12",
"75:00",
"88:44",
"100",
"133",
"143",
"188",
"200",
"222",
"250",
"314",
"333",
"413",
"420",
"500",
"600",
"612",
"888",
"1000",
"1025"]
timedlist = [timedelta(0), timedelta(0, 60), timedelta(0, 120), timedelta(0, 240), timedelta(0, 360), timedelta(0, 600), timedelta(0, 840), timedelta(0, 1320), timedelta(0, 1800), timedelta(0, 2460), timedelta(0, 3600), timedelta(0, 5640), timedelta(0, 8160), timedelta(0, 11640), timedelta(0, 15180), timedelta(0, 15600), timedelta(0, 19500), timedelta(0, 22320), timedelta(0, 27000), timedelta(0, 31440), timedelta(0, 37500), timedelta(0, 41640), timedelta(0, 51180), timedelta(0, 58320), timedelta(0, 63840), timedelta(0, 80520), timedelta(1, 4200), timedelta(1, 34380), timedelta(1, 64800), timedelta(1, 69240), timedelta(2, 7200), timedelta(2, 51120), timedelta(3, 10800), timedelta(3, 60240), timedelta(4, 14400), timedelta(5, 46800), timedelta(5, 82800), timedelta(7, 72000), timedelta(8, 28800), timedelta(9, 21600), timedelta(10, 36000), timedelta(13, 7200), timedelta(13, 75600), timedelta(17, 18000), timedelta(17, 43200), timedelta(20, 72000), timedelta(25), timedelta(25, 43200), timedelta(37), timedelta(41, 57600), timedelta(42, 61200)]
timedlist = [timedelta(0),
timedelta(0, 60),
timedelta(0, 120),
timedelta(0, 240),
timedelta(0, 360),
timedelta(0, 600),
timedelta(0, 840),
timedelta(0, 1320),
timedelta(0, 1800),
timedelta(0, 2460),
timedelta(0, 3600),
timedelta(0, 5640),
timedelta(0, 8160),
timedelta(0, 11640),
timedelta(0, 15180),
timedelta(0, 15600),
timedelta(0, 19500),
timedelta(0, 22320),
timedelta(0, 27000),
timedelta(0, 31440),
timedelta(0, 37500),
timedelta(0, 41640),
timedelta(0, 51180),
timedelta(0, 58320),
timedelta(0, 63840),
timedelta(0, 80520),
timedelta(1, 4200),
timedelta(1, 34380),
timedelta(1, 64800),
timedelta(1, 69240),
timedelta(2, 7200),
timedelta(2, 51120),
timedelta(3, 10800),
timedelta(3, 60240),
timedelta(4, 14400),
timedelta(5, 46800),
timedelta(5, 82800),
timedelta(7, 72000),
timedelta(8, 28800),
timedelta(9, 21600),
timedelta(10, 36000),
timedelta(13, 7200),
timedelta(13, 75600),
timedelta(17, 18000),
timedelta(17, 43200),
timedelta(20, 72000),
timedelta(25),
timedelta(25, 43200),
timedelta(37),
timedelta(41, 57600),
timedelta(42, 61200)]

View file

@ -1585,7 +1585,11 @@ class PesterUserlist(QtWidgets.QDialog):
self.searchbox.setFocus()
@QtCore.pyqtSlot()
def updateUsers(self):
names = self.mainwindow.namesdb["#pesterchum"]
try:
names = self.mainwindow.namesdb["#pesterchum"]
except KeyError:
# Not in #pesterchum?
return
self.userarea.clear()
for n in names:
if str(self.searchbox.text()) == "" or n.lower().find(str(self.searchbox.text()).lower()) != -1:

View file

@ -107,9 +107,9 @@ class CommandHandler(object):
try:
f(*args)
except TypeError as e:
logging.warning("Failed to pass command, did the server pass an unsupported paramater? " + str(e))
logging.info("Failed to pass command, did the server pass an unsupported paramater? " + str(e))
except Exception as e:
logging.warning("Failed to pass command, %s" % str(e))
logging.info("Failed to pass command, %s" % str(e))
@protected
def __unhandled__(self, cmd, *args):

View file

@ -12,18 +12,19 @@ QString = str
if os.path.dirname(sys.argv[0]):
os.chdir(os.path.dirname(sys.argv[0]))
print("Usage: pesterchum.py [OPTIONS]")
print("Use -h/--help to see the available options.\nLogging is configured in logging.ini")
print("Use -h/--help to see the available options."
"\nLogging is configured in logging.ini")
# Help
if ('--help' in sys.argv[1:]) or ('-h' in sys.argv[1:]):
print("Possible arguments:")
help_arguments = (" -l, --logging\n Specify level of logging, possible values are:\n"
+ " CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET.\n"
+ " The default value is WARNING.\n"
+ " (See https://docs.python.org/3/library/logging.html)\n\n"
+ " -s, --server\n Specify server override. (legacy)\n\n"
+ " -p, --port\n Specify port override. (legacy)\n\n"
+ " --advanced\n Enable advanced.\n\n"
+ " --no-honk\n Disable honking.\n")
" CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET.\n"
" The default value is WARNING.\n"
" (See https://docs.python.org/3/library/logging.html)\n\n"
" -s, --server\n Specify server override. (legacy)\n\n"
" -p, --port\n Specify port override. (legacy)\n\n"
" --advanced\n Enable advanced.\n\n"
" --no-honk\n Disable honking.\n")
print(help_arguments)
sys.exit()
@ -605,13 +606,16 @@ class chumArea(RightClickTree):
#self.topLevelItem(0).sortChildren(0, QtCore.Qt.SortOrder.AscendingOrder)
def getChums(self, handle):
chums = self.findItems(handle, QtCore.Qt.MatchFlag.MatchExactly | QtCore.Qt.MatchFlag.MatchRecursive)
chums = self.findItems(handle, QtCore.Qt.MatchFlag.MatchExactly
| QtCore.Qt.MatchFlag.MatchRecursive)
return chums
def showAllChums(self):
for c in self.chums:
chandle = c.handle
if not len(self.findItems(chandle, QtCore.Qt.MatchFlag.MatchExactly | QtCore.Qt.MatchFlag.MatchRecursive)):
if not len(self.findItems(chandle,
QtCore.Qt.MatchFlag.MatchExactly
| QtCore.Qt.MatchFlag.MatchRecursive)):
#if True:# For if it doesn't work at all :/
chumLabel = chumListing(c, self.mainwindow)
self.addItem(chumLabel)
@ -720,7 +724,9 @@ class chumArea(RightClickTree):
if text.rfind(" (") != -1:
text = text[0:text.rfind(" (")]
curgroups.append(text)
if not self.findItems(chumLabel.handle, QtCore.Qt.MatchFlag.MatchExactly | QtCore.Qt.MatchFlag.MatchRecursive):
if not self.findItems(chumLabel.handle,
QtCore.Qt.MatchFlag.MatchExactly
| QtCore.Qt.MatchFlag.MatchRecursive):
#if True:# For if it doesn't work at all :/
if chumLabel.chum.group not in curgroups:
child_1 = QtWidgets.QTreeWidgetItem(["%s" % (chumLabel.chum.group)])
@ -773,7 +779,9 @@ class chumArea(RightClickTree):
if self.mainwindow.config.showOnlineNumbers():
self.showOnlineNumbers()
else: # usually means this is now the trollslum
if not self.findItems(chumLabel.handle, QtCore.Qt.MatchFlag.MatchExactly | QtCore.Qt.MatchFlag.MatchRecursive):
if not self.findItems(chumLabel.handle,
QtCore.Qt.MatchFlag.MatchExactly
| QtCore.Qt.MatchFlag.MatchRecursive):
#if True:# For if it doesn't work at all :/
self.topLevelItem(0).addChild(chumLabel)
self.topLevelItem(0).sortChildren(0, QtCore.Qt.SortOrder.AscendingOrder)
@ -933,7 +941,10 @@ class chumArea(RightClickTree):
if not currentChum:
return
currentChum = currentChum.text(0)
self.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow)
self.pesterlogviewer = PesterLogViewer(currentChum,
self.mainwindow.config,
self.mainwindow.theme,
self.mainwindow)
self.pesterlogviewer.rejected.connect(self.closeActiveLog)
self.pesterlogviewer.show()
self.pesterlogviewer.raise_()
@ -947,7 +958,9 @@ class chumArea(RightClickTree):
currentChum = self.currentItem()
if not currentChum:
return
(notes, ok) = QtWidgets.QInputDialog.getText(self, "Notes", "Enter your notes...")
(notes, ok) = QtWidgets.QInputDialog.getText(self,
"Notes",
"Enter your notes...")
if ok:
notes = str(notes)
self.mainwindow.chumdb.setNotes(currentChum.handle, notes)
@ -957,12 +970,15 @@ class chumArea(RightClickTree):
if not hasattr(self, 'renamegroupdialog'):
self.renamegroupdialog = None
if not self.renamegroupdialog:
(gname, ok) = QtWidgets.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:")
(gname, ok) = QtWidgets.QInputDialog.getText(self,
"Rename Group",
"Enter a new name for the group:")
if ok:
gname = str(gname)
if re.search("[^A-Za-z0-9_\s]", gname) is not None:
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.mainwindow.theme["main/defaultwindow/style"] + "}")
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.mainwindow.theme["main/defaultwindow/style"])
msgbox.setInformativeText("THIS IS NOT A VALID GROUP NAME")
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
msgbox.exec()
@ -1140,7 +1156,9 @@ class TrollSlumWindow(QtWidgets.QFrame):
if self.addtrolldialog:
return
self.addtrolldialog = QtWidgets.QInputDialog(self)
(handle, ok) = self.addtrolldialog.getText(self, "Add Troll", "Enter Troll Handle:")
(handle, ok) = self.addtrolldialog.getText(self,
"Add Troll",
"Enter Troll Handle:")
if ok:
handle = str(handle)
if not (PesterProfile.checkLength(handle) and
@ -1162,8 +1180,8 @@ class PesterWindow(MovingWindow):
def __init__(self, options, parent=None, app=None):
super(PesterWindow, self).__init__(None,
(QtCore.Qt.WindowType.CustomizeWindowHint |
QtCore.Qt.WindowType.FramelessWindowHint))
(QtCore.Qt.WindowType.CustomizeWindowHint
| QtCore.Qt.WindowType.FramelessWindowHint))
# For debugging
_CONSOLE_ENV.PAPP = self
@ -1200,7 +1218,10 @@ class PesterWindow(MovingWindow):
self.userprofile = userProfile(self.config.defaultprofile())
self.theme = self.userprofile.getTheme()
else:
self.userprofile = userProfile(PesterProfile("pesterClient%d" % (random.randint(100,999)), QtGui.QColor("black"), Mood(0)))
self.userprofile = userProfile(PesterProfile("pesterClient%d"
% (random.randint(100,999)),
QtGui.QColor("black"),
Mood(0)))
self.theme = self.userprofile.getTheme()
except Exception as e:
msgBox = QtWidgets.QMessageBox()
@ -1208,14 +1229,15 @@ class PesterWindow(MovingWindow):
msgBox.setWindowTitle(":(")
msgBox.setTextFormat(QtCore.Qt.TextFormat.RichText) # Clickable html links
self.filename = _datadir+"pesterchum.js"
msgBox.setText("<html><h3>A profile error occured, trying to switch to default pesterClient profile." + \
"<br><br>" + str(e) + "<\h3><\html>")
#"\" if pesterchum acts oddly you might want to try backing up and then deleting \"" + \
#_datadir+"pesterchum.js" + \
#"\"")
msgBox.setText("<html><h3>A profile error occured,"
"trying to switch to default pesterClient profile."
"<br><br>%s<\h3><\html>" % e)
PchumLog.critical(e)
msgBox.exec()
self.userprofile = userProfile(PesterProfile("pesterClient%d" % (random.randint(100,999)), QtGui.QColor("black"), Mood(0)))
self.userprofile = userProfile(PesterProfile("pesterClient%d"
% (random.randint(100,999)),
QtGui.QColor("black"),
Mood(0)))
self.theme = self.userprofile.getTheme()
# karxi: For the record, these are set via commandline arguments. By
@ -1563,8 +1585,8 @@ class PesterWindow(MovingWindow):
@QtCore.pyqtSlot()
def closeToTray(self):
# I'm just gonna include a toast here to make sure people don't get confused. :'3
t = self.tm.Toast("Notice:", "Pesterchum has been minimized to your tray. \
\n(This behavior is configurable in settings.)")
t = self.tm.Toast("Notice:",
"Pesterchum has been minimized to your tray.")
t.show()
self.hide()
self.closeToTraySignal.emit()
@ -1597,7 +1619,10 @@ class PesterWindow(MovingWindow):
elif not self.config.notifyOptions() & self.config.NEWCONVO:
if msg[:11] != "PESTERCHUM:":
if handle.upper() not in BOTNAMES:
t = self.tm.Toast("From: %s" % handle, re.sub("</?c(=.*?)?>", "", msg))
t = self.tm.Toast("From: %s" % handle,
re.sub("</?c(=.*?)?>",
"",
msg))
t.show()
else:
if msg == "PESTERCHUM:CEASE":
@ -1668,7 +1693,9 @@ class PesterWindow(MovingWindow):
self.namesound.play()
return
if not memo.notifications_muted:
if self.honk and re.search(r"\bhonk\b", convertTags(msg, "text"), re.I):
if self.honk and re.search(r"\bhonk\b",
convertTags(msg, "text"),
re.I):
# TODO: I've got my eye on you, Gamzee.
self.honksound.play()
elif self.config.memoPing() or memo.always_beep:
@ -1874,10 +1901,13 @@ class PesterWindow(MovingWindow):
self.backgroundImage = QtGui.QPixmap(theme["main/background-image"])
self.setMask(self.backgroundImage.mask())
self.menu.setStyleSheet("QMenuBar { background: transparent; %s } QMenuBar::item { background: transparent; %s } "
self.menu.setStyleSheet(("QMenuBar { background: transparent; %s }"
"QMenuBar::item { background: transparent; %s }")
% (theme["main/menubar/style"],
theme["main/menu/menuitem"])
+ "QMenu { background: transparent; %s } QMenu::item::selected { %s } QMenu::item::disabled { %s }"
+ ("QMenu { background: transparent; %s }"
"QMenu::item::selected { %s }"
"QMenu::item::disabled { %s }")
% (theme["main/menu/style"],
theme["main/menu/selected"],
theme["main/menu/disabled"]))
@ -2004,7 +2034,9 @@ class PesterWindow(MovingWindow):
# This is a better spot to put this :)
# Setting QMessageBox's style usually doesn't do anything.
self.setStyleSheet("QInputDialog { %s } QMessageBox { %s }" % (self.theme["main/defaultwindow/style"], self.theme["main/defaultwindow/style"]))
self.setStyleSheet("QInputDialog { %s } QMessageBox { %s }"
% (self.theme["main/defaultwindow/style"],
self.theme["main/defaultwindow/style"]))
if theme["main/mychumhandle/colorswatch/text"]:
self.mychumcolor.setText(theme["main/mychumhandle/colorswatch/text"])
@ -2168,7 +2200,9 @@ class PesterWindow(MovingWindow):
def doAutoIdentify(self):
if self.userprofile.getAutoIdentify():
self.sendMessage.emit("identify " + self.userprofile.getNickServPass(), "NickServ")
self.sendMessage.emit("identify "
+ self.userprofile.getNickServPass(),
"NickServ")
def doAutoJoins(self):
if not self.autoJoinDone:
@ -2221,7 +2255,10 @@ class PesterWindow(MovingWindow):
except KeyError:
chumopen = self.convos[h.lower()].chumopen
if chumopen:
self.chatlog.log(chum.handle, self.profile().pestermsg(chum, QtGui.QColor(self.theme["convo/systemMsgColor"]), self.theme["convo/text/ceasepester"]))
self.chatlog.log(chum.handle,
self.profile().pestermsg(chum,
QtGui.QColor(self.theme["convo/systemMsgColor"]),
self.theme["convo/text/ceasepester"]))
self.convoClosed.emit(handle)
self.chatlog.finish(h)
del self.convos[h]
@ -2273,9 +2310,12 @@ class PesterWindow(MovingWindow):
if h.upper() == "NICKSERV" and m.startswith("Your nickname is now being changed to"):
changedto = m[39:-1]
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.theme["main/defaultwindow/style"] + "}")
msgbox.setText("This chumhandle has been registered; you may not use it.")
msgbox.setInformativeText("Your handle is now being changed to %s." % (changedto))
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.theme["main/defaultwindow/style"])
msgbox.setText("This chumhandle has been registered; "
"you may not use it.")
msgbox.setInformativeText("Your handle is now being changed to %s."
% (changedto))
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
msgbox.exec()
elif h == self.randhandler.randNick:
@ -2298,8 +2338,11 @@ class PesterWindow(MovingWindow):
msgbox = QtWidgets.QMessageBox()
msgbox.setText("You're invited!")
msgbox.setStyleSheet("QMessageBox{" + self.theme["main/defaultwindow/style"] + "}")
msgbox.setInformativeText("%s has invited you to the memo: %s\nWould you like to join them?" % (handle, channel))
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok | QtWidgets.QMessageBox.StandardButton.Cancel)
msgbox.setInformativeText(("%s has invited you to the memo: %s"
"\nWould you like to join them?")
% (handle, channel))
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok
| QtWidgets.QMessageBox.StandardButton.Cancel)
# Find the Cancel button and make it default
for b in msgbox.buttons():
if msgbox.buttonRole(b) == QtWidgets.QMessageBox.ButtonRole.RejectRole:
@ -2433,9 +2476,13 @@ class PesterWindow(MovingWindow):
def removeChum(self, chumlisting):
self.config.removeChum(chumlisting)
def reportChum(self, handle):
(reason, ok) = QtWidgets.QInputDialog.getText(self, "Report User", "Enter the reason you are reporting this user (optional):")
(reason, ok) = QtWidgets.QInputDialog.getText(self,
"Report User",
"Enter the reason you are reporting this user (optional):")
if ok:
self.sendMessage.emit("REPORT %s %s" % (handle, reason) , "calSprite")
self.sendMessage.emit("REPORT %s %s"
% (handle, reason),
"calSprite")
@QtCore.pyqtSlot(QString)
def blockChum(self, handle):
@ -2444,7 +2491,9 @@ class PesterWindow(MovingWindow):
self.config.removeChum(h)
if h in self.convos:
convo = self.convos[h]
msg = self.profile().pestermsg(convo.chum, QtGui.QColor(self.theme["convo/systemMsgColor"]), self.theme["convo/text/blocked"])
msg = self.profile().pestermsg(convo.chum,
QtGui.QColor(self.theme["convo/systemMsgColor"]),
self.theme["convo/text/blocked"])
convo.textArea.append(convertTags(msg))
self.chatlog.log(convo.chum.handle, msg)
convo.updateBlocked()
@ -2461,7 +2510,9 @@ class PesterWindow(MovingWindow):
self.config.delBlocklist(h)
if h in self.convos:
convo = self.convos[h]
msg = self.profile().pestermsg(convo.chum, QtGui.QColor(self.theme["convo/systemMsgColor"]), self.theme["convo/text/unblocked"])
msg = self.profile().pestermsg(convo.chum,
QtGui.QColor(self.theme["convo/systemMsgColor"]),
self.theme["convo/text/unblocked"])
convo.textArea.append(convertTags(msg))
self.chatlog.log(convo.chum.handle, msg)
convo.updateMood(convo.chum.mood, unblocked=True)
@ -2735,7 +2786,9 @@ class PesterWindow(MovingWindow):
msgbox = QtWidgets.QMessageBox()
msgbox.setInformativeText("THIS IS NOT A VALID GROUP NAME")
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
msgbox.setStyleSheet("QMessageBox{" + self.theme["main/defaultwindow/style"] + "}")#Style :) (memos/style or convo/style works :3 )
#Style :) (memos/style or convo/style works :3 )
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.theme["main/defaultwindow/style"])
msgbox.exec()
self.addgroupdialog = None
return
@ -3063,28 +3116,33 @@ class PesterWindow(MovingWindow):
try:
self.userprofile = userProfile(handle)
self.changeTheme(self.userprofile.getTheme())
except (json.JSONDecodeError, FileNotFoundError) as e:
except (json.JSONDecodeError, FileNotFoundError, ValueError) as e:
msgBox = QtWidgets.QMessageBox()
msgBox.setIcon(QtWidgets.QMessageBox.StandardButton.Warning)
msgBox.setIcon(QtWidgets.QMessageBox.Icon.Warning)
msgBox.setWindowTitle(":(")
msgBox.setTextFormat(QtCore.Qt.TextFormat.RichText) # Clickable html links
self.filename = _datadir+"pesterchum.js"
try:
msgBox.setText("<html><h3>Failed to load: " + ("<a href='%s'>%s/%s.js</a>" % (self.profiledir, self.profiledir, user)) + \
"<br><br> Try to check for syntax errors if the file exists." + \
"<br><br>If you got this message at launch you may want to change your default profile." + \
"<br><br>" + str(e) + "<\h3><\html>")
#"\" if pesterchum acts oddly you might want to try backing up and then deleting \"" + \
#_datadir+"pesterchum.js" + \
#"\"")
msg = ("<html><h3>Failed to load: "
"<a href='%s'>%s/%s.js</a>"
"<br><br>"
"Try to check for syntax errors if the file exists."
"<br><br>"
"If you got this message at launch you may want to "
"change your default profile."
"<br><br>%s<\h3><\html>"
% (self.profiledir, self.profiledir, user, e))
except:
# More generic error for if not all variables are available.
msgBox.setText("Unspecified profile error." + \
"<br><br> Try to check for syntax errors if the file exists." + \
"<br><br>If you got this message at launch you may want to change your default profile." + \
"<br><br>" + str(e) + "<\h3><\html>")
msg = ("Unspecified profile error."
"<br><br> Try to check for syntax errors if the "
"file exists."
"<br><br>If you got this message at launch you may "
"want to change your default profile."
"<br><br>%s<\h3><\html>" % e)
PchumLog.critical(e)
msgBox.setText(msg)
msgBox.exec()
return
else:
@ -3145,7 +3203,8 @@ class PesterWindow(MovingWindow):
closeWarning = QtWidgets.QMessageBox()
closeWarning.setText("WARNING: CHANGING PROFILES WILL CLOSE ALL CONVERSATION WINDOWS!")
closeWarning.setInformativeText("i warned you about windows bro!!!! i told you dog!")
closeWarning.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Cancel | QtWidgets.QMessageBox.StandardButton.Ok)
closeWarning.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Cancel
| QtWidgets.QMessageBox.StandardButton.Ok)
closeWarning.setDefaultButton(QtWidgets.QMessageBox.StandardButton.Ok)
ret = closeWarning.exec()
if ret == QtWidgets.QMessageBox.StandardButton.Cancel:
@ -3178,15 +3237,19 @@ class PesterWindow(MovingWindow):
self.newConversation("nickServ")
@QtCore.pyqtSlot()
def launchHelp(self):
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://github.com/Dpeta/pesterchum-alt-servers/issues", QtCore.QUrl.ParsingMode.TolerantMode))
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://forum.homestuck.xyz/viewtopic.php?f=7&t=467", QtCore.QUrl.ParsingMode.TolerantMode))
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://github.com/Dpeta/pesterchum-alt-servers/issues",
QtCore.QUrl.ParsingMode.TolerantMode))
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://forum.homestuck.xyz/viewtopic.php?f=7&t=467",
QtCore.QUrl.ParsingMode.TolerantMode))
@QtCore.pyqtSlot()
def reportBug(self):
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://github.com/Dpeta/pesterchum-alt-servers/issues", QtCore.QUrl.ParsingMode.TolerantMode))
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://github.com/Dpeta/pesterchum-alt-servers/issues",
QtCore.QUrl.ParsingMode.TolerantMode))
@QtCore.pyqtSlot()
def xyzRules(self):
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://www.pesterchum.xyz/pesterchum-rules", QtCore.QUrl.ParsingMode.TolerantMode))
QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://www.pesterchum.xyz/pesterchum-rules",
QtCore.QUrl.ParsingMode.TolerantMode))
@QtCore.pyqtSlot(QString, QString)
def nickCollision(self, handle, tmphandle):
@ -3196,7 +3259,10 @@ class PesterWindow(MovingWindow):
self.loadingscreen = None
self.mychumhandle.setText(tmphandle)
self.userprofile = userProfile(PesterProfile("pesterClient%d" % (random.randint(100,999)), QtGui.QColor("black"), Mood(0)))
self.userprofile = userProfile(PesterProfile("pesterClient%d"
% (random.randint(100,999)),
QtGui.QColor("black"),
Mood(0)))
self.changeTheme(self.userprofile.getTheme())
if not hasattr(self, 'chooseprofile'):
@ -3247,7 +3313,8 @@ class PesterWindow(MovingWindow):
def tooManyPeeps(self):
msg = QtWidgets.QMessageBox(self)
msg.setText("D: TOO MANY PEOPLE!!!")
msg.setInformativeText("The server has hit max capacity. Please try again later.")
msg.setInformativeText("The server has hit max capacity."
"Please try again later.")
#msg.setStyleSheet("QMessageBox{" + self.theme["main/defaultwindow/style"] + "}")
msg.exec()
@ -3276,7 +3343,8 @@ class PesterWindow(MovingWindow):
PchumLog.info("server: "+str(server))
except:
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.theme["main/defaultwindow/style"] + "}")
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.theme["main/defaultwindow/style"])
msgbox.setWindowIcon(PesterIcon(self.theme["main/icon"]))
msgbox.setInformativeText("Incorrect format :(")
msgbox.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
@ -3308,11 +3376,12 @@ class PesterWindow(MovingWindow):
if os.path.isfile(_datadir + "serverlist.json"):
PchumLog.error("Failed to load server list from serverlist.json.")
msgbox = QtWidgets.QMessageBox()
msgbox.setStyleSheet("QMessageBox{" + self.theme["main/defaultwindow/style"] + "}")
msgbox.setStyleSheet("QMessageBox{ %s }"
% self.theme["main/defaultwindow/style"])
msgbox.setWindowIcon(PesterIcon(self.theme["main/icon"]))
msgbox.setInformativeText("Failed to load server list, do you want to revert to defaults?\n" \
+ "If you choose no, Pesterchum will most likely crash unless you manually fix serverlist.json\n" \
+ "Please tell me if this error occurs :'3")
msgbox.setInformativeText("Failed to load server list, do you want to revert to defaults?\n"
"If you choose no, Pesterchum will most likely crash unless you manually fix serverlist.json\n"
"Please tell me if this error occurs :'3")
msgbox.addButton(QtWidgets.QPushButton("Yes"), QtWidgets.QMessageBox.ButtonRole.YesRole)
msgbox.addButton(QtWidgets.QPushButton("No"), QtWidgets.QMessageBox.ButtonRole.NoRole)
msgbox.exec()
@ -3323,8 +3392,8 @@ class PesterWindow(MovingWindow):
server_file.close()
else:
PchumLog.warning("Failed to load server list because serverlist.json doesn't exist, " \
+ "this isn't an issue if this is the first time Pesterchum has been started.")
PchumLog.warning("Failed to load server list because serverlist.json doesn't exist, "
"this isn't an issue if this is the first time Pesterchum has been started.")
with open(_datadir + "serverlist.json", "w") as server_file:
server_file.write(json.dumps(default_server_list, indent = 4) )
server_file.close()
@ -3561,7 +3630,8 @@ class PesterWindow(MovingWindow):
# Connect
self.chooseServerWidged.accepted.connect(self.setServer)
self.chooseServerWidged.rejected.connect(self.killApp, QtCore.Qt.ConnectionType.QueuedConnection)
self.chooseServerWidged.rejected.connect(self.killApp,
QtCore.Qt.ConnectionType.QueuedConnection)
# Show
self.chooseServerWidged.show()
@ -3664,7 +3734,9 @@ class MainProgram(QtCore.QObject):
self.widget = PesterWindow(options, parent=self, app=self.app)
#self.widget.show() <== Already called in showLoading()
self.trayicon = PesterTray(PesterIcon(self.widget.theme["main/icon"]), self.widget, self.app)
self.trayicon = PesterTray(PesterIcon(self.widget.theme["main/icon"]),
self.widget,
self.app)
self.traymenu = QtWidgets.QMenu()
moodMenu = self.traymenu.addMenu("SET MOOD")
@ -3725,7 +3797,8 @@ class MainProgram(QtCore.QObject):
self.trayicon.show()
if self.widget.config.trayMessage():
self.trayicon.showMessage("Pesterchum", ("Pesterchum is still running in the system tray."
+ '\n' + "Right click to close it."))
"\n"
"Right click to close it."))
@QtCore.pyqtSlot()
def trayMessageClick(self):
@ -3967,7 +4040,7 @@ class MainProgram(QtCore.QObject):
# Show error to end user and log.
try:
# Log to log file
PchumLog.error(exc, value, tb)
PchumLog.error("%s, %s" % (exc, value))
# Try to write to separate logfile
try:
@ -3997,7 +4070,6 @@ class MainProgram(QtCore.QObject):
PchumLog.exception("app error")
def run(self):
#PchumLog.critical("mreowww") <--- debug thingy :3
sys.exit(self.app.exec())
def _retrieveGlobals():