diff --git a/convo.py b/convo.py index 23e7ca1..0a2ce51 100644 --- a/convo.py +++ b/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): diff --git a/irc.py b/irc.py index 8c8eb90..2ead161 100644 --- a/irc.py +++ b/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. diff --git a/memos.py b/memos.py index 4875645..50f3a5a 100644 --- a/memos.py +++ b/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()) diff --git a/menus.py b/menus.py index 491aca8..cfa92e0 100644 --- a/menus.py +++ b/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 ()" + "\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() diff --git a/parsetools.py b/parsetools.py index 1c2c55c..22cc6e6 100644 --- a/parsetools.py +++ b/parsetools.py @@ -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 diff --git a/pesterchum.py b/pesterchum.py index 73543c6..dbbbd31 100755 --- a/pesterchum.py +++ b/pesterchum.py @@ -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") diff --git a/user_profile.py b/user_profile.py index 8cc4731..70fa5c2 100644 --- a/user_profile.py +++ b/user_profile.py @@ -358,8 +358,8 @@ with a backup from: %s" "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)