Add IRC compatibility mode (only disables things for now . . .)
This commit is contained in:
parent
ccf462d8a8
commit
938cf69b85
7 changed files with 73 additions and 60 deletions
4
convo.py
4
convo.py
|
@ -898,7 +898,7 @@ class PesterConvo(QtWidgets.QFrame):
|
|||
self.chum.color = color
|
||||
|
||||
def addMessage(self, msg, me=True):
|
||||
if type(msg) in [str, str]:
|
||||
if isinstance(msg, str):
|
||||
lexmsg = lexMessage(msg)
|
||||
else:
|
||||
lexmsg = msg
|
||||
|
@ -1096,7 +1096,7 @@ class PesterConvo(QtWidgets.QFrame):
|
|||
text = self.textInput.text()
|
||||
text = str(self.textInput.text())
|
||||
|
||||
return parsetools.kxhandleInput(self, text, flavor="convo")
|
||||
return parsetools.kxhandleInput(self, text, flavor="convo", irc_compatible=self.mainwindow.config.irc_compatibility_mode())
|
||||
|
||||
@QtCore.pyqtSlot()
|
||||
def addThisChum(self):
|
||||
|
|
45
irc.py
45
irc.py
|
@ -829,25 +829,26 @@ class PesterIRC(QtCore.QThread):
|
|||
)
|
||||
self.connected.emit() # Alert main thread that we've connected.
|
||||
profile = self.mainwindow.profile()
|
||||
if not self.mainwindow.config.lowBandwidth():
|
||||
# Negotiate capabilities
|
||||
self._send_irc.cap("REQ", "message-tags")
|
||||
self._send_irc.cap(
|
||||
"REQ", "draft/metadata-notify-2"
|
||||
) # <--- Not required in the unreal5 module implementation
|
||||
self._send_irc.cap("REQ", "pesterchum-tag") # <--- Currently not using this
|
||||
self._send_irc.cap("REQ", "twitch.tv/membership") # Twitch silly
|
||||
self._send_irc.join("#pesterchum")
|
||||
# Get mood
|
||||
mood = profile.mood.value_str()
|
||||
# Moods via metadata
|
||||
self._send_irc.metadata("*", "sub", "mood")
|
||||
self._send_irc.metadata("*", "set", "mood", mood)
|
||||
# Color via metadata
|
||||
self._send_irc.metadata("*", "sub", "color")
|
||||
self._send_irc.metadata("*", "set", "color", profile.color.name())
|
||||
# Backwards compatible moods
|
||||
self._send_irc.privmsg("#pesterchum", f"MOOD >{mood}")
|
||||
if self.mainwindow.config.irc_compatibility_mode():
|
||||
return
|
||||
# Negotiate capabilities
|
||||
self._send_irc.cap("REQ", "message-tags")
|
||||
self._send_irc.cap(
|
||||
"REQ", "draft/metadata-notify-2"
|
||||
) # <--- Not required in the unreal5 module implementation
|
||||
self._send_irc.cap("REQ", "pesterchum-tag") # <--- Currently not using this
|
||||
self._send_irc.cap("REQ", "twitch.tv/membership") # Twitch silly
|
||||
self._send_irc.join("#pesterchum")
|
||||
# Get mood
|
||||
mood = profile.mood.value_str()
|
||||
# Moods via metadata
|
||||
self._send_irc.metadata("*", "sub", "mood")
|
||||
self._send_irc.metadata("*", "set", "mood", mood)
|
||||
# Color via metadata
|
||||
self._send_irc.metadata("*", "sub", "color")
|
||||
self._send_irc.metadata("*", "set", "color", profile.color.name())
|
||||
# Backwards compatible moods
|
||||
self._send_irc.privmsg("#pesterchum", f"MOOD >{mood}")
|
||||
|
||||
def _featurelist(self, _target, _handle, *params):
|
||||
"""Numerical reply 005 RPL_ISUPPORT to communicate supported server features.
|
||||
|
@ -857,11 +858,11 @@ class PesterIRC(QtCore.QThread):
|
|||
"""
|
||||
features = params[:-1]
|
||||
PchumLog.info("Server _featurelist: %s", features)
|
||||
for feature in features:
|
||||
if feature.casefold().startswith("metadata"):
|
||||
if not self.metadata_supported:
|
||||
if any(feature.startswith("METADATA") for feature in features):
|
||||
PchumLog.info("Server supports metadata.")
|
||||
self.metadata_supported = True
|
||||
|
||||
|
||||
def _cap(self, server, nick, subcommand, tag):
|
||||
"""IRCv3 capabilities command from server.
|
||||
|
||||
|
|
10
memos.py
10
memos.py
|
@ -357,7 +357,7 @@ class MemoText(PesterText):
|
|||
pass
|
||||
|
||||
def addMessage(self, msg, chum):
|
||||
if type(msg) in [str, str]:
|
||||
if isinstance(msg, str):
|
||||
lexmsg = lexMessage(msg)
|
||||
else:
|
||||
lexmsg = msg
|
||||
|
@ -698,6 +698,8 @@ class PesterMemo(PesterConvo):
|
|||
return PesterIcon(self.mainwindow.theme["memos/memoicon"])
|
||||
|
||||
def sendTimeInfo(self, newChum=False):
|
||||
if self.mainwindow.config.irc_compatibility_mode():
|
||||
return
|
||||
if newChum:
|
||||
self.messageSent.emit(
|
||||
"PESTERCHUM:TIME>%s" % (delta2txt(self.time.getTime(), "server") + "i"),
|
||||
|
@ -1398,7 +1400,7 @@ class PesterMemo(PesterConvo):
|
|||
def sentMessage(self):
|
||||
text = str(self.textInput.text())
|
||||
|
||||
return parsetools.kxhandleInput(self, text, flavor="memos")
|
||||
return parsetools.kxhandleInput(self, text, flavor="memos", irc_compatible=self.mainwindow.config.irc_compatibility_mode())
|
||||
|
||||
@QtCore.pyqtSlot(QString)
|
||||
def namesUpdated(self, channel):
|
||||
|
@ -1730,7 +1732,7 @@ class PesterMemo(PesterConvo):
|
|||
txt_time = delta2txt(time, "server")
|
||||
# Only send if time isn't CURRENT, it's very spammy otherwise.
|
||||
# CURRENT should be the default already.
|
||||
if txt_time != "i":
|
||||
if txt_time != "i" and not self.mainwindow.config.irc_compatibility_mode():
|
||||
serverText = "PESTERCHUM:TIME>" + txt_time
|
||||
self.messageSent.emit(serverText, self.title())
|
||||
elif update == "+q":
|
||||
|
@ -1951,6 +1953,8 @@ class PesterMemo(PesterConvo):
|
|||
|
||||
@QtCore.pyqtSlot()
|
||||
def sendtime(self):
|
||||
if self.mainwindow.config.irc_compatibility_mode():
|
||||
return
|
||||
# me = self.mainwindow.profile()
|
||||
# systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"])
|
||||
time = txt2delta(self.timeinput.text())
|
||||
|
|
21
menus.py
21
menus.py
|
@ -323,10 +323,10 @@ class QuirkTesterWindow(QtWidgets.QDialog):
|
|||
def sentMessage(self):
|
||||
text = str(self.textInput.text())
|
||||
|
||||
return parsetools.kxhandleInput(self, text, "menus")
|
||||
return parsetools.kxhandleInput(self, text, "menus", irc_compatible=self.mainwindow.config.irc_compatibility_mode())
|
||||
|
||||
def addMessage(self, msg, me=True):
|
||||
if type(msg) in [str, str]:
|
||||
if isinstance(msg, str):
|
||||
lexmsg = lexMessage(msg)
|
||||
else:
|
||||
lexmsg = msg
|
||||
|
@ -1233,12 +1233,17 @@ class PesterOptions(QtWidgets.QDialog):
|
|||
self.tabs.button(-2).setChecked(True)
|
||||
self.pages = QtWidgets.QStackedWidget(self)
|
||||
|
||||
self.bandwidthcheck = QtWidgets.QCheckBox("Low Bandwidth", self)
|
||||
if self.config.lowBandwidth():
|
||||
self.bandwidthcheck.setChecked(True)
|
||||
self.irc_mode_check = QtWidgets.QCheckBox("IRC compatibility mode", self)
|
||||
if self.config.irc_compatibility_mode():
|
||||
self.irc_mode_check.setChecked(True)
|
||||
bandwidthLabel = QtWidgets.QLabel(
|
||||
"(Stops you for receiving the flood of MOODS,\n"
|
||||
" though stops chumlist from working properly)"
|
||||
"Enable this if you're planning on using Pesterchum on a server with normal IRC clients."
|
||||
"\nDisables at least the following features:"
|
||||
"\n - Moods (#pesterchum MOODs and METADATA moods)"
|
||||
"\n - Message colors (COLOR > and METADATA color)"
|
||||
"\n - Message color tags (<c=0,0,0>)"
|
||||
"\n - Timelines (PESTERCHUM:CURRENT, etc.)"
|
||||
"\n - PESTERCHUM:X commands (BEGIN, CEASE, BLOCK, IDLE, etc.)"
|
||||
)
|
||||
font = bandwidthLabel.font()
|
||||
font.setPointSize(8)
|
||||
|
@ -1617,7 +1622,7 @@ class PesterOptions(QtWidgets.QDialog):
|
|||
widget = QtWidgets.QWidget()
|
||||
layout_connect = QtWidgets.QVBoxLayout(widget)
|
||||
layout_connect.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
|
||||
layout_connect.addWidget(self.bandwidthcheck)
|
||||
layout_connect.addWidget(self.irc_mode_check)
|
||||
layout_connect.addWidget(bandwidthLabel)
|
||||
layout_connect.addWidget(self.autonickserv)
|
||||
layout_indent = QtWidgets.QVBoxLayout()
|
||||
|
|
|
@ -283,8 +283,7 @@ def kxlexMsg(string):
|
|||
# ...and that's it for this.
|
||||
return msg
|
||||
|
||||
|
||||
def lexMessage(string):
|
||||
def lexMessage(string: str):
|
||||
lexlist = [
|
||||
(mecmd, _mecmdre),
|
||||
(colorBegin, _ctag_begin),
|
||||
|
@ -302,10 +301,11 @@ def lexMessage(string):
|
|||
(honker, _honk),
|
||||
]
|
||||
|
||||
string = str(string)
|
||||
string = string.replace("\n", " ").replace("\r", " ")
|
||||
lexed = lexer(str(string), lexlist)
|
||||
lexed = lexer(string, lexlist)
|
||||
return balance(lexed)
|
||||
|
||||
def balance(lexed):
|
||||
balanced = []
|
||||
beginc = 0
|
||||
endc = 0
|
||||
|
@ -683,7 +683,7 @@ def _is_ooc(msg, strict=True):
|
|||
return False
|
||||
|
||||
|
||||
def kxhandleInput(ctx, text=None, flavor=None):
|
||||
def kxhandleInput(ctx, text=None, flavor=None, irc_compatible=False):
|
||||
"""The function that user input that should be sent to the server is routed
|
||||
through. Handles lexing, splitting, and quirk application, as well as
|
||||
sending."""
|
||||
|
@ -699,11 +699,10 @@ def kxhandleInput(ctx, text=None, flavor=None):
|
|||
if text is None:
|
||||
# Fetch the raw text from the input box.
|
||||
text = ctx.textInput.text()
|
||||
text = str(ctx.textInput.text())
|
||||
|
||||
# Preprocessing stuff.
|
||||
msg = text.strip()
|
||||
if msg == "" or msg.startswith("PESTERCHUM:"):
|
||||
if not msg or msg.startswith("PESTERCHUM:"):
|
||||
# We don't allow users to send system messages. There's also no
|
||||
# point if they haven't entered anything.
|
||||
return
|
||||
|
@ -736,7 +735,7 @@ def kxhandleInput(ctx, text=None, flavor=None):
|
|||
|
||||
# Begin message processing.
|
||||
# We use 'text' despite its lack of processing because it's simpler.
|
||||
if should_quirk and not (is_action or is_ooc):
|
||||
if should_quirk and not (is_action or is_ooc or irc_compatible):
|
||||
if flavor != "menus":
|
||||
# Fetch the quirks we'll have to apply.
|
||||
quirks = ctx.mainwindow.userprofile.quirks
|
||||
|
@ -827,7 +826,8 @@ def kxhandleInput(ctx, text=None, flavor=None):
|
|||
if flavor == "convo":
|
||||
# if ceased, rebegin
|
||||
if hasattr(ctx, "chumopen") and not ctx.chumopen:
|
||||
ctx.mainwindow.newConvoStarted.emit(QString(ctx.title()), True)
|
||||
if not irc_compatible:
|
||||
ctx.mainwindow.newConvoStarted.emit(QString(ctx.title()), True)
|
||||
ctx.setChumOpen(True)
|
||||
|
||||
# Post-process and send the messages.
|
||||
|
@ -846,7 +846,7 @@ def kxhandleInput(ctx, text=None, flavor=None):
|
|||
serverMsg = copy(lm)
|
||||
|
||||
# Memo-specific processing.
|
||||
if flavor == "memos" and not is_action:
|
||||
if flavor == "memos" and not is_action and not irc_compatible:
|
||||
# Quirks were already applied, so get the prefix/postfix stuff
|
||||
# ready.
|
||||
# We fetched the information outside of the loop, so just
|
||||
|
|
|
@ -1897,7 +1897,7 @@ class PesterWindow(MovingWindow):
|
|||
event.accept()
|
||||
|
||||
def newMessage(self, handle, msg):
|
||||
if handle in self.config.getBlocklist():
|
||||
if not self.config.irc_compatibility_mode() and handle in self.config.getBlocklist():
|
||||
# yeah suck on this
|
||||
self.sendMessage.emit("PESTERCHUM:BLOCKED", handle)
|
||||
return
|
||||
|
@ -2007,7 +2007,7 @@ class PesterWindow(MovingWindow):
|
|||
self.trollslum.updateMood(handle, mood)
|
||||
|
||||
def newConversation(self, chum, initiated=True):
|
||||
if type(chum) in [str, str]:
|
||||
if isinstance(chum, str):
|
||||
matchingChums = [c for c in self.chumList.chums if c.handle == chum]
|
||||
if len(matchingChums) > 0:
|
||||
mood = matchingChums[0].mood
|
||||
|
@ -2032,7 +2032,7 @@ class PesterWindow(MovingWindow):
|
|||
)
|
||||
convoWindow.windowClosed["QString"].connect(self.closeConvo)
|
||||
self.convos[chum.handle] = convoWindow
|
||||
if str(chum.handle).upper() in BOTNAMES:
|
||||
if chum.handle.upper() in BOTNAMES or self.config.irc_compatibility_mode():
|
||||
convoWindow.toggleQuirks(True)
|
||||
convoWindow.quirksOff.setChecked(True)
|
||||
if str(chum.handle).upper() in CUSTOMBOTS:
|
||||
|
@ -2616,7 +2616,8 @@ class PesterWindow(MovingWindow):
|
|||
self.theme["convo/text/ceasepester"],
|
||||
),
|
||||
)
|
||||
self.convoClosed.emit(handle)
|
||||
if not self.config.irc_compatibility_mode():
|
||||
self.convoClosed.emit(handle)
|
||||
self.chatlog.finish(h)
|
||||
del self.convos[h]
|
||||
|
||||
|
@ -2881,7 +2882,8 @@ class PesterWindow(MovingWindow):
|
|||
newtroll = PesterProfile(h)
|
||||
self.trollslum.addTroll(newtroll)
|
||||
self.moodRequest.emit(newtroll)
|
||||
self.blockedChum.emit(handle)
|
||||
if not self.config.irc_compatibility_mode():
|
||||
self.blockedChum.emit(handle)
|
||||
|
||||
@QtCore.pyqtSlot(QString)
|
||||
def unblockChum(self, handle):
|
||||
|
@ -2902,8 +2904,9 @@ class PesterWindow(MovingWindow):
|
|||
self.trollslum.removeTroll(handle)
|
||||
self.config.addChum(chum)
|
||||
self.chumList.addChum(chum)
|
||||
self.moodRequest.emit(chum)
|
||||
self.unblockedChum.emit(handle)
|
||||
if not self.config.irc_compatibility_mode():
|
||||
self.moodRequest.emit(chum)
|
||||
self.unblockedChum.emit(handle)
|
||||
|
||||
@QtCore.pyqtSlot(bool)
|
||||
def toggleIdle(self, idle):
|
||||
|
@ -2968,7 +2971,7 @@ class PesterWindow(MovingWindow):
|
|||
# might affect, but I've been using it for months and haven't
|
||||
# noticed any issues....
|
||||
handle = convo.chum.handle
|
||||
if self.isBot(handle):
|
||||
if self.isBot(handle) and not self.config.irc_compatibility_mode():
|
||||
# Don't send these idle messages.
|
||||
continue
|
||||
# karxi: Now we just use 'handle' instead of 'h'.
|
||||
|
@ -3440,11 +3443,11 @@ class PesterWindow(MovingWindow):
|
|||
if notifysetting != curnotify:
|
||||
self.config.set("notifyOptions", notifysetting)
|
||||
# low bandwidth
|
||||
bandwidthsetting = self.optionmenu.bandwidthcheck.isChecked()
|
||||
curbandwidth = self.config.lowBandwidth()
|
||||
if bandwidthsetting != curbandwidth:
|
||||
self.config.set("lowBandwidth", bandwidthsetting)
|
||||
if bandwidthsetting:
|
||||
irc_mode_setting = self.optionmenu.irc_mode_check.isChecked()
|
||||
curbandwidth = self.config.irc_compatibility_mode()
|
||||
if irc_mode_setting != curbandwidth:
|
||||
self.config.set("irc_compatibility_mode", irc_mode_setting)
|
||||
if irc_mode_setting:
|
||||
self.leftChannel.emit("#pesterchum")
|
||||
else:
|
||||
self.joinChannel.emit("#pesterchum")
|
||||
|
|
|
@ -358,8 +358,8 @@ with a backup from: <a href='%s'>%s</a></h3></html>"
|
|||
"notifyOptions", self.SIGNIN | self.NEWMSG | self.NEWCONVO | self.INITIALS
|
||||
)
|
||||
|
||||
def lowBandwidth(self):
|
||||
return self.config.get("lowBandwidth", False)
|
||||
def irc_compatibility_mode(self):
|
||||
return self.config.get("irc_compatibility_mode", False)
|
||||
|
||||
def ghostchum(self):
|
||||
return self.config.get("ghostchum", False)
|
||||
|
|
Loading…
Reference in a new issue