From 65a87d4f85a6eb505a74d5228c6509cf0cc64f1e Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 9 Nov 2023 04:51:26 +0800 Subject: [PATCH] initial commit - working --- .gitignore | 160 ++++++++++++++++++++++++++++++++++++++++++++ README.md | 29 ++++++++ icons/graph.png | Bin 0 -> 13783 bytes icons/schematic.png | Bin 0 -> 16788 bytes icons/symbol.png | Bin 0 -> 30362 bytes ltspice-discord.py | 136 +++++++++++++++++++++++++++++++++++++ requirements.txt | Bin 0 -> 168 bytes 7 files changed, 325 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 icons/graph.png create mode 100644 icons/schematic.png create mode 100644 icons/symbol.png create mode 100644 ltspice-discord.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68bc17f --- /dev/null +++ b/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..f0d67e3 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +## Icons + +# Rich presence for LTspice + +## Install and run + +Install dependencies: + +```bash +python -m venv .venv +source .venv/bin/activate +python -m pip install -r requirements.txt +``` + +Run with: + +```bash +python .\ltspice-discord.py +``` + +## Icons + +Icons adapted from: + +https://commons.wikimedia.org/wiki/File:BJT_NPN_symbol-fr.svg + +https://en.wikipedia.org/wiki/File:Oscillation_amortie.svg?&useskin=vector + +https://commons.wikimedia.org/wiki/File:AND_ANSI.svg diff --git a/icons/graph.png b/icons/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..513360c2ade0f7d22e343d1f4461e17cad82f4e2 GIT binary patch literal 13783 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 literal 0 HcmV?d00001 diff --git a/icons/schematic.png b/icons/schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfaf883681d6a4796ec8647f503823c9e9e8aa3 GIT binary patch literal 16788 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 J{R8di{{_9;#K!;t literal 0 HcmV?d00001 diff --git a/icons/symbol.png b/icons/symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..fd15535e31215e8cdbc193d1ba8044d3b47e38a3 GIT binary patch literal 30362 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 literal 0 HcmV?d00001 diff --git a/ltspice-discord.py b/ltspice-discord.py new file mode 100644 index 0000000..7c07db2 --- /dev/null +++ b/ltspice-discord.py @@ -0,0 +1,136 @@ +import os +from typing import List +import win32gui +import time +import psutil +import win32process +import pypresence + +rpc = pypresence.Presence("1171889899679531129") +data = None + +rpc.connect() + + +def find_active_processes(name: str) -> List[int]: + processes = [] + for pid in psutil.pids(): + try: + if psutil.Process(pid) and psutil.Process(pid).name() == name: + processes.append(pid) + except psutil.NoSuchProcess: + pass + return processes + + +LTSPICE_NAME = "LTSPICE.exe" + +last_state = {} +last_program = {"pid": None, "path": None} + + +def handle_ltspice(title: str) -> None: + global last_state + filename = title.replace("LTspice XVII - ", "") + file, ext = os.path.splitext(filename) + state = {} + if ext in (".asc",): # SCHEMATICS + state = { + "large_image": "schematic", + "large_text": "Schematic", + "details": "Editing a schematic", + "state": filename, + } + elif ext in ( + ".cir", + ".net", + ".sp", + ): # NETLISTS + state = { + "large_image": "symbol", # TODO: Add images for these + "large_text": "Symbol", + "details": "Editing a netlist", + "state": filename, + } + elif ext in ( + ".raw", + ".fra", + ): # WAVEFORMS + state = { + "large_image": "graph", + "large_text": "Waveform", + "details": "Viewing a graph", + "state": filename, + } + elif ext in ( + ".bjt", + ".cap", + ".dio", + ".ind", + ".jft", + ".mos", + ".res", + ): # DISCRETES + state = { + "large_image": "symbol", # TODO: Add images for each one of these + "large_text": "Symbol", + "details": "Editing a discrete component", + "state": filename, + } + elif ext in (".asy",): # SYMBOLS + state = { + "large_image": "symbol", + "large_text": "Symbol", + "details": "Editing a symbol", + "state": filename, + } + else: + rpc.clear() + state = { + "large_image": "logo", + "large_text": "LTspice", + "details": "Idling", + } + + if state != last_state: + print("UPDATED!") + print(filename, file, ext) + rpc.update( + **state, + start=int(time.time()), + small_image="logo", + small_text="LTspice", + ) + last_state = state + return True + return False + + +def main() -> None: + global last_program + WINDOW_HANDLERS = { + LTSPICE_NAME: handle_ltspice, + } + while True: + time.sleep(3) + foreground_hwnd = win32gui.GetForegroundWindow() + pid = win32process.GetWindowThreadProcessId(foreground_hwnd) + if pid[-1] >= 0: + active_process = psutil.Process(pid[-1]) + if active_process.name() in WINDOW_HANDLERS.keys(): + handler = WINDOW_HANDLERS[active_process.name()] + if handler(win32gui.GetWindowText(foreground_hwnd)): + last_program = { + "pid": active_process.pid, + "path": active_process.name(), + } + if last_program["pid"] is not None and last_program[ + "pid" + ] not in find_active_processes(last_program["path"]): + last_program = {"pid": None, "path": None} + print("Clear RPC - program closed") + rpc.clear() + + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..ff9e86dae2cf427b3d000689a9e3f46c52ef88a4 GIT binary patch literal 168 zcmX|*u?oU46h+T0_$x(>6*6>oEnWP8v_ql9V3g3G*WMSYgqtDfy!-O~Br6 literal 0 HcmV?d00001