From c7987a37aa061ddefd6e33cbca63889c136f508b Mon Sep 17 00:00:00 2001 From: Stephen Dranger Date: Sun, 13 Feb 2011 03:27:12 -0600 Subject: [PATCH] the great parser change! --- TODO | 12 ++--- convo.py | 121 ++++++++++++++++++++++-------------------- convo.pyc | Bin 25405 -> 25610 bytes dataobjs.py | 79 ++++++++++++++++++--------- dataobjs.pyc | Bin 11753 -> 13035 bytes generic.pyc | Bin 3575 -> 3575 bytes irc.pyc | Bin 13203 -> 13203 bytes logs/chums.js | 2 +- memos.py | 81 ++++++++++++++-------------- memos.pyc | Bin 31835 -> 31758 bytes menus.py | 107 ++++++++++++++++++++++++++++++++++--- menus.pyc | Bin 20542 -> 23552 bytes oyoyo/__init__.pyc | Bin 333 -> 333 bytes oyoyo/client.pyc | Bin 9728 -> 9728 bytes oyoyo/cmdhandler.pyc | Bin 8312 -> 8312 bytes oyoyo/helpers.pyc | Bin 5013 -> 5013 bytes oyoyo/ircevents.pyc | Bin 5693 -> 5693 bytes oyoyo/parse.pyc | Bin 2869 -> 2869 bytes parsetools.py | 70 ++++++++++++++++++++---- parsetools.pyc | Bin 8426 -> 10748 bytes pesterchum.js | 2 +- pesterchum.py | 88 +++++++++++++++++++----------- profiles/ghostDunk.js | 2 +- 23 files changed, 384 insertions(+), 180 deletions(-) diff --git a/TODO b/TODO index edb3708..e597fd2 100644 --- a/TODO +++ b/TODO @@ -1,17 +1,17 @@ Features: -* Tray doesn't disappear on windows after close -* memo sending from unknown color breaks -- over IRC -* smilies processed before quirks -* More complex quirks: random, spelling, by-sound +* More complex quirks: spelling, by-sound +* random quirk string enter must clear text box and focus input on add +* IRC message limit!!! +* on ban, redirect to memo chooser * ? time option??? -* convert hex tags ( or ) * help menu -- about and forum +* Tray doesn't disappear on windows after close +* memo sending from unknown color breaks -- over IRC?? -- release alpha * shared buddy lists - changes to the buddy list should refresh it? multiple clients share buddy list??? * chumList not scaling -- QListView + delegate? * spell check? -* convo backgrounds -- make them more like http://www.mspaintadventures.com/storyfiles/hs2/02546_2.gif * help button on quirks menu? -- release beta * flashing?? diff --git a/convo.py b/convo.py index 7a8364c..7a7431f 100644 --- a/convo.py +++ b/convo.py @@ -1,11 +1,12 @@ from string import Template import re +from copy import copy from datetime import datetime, timedelta from PyQt4 import QtGui, QtCore from dataobjs import PesterProfile, Mood, PesterHistory from generic import PesterIcon, RightClickList -from parsetools import convertTags +from parsetools import convertTags, lexMessage, mecmd, colorBegin, colorEnd class PesterTabWindow(QtGui.QFrame): def __init__(self, mainwindow, parent=None, convo="convo"): @@ -203,74 +204,72 @@ class PesterText(QtGui.QTextEdit): 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, text, chum): - color = chum.colorhtml() + def addMessage(self, lexmsg, chum): + if len(lexmsg) == 0: + return + color = chum.colorcmd() systemColor = QtGui.QColor(self.parent().mainwindow.theme["convo/systemMsgColor"]) initials = chum.initials() - msg = unicode(text) parent = self.parent() window = parent.mainwindow me = window.profile() - quirks = window.userprofile.quirks if parent.applyquirks else None - if msg == "PESTERCHUM:BEGIN": + if lexmsg[0] == "PESTERCHUM:BEGIN": parent.setChumOpen(True) - msg = chum.pestermsg(me, systemColor, window.theme["convo/text/beganpester"]) - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) - elif msg == "PESTERCHUM:CEASE": + pmsg = chum.pestermsg(me, systemColor, window.theme["convo/text/beganpester"]) + window.chatlog.log(chum.handle, pmsg) + self.append(convertTags(pmsg)) + elif lexmsg[0] == "PESTERCHUM:CEASE": parent.setChumOpen(False) - msg = chum.pestermsg(me, systemColor, window.theme["convo/text/ceasepester"]) - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) - elif msg == "PESTERCHUM:BLOCK": - msg = chum.pestermsg(me, systemColor, window.theme['convo/text/blocked']) - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) - elif msg == "PESTERCHUM:UNBLOCK": - msg = chum.pestermsg(me, systemColor, window.theme['convo/text/unblocked']) - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) - elif msg == "PESTERCHUM:BLOCKED": - msg = chum.pestermsg(me, systemColor, window.theme['convo/text/blockedmsg']) - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) - elif msg == "PESTERCHUM:IDLE": - msg = chum.idlemsg(systemColor, window.theme['convo/text/idle']) - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) - elif msg[0:3] == "/me" or msg[0:13] == "PESTERCHUM:ME": - if quirks: - msg = quirks.apply(msg) - if msg[0:3] == "/me": - start = 3 - else: - start = 13 - space = msg.find(" ") - msg = chum.memsg(systemColor, msg[start:space], msg[space:]) + pmsg = chum.pestermsg(me, systemColor, window.theme["convo/text/ceasepester"]) + window.chatlog.log(chum.handle, pmsg) + self.append(convertTags(pmsg)) + elif lexmsg[0] == "PESTERCHUM:BLOCK": + pmsg = chum.pestermsg(me, systemColor, window.theme['convo/text/blocked']) + window.chatlog.log(chum.handle, pmsg) + self.append(convertTags(pmsg)) + elif lexmsg[0] == "PESTERCHUM:UNBLOCK": + pmsg = chum.pestermsg(me, systemColor, window.theme['convo/text/unblocked']) + window.chatlog.log(chum.handle, pmsg) + self.append(convertTags(pmsg)) + elif lexmsg[0] == "PESTERCHUM:BLOCKED": + pmsg = chum.pestermsg(me, systemColor, window.theme['convo/text/blockedmsg']) + window.chatlog.log(chum.handle, pmsg) + self.append(convertTags(pmsg)) + elif lexmsg[0] == "PESTERCHUM:IDLE": + imsg = chum.idlemsg(systemColor, window.theme['convo/text/idle']) + window.chatlog.log(chum.handle, imsg) + self.append(convertTags(imsg)) + elif type(lexmsg[0]) is mecmd: + memsg = chum.memsg(systemColor, lexmsg) if chum is me: - window.chatlog.log(parent.chum.handle, convertTags(msg, "bbcode")) + window.chatlog.log(parent.chum.handle, memsg) else: - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) - self.append(convertTags(msg)) + window.chatlog.log(chum.handle, memsg) + self.append(convertTags(memsg)) else: if not parent.chumopen and chum is not me: beginmsg = chum.pestermsg(me, systemColor, window.theme["convo/text/beganpester"]) parent.setChumOpen(True) - window.chatlog.log(chum.handle, convertTags(beginmsg, "bbcode")) + window.chatlog.log(chum.handle, beginmsg) self.append(convertTags(beginmsg)) - msg = "%s: %s" % (color, initials, msg) - self.append(convertTags(msg, quirkobj=quirks)) + lexmsg[0:0] = [colorBegin("" % (color), color), + "%s: " % (initials)] + lexmsg.append(colorEnd("")) + self.append(convertTags(lexmsg)) if chum is me: - window.chatlog.log(parent.chum.handle, convertTags(msg, "bbcode", quirkobj=quirks)) + window.chatlog.log(parent.chum.handle, lexmsg) else: - if window.idle: + if window.idleaction.isChecked(): idlethreshhold = 60 if (not hasattr(self, 'lastmsg')) or \ - datetime.now() - self.lastmsg > timedelta(0,60): + datetime.now() - self.lastmsg > timedelta(0,idlethreshhold): + idlemsg = me.idlemsg(systemColor, verb) + self.textArea.append(convertTags(idlemsg)) + window.chatlog.log(self.title(), idlemsg) parent.messageSent.emit("PESTERCHUM:IDLE", parent.title()) self.lastmsg = datetime.now() - window.chatlog.log(chum.handle, convertTags(msg, "bbcode")) + window.chatlog.log(chum.handle, lexmsg) def changeTheme(self, theme): self.initTheme(theme) sb = self.verticalScrollBar() @@ -303,6 +302,7 @@ class PesterInput(QtGui.QLineEdit): self.setStyleSheet(theme["convo/input/style"]) def focusInEvent(self, event): self.parent().clearNewMessage() + self.parent().textArea.textCursor().clearSelection() QtGui.QLineEdit.focusInEvent(self, event) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Up: @@ -388,7 +388,7 @@ class PesterConvo(QtGui.QFrame): msg = self.mainwindow.profile().pestermsg(self.chum, QtGui.QColor(self.mainwindow.theme["convo/systemMsgColor"]), self.mainwindow.theme["convo/text/beganpester"]) self.setChumOpen(True) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.title(), convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.title(), msg) self.newmessage = False self.history = PesterHistory() @@ -403,12 +403,12 @@ class PesterConvo(QtGui.QFrame): self.mainwindow.ceasesound.play() msg = self.chum.pestermsg(self.mainwindow.profile(), syscolor, self.mainwindow.theme["convo/text/ceasepester"]) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.title(), convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.title(), msg) self.chumopen = False elif old and old.name() != mood.name(): msg = self.chum.moodmsg(mood, syscolor, self.mainwindow.theme) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.title(), convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.title(), msg) if self.parent(): self.parent().updateMood(self.title(), mood, unblocked) else: @@ -431,13 +431,17 @@ class PesterConvo(QtGui.QFrame): def updateColor(self, color): self.chum.color = color - def addMessage(self, text, me=True): + def addMessage(self, msg, me=True): + if type(msg) in [str, unicode]: + lexmsg = lexMessage(msg) + else: + lexmsg = msg if me: chum = self.mainwindow.profile() else: chum = self.chum self.notifyNewMessage() - self.textArea.addMessage(text, chum) + self.textArea.addMessage(lexmsg, chum) def notifyNewMessage(self): # first see if this conversation HASS the focus @@ -516,13 +520,16 @@ class PesterConvo(QtGui.QFrame): if text == "" or text[0:11] == "PESTERCHUM:": return self.history.add(text) - self.addMessage(text, True) + quirks = self.mainwindow.userprofile.quirks + lexmsg = lexMessage(text) + if type(lexmsg[0]) is not mecmd and self.applyquirks: + lexmsg = quirks.apply(lexmsg) + serverMsg = copy(lexmsg) + self.addMessage(lexmsg, True) # if ceased, rebegin if hasattr(self, 'chumopen') and not self.chumopen: self.mainwindow.newConvoStarted.emit(QtCore.QString(self.title()), True) - # convert color tags - quirkobj = self.mainwindow.userprofile.quirks if self.applyquirks else None - text = convertTags(text, "ctag", quirkobj) + text = convertTags(serverMsg, "ctag") self.messageSent.emit(text, self.title()) self.textInput.setText("") diff --git a/convo.pyc b/convo.pyc index 07ab907a9b8c46c7e6c955e42e9ee6bb6d769f35..965108344ff973ea6a500efdf8d33487bcca2ab1 100644 GIT binary patch delta 7913 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 T8<7!D8^N%r< diff --git a/dataobjs.py b/dataobjs.py index c51be52..263d324 100644 --- a/dataobjs.py +++ b/dataobjs.py @@ -1,9 +1,10 @@ from PyQt4 import QtGui, QtCore from datetime import * import re +import random from generic import PesterIcon -from parsetools import timeDifference +from parsetools import timeDifference, convertTags class Mood(object): moods = ["chummy", "rancorous", "offline", "pleasant", "distraught", @@ -37,15 +38,31 @@ class pesterQuirk(object): raise ValueError("Quirks must be given a dictionary") self.quirk = quirk self.type = self.quirk["type"] - def apply(self, string): + def apply(self, string, first=False, last=False): if self.type == "prefix": return self.quirk["value"] + string - if self.type == "suffix": + elif self.type == "suffix": return string + self.quirk["value"] - if self.type == "replace": + elif self.type == "replace": return string.replace(self.quirk["from"], self.quirk["to"]) - if self.type == "regexp": - return re.sub(self.quirk["from"], self.quirk["to"], string) + elif self.type == "regexp": + fr = self.quirk["from"] + if not first and len(fr) > 0 and fr[0] == "^": + return string + if not last and len(fr) > 0 and fr[len(fr)-1] == "$": + return string + return re.sub(fr, self.quirk["to"], string) + elif self.type == "random": + fr = self.quirk["from"] + if not first and len(fr) > 0 and fr[0] == "^": + return string + if not last and len(fr) > 0 and fr[len(fr)-1] == "$": + return string + def randomrep(mo): + choice = random.choice(self.quirk["randomlist"]) + return mo.expand(choice) + return re.sub(self.quirk["from"], randomrep, string) + def __str__(self): if self.type == "prefix": return "BEGIN WITH: %s" % (self.quirk["value"]) @@ -55,6 +72,8 @@ class pesterQuirk(object): return "REPLACE %s WITH %s" % (self.quirk["from"], self.quirk["to"]) elif self.type == "regexp": return "REGEXP: %s REPLACED WITH %s" % (self.quirk["from"], self.quirk["to"]) + elif self.type == "random": + return "REGEXP: %s RANDOMLY REPLACED WITH %s" % (self.quirk["from"], [str(r) for r in self.quirk["randomlist"]]) class pesterQuirks(object): def __init__(self, quirklist): @@ -66,25 +85,35 @@ class pesterQuirks(object): self.quirklist.append(q) def plainList(self): return [q.quirk for q in self.quirklist] - def apply(self, string): - # don't quirk /me commands - if string[0:3] == "/me": - space = string.find(" ") - cmd = string[0:space] - string = string[space:] - else: - cmd = "" - presuffix = [q for q in self.quirklist if - q.type=='prefix' or q.type=='suffix'] + def apply(self, lexed, first=False, last=False): + prefix = [q for q in self.quirklist if q.type=='prefix'] + suffix = [q for q in self.quirklist if q.type=='suffix'] replace = [q for q in self.quirklist if q.type=='replace' or q.type=='regexp'] - for r in replace: - string = r.apply(string) - if not cmd: - for ps in presuffix: - string = ps.apply(string) - string = cmd+string - return string + random = [q for q in self.quirklist if q.type=='random'] + + firstStr = True + newlist = [] + for (i, o) in enumerate(lexed): + if type(o) not in [str, unicode]: + newlist.append(o) + continue + lastStr = (i == len(lexed)-1) + string = o + for r in random: + string = r.apply(string, first=firstStr, last=lastStr) + for r in replace: + string = r.apply(string, first=firstStr, last=lastStr) + if firstStr: + for p in prefix: + string = p.apply(string) + if lastStr: + for s in suffix: + string = s.apply(string) + newlist.append(string) + firstStr = False + + return newlist def __iter__(self): for q in self.quirklist: @@ -127,7 +156,9 @@ class PesterProfile(object): def blocked(self, config): return self.handle in config.getBlocklist() - def memsg(self, syscolor, suffix, msg, time=None): + def memsg(self, syscolor, lexmsg, time=None): + suffix = lexmsg[0].suffix + msg = convertTags(lexmsg[1:], "text") uppersuffix = suffix.upper() if time is not None: handle = "%s %s" % (time.temporal, self.handle) diff --git a/dataobjs.pyc b/dataobjs.pyc index f8076413aa336122e4428e9ceaea1a38c6d06c60..b9744fc89edad907d06be08e7edab3e3cf986a3d 100644 GIT binary patch delta 5080 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 delta 16 Ycmew^{au><;wN6NuK9r**+1|C06|#?H2?qr diff --git a/irc.pyc b/irc.pyc index 62a8eb1dacfd9b430f6554df3ecd56d0d78e85b6..e4a65a510087af4df768c7fa422ef6360a2a92cd 100644 GIT binary patch delta 16 YcmbQ7J~^HJ;wN6NMfU?XviBGR06%gE9smFU delta 16 XcmbQ7J~^HJ;wN6NuK9r**?WuuJx>P5 diff --git a/logs/chums.js b/logs/chums.js index ee55015..e55192a 100644 --- a/logs/chums.js +++ b/logs/chums.js @@ -1 +1 @@ -{"macruralAlchemist": {"color": "#700000", "handle": "macruralAlchemist", "mood": "offline"}, "lyricalKeraunoscopic": {"color": "#00c000", "handle": "lyricalKeraunoscopic", "mood": "offline"}, "fireSwallow": {"color": "#80bb9a", "handle": "fireSwallow", "mood": "offline"}, "aquaMarinist": {"color": "#00caca", "handle": "aquaMarinist", "mood": "offline"}, "centaursTesticle": {"color": "#000056", "handle": "centaursTesticle", "mood": "offline"}, "mechanicalSpectacle": {"color": "#0000ff", "handle": "mechanicalSpectacle", "mood": "offline"}, "carcinoGeneticist": {"color": "#999999", "handle": "carcinoGeneticist", "mood": "offline"}, "greyscalePacifist": {"color": "#7f7f7f", "handle": "greyscalePacifist", "mood": "offline"}, "aquaticMarinist": {"color": "#00caca", "handle": "aquaticMarinist", "mood": "offline"}, "iw": {"color": "#ff0000", "handle": "iw", "mood": "offline"}, "insipidTranscient": {"color": "#145064", "handle": "insipidTranscient", "mood": "offline"}, "caffeinatedAnalyst": {"color": "#aa0000", "handle": "caffeinatedAnalyst", "mood": "offline"}, "midnightSparrow": {"color": "#ff55ff", "handle": "midnightSparrow", "mood": "offline"}, "absoluteTranquility": {"color": "#000033", "handle": "absoluteTranquility", "mood": "offline"}, "nitroZealist": {"color": "#ff3737", "handle": "nitroZealist", "mood": "offline"}, "quintessentialArbalest": {"color": "#999999", "handle": "quintessentialArbalest", "mood": "offline"}, "noSense": {"color": "#1d0059", "handle": "noSense", "mood": "offline"}, "agogPorphyry": {"color": "#522d80", "handle": "agogPorphyry", "mood": "offline"}, "grimAuxiliatrix": {"color": "#008141", "handle": "grimAuxiliatrix", "mood": "offline"}, "androidTechnician": {"color": "#0000ff", "handle": "androidTechnician", "mood": "offline"}, "ardentAbettor": {"color": "#c8b670", "handle": "ardentAbettor", "mood": "offline"}, "aceIsm": {"color": "#ffcc66", "handle": "aceIsm", "mood": "offline"}, "apocalypseArisen": {"color": "#a10000", "handle": "apocalypseArisen", "mood": "offline"}, "radicalApologist": {"color": "#ffaa00", "handle": "radicalApologist", "mood": "offline"}, "microMachines": {"color": "#aa00ff", "handle": "microMachines", "mood": "offline"}, "uroborosUnbound": {"color": "#00416a", "handle": "uroborosUnbound", "mood": "offline"}, "arachnidsGrip": {"color": "#005682", "handle": "arachnidsGrip", "mood": "offline"}, "caligulasAquarium": {"color": "#6a006a", "handle": "caligulasAquarium", "mood": "offline"}, "percipientPedestrian": {"color": "#00ffff", "handle": "percipientPedestrian", "mood": "offline"}, "tentacleTherapist": {"color": "#cc66ff", "handle": "tentacleTherapist", "mood": "offline"}, "sucroseSaboteur": {"color": "#00e700", "handle": "sucroseSaboteur", "mood": "offline"}, "illuminatedWax": {"color": "#000000", "handle": "illuminatedWax", "mood": "offline"}, "moirailBunp": {"color": "#6a3d0f", "handle": "moirailBunp", "mood": "offline"}, "madLurker": {"color": "#000000", "handle": "madLurker", "mood": "offline"}, "testOut": {"color": "#c760cc", "handle": "testOut", "mood": "offline"}, "pesterClient3022": {"color": "#336600", "handle": "pesterClient3022", "mood": "offline"}, "hellerificJefferson": {"color": "#3300ff", "handle": "hellerificJefferson", "mood": "offline"}, "DocScratch": {"color": "#ffffff", "handle": "DocScratch", "mood": "offline"}, "recalcitrantDisaster": {"color": "#8b0068", "handle": "recalcitrantDisaster", "mood": "offline"}, "superGhost": {"color": "#800564", "handle": "superGhost", "mood": "offline"}, "arsenicCatnip": {"color": "#006400", "handle": "arsenicCatnip", "mood": "offline"}, "kaleidoscopicMind": {"color": "#ff6666", "handle": "kaleidoscopicMind", "mood": "offline"}, "zealousScarecrow": {"color": "#00c882", "handle": "zealousScarecrow", "mood": "offline"}, "captainCaveman": {"color": "#7c414e", "handle": "captainCaveman", "mood": "offline"}, "gamblingGenocider": {"color": "#00ff00", "handle": "gamblingGenocider", "mood": "offline"}, "cuttlefishCuller": {"color": "#77003c", "handle": "cuttlefishCuller", "mood": "offline"}, "wovenWay": {"color": "#000000", "handle": "wovenWay", "mood": "offline"}, "masterG": {"color": "#77003c", "handle": "masterG", "mood": "offline"}, "elegantDiversion": {"color": "#14b40a", "handle": "elegantDiversion", "mood": "offline"}, "plasmaModerator": {"color": "#5685cc", "handle": "plasmaModerator", "mood": "offline"}, "carcinoGenetecist": {"color": "#7f7f7f", "handle": "carcinoGenetecist", "mood": "offline"}, "marineAquist": {"color": "#00caca", "handle": "marineAquist", "mood": "offline"}, "remoteBloodbath": {"color": "#c70000", "handle": "remoteBloodbath", "mood": "offline"}, "oilslickOrchid": {"color": "#743f7e", "handle": "oilslickOrchid", "mood": "offline"}, "acapellaWaterfall": {"color": "#000099", "handle": "acapellaWaterfall", "mood": "offline"}, "gallowsCalibrator": {"color": "#008282", "handle": "gallowsCalibrator", "mood": "offline"}, "rageInducer": {"color": "#00ffff", "handle": "rageInducer", "mood": "offline"}, "anguillaNuntia": {"color": "#ff007f", "handle": "anguillaNuntia", "mood": "offline"}, "greenZephyr": {"color": "#00ca40", "handle": "greenZephyr", "mood": "offline"}, "lawdEngrish": {"color": "#00ff00", "handle": "lawdEngrish", "mood": "offline"}, "pretentiousFantasia": {"color": "#ff66cf", "handle": "pretentiousFantasia", "mood": "offline"}, "counterRealist": {"color": "#10d985", "handle": "counterRealist", "mood": "offline"}, "maxiumumFatness": {"color": "#3366ff", "handle": "maxiumumFatness", "mood": "offline"}, "schlagzeugGator": {"color": "#61821f", "handle": "schlagzeugGator", "mood": "offline"}, "metaliAggressive": {"color": "#9289d5", "handle": "metaliAggressive", "mood": "offline"}, "pesterClient394": {"color": "#ff3737", "handle": "pesterClient394", "mood": "offline"}, "magmaExploiter": {"color": "#d90000", "handle": "magmaExploiter", "mood": "offline"}, "gardenGnostic": {"color": "#00ff00", "handle": "gardenGnostic", "mood": "offline"}, "unknownTraveler": {"color": "#006666", "handle": "unknownTraveler", "mood": "offline"}, "utilitarianTurnabout": {"color": "#dd0000", "handle": "utilitarianTurnabout", "mood": "offline"}, "adiosToreador": {"color": "#aa5500", "handle": "adiosToreador", "mood": "offline"}} \ No newline at end of file +{"macruralAlchemist": {"color": "#700000", "handle": "macruralAlchemist", "mood": "offline"}, "lyricalKeraunoscopic": {"color": "#00c000", "handle": "lyricalKeraunoscopic", "mood": "offline"}, "fireSwallow": {"color": "#80bb9a", "handle": "fireSwallow", "mood": "offline"}, "aquaMarinist": {"color": "#00caca", "handle": "aquaMarinist", "mood": "offline"}, "centaursTesticle": {"color": "#000056", "handle": "centaursTesticle", "mood": "offline"}, "mechanicalSpectacle": {"color": "#0000ff", "handle": "mechanicalSpectacle", "mood": "offline"}, "carcinoGeneticist": {"color": "#999999", "handle": "carcinoGeneticist", "mood": "offline"}, "greyscalePacifist": {"color": "#7f7f7f", "handle": "greyscalePacifist", "mood": "offline"}, "aquaticMarinist": {"color": "#00caca", "handle": "aquaticMarinist", "mood": "offline"}, "iw": {"color": "#ff0000", "handle": "iw", "mood": "offline"}, "insipidTranscient": {"color": "#145064", "handle": "insipidTranscient", "mood": "offline"}, "caffeinatedAnalyst": {"color": "#aa0000", "handle": "caffeinatedAnalyst", "mood": "offline"}, "pesterClient394": {"color": "#ff3737", "handle": "pesterClient394", "mood": "offline"}, "absoluteTranquility": {"color": "#000033", "handle": "absoluteTranquility", "mood": "offline"}, "nitroZealist": {"color": "#ff3737", "handle": "nitroZealist", "mood": "offline"}, "quintessentialArbalest": {"color": "#999999", "handle": "quintessentialArbalest", "mood": "offline"}, "noSense": {"color": "#1d0059", "handle": "noSense", "mood": "offline"}, "agogPorphyry": {"color": "#522d80", "handle": "agogPorphyry", "mood": "offline"}, "grimAuxiliatrix": {"color": "#008141", "handle": "grimAuxiliatrix", "mood": "offline"}, "terminallyCapricious": {"color": "#2b0057", "handle": "terminallyCapricious", "mood": "offline"}, "androidTechnician": {"color": "#0000ff", "handle": "androidTechnician", "mood": "offline"}, "ardentAbettor": {"color": "#c8b670", "handle": "ardentAbettor", "mood": "offline"}, "aceIsm": {"color": "#ffcc66", "handle": "aceIsm", "mood": "offline"}, "apocalypseArisen": {"color": "#a10000", "handle": "apocalypseArisen", "mood": "offline"}, "radicalApologist": {"color": "#ffaa00", "handle": "radicalApologist", "mood": "offline"}, "microMachines": {"color": "#aa00ff", "handle": "microMachines", "mood": "offline"}, "uroborosUnbound": {"color": "#00416a", "handle": "uroborosUnbound", "mood": "offline"}, "arachnidsGrip": {"color": "#005682", "handle": "arachnidsGrip", "mood": "offline"}, "caligulasAquarium": {"color": "#6a006a", "handle": "caligulasAquarium", "mood": "offline"}, "percipientPedestrian": {"color": "#00ffff", "handle": "percipientPedestrian", "mood": "offline"}, "tentacleTherapist": {"color": "#cc66ff", "handle": "tentacleTherapist", "mood": "offline"}, "sucroseSaboteur": {"color": "#00e700", "handle": "sucroseSaboteur", "mood": "offline"}, "illuminatedWax": {"color": "#000000", "handle": "illuminatedWax", "mood": "offline"}, "moirailBunp": {"color": "#6a3d0f", "handle": "moirailBunp", "mood": "offline"}, "madLurker": {"color": "#000000", "handle": "madLurker", "mood": "offline"}, "testOut": {"color": "#c760cc", "handle": "testOut", "mood": "offline"}, "pesterClient3022": {"color": "#336600", "handle": "pesterClient3022", "mood": "offline"}, "hellerificJefferson": {"color": "#3300ff", "handle": "hellerificJefferson", "mood": "offline"}, "DocScratch": {"color": "#ffffff", "handle": "DocScratch", "mood": "offline"}, "recalcitrantDisaster": {"color": "#8b0068", "handle": "recalcitrantDisaster", "mood": "offline"}, "superGhost": {"color": "#800564", "handle": "superGhost", "mood": "offline"}, "arsenicCatnip": {"color": "#006400", "handle": "arsenicCatnip", "mood": "offline"}, "kaleidoscopicMind": {"color": "#ff6666", "handle": "kaleidoscopicMind", "mood": "offline"}, "zealousScarecrow": {"color": "#00c882", "handle": "zealousScarecrow", "mood": "offline"}, "captainCaveman": {"color": "#7c414e", "handle": "captainCaveman", "mood": "offline"}, "gamblingGenocider": {"color": "#00ff00", "handle": "gamblingGenocider", "mood": "offline"}, "cuttlefishCuller": {"color": "#77003c", "handle": "cuttlefishCuller", "mood": "offline"}, "wovenWay": {"color": "#000000", "handle": "wovenWay", "mood": "offline"}, "masterG": {"color": "#77003c", "handle": "masterG", "mood": "offline"}, "elegantDiversion": {"color": "#14b40a", "handle": "elegantDiversion", "mood": "offline"}, "plasmaModerator": {"color": "#5685cc", "handle": "plasmaModerator", "mood": "offline"}, "carcinoGenetecist": {"color": "#7f7f7f", "handle": "carcinoGenetecist", "mood": "offline"}, "marineAquist": {"color": "#00caca", "handle": "marineAquist", "mood": "offline"}, "remoteBloodbath": {"color": "#c70000", "handle": "remoteBloodbath", "mood": "offline"}, "oilslickOrchid": {"color": "#743f7e", "handle": "oilslickOrchid", "mood": "offline"}, "acapellaWaterfall": {"color": "#000099", "handle": "acapellaWaterfall", "mood": "offline"}, "gallowsCalibrator": {"color": "#008282", "handle": "gallowsCalibrator", "mood": "offline"}, "rageInducer": {"color": "#00ffff", "handle": "rageInducer", "mood": "offline"}, "anguillaNuntia": {"color": "#ff007f", "handle": "anguillaNuntia", "mood": "offline"}, "greenZephyr": {"color": "#00ca40", "handle": "greenZephyr", "mood": "offline"}, "lawdEngrish": {"color": "#00ff00", "handle": "lawdEngrish", "mood": "offline"}, "pretentiousFantasia": {"color": "#ff66cf", "handle": "pretentiousFantasia", "mood": "offline"}, "counterRealist": {"color": "#10d985", "handle": "counterRealist", "mood": "offline"}, "maxiumumFatness": {"color": "#3366ff", "handle": "maxiumumFatness", "mood": "offline"}, "schlagzeugGator": {"color": "#61821f", "handle": "schlagzeugGator", "mood": "offline"}, "metaliAggressive": {"color": "#9289d5", "handle": "metaliAggressive", "mood": "offline"}, "midnightSparrow": {"color": "#ff55ff", "handle": "midnightSparrow", "mood": "offline"}, "magmaExploiter": {"color": "#d90000", "handle": "magmaExploiter", "mood": "offline"}, "gardenGnostic": {"color": "#00ff00", "handle": "gardenGnostic", "mood": "offline"}, "unknownTraveler": {"color": "#006666", "handle": "unknownTraveler", "mood": "offline"}, "utilitarianTurnabout": {"color": "#dd0000", "handle": "utilitarianTurnabout", "mood": "offline"}, "adiosToreador": {"color": "#aa5500", "handle": "adiosToreador", "mood": "offline"}} \ No newline at end of file diff --git a/memos.py b/memos.py index 10b7786..ec8bb6b 100644 --- a/memos.py +++ b/memos.py @@ -1,12 +1,14 @@ from string import Template import re +from copy import copy from PyQt4 import QtGui, QtCore from datetime import time, timedelta, datetime from dataobjs import PesterProfile, Mood, PesterHistory from generic import PesterIcon, RightClickList from convo import PesterConvo, PesterInput, PesterText, PesterTabWindow -from parsetools import convertTags, addTimeInitial, timeProtocol +from parsetools import convertTags, addTimeInitial, timeProtocol, \ + lexMessage, colorBegin, colorEnd, mecmd def delta2txt(d, format="pc"): if format == "pc": @@ -223,18 +225,20 @@ class MemoText(PesterText): else: self.setStyleSheet("QTextEdit { %s }" % theme["memos/textarea/style"]) - def addMessage(self, text, chum): + def addMessage(self, msg, chum): + if type(msg) in [str, unicode]: + lexmsg = lexMessage(msg) + else: + lexmsg = msg parent = self.parent() window = parent.mainwindow me = window.profile() - quirks = window.userprofile.quirks if parent.applyquirks else None - msg = unicode(text) chumdb = window.chumdb if chum is not me: # SO MUCH WH1T3SP4C3 >:] - mobj = _ctag_begin.match(text) # get color from tag - if mobj: + if type(lexmsg[0]) is colorBegin: # get color tag + colortag = lexmsg[0] try: - color = QtGui.QColor(*[int(c) for c in mobj.group(1).split(",")]) + color = QtGui.QColor(*[int(c) for c in colortag.color.split(",")]) except ValueError: color = QtGui.QColor("black") else: @@ -257,7 +261,7 @@ class MemoText(PesterText): # new chum! time current newtime = timedelta(0) time = TimeTracker(newtime) - parent.times[chum.handle] = time + parent.times[handle] = time else: time = parent.time @@ -265,26 +269,16 @@ class MemoText(PesterText): grammar = time.getGrammar() joinmsg = chum.memojoinmsg(systemColor, time.getTime(), grammar, window.theme["convo/text/joinmemo"]) self.append(convertTags(joinmsg)) - parent.mainwindow.chatlog.log(parent.channel, convertTags(msg, "bbcode")) + parent.mainwindow.chatlog.log(parent.channel, joinmsg) time.openCurrentTime() - if msg[0:3] == "/me" or msg[0:13] == "PESTERCHUM:ME": - if quirks: - msg = quirks.apply(msg) - if msg[0:3] == "/me": - start = 3 - else: - start = 13 - space = msg.find(" ") - memsg = chum.memsg(systemColor, msg[start:space], msg[space:], time=time.getGrammar()) - window.chatlog.log(parent.channel, convertTags(msg, "bbcode")) + if type(lexmsg[0]) is mecmd: + memsg = chum.memsg(systemColor, lexmsg, time=time.getGrammar()) + window.chatlog.log(parent.channel, memsg) self.append(convertTags(memsg)) else: - if chum is not me: - msg = addTimeInitial(msg, parent.times[chum.handle].getGrammar()) - self.append(convertTags(msg, quirksobj=quirks)) - window.chatlog.log(parent.channel, convertTags(msg, "bbcode", quirks)) - + self.append(convertTags(lexmsg)) + window.chatlog.log(parent.channel, lexmsg) def changeTheme(self, theme): self.initTheme(theme) @@ -398,7 +392,7 @@ class PesterMemo(PesterConvo): 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, convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.channel, msg) self.op = False self.newmessage = False @@ -537,7 +531,7 @@ class PesterMemo(PesterConvo): self.times[handle].removeTime(close) msg = chum.memoclosemsg(systemColor, grammar, window.theme["convo/text/closememo"]) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.channel, msg) elif timed not in self.times[handle]: self.times[handle].addTime(timed) else: @@ -556,20 +550,26 @@ class PesterMemo(PesterConvo): if self.time.getTime() == None: self.sendtime() grammar = self.time.getGrammar() - if text[0:3] != "/me": + quirks = self.mainwindow.userprofile.quirks + lexmsg = lexMessage(text) + if type(lexmsg[0]) is not mecmd: + if self.applyquirks: + lexmsg = quirks.apply(lexmsg) initials = self.mainwindow.profile().initials() colorcmd = self.mainwindow.profile().colorcmd() - clientText = "%s%s%s: %s" % (colorcmd, grammar.pcf, initials, grammar.number, text) + clientMsg = [colorBegin("" % (colorcmd), colorcmd), + "%s%s%s: " % (grammar.pcf, initials, grammar.number)] + lexmsg + [colorEnd("")] # account for TC's parsing error - serverText = "%s: %s " % (colorcmd, initials, text) + serverMsg = [colorBegin("" % (colorcmd), colorcmd), + "%s: " % (initials)] + lexmsg + [colorEnd(""), " "] else: - clientText = text - serverText = clientText - self.addMessage(clientText, True) - # convert color tags - quirks = self.mainwindow.userprofile.quirks if self.applyquirks else None - serverText = convertTags(unicode(serverText), "ctag", quirks) + clientMsg = copy(lexmsg) + serverMsg = copy(lexmsg) + + self.addMessage(clientMsg, True) + serverText = convertTags(serverMsg, "ctag") self.messageSent.emit(serverText, self.title()) + self.textInput.setText("") @QtCore.pyqtSlot() def namesUpdated(self): @@ -611,7 +611,7 @@ class PesterMemo(PesterConvo): grammar = t.getGrammar() msg = chum.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"]) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.channel, msg) self.times[h].removeTime(t.getTime()) if update == "nick": self.addUser(newnick) @@ -639,7 +639,7 @@ class PesterMemo(PesterConvo): opgrammar = TimeGrammar("CURRENT", "C", "RIGHT NOW") msg = chum.memobanmsg(opchum, opgrammar, systemColor, grammar) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.channel, msg) ttracker.removeTime(ttracker.getTime()) if chum is self.mainwindow.profile(): @@ -658,7 +658,7 @@ class PesterMemo(PesterConvo): self.time.openCurrentTime() 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, convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.channel, msg) elif ret == QtGui.QMessageBox.Cancel: if self.parent(): i = self.parent().tabIndices[self.channel] @@ -725,7 +725,7 @@ class PesterMemo(PesterConvo): systemColor = QtGui.QColor(self.mainwindow.theme["memos/systemMsgColor"]) msg = me.memoclosemsg(systemColor, grammar, self.mainwindow.theme["convo/text/closememo"]) self.textArea.append(convertTags(msg)) - self.mainwindow.chatlog.log(self.channel, convertTags(msg, "bbcode")) + self.mainwindow.chatlog.log(self.channel, msg) newtime = self.time.getTime() if newtime is None: @@ -738,12 +738,13 @@ class PesterMemo(PesterConvo): time = self.time.prevTime() self.time.setCurrent(time) self.resetSlider(time) + self.textInput.setFocus() @QtCore.pyqtSlot() def nexttime(self): time = self.time.nextTime() self.time.setCurrent(time) self.resetSlider(time) - + self.textInput.setFocus() def closeEvent(self, event): self.mainwindow.waitingMessages.messageAnswered(self.channel) self.windowClosed.emit(self.title()) diff --git a/memos.pyc b/memos.pyc index 749749e17908b2ad2fa01f002a2299487c067911..3061b672f878748ad8ea202d7dfcb28c659b2996 100644 GIT binary patch delta 9191 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 delta 9349 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 G>H2?^i7H$G diff --git a/menus.py b/menus.py index f0acdd1..15794fd 100644 --- a/menus.py +++ b/menus.py @@ -30,7 +30,7 @@ class PesterQuirkList(QtGui.QListWidget): for q in mainwindow.userprofile.quirks: item = PesterQuirkItem(q, self) self.addItem(item) - self.sortItems() + #self.sortItems() @QtCore.pyqtSlot() def removeCurrent(self): @@ -38,6 +38,77 @@ class PesterQuirkList(QtGui.QListWidget): if i >= 0: self.takeItem(i) +class RandomQuirkDialog(MultiTextDialog): + def __init__(self, parent): + QtGui.QDialog.__init__(self, parent) + self.setWindowTitle("RANDOM QUIRK") + self.inputs = {} + layout_1 = QtGui.QHBoxLayout() + regexpl = QtGui.QLabel("REGEXP:", self) + self.regexp = QtGui.QLineEdit(self) + layout_1.addWidget(regexpl) + layout_1.addWidget(self.regexp) + replacewithl = QtGui.QLabel("REPLACE WITH:", self) + + layout_2 = QtGui.QVBoxLayout() + layout_3 = QtGui.QHBoxLayout() + self.replacelist = QtGui.QListWidget(self) + self.replaceinput = QtGui.QLineEdit(self) + addbutton = QtGui.QPushButton("ADD", self) + self.connect(addbutton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('addRandomString()')) + removebutton = QtGui.QPushButton("REMOVE", self) + self.connect(removebutton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('removeRandomString()')) + layout_3.addWidget(addbutton) + layout_3.addWidget(removebutton) + layout_2.addWidget(self.replacelist) + layout_2.addWidget(self.replaceinput) + layout_2.addLayout(layout_3) + layout_1.addLayout(layout_2) + + self.ok = QtGui.QPushButton("OK", self) + self.ok.setDefault(True) + self.connect(self.ok, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('accept()')) + self.cancel = QtGui.QPushButton("CANCEL", self) + self.connect(self.cancel, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('reject()')) + layout_ok = QtGui.QHBoxLayout() + layout_ok.addWidget(self.cancel) + layout_ok.addWidget(self.ok) + + layout_0 = QtGui.QVBoxLayout() + layout_0.addLayout(layout_1) + layout_0.addLayout(layout_ok) + + self.setLayout(layout_0) + + def getText(self): + r = self.exec_() + if r == QtGui.QDialog.Accepted: + randomlist = [unicode(self.replacelist.item(i).text()) + for i in range(0,self.replacelist.count())] + retval = {"from": unicode(self.regexp.text()), + "randomlist": randomlist } + return retval + else: + return None + + + @QtCore.pyqtSlot() + def addRandomString(self): + text = unicode(self.replaceinput.text()) + item = QtGui.QListWidgetItem(text, self.replacelist) + self.replaceinput.setText("") + @QtCore.pyqtSlot() + def removeRandomString(self): + if not self.replacelist.currentItem(): + return + else: + self.replacelist.takeItem(self.currentRow()) + self.replaceinput.setFocus() + class PesterChooseQuirks(QtGui.QDialog): def __init__(self, config, theme, parent): QtGui.QDialog.__init__(self, parent) @@ -62,11 +133,17 @@ class PesterChooseQuirks(QtGui.QDialog): self.addRegexpReplaceButton = QtGui.QPushButton("REGEXP REPLACE", self) self.connect(self.addRegexpReplaceButton, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('addRegexpDialog()')) + self.addRandomReplaceButton = QtGui.QPushButton("RANDOM REPLACE", self) + self.connect(self.addRandomReplaceButton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('addRandomDialog()')) + layout_1 = QtGui.QHBoxLayout() layout_1.addWidget(self.addPrefixButton) layout_1.addWidget(self.addSuffixButton) layout_1.addWidget(self.addSimpleReplaceButton) - layout_1.addWidget(self.addRegexpReplaceButton) + layout_2 = QtGui.QHBoxLayout() + layout_2.addWidget(self.addRegexpReplaceButton) + layout_2.addWidget(self.addRandomReplaceButton) self.removeSelectedButton = QtGui.QPushButton("REMOVE", self) self.connect(self.removeSelectedButton, QtCore.SIGNAL('clicked()'), @@ -86,6 +163,7 @@ class PesterChooseQuirks(QtGui.QDialog): layout_0 = QtGui.QVBoxLayout() layout_0.addWidget(self.quirkList) layout_0.addLayout(layout_1) + layout_0.addLayout(layout_2) layout_0.addWidget(self.removeSelectedButton) layout_0.addLayout(layout_ok) self.setLayout(layout_0) @@ -94,7 +172,6 @@ class PesterChooseQuirks(QtGui.QDialog): return [self.quirkList.item(i).quirk for i in range(0,self.quirkList.count())] - @QtCore.pyqtSlot() def addPrefixDialog(self): pdict = MultiTextDialog("ENTER PREFIX", self, {"label": "Value:", "inputname": "value"}).getText() @@ -102,7 +179,7 @@ class PesterChooseQuirks(QtGui.QDialog): prefix = pesterQuirk(pdict) pitem = PesterQuirkItem(prefix, self.quirkList) self.quirkList.addItem(pitem) - self.quirkList.sortItems() + #self.quirkList.sortItems() @QtCore.pyqtSlot() def addSuffixDialog(self): vdict = MultiTextDialog("ENTER SUFFIX", self, {"label": "Value:", "inputname": "value"}).getText() @@ -110,7 +187,7 @@ class PesterChooseQuirks(QtGui.QDialog): quirk = pesterQuirk(vdict) item = PesterQuirkItem(quirk, self.quirkList) self.quirkList.addItem(item) - self.quirkList.sortItems() + #self.quirkList.sortItems() @QtCore.pyqtSlot() def addSimpleReplaceDialog(self): vdict = MultiTextDialog("REPLACE", self, {"label": "Replace:", "inputname": "from"}, {"label": "With:", "inputname": "to"}).getText() @@ -118,7 +195,7 @@ class PesterChooseQuirks(QtGui.QDialog): quirk = pesterQuirk(vdict) item = PesterQuirkItem(quirk, self.quirkList) self.quirkList.addItem(item) - self.quirkList.sortItems() + #self.quirkList.sortItems() @QtCore.pyqtSlot() def addRegexpDialog(self): vdict = MultiTextDialog("REGEXP REPLACE", self, {"label": "Regexp:", "inputname": "from"}, {"label": "Replace With:", "inputname": "to"}).getText() @@ -135,7 +212,23 @@ class PesterChooseQuirks(QtGui.QDialog): quirk = pesterQuirk(vdict) item = PesterQuirkItem(quirk, self.quirkList) self.quirkList.addItem(item) - self.quirkList.sortItems() + #self.quirkList.sortItems() + @QtCore.pyqtSlot() + def addRandomDialog(self): + vdict = RandomQuirkDialog(self).getText() + vdict["type"] = "random" + try: + re.compile(vdict["from"]) + except re.error, e: + quirkWarning = QtGui.QMessageBox(self) + quirkWarning.setText("Not a valid regular expression!") + quirkWarning.setInformativeText("H3R3S WHY DUMP4SS: %s" % (e)) + quirkWarning.exec_() + return + quirk = pesterQuirk(vdict) + item = PesterQuirkItem(quirk, self.quirkList) + self.quirkList.addItem(item) + #self.quirkList.sortItems() class PesterChooseTheme(QtGui.QDialog): def __init__(self, config, theme, parent): diff --git a/menus.pyc b/menus.pyc index a4bfd9e43db4e7752b84f8f599de194f71758089..657ace7956e6127cfa4b9953598d041c7f46bcd8 100644 GIT binary patch delta 6256 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 diff --git a/oyoyo/__init__.pyc b/oyoyo/__init__.pyc index be26c04278418a75756d2cf8046f30e23a4107ba..28e3e80c476d1ac01bd4cfb463eeb187f0612c7e 100644 GIT binary patch delta 15 WcmX@hbe4(j;wN6NbFmxQ+!+BfRRyU4 delta 15 XcmX@hbe4(j;wN6Nd*3&*xibO)HMa&+ diff --git a/oyoyo/client.pyc b/oyoyo/client.pyc index 5ba5325557d363f0374c9e0ca7739ef737554db4..9115adc5cacf5adb23fb132f67c3c301bbd75af2 100644 GIT binary patch delta 15 WcmZqhY4BmY_=%V6#+Hq2zf=J<<_6mU delta 15 WcmZqhY4BmY_=%TGaLz`yU#b8v#0C5S diff --git a/oyoyo/cmdhandler.pyc b/oyoyo/cmdhandler.pyc index e9def19d77978e0983f9458c1605a5ac084df2c3..d97b3d1ff2c4eb42e44ae39815380e44fd3c0833 100644 GIT binary patch delta 15 Wcmez2@WX-a;wN6NbFmxQiWC4n$_B*% delta 15 Xcmez2@WX-a;wN6Nd*3&*6)6A!K`aMv diff --git a/oyoyo/helpers.pyc b/oyoyo/helpers.pyc index e5c82c49e21cd1824177f884ec2698caa054d20e..e5b17da6abb110ba3d8dc2bd4f39e243966dd719 100644 GIT binary patch delta 16 XcmbQLK2@Fl;wN4%2Mhm=?0v!jG4%y{ delta 16 XcmbQLK2@Fl;wN6NuK9r*+53b6Hg5(k diff --git a/oyoyo/ircevents.pyc b/oyoyo/ircevents.pyc index 1f1ccd60b234136833f75055fd8d2e431da22511..c83999f5508b0e331f132f84e784455707b3e147 100644 GIT binary patch delta 15 Wcmdn1vsZ`h;wN6NbFmxQ%*6mS&IRHC delta 15 Xcmdn1vsZ`h;wN6Nd*3&*nTr7cI4}l` diff --git a/oyoyo/parse.pyc b/oyoyo/parse.pyc index e67f2eacb08e566bee9472177a2c6889c2828d09..9095b24ca7fdd4567a86d7cbbd0c9a4cc710c079 100644 GIT binary patch delta 15 WcmdlgwpEPn;wN6NbFmxQ^tk~smj#mm delta 15 XcmdlgwpEPn;wN6Nd*3&*>2m`BH2DTS diff --git a/parsetools.py b/parsetools.py index cb703f9..cc9f8b9 100644 --- a/parsetools.py +++ b/parsetools.py @@ -4,10 +4,13 @@ from datetime import timedelta from PyQt4 import QtGui _ctag_begin = re.compile(r'(?i)') +_gtag_begin = re.compile(r'(?i)') _ctag_end = re.compile(r'(?i)') _ctag_rgb = re.compile(r'\d+,\d+,\d+') _urlre = re.compile(r"(?i)http://[^\s]+") -_memore = re.compile(r" (#[A-Za-z0-9_]+)") +_memore = re.compile(r"(\s|^)(#[A-Za-z0-9_]+)") +_imgre = re.compile(r"""(?i)""") +_mecmdre = re.compile(r"^/me(\S*)") def lexer(string, objlist): """objlist is a list: [(objecttype, re),...] list is in order of preference""" @@ -38,6 +41,8 @@ class colorBegin(object): self.color = color def convert(self, format): color = self.color + if format == "text": + return "" if _ctag_rgb.match(color) is not None: if format=='ctag': return "" % (color) @@ -64,6 +69,8 @@ class colorEnd(object): return "" elif format == "bbcode": return "[/color]" + elif format == "text": + return "" else: return self.string class hyperlink(object): @@ -76,6 +83,30 @@ class hyperlink(object): return "[url]%s[/url]" % (self.string) else: return self.string +class imagelink(object): + def __init__(self, string, img): + self.string = string + self.img = img + def convert(self, format): + if format == "html": + return self.string + elif format == "bbcode": + if self.img[0:7] == "http://": + return "[img]%s[/img]" % (img) + else: + return "" + else: + return "" +class memolex(object): + def __init__(self, string, space, channel): + self.string = string + self.space = space + self.channel = channel + def convert(self, format): + if format == "html": + return "%s%s" % (self.space, self.channel, self.channel) + else: + return self.string class smiley(object): def __init__(self, string): self.string = string @@ -84,15 +115,22 @@ class smiley(object): return "" % (smiledict[self.string]) else: return self.string +class mecmd(object): + def __init__(self, string, suffix): + self.string = string + self.suffix = suffix + def convert(self, format): + return self.string -def convertTags(string, format="html", quirkobj=None): - if format not in ["html", "bbcode", "ctag"]: - raise ValueError("Color format not recognized") - lexlist = [(colorBegin, _ctag_begin), (colorEnd, _ctag_end), - (hyperlink, _urlre), (hyperlink, _memore), +def lexMessage(string): + lexlist = [(mecmd, _mecmdre), + (colorBegin, _ctag_begin), (colorBegin, _gtag_begin), + (colorEnd, _ctag_end), (imagelink, _imgre), + (hyperlink, _urlre), (memolex, _memore), (smiley, _smilere)] - lexed = lexer(string, lexlist) + lexed = lexer(unicode(string), lexlist) + balanced = [] beginc = 0 endc = 0 @@ -111,25 +149,35 @@ def convertTags(string, format="html", quirkobj=None): if beginc > endc: for i in range(0, beginc-endc): balanced.append(colorEnd("")) + if type(balanced[len(balanced)-1]) not in [str, unicode]: + balanced.append("") + return balanced +def convertTags(lexed, format="html"): + if format not in ["html", "bbcode", "ctag", "text"]: + raise ValueError("Color format not recognized") + + if type(lexed) in [str, unicode]: + lexed = lexMessage(lexed) escaped = "" - for o in balanced: + firststr = True + for (i, o) in enumerate(lexed): if type(o) in [str, unicode]: - if quirkobj: - o = quirkobj.apply(o) if format == "html": escaped += o.replace("&", "&").replace(">", ">").replace("<","<") else: escaped += o else: escaped += o.convert(format) + return escaped def addTimeInitial(string, grammar): endofi = string.find(":") endoftag = string.find(">") - if endoftag < 0 or endoftag > 16 or endofi > 17: + # support Doc Scratch mode + if (endoftag < 0 or endoftag > 16) or (endofi < 0 or endofi > 17): return string return string[0:endoftag+1]+grammar.pcf+string[endoftag+1:endofi]+grammar.number+string[endofi:] diff --git a/parsetools.pyc b/parsetools.pyc index 7b8e8b963eeb360c93abbcd29102b66594ae4df1..7323615b205cbd379b7d187165f2f62c17cd96fc 100644 GIT binary patch delta 3448 zcmai0U2J1V6+UzQAO9wf?fl2-ZW?cv#WX;=-8$Z+Ng-^zS-7q?Z4x*2dafNuiJi^8 zi&Dv{5xYpJMHMi8sDzMsR0QnhTH zd*;kHXJ*cvznKqL{!P>#_0jkR+40btQ0i_$s{B9iC)zr|eKbvSSff2Gk?F(3 zB(t7yu8(F&j(F&3AI*{+^U(1=nj<;Eovjg)lO(6;0gg3Fa$199B=edXCpn{;zy$3* zLF%^HxmY5(M2oUa@;aJjk}GJQBe{xZjpXy(s6U7oZpdwtJLpwOzKUj-r$z?UAxk#s_z>&p0cMs zuyxqX+sE~#?YSqag`LXfOU&%p^To0qfy}GLLksZy*`JKR86tW1%fPfK&#`y?AS5E9 zZlE2&$KtE_>|27U3%3)U8q|dY1nnEt36PKmRfI}}#(F*tMF9D!Yf!c#USA@|Pptqo ziTtNNMmcZ-e4w>znoc3;BPT>%KSM)zCB5OJ?_iSvZQlJk`JFKB4^Ssd0)OsOGRUG3 zz_@t1ouYHRt9~4shISI`6~ff; z@sK2#nGL*w4T&7<#BtEl*?Ra5k(vi*7q|~Q#YI5#)|e)SIzusvInh_%zZiaO<9n4`MFy;nZ^6-`hm@f8&=;z~ZYs zVuE}Wwqf!ttpmZ(J}9^#2L>U6XU<*2@f;*a=+FpJrOh#qR{MzkpnbGK+A+uvXwL4^ zKHGDgqie;Y9S5+DtgO!3+eL0&cWEcN=YYT``fQ7r@_ZJC&vLL&_;Eg)EMeMhp31(3 zNqxvMqC@Mjb6}mQw_}TJ)CtDwd$o4kI{3I@uX~2gqq_e;!(LH$;!m#Q&?rvYBy95Y zu>F((aSwVOa-SHhpXHd@<6VOw9IKhfop-PdLG1p~dDYJn?};|z^_IAxewSQz!%;7N z#B$!!smConz6|lhN0v6603%lYP^S#zZ;gI|W%qN&>HuY5 zaQ3SY2ButP=h+Ug<2x@RkIB>Ca}d49;-1gzyf{Z_zly&N1hovo+%U+&zt3a*nhB5- z)J%v_d08ex&VXj3F#e6^DP7Ua( zJzNR6OdgpV6QU2a(!8HuuaBJro7kII^Hb-GBu*B{!IJ`q(dY;cv{oIZQ(O>wad;o~ z0aNwtr^F_18m%I(KPSUN7{F0RM$tN1woVhL3{htgdg~=nTzE211W+k(JZ-p@gFUAG zS1Q)aZjs0VGTFEA2+^(%ykpDcd&Y?}Qg>?2-8aYV~Sv^c=MNs`EJ(=c0X0pBoRz|0OA;67%tRtZ8N^z zk=gpe@J&J5)^Lq}6uI%s#tl-(eFnG#r=$f@wGoQ&7eetw@fqFWwO;jGw1YVH^D6?m z0Ozx>bUK_bcN4CG67C~s0UbPg@OlUlD!&YKlrtaEZ(x^?lEjObL)f6ZfAwbQ-mcec zg>{PLg)6m7n^?C};PUQPOnrx#dG*hsf?-ap&!iWGU+t#zJslJL5-D&lo0pkznrmN} zY(VoR5dC0z>G+;yauwEIJhqMwYIV!K(6!(OOBcOy%dXdsEUAO5(K@yr+c`EXEW%f2 z0Uy6?ejEL~`t@+?>JQMhCm2LoP8p*jC4%_HDJDjNEEowRXK1Igc73P5rJl)L9=QlR z=&Kc}b~L7qf>hck)ycdpZmZv9&Qd?&^*NA8Bt_Erf_f|a?;t;I%&Pi!?n?9$v-|`z zFRNeVro`vepL0_D^lWY9kB0cw+0^)J{@@G`H`Iga#f#4~`z0n{W-`mVC!RK~xx*aaF(%&zCKqONMGfY&!56^l*WZ%b&krq}pc{i> j@H23TM}I~nmmSN-vIE&fHj)izLy_s&a3rjLl)v#`evvg> delta 1975 zcmaJ?O>9(E6#nj;-}mOXf78wnL;pD*`ggn%ltnQXDeY z*2X*91Z1MEO?I?N$gZ}wyQA%b?17}9y||;HL~hh5LsT+hG!le32To|2(oFUCo$XV)+LC#S(4|$xr1;|C}PAF4*eXP_E z8*qYkAstW1<^>$OewYdj^!)zhxo@k6AY zWizJ%5fcG!n(3#JHOVl=u#cgc&1)ncQT5mpagwsRCWh44@thb|Kg19GFXk!o>cs4$ zn9&!+>^e-|CwK-g8x*>xPV_z!XDEJ7jr6@rYb^IIG@}%Nh zZb$Y`r|ctDgqlvxJIZIw9->DAl@Mx42p6pze_w#Fm>A`1xI)zOfe67u0B*1?gghY( zS7%`@fE{u(uuF_=_;6dpjvs3tza-g+=7b?^-$TQX#fzU{ho(lD8N@MKsuD&mOS~e- zAg0Kl85M2W#l|+})A9Cs-ZP#zv8xhjP7U$Y-6>k-`MF^sItnMo>v{1yx|U+O$<>M< zwL=iwMY#0J1X>IppbafvOk;;A?IlKsB10U@n>{X;`N(7#yE_K9zhI}ui=RKg$pqXa z)-+UtsI5`*RFyqm=XAC9NoUe7u4dI1$!@UG>4wxnZzAQva)e*QmK=kOvphvhZyf%M zcI!>?hAZun)5Et-$+pzX(@WRvYqd?= znpX8pN_~_`&v7AJ>_sF4R_pck8=mK;U0+`<+ZGpr$*Wm$hH(OVvVe{2&gRwH<%;?y zvk>)W*jwe*x-FH6Ppj|uCHv2j*Vah_uXIE=eG^(js8V*s)Pf>J<(C#A(L;q*)Z$vd zDD!i})x(*1wQ^H+=UUO~5r*RooP(7n z@Q#r-YnNT`_`T!y4%p(dw_aj+o8dgeWrixl5dx}V`d_FyRZqBT-`KJi>9swss)cS* jQMU@cy_(*i8b}%R)e{9hq{sA(PdzFeR!<6sW@!Hb;VxV% diff --git a/pesterchum.js b/pesterchum.js index 7f21063..ff954a3 100644 --- a/pesterchum.js +++ b/pesterchum.js @@ -1 +1 @@ -{"tabs": false, "soundon": true, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "superGhost", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "adiosToreador", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "maxiumumFatness", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "confusedTransient", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist"], "defaultprofile": "ghostDunk", "block": []} \ No newline at end of file +{"tabs": true, "soundon": true, "chums": ["unknownTraveler", "tentacleTherapist", "vaginalEngineer", "mechanicalSpectacle", "carcinoGeneticist", "schlagzeugGator", "gamblingGenocider", "gardenGnostic", "superGhost", "centaursTesticle", "arachnidsGrip", "grimAuxiliatrix", "remoteBloodbath", "nitroZealist", "greenZephyr", "arsenicCatnip", "adiosToreador", "cuttlefishCuller", "rageInducer", "gallowsCalibrator", "caligulasAquarium", "terminallyCapricious", "illuminatedWax", "aquaMarinist", "elegantDiversion", "moirailBunp", "uroborosUnbound", "androidTechnician", "midnightSparrow", "apocalypseArisen", "anguillaNuntia", "oilslickOrchid", "confusedTransient", "pretentiousFantasia", "aquaticMarinist", "lyricalKeraunoscopic", "counterRealist", "ectoBiologist", "percipientPedestrian", "asceticClinician"], "defaultprofile": "ghostDunk", "block": []} \ No newline at end of file diff --git a/pesterchum.py b/pesterchum.py index 5d87bed..b5edad3 100644 --- a/pesterchum.py +++ b/pesterchum.py @@ -19,8 +19,8 @@ from menus import PesterChooseQuirks, PesterChooseTheme, \ from dataobjs import PesterProfile, Mood, pesterQuirk, pesterQuirks from generic import PesterIcon, RightClickList, MultiTextDialog, PesterList from convo import PesterTabWindow, PesterText, PesterInput, PesterConvo -from parsetools import convertTags -from memos import PesterMemo, MemoTabWindow +from parsetools import convertTags, addTimeInitial +from memos import PesterMemo, MemoTabWindow, TimeTracker from irc import PesterIRC class waitingMessageHolder(object): @@ -59,27 +59,35 @@ class PesterLog(object): self.handle = handle self.convos = {} def log(self, handle, msg): + bbcodemsg = convertTags(msg, "bbcode") + html = convertTags(msg, "html") + msg = convertTags(msg, "text") + modes = {"bbcode": bbcodemsg, "html": html, "text": msg} if not self.convos.has_key(handle): - if not os.path.exists("logs/%s" % (self.handle)): - os.mkdir("logs/%s" % (self.handle)) - time = datetime.now().strftime("%Y-%m-%d.%H.%M.txt") - if not os.path.exists("logs/%s/%s" % (self.handle, handle)): - os.mkdir("logs/%s/%s" % (self.handle, handle)) - fp = codecs.open("logs/%s/%s/%s.%s" % (self.handle, handle, handle, time), encoding='utf-8', mode='a') - self.convos[handle] = fp - if platform.system() == "Windows": - self.convos[handle].write(msg+"\r\n") - else: - self.convos[handle].write(msg+"\n") - self.convos[handle].flush() + time = datetime.now().strftime("%Y-%m-%d.%H.%M") + self.convos[handle] = {} + for (format, t) in modes.iteritems(): + if not os.path.exists("logs/%s/%s/%s" % (self.handle, handle, format)): + os.makedirs("logs/%s/%s/%s" % (self.handle, handle, format)) + fp = codecs.open("logs/%s/%s/%s/%s.%s.txt" % (self.handle, handle, format, handle, time), encoding='utf-8', mode='a') + self.convos[handle][format] = fp + for (format, t) in modes.iteritems(): + f = self.convos[handle][format] + if platform.system() == "Windows": + f.write(t+"\r\n") + else: + f.write(t+"\r\n") + f.flush() def finish(self, handle): if not self.convos.has_key(handle): return - self.convos[handle].close() + for f in self.convos[handle].values(): + f.close() del self.convos[handle] def close(self): for h in self.convos.keys(): - self.convos[h].close() + for f in self.convos[h].values(): + f.close() class PesterProfileDB(dict): def __init__(self): @@ -668,6 +676,10 @@ class PesterWindow(MovingWindow): self.importaction = QtGui.QAction(self.theme["main/menus/client/import"], self) self.connect(self.importaction, QtCore.SIGNAL('triggered()'), self, QtCore.SLOT('importExternalConfig()')) + self.idleaction = QtGui.QAction(self.theme["main/menus/client/idle"], self) + self.idleaction.setCheckable(True) + self.connect(self.idleaction, QtCore.SIGNAL('toggled(bool)'), + self, QtCore.SLOT('toggleIdle(bool)')) self.menu = QtGui.QMenuBar(self) @@ -676,6 +688,7 @@ class PesterWindow(MovingWindow): filemenu.addAction(opts) filemenu.addAction(memoaction) filemenu.addAction(userlistaction) + filemenu.addAction(self.idleaction) filemenu.addAction(self.importaction) filemenu.addAction(exitaction) @@ -769,7 +782,7 @@ class PesterWindow(MovingWindow): self.waitingMessages = waitingMessageHolder(self) - self.idle = False + self.autoidle = False self.idlethreshold = 600 self.idletimer = QtCore.QTimer(self) self.idleposition = QtGui.QCursor.pos() @@ -843,6 +856,14 @@ class PesterWindow(MovingWindow): # silently ignore in case we forgot to /part return memo = self.memos[chan] + msg = unicode(msg) + if not memo.times.has_key(handle): + # new chum! time current + newtime = timedelta(0) + time = TimeTracker(newtime) + memo.times[handle] = time + if msg[0:3] != "/me" and msg[0:13] != "PESTERCHUM:ME": + msg = addTimeInitial(msg, memo.times[handle].getGrammar()) memo.addMessage(msg, handle) self.alarm.play() @@ -963,6 +984,7 @@ class PesterWindow(MovingWindow): self.userlistaction.setText(theme["main/menus/client/userlist"]) self.memoaction.setText(theme["main/menus/client/memos"]) self.importaction.setText(theme["main/menus/client/import"]) + self.idleaction.setText(theme["main/menus/client/idle"]) self.filemenu.setTitle(theme["main/menus/client/_name"]) self.changetheme.setText(theme["main/menus/profile/theme"]) self.changequirks.setText(theme["main/menus/profile/quirks"]) @@ -1116,7 +1138,7 @@ class PesterWindow(MovingWindow): chum = self.convos[h].chum chumopen = self.convos[h].chumopen if chumopen: - self.chatlog.log(chum.handle, convertTags(self.profile().pestermsg(chum, QtGui.QColor(self.theme["convo/systemMsgColor"]), self.theme["convo/text/ceasepester"]), "bbcode")) + 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] @@ -1242,7 +1264,7 @@ class PesterWindow(MovingWindow): convo = self.convos[h] 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, convertTags(msg, "bbcode")) + self.chatlog.log(convo.chum.handle, msg) convo.updateBlocked() self.chumList.removeChum(h) if hasattr(self, 'trollslum') and self.trollslum: @@ -1259,7 +1281,7 @@ class PesterWindow(MovingWindow): convo = self.convos[h] 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, convertTags(msg, "bbcode")) + self.chatlog.log(convo.chum.handle, msg) convo.updateMood(convo.chum.mood, unblocked=True) chum = PesterProfile(h, chumdb=self.chumdb) if hasattr(self, 'trollslum') and self.trollslum: @@ -1271,18 +1293,16 @@ class PesterWindow(MovingWindow): @QtCore.pyqtSlot(bool) def toggleIdle(self, idle): - if self.idle and not idle: - self.idle = False - elif idle and not self.idle: - self.idle = True + if idle: sysColor = QtGui.QColor(self.theme["convo/systemMsgColor"]) verb = self.theme["convo/text/idle"] for (h, convo) in self.convos.iteritems(): msg = self.profile().idlemsg(sysColor, verb) convo.textArea.append(convertTags(msg)) - self.chatlog.log(h, convertTags(msg, "bbcode")) + self.chatlog.log(h, msg) self.sendMessage.emit("PESTERCHUM:IDLE", h) - + else: + self.idletime = 0 @QtCore.pyqtSlot() def checkIdle(self): newpos = QtGui.QCursor.pos() @@ -1291,9 +1311,14 @@ class PesterWindow(MovingWindow): else: self.idletime = 0 if self.idletime >= self.idlethreshold: - self.toggleIdle(True) + if not self.idleaction.isChecked(): + self.idleaction.toggle() + self.autoidle = True else: - self.toggleIdle(False) + if self.autoidle: + if self.idleaction.isChecked(): + self.idleaction.toggle() + self.autoidle = False self.idleposition = newpos @QtCore.pyqtSlot() def importExternalConfig(self): @@ -1801,10 +1826,9 @@ class MainProgram(QtCore.QObject): self.widget.loadingscreen = LoadingScreen(self.widget) self.connect(self.widget.loadingscreen, QtCore.SIGNAL('rejected()'), self.widget, QtCore.SLOT('close()')) - self.widget.loadingscreen = None - #status = self.widget.loadingscreen.exec_() - #if status == QtGui.QDialog.Rejected: - # sys.exit(0) + status = self.widget.loadingscreen.exec_() + if status == QtGui.QDialog.Rejected: + sys.exit(0) os._exit(self.app.exec_()) pesterchum = MainProgram() diff --git a/profiles/ghostDunk.js b/profiles/ghostDunk.js index ea311d0..338c689 100644 --- a/profiles/ghostDunk.js +++ b/profiles/ghostDunk.js @@ -1 +1 @@ -{"color": "#ff00ff", "theme": "pesterchum", "quirks": [{"to": "7", "from": "t", "type": "replace"}], "handle": "ghostDunk"} \ No newline at end of file +{"color": "#ff00ff", "theme": "pesterchum", "quirks": [], "handle": "ghostDunk"} \ No newline at end of file