diff --git a/CHANGELOG.md b/CHANGELOG.md index 3880968..fb340ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog (This document uses YYYY-MM-DD) -## [v2.4.3] - 2022-09-05 +## [v2.4.3] - 2022-09-06 ### Added - Support for color via IRCv3 metadata draft. @@ -11,10 +11,16 @@ ### Changed - Reenabled server certificate validation when using SSL. - Uses the system's local certificates, so might fail on some installations. + - Redid command-line handling with the argparse module instead of getopt. + - Restructured imports & data directory checks in pesterchum.py ### Fixed - Error when setting quirk with PyQt5. +### Depreciated + - Disabled the console for now since no one seems to use it and it caused an issue on import. + - Logging.config/configparser logging configuration, not aware of anyone that actually used this. Logging level can still be specified with command line arguments. (-l --logging) + ## [v2.4.2] - 2022-08-14 ### Added diff --git a/console.py b/console.py index db4003b..4a8fd4e 100644 --- a/console.py +++ b/console.py @@ -7,7 +7,6 @@ import traceback import time import datetime import logging -import logging.config try: from PyQt6 import QtCore, QtGui, QtWidgets @@ -25,11 +24,8 @@ import ostools #from version import _pcVersion from pnc.dep.attrdict import AttrDict -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') - class ConsoleWindow(QtWidgets.QDialog): #~class ConsoleWindow(styler.PesterBaseWindow): # A simple console class, cobbled together from the corpse of another. diff --git a/convo.py b/convo.py index 72ad16f..e356c9a 100644 --- a/convo.py +++ b/convo.py @@ -1,6 +1,5 @@ import sys import logging -import logging.config from string import Template from time import strftime from datetime import datetime, timedelta @@ -15,14 +14,15 @@ except ImportError: import ostools from dataobjs import PesterHistory -from parsetools import (convertTags, lexMessage, mecmd, colorBegin, colorEnd, +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): diff --git a/dataobjs.py b/dataobjs.py index ccef5fb..112acee 100644 --- a/dataobjs.py +++ b/dataobjs.py @@ -1,8 +1,5 @@ import logging -import logging.config import ostools -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') try: from PyQt6 import QtGui diff --git a/irc.py b/irc.py index 2ab9587..0fad301 100644 --- a/irc.py +++ b/irc.py @@ -1,5 +1,4 @@ import logging -import logging.config import socket import random import time @@ -22,8 +21,6 @@ from oyoyo.client import IRCClient from oyoyo.cmdhandler import DefaultCommandHandler from oyoyo import helpers, services -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') # Python 3 diff --git a/luaquirks.py b/luaquirks.py index 4ff33d7..636afeb 100644 --- a/luaquirks.py +++ b/luaquirks.py @@ -5,7 +5,6 @@ Hard for me to work on this since I know absolutely nothing about lua, plus I'm + I asked and there doesn't seem to be a single person who actually used this 💀 import logging -import logging.config import os import sys import re @@ -15,8 +14,6 @@ from PyQt6 import QtCore, QtGui, QtWidgets import ostools from quirks import ScriptQuirks -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') try: diff --git a/memos.py b/memos.py index 1d879b4..2884ae3 100644 --- a/memos.py +++ b/memos.py @@ -1,5 +1,4 @@ import logging -import logging.config import re from string import Template from datetime import timedelta, datetime @@ -21,8 +20,6 @@ from parsetools import (convertTags, timeProtocol, lexMessage, colorBegin, mecmd, smiledict) from logviewer import PesterLogViewer -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') # Python 3 @@ -412,7 +409,6 @@ class PesterMemo(PesterConvo): self.textArea = MemoText(self.mainwindow.theme, self) self.textInput = MemoInput(self.mainwindow.theme, self) - print(self.textInput) self.textInput.setFocus() self.miniUserlist = QtWidgets.QPushButton(">\n>", self) diff --git a/ostools.py b/ostools.py index b6c9d07..1a2e5b3 100644 --- a/ostools.py +++ b/ostools.py @@ -1,7 +1,7 @@ import os import sys import platform - + try: from PyQt6.QtCore import QStandardPaths except ImportError: @@ -32,6 +32,27 @@ def osVer(): elif isLinux(): return " ".join(platform.linux_distribution()) +def validateDataDir(): + """Checks if data directory is present""" + # Define paths + datadir = getDataDir() + profile = os.path.join(datadir, "profiles") + quirks = os.path.join(datadir, "quirks") + logs = os.path.join(datadir, "logs") + errorlogs = os.path.join(datadir, "errorlogs") + backup = os.path.join(datadir, "backup") + js_pchum = os.path.join(datadir, "pesterchum.js") + + dirs = [datadir, profile, quirks, logs, errorlogs, backup] + for d in dirs: + if (os.path.isdir(d) == False) or (os.path.exists(d) == False): + os.makedirs(d, exist_ok=True) + + # pesterchum.js + if not os.path.exists(js_pchum): + with open(js_pchum, 'w') as f: + f.write("{}") + def getDataDir(): # Temporary fix for non-ascii usernames # If username has non-ascii characters, just store userdata @@ -43,5 +64,6 @@ def getDataDir(): return os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.HomeLocation), ".pesterchum/") else: return os.path.join(QStandardPaths.writableLocation(QStandardPaths.StandardLocation.AppLocalDataLocation), "pesterchum/") - except UnicodeDecodeError: + except UnicodeDecodeError as e: + print(e) return '' diff --git a/oyoyo/client.py b/oyoyo/client.py index 1563aec..3993e70 100644 --- a/oyoyo/client.py +++ b/oyoyo/client.py @@ -16,10 +16,6 @@ # THE SOFTWARE. import logging -import logging.config -import ostools -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') import logging @@ -326,7 +322,7 @@ class IRCClient: for el in data: tags, prefix, command, args = parse_raw_irc_command(el) - print(tags, prefix, command, args) + #print(tags, prefix, command, args) try: # Only need tags with tagmsg if command.upper() == "TAGMSG": diff --git a/oyoyo/cmdhandler.py b/oyoyo/cmdhandler.py index 627e6fc..bb3526d 100644 --- a/oyoyo/cmdhandler.py +++ b/oyoyo/cmdhandler.py @@ -15,18 +15,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. import logging -import logging.config -import ostools -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") -PchumLog = logging.getLogger('pchumLogger') - import inspect -import logging from oyoyo import helpers from oyoyo.parse import parse_nick +PchumLog = logging.getLogger('pchumLogger') + def protected(func): """ decorator to protect functions from being called """ func.protected = True diff --git a/oyoyo/helpers.py b/oyoyo/helpers.py index e57f2fb..4513366 100644 --- a/oyoyo/helpers.py +++ b/oyoyo/helpers.py @@ -18,13 +18,10 @@ """ contains helper functions for common irc commands """ import logging -import logging.config -import ostools -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") -PchumLog = logging.getLogger('pchumLogger') import random +PchumLog = logging.getLogger('pchumLogger') + def msg(cli, user, msg): for line in msg.split('\n'): cli.send("PRIVMSG", user, ":%s" % line) diff --git a/oyoyo/parse.py b/oyoyo/parse.py index b0fa6c0..8cdbaa3 100644 --- a/oyoyo/parse.py +++ b/oyoyo/parse.py @@ -16,13 +16,9 @@ # THE SOFTWARE. import logging -import logging.config -import ostools from oyoyo.ircevents import numeric_events -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') def parse_raw_irc_command(element): diff --git a/parsetools.py b/parsetools.py index 074772f..ab6ff79 100644 --- a/parsetools.py +++ b/parsetools.py @@ -1,5 +1,4 @@ import logging -import logging.config import re import collections from copy import copy @@ -20,8 +19,6 @@ from quirks import ScriptQuirks from pyquirks import PythonQuirks #from luaquirks import LuaQuirks -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') # I'll clean up the things that are no longer needed once the transition is @@ -42,16 +39,18 @@ _oocre = re.compile(r"([\[(\{])\1.*([\])\}])\2") _format_begin = re.compile(r'(?i)<([ibu])>') _format_end = re.compile(r'(?i)') _honk = re.compile(r"(?i)\bhonk\b") +_groupre = re.compile(r"\\([0-9]+)") quirkloader = ScriptQuirks() -quirkloader.add(PythonQuirks()) -#quirkloader.add(LuaQuirks()) -quirkloader.loadAll() -# Quirks are already listed in quirks.py, so logging is redundant here. -#PchumLog.debug(quirkloader.funcre()) -quirkloader.funcre() -_functionre = re.compile(r"%s" % quirkloader.funcre()) -_groupre = re.compile(r"\\([0-9]+)") +_functionre = None + +def loadQuirks(): + global quirkloader, _functionre + quirkloader.add(PythonQuirks()) + #quirkloader.add(LuaQuirks()) + quirkloader.loadAll() + quirkloader.funcre() + _functionre = re.compile(r"%s" % quirkloader.funcre()) def reloadQuirkFunctions(): quirkloader.loadAll() diff --git a/pesterchum.py b/pesterchum.py index 8156de9..991757b 100644 --- a/pesterchum.py +++ b/pesterchum.py @@ -1,41 +1,60 @@ #!/usr/bin/env python3 -import sys import os +import sys import shutil -import getopt -import configparser +import argparse import traceback - -# Python 3 -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") -# 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") - print(help_arguments) - sys.exit() - import logging -import logging.config import datetime import random import re import time import json + +import ostools +import nickservmsgs +import pytwmn +#import console from pnc.dep.attrdict import AttrDict +from profile import (userConfig, + userProfile, + pesterTheme, + PesterLog, + PesterProfileDB) +from menus import (PesterChooseQuirks, + PesterChooseTheme, + PesterChooseProfile, + PesterOptions, + PesterUserlist, + PesterMemoList, + LoadingScreen, + AboutPesterchum, + UpdatePesterchum, + AddChumDialog) +from mood import (Mood, + PesterMoodAction, + PesterMoodHandler, + PesterMoodButton) +from dataobjs import PesterProfile, pesterQuirk, pesterQuirks +from generic import (PesterIcon, + RightClickTree, + PesterList, + CaseInsensitiveDict, + MovingWindow, + NoneSound, + WMButton) +from convo import (PesterTabWindow, + PesterConvo) +from parsetools import (convertTags, + addTimeInitial, + themeChecker, + ThemeException, + loadQuirks) +from memos import PesterMemo, MemoTabWindow, TimeTracker +from irc import PesterIRC +from logviewer import PesterLogUserSelect, PesterLogViewer +from randomer import RandomHandler, RANDNICK +from toast import PesterToastMachine, PesterToast try: from PyQt6 import QtCore, QtGui, QtWidgets @@ -45,199 +64,69 @@ except ImportError: from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QAction, QShortcut, QActionGroup -#vnum = QtCore.qVersion() -#major = int(vnum[:vnum.find(".")]) -#if vnum.find(".", vnum.find(".")+1) != -1: -# minor = int(vnum[vnum.find(".")+1:vnum.find(".", vnum.find(".")+1)]) -#else: -# minor = int(vnum[vnum.find(".")+1:]) -#if (major < 6) or ((major > 6) and (minor < 2)): -# print("ERROR: Pesterchum requires at least Qt version >= 6.2") -# print("You currently have version " + str(vnum) + ". Please upgrade Qt.") -# sys.exit() - -import ostools -# Placed here before importing the rest of pesterchum, since bits of it need -# OSX's data directory and it doesn't hurt to have everything set up before -# plowing on. :o) -# ~Lex +# Data directory +ostools.validateDataDir() _datadir = ostools.getDataDir() -if not os.path.isdir(_datadir): - os.makedirs(_datadir) -if not os.path.isdir(os.path.join(_datadir, 'errorlogs')): - os.makedirs(os.path.join(_datadir, 'errorlogs')) -# See, what I've done here is that _datadir is '' if we're not on OSX, so the -# concatination is the same as if it wasn't there. -# UPDATE 2011-11-28 : -# Now using data directory as defined by QDesktopServices on all platforms -# (on Linux, same as using xdg). To stay safe with older versions, copy any -# data (profiles, logs, etc) from old location to new data directory. -config = configparser.ConfigParser() -# Create logging.ini -#if os.path.exists(_datadir + "logging.ini") == False: -try: - config.read(_datadir + 'logging.ini') +# Data directory dependent actions +loadQuirks() - # Test load - logging.config.fileConfig(_datadir + "logging.ini") - PchumLog = logging.getLogger('pchumLogger') -except: - #config.read('logging.ini.example') - config = configparser.ConfigParser() +# Command line options +parser = argparse.ArgumentParser() +parser.add_argument("--server", + "-s", + metavar="ADDRESS", + help="Specify server override. (legacy)") +parser.add_argument("--port", + "-p", + metavar="PORT", + help="Specify port override. (legacy)") +parser.add_argument("--logging", + "-l", + metavar="LEVEL", + default="WARNING", + help=("Specify level of logging, possible values are:" + " CRITICAL, ERROR, WARNING, INFO, DEBUG, NOTSET." + " (https://docs.python.org/3/library/logging.html)")) +parser.add_argument("--advanced", + action="store_true", + help=("Enable 'advanced' mode. Adds an 'advanced' tab" + " to settings for setting user mode and adds" + " channel modes in memo titles." + " This feature is currently not maintained.")) +parser.add_argument("--nohonk", + action="store_true", + help="Disables the honk soundeffect 🤡📣") - # Default setup - config['loggers'] = {'keys': 'root,pchumLogger'} - config['handlers'] = {'keys': 'consoleHandler,FileHandler'} - config['formatters'] = {'keys': 'simpleFormatter'} - config['logger_root'] = {'level': 'WARNING', - 'handlers': 'consoleHandler'} - config['handler_consoleHandler'] = {'class': 'StreamHandler', - 'level': 'WARNING', - 'formatter': 'simpleFormatter', - 'args': '(sys.stdout,)'} - config['handler_FileHandler'] = {'class': 'FileHandler', - 'level': 'WARNING', - 'formatter': 'simpleFormatter'} - config['logger_pchumLogger'] = {'level': 'WARNING', - 'handlers': 'consoleHandler,FileHandler', - 'qualname': 'pchumLogger', - 'propagate': '0'} - config['formatter_simpleFormatter'] = {'format': '%(levelname)s - %(module)s - %(message)s', - 'datefmt': ''} - - # Enable file logging - config['handlers']['keys'] = 'consoleHandler,FileHandler' - config['logger_pchumLogger']['handlers'] = 'consoleHandler,FileHandler' - #(r'C:\Users\X\AppData\Local\pesterchum\pesterchum.log', 'a') - config['handler_FileHandler'] = {'class': 'FileHandler', - 'level': 'WARNING', - 'formatter': 'simpleFormatter', - 'args': (_datadir + 'pesterchum.log', 'a')} - - print(config.sections()) - - -loglevel = "30"# Warning (Default) -if ('--logging' in sys.argv[1:]) or ('-l' in sys.argv[1:]) & (False == ('--logging' in sys.argv[1:]) and ('-l' in sys.argv[1:])): - try: - # If both are specified, this does not run. - if ('-l' in sys.argv[1:]): - loglevel = sys.argv[sys.argv.index('-l') + 1] - if ('--logging' in sys.argv[1:]): - loglevel = sys.argv[sys.argv.index('--logging') + 1] - - loglevel = loglevel.upper().strip() - - config.read(_datadir + 'logging.ini') - - print("loglevel = " + loglevel) - - if loglevel == "50" or loglevel == "CRITICAL": - loglevel = "CRITICAL" - print("Logging Level is CRITICAL") - elif loglevel == "40" or loglevel == "ERROR": - loglevel = "ERROR" - print("Logging Level is ERROR") - elif loglevel == "30" or loglevel == "WARNING": - loglevel = "WARNING" - print("Logging Level is WARNING") - elif loglevel == "20" or loglevel == "INFO": - loglevel = "INFO" - print("Logging Level is INFO") - elif loglevel == "10" or loglevel == "DEBUG": - loglevel = "DEBUG" - print("Logging Level is DEBUG") - elif loglevel == "0" or loglevel == "NOTSET": - loglevel = "NOTSET" - print("Logging Level is NOTSET") - else: - loglevel = "WARNING" - print("Logging Level is WARNING") - - config['logger_root']['level'] = loglevel - config['logger_pchumLogger']['level'] = loglevel - config['handler_consoleHandler']['level'] = loglevel - config['handler_FileHandler']['level'] = loglevel - - # Remove from argv because the rest of the code can't handle it :/ - if ('-l' in sys.argv[1:]): - sys.argv.pop(sys.argv.index('-l') + 1) - sys.argv.pop(sys.argv.index('-l')) - if ('--logging' in sys.argv[1:]): - sys.argv.pop(sys.argv.index('--logging') + 1) - sys.argv.pop(sys.argv.index('--logging')) - except: - logging.exception("Invalid syntax?") - -# Update logging.ini -with open(_datadir + "logging.ini", 'w') as configfile: - config.write(configfile) - -# Load logging.ini -logging.config.fileConfig(_datadir + "logging.ini") +# Set logging config section, log level is in oppts. +# Logger PchumLog = logging.getLogger('pchumLogger') +# Handlers +file_handler = logging.FileHandler(os.path.join(_datadir, 'pesterchum.log')) +stream_handler = logging.StreamHandler() +# Format +formatter = logging.Formatter('%(asctime)s - %(module)s - %(levelname)s - %(message)s') +file_handler.setFormatter(formatter) +stream_handler.setFormatter(formatter) +# Add handlers +PchumLog.addHandler(file_handler) +PchumLog.addHandler(stream_handler) -try: - import console - _CONSOLE = True -except ImportError: - _CONSOLE = False - logging.warning("Console file not shipped; skipping.") - -if _datadir: - if not os.path.exists(_datadir): - os.makedirs(_datadir) - if not os.path.exists(_datadir+"profiles/") and os.path.exists("profiles/"): - shutil.move("profiles/", _datadir+"profiles/") - if not os.path.exists(_datadir+"pesterchum.js") and os.path.exists("pesterchum.js"): - shutil.move("pesterchum.js", _datadir+"pesterchum.js") - if not os.path.exists(_datadir+"logs/") and os.path.exists("logs/"): - shutil.move("logs/", _datadir+"logs/") - -if not os.path.exists(_datadir+"profiles"): - os.mkdir(_datadir+"profiles") -if not os.path.exists(_datadir+"pesterchum.js"): - f = open(_datadir+"pesterchum.js", 'w') - f.write("{}") - f.close() -if not os.path.exists(_datadir+"logs"): - os.mkdir(_datadir+"logs") - -from profile import userConfig, userProfile, pesterTheme, PesterLog, \ - PesterProfileDB -from menus import PesterChooseQuirks, PesterChooseTheme, \ - PesterChooseProfile, PesterOptions, PesterUserlist, PesterMemoList, \ - LoadingScreen, AboutPesterchum, UpdatePesterchum, AddChumDialog -from mood import Mood, PesterMoodAction, PesterMoodHandler, PesterMoodButton -from dataobjs import PesterProfile, pesterQuirk, pesterQuirks -from generic import PesterIcon, RightClickTree, \ - PesterList, CaseInsensitiveDict, MovingWindow, \ - NoneSound, WMButton -from convo import PesterTabWindow, PesterConvo -from parsetools import convertTags, addTimeInitial, themeChecker, ThemeException -from memos import PesterMemo, MemoTabWindow, TimeTracker -from irc import PesterIRC -from logviewer import PesterLogUserSelect, PesterLogViewer -from randomer import RandomHandler, RANDNICK -import nickservmsgs -from toast import PesterToastMachine, PesterToast -import pytwmn - -#canon_handles = ["apocalypseArisen", "arsenicCatnip", "arachnidsGrip", "adiosToreador", -# "caligulasAquarium", "cuttlefishCuller", "carcinoGeneticist", "centaursTesticle", -# "grimAuxiliatrix", "gallowsCalibrator", "gardenGnostic", "ectoBiologist", -# "twinArmageddons", "terminallyCapricious", "turntechGodhead", "tentacleTherapist"] +# Global variables BOTNAMES = [] CUSTOMBOTS = ["CALSPRITE", RANDNICK.upper()] SERVICES = ["NICKSERV", "CHANSERV", "MEMOSERV", "OPERSERV", "HELPSERV", "HOSTSERV", "BOTSERV"] BOTNAMES.extend(CUSTOMBOTS) BOTNAMES.extend(SERVICES) - # Save the main app. From here, we should be able to get everything else in # order, for console use. +_CONSOLE = False _CONSOLE_ENV = AttrDict() _CONSOLE_ENV.PAPP = None +# Python 3 +QString = str +# Command line arguments +_ARGUMENTS = parser.parse_args() # Import audio module if ostools.isLinux(): @@ -250,7 +139,8 @@ if ostools.isLinux(): import pygame except ImportError: print("Failed to import pygame, falling back to QtMultimedia. " - + "For QtMultimedia to work on Linux you need GStreamer" + + "This should also work fine, but for QtMultimedia to work " + + "on Linux you need GStreamer" + " + a plugin for decoding the wave format.") try: from PyQt6 import QtMultimedia @@ -682,32 +572,32 @@ class chumArea(RightClickTree): self.showOnlineNumbers() def showOnlineNumbers(self): if hasattr(self, 'groups'): - self.hideOnlineNumbers() - totals = {'Chums': 0} - online = {'Chums': 0} - for g in self.groups: - totals[str(g)] = 0 - online[str(g)] = 0 - for c in self.chums: - yes = c.mood.name() != "offline" - if c.group == "Chums": - totals[str(c.group)] = totals[str(c.group)]+1 - if yes: - online[str(c.group)] = online[str(c.group)]+1 - elif c.group in totals: - totals[str(c.group)] = totals[str(c.group)]+1 - if yes: - online[str(c.group)] = online[str(c.group)]+1 - else: - totals["Chums"] = totals["Chums"]+1 - if yes: - online["Chums"] = online["Chums"]+1 - for i in range(self.topLevelItemCount()): - text = str(self.topLevelItem(i).text(0)) - if text.rfind(" (") != -1: - text = text[0:text.rfind(" (")] - if text in online: - self.topLevelItem(i).setText(0, "%s (%i/%i)" % (text, online[text], totals[text])) + self.hideOnlineNumbers() + totals = {'Chums': 0} + online = {'Chums': 0} + for g in self.groups: + totals[str(g)] = 0 + online[str(g)] = 0 + for c in self.chums: + yes = c.mood.name() != "offline" + if c.group == "Chums": + totals[str(c.group)] = totals[str(c.group)]+1 + if yes: + online[str(c.group)] = online[str(c.group)]+1 + elif c.group in totals: + totals[str(c.group)] = totals[str(c.group)]+1 + if yes: + online[str(c.group)] = online[str(c.group)]+1 + else: + totals["Chums"] = totals["Chums"]+1 + if yes: + online["Chums"] = online["Chums"]+1 + for i in range(self.topLevelItemCount()): + text = str(self.topLevelItem(i).text(0)) + if text.rfind(" (") != -1: + text = text[0:text.rfind(" (")] + if text in online: + self.topLevelItem(i).setText(0, "%s (%i/%i)" % (text, online[text], totals[text])) def hideOnlineNumbers(self): for i in range(self.topLevelItemCount()): text = str(self.topLevelItem(i).text(0)) @@ -1270,15 +1160,16 @@ class PesterWindow(MovingWindow): # This was almost certainly intentional. if "advanced" in options: self.advanced = options["advanced"] - else: self.advanced = False + else: + self.advanced = False if "server" in options: self.serverOverride = options["server"] if "port" in options: self.portOverride = options["port"] if "honk" in options: self.honk = options["honk"] - - else: self.honk = True + else: + self.honk = True self.modes = "" self.sound_type = None @@ -2969,9 +2860,9 @@ class PesterWindow(MovingWindow): self.config.set("showTimeStamps", timestampsetting) timeformatsetting = str(self.optionmenu.timestampBox.currentText()) if timeformatsetting == "12 hour": - self.config.set("time12Format", True) + self.config.set("time12Format", True) else: - self.config.set("time12Format", False) + self.config.set("time12Format", False) secondssetting = self.optionmenu.secondscheck.isChecked() self.config.set("showSeconds", secondssetting) # groups @@ -3066,12 +2957,12 @@ class PesterWindow(MovingWindow): # Taskbar blink blinksetting = 0 if self.optionmenu.pesterBlink.isChecked(): - blinksetting |= self.config.PBLINK + blinksetting |= self.config.PBLINK if self.optionmenu.memoBlink.isChecked(): - blinksetting |= self.config.MBLINK + blinksetting |= self.config.MBLINK curblink = self.config.blink() if blinksetting != curblink: - self.config.set('blink', blinksetting) + self.config.set('blink', blinksetting) # toast notifications self.tm.setEnabled(self.optionmenu.notifycheck.isChecked()) self.tm.setCurrentType(str(self.optionmenu.notifyOptions.currentText())) @@ -3623,7 +3514,7 @@ class PesterWindow(MovingWindow): server_file.write(json.dumps(json_server_file, indent = 4) ) server_file.close() except: - PchumLog.error("Failed to set server :(") + PchumLog.error("Failed to set server :(") # Continue running Pesterchum as usual # Sorry- @@ -4116,19 +4007,27 @@ class MainProgram(QtCore.QObject): def oppts(self, argv): options = {} + # The parser and arguments are defined globally, + # since --help causes Qt to raise an exception otherwise. + args = _ARGUMENTS try: - opts, args = getopt.getopt(argv, "s:p:", ["server=", "port=", "advanced", "no-honk"]) - except getopt.GetoptError: - return options - for opt, arg in opts: - if opt in ("-s", "--server"): - options["server"] = arg - elif opt in ("-p", "--port"): - options["port"] = arg - elif opt in ("--advanced"): - options["advanced"] = True - elif opt in ("--no-honk"): + if args.server != None: + options["server"] = args.server + if args.port != None: + options["port"] = args.port + # Set log level + PchumLog.setLevel(args.logging.upper()) + file_handler.setLevel(args.logging.upper()) + stream_handler.setLevel(args.logging.upper()) + # Enable advanced + options["advanced"] = args.advanced + # Disable honks + if args.nohonk == True: options["honk"] = False + except Exception as e: + print(e) + return options + return options def uncaughtException(self, exc, value, tb): diff --git a/profile.py b/profile.py index 408c35e..a2bee51 100644 --- a/profile.py +++ b/profile.py @@ -6,7 +6,6 @@ import codecs import shutil import zipfile import logging -import logging.config from string import Template from datetime import datetime from time import strftime @@ -23,7 +22,6 @@ from dataobjs import PesterProfile, pesterQuirks from parsetools import convertTags _datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') @@ -274,20 +272,20 @@ with a backup from: %s" % (_datadir, self.filename, return self.config.get('opvMessages', True) def animations(self): return self.config.get('animations', True) - def checkForUpdates(self): - u = self.config.get('checkUpdates', 0) - if type(u) == type(bool()): - if u: u = 2 - else: u = 3 - return u - # Once a day - # Once a week - # Only on start - # Never - def lastUCheck(self): - return self.config.get('lastUCheck', 0) - def checkMSPA(self): - return self.config.get('mspa', False) + #def checkForUpdates(self): + # u = self.config.get('checkUpdates', 0) + # if type(u) == type(bool()): + # if u: u = 2 + # else: u = 3 + # return u + # # Once a day + # # Once a week + # # Only on start + # # Never + #def lastUCheck(self): + # return self.config.get('lastUCheck', 0) + #def checkMSPA(self): + # return self.config.get('mspa', False) def blink(self): return self.config.get('blink', self.PBLINK | self.MBLINK) def notify(self): diff --git a/pyquirks.py b/pyquirks.py index a516063..5690a47 100644 --- a/pyquirks.py +++ b/pyquirks.py @@ -1,5 +1,4 @@ import logging -import logging.config import importlib.util try: @@ -11,8 +10,6 @@ except ImportError: import ostools from quirks import ScriptQuirks -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') class PythonQuirks(ScriptQuirks): diff --git a/quirks.py b/quirks.py index 97978ea..52f04ab 100644 --- a/quirks.py +++ b/quirks.py @@ -1,11 +1,9 @@ import os import logging -import logging.config import ostools _datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') class ScriptQuirks(object): @@ -37,7 +35,7 @@ class ScriptQuirks(object): if self.last[k] == self.quirks[k]: del self.quirks[k] #print self.quirks - if self.quirks: + if hasattr(self, 'quirks'): # See https://stackoverflow.com/questions/12843099/python-logging-typeerror-not-all-arguments-converted-during-string-formatting reg_quirks = ('Registered quirks:', '(), '.join(self.quirks) + "()") PchumLog.info(reg_quirks) @@ -53,13 +51,13 @@ class ScriptQuirks(object): extension = self.getExtension() filenames = [] if not os.path.exists(os.path.join(self.home, 'quirks')): - os.mkdir(os.path.join(self.home, 'quirks')) + os.makedirs(os.path.join(self.home, 'quirks'), exist_ok=True) for fn in os.listdir(os.path.join(self.home, 'quirks')): if fn.endswith(extension) and not fn.startswith('_'): filenames.append(os.path.join(self.home, 'quirks', fn)) - if self._datadir: + if hasattr(self, '_datadir'): if not os.path.exists(os.path.join(self._datadir, 'quirks')): - os.mkdir(os.path.join(self._datadir, 'quirks')) + os.makedirs(os.path.join(self._datadir, 'quirks'), exist_ok=True) for fn in os.listdir(os.path.join(self._datadir, 'quirks')): if fn.endswith(extension) and not fn.startswith('_'): filenames.append(os.path.join(self._datadir, 'quirks', fn)) @@ -75,10 +73,6 @@ class ScriptQuirks(object): continue except Exception as e: PchumLog.warning("Error loading %s: %s (in quirks.py)" % (os.path.basename(name), e)) - #msgbox = QtWidgets.QMessageBox() - #msgbox.setWindowTitle("Error!") - #msgbox.setText("Error loading %s: %s (in quirks.py)" % (os.path.basename(filename), e)) - #msgbox.exec() else: if self.modHas(module, 'setup'): module.setup() @@ -91,7 +85,7 @@ class ScriptQuirks(object): del self.quirks[k] def funcre(self): - if not self.quirks: + if not hasattr(self, 'quirks'): return r"\\[0-9]+" f = r"(" for q in self.quirks: diff --git a/randomer.py b/randomer.py index 2f947d8..3a91141 100644 --- a/randomer.py +++ b/randomer.py @@ -1,5 +1,4 @@ import logging -import logging.config try: from PyQt6 import QtCore, QtWidgets @@ -9,8 +8,6 @@ except ImportError: import ostools -_datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') RANDNICK = "randomEncounter" diff --git a/toast.py b/toast.py index 8a9b391..d7bdf71 100644 --- a/toast.py +++ b/toast.py @@ -2,7 +2,6 @@ import os #import time import inspect import logging -import logging.config try: from PyQt6 import QtCore, QtGui, QtWidgets @@ -13,7 +12,6 @@ except ImportError: import ostools _datadir = ostools.getDataDir() -logging.config.fileConfig(_datadir + "logging.ini") PchumLog = logging.getLogger('pchumLogger') #try: