nparseplus-sdk
The stable contract for building nParse+ plugins: addon windows, log parsers, event subscribers, and network pollers that load into the app at runtime.
nParse+ is a log-parsing overlay for the EverQuest emulator server Project 1999 — spell timers, DPS tracking, maps, triggers, and shared raid information, driven entirely by reading the game's own log file. This package is how you extend it.
pip install nparseplus-sdk
A minimal plugin
from datetime import timedelta
from nparseplus_sdk import NParsePlugin, PluginContext, PluginMeta
class HelloTimerPlugin(NParsePlugin):
meta = PluginMeta(
id="hello-timer",
name="Hello Timer",
version="1.0.0",
requires_sdk=">=1.0,<2",
)
def activate(self, ctx: PluginContext) -> None:
# Host classes are imported lazily so `import nparseplus_sdk` never
# drags in the app (or Qt) — see the "No dependency on the app" note.
from nparseplus_sdk.events import CommsChannel, CommsEvent
from nparseplus_sdk.timers import TimerRow
def on_comms(event) -> None:
if event.channel is not CommsChannel.SAY or event.sender != "You":
return
if event.content.strip().lower() != "hello nparse":
return
ctx.timers.add_timer(
TimerRow(
name="Hello from a plugin",
group=" Hello Timer",
updated_at=event.timestamp,
ends_at=event.timestamp + timedelta(seconds=30),
total_duration_s=30.0,
)
)
ctx.subscribe(CommsEvent, on_comms)
def create_plugin() -> NParsePlugin:
return HelloTimerPlugin()
Drop that in the app's plugins folder, approve it when asked, and saying "hello nparse" in game starts a 30-second timer. Check your work before you ship it:
nparseplus-plugin validate path/to/your_plugin.py
The full guide — the context API, plugin windows, settings pages, packaging and publishing — is the Plugins section of the nParse+ documentation.
What you should know before building
- Add-ons are opt-in. Users must tick Settings > Advanced > Enable plugins (add-ons) and restart before anything loads. A user who only wants maps and spell timers never sees the feature at all.
- Every plugin is consent-gated. Yours does not run until the user approves it by name, and it runs with the same access to their machine as nParse+ itself. Write accordingly.
- Versioning is independent of the app. Declare the SDK range you built
against in
PluginMeta.requires_sdk(e.g.">=1.0,<2"); the app refuses plugins whose range does not admit the SDK version it bundles. 1.x is additive-only. - You can ship updates without a registry. Set
PluginMeta.update_url(SDK 1.1+) to an https index document listing your latest release and the app offers in-place updates for your plugin. It can only ever offer your own id, it never appears in the Browse list, and the sha256 in it is your own claim rather than anyone's review — see Shipping updates without a registry. - No dependency on the app. Plugins execute inside nParse+, which provides
the runtime, so this package installs standalone with nothing but
pydanticandpackaging.nparseplus_sdk.events,.timersand.uire-export host classes lazily — import them insideactivate(), not at module scope. For standalone type-checking or tests you can install the app from source (pip install git+https://github.com/prokopto-dev/nparse-plus); it is not itself a PyPI package.
Repository note
This package lives in the sdk/ directory of the main
prokopto-dev/nparse-plus repository as an independent uv workspace member,
versioned and released independently of the app. It may eventually move to its
own repository (prokopto-dev/nparseplus-sdk).
Maintainers: the release procedure and the one-time publishing setup are in CONTRIBUTING.md.
The version has exactly one source:
__version__insrc/nparseplus_sdk/__init__.py.pyproject.tomldeclaresdynamic = ["version"]and hatchling reads that literal;uv.lockrecords no version for a dynamic-version package — so the wheel, the lock and the runtime constant cannot disagree. Do not reintroduce a literalversion =inpyproject.toml, and do not deriveSDK_VERSIONfromimportlib.metadata: a PyInstaller-frozen app has no dist metadata, so any fallback next to that lookup is what every shipped build would report tocheck_compat.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nparseplus_sdk-1.1.0.tar.gz.
File metadata
- Download URL: nparseplus_sdk-1.1.0.tar.gz
- Upload date:
- Size: 19.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9996ccc31b2e16d31356cc179f56c829a09ddc8d247faddadfdc2b3ed69493f
|
|
| MD5 |
1f8a7f4a8aabdd42935f4cf87e4c293c
|
|
| BLAKE2b-256 |
cb49d4bd447d9b2621d0d62f43dbb05575e529e7737be6d12bedee5f73cb1487
|
Provenance
The following attestation bundles were made for nparseplus_sdk-1.1.0.tar.gz:
Publisher:
release-sdk.yml on prokopto-dev/nparse-plus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nparseplus_sdk-1.1.0.tar.gz -
Subject digest:
a9996ccc31b2e16d31356cc179f56c829a09ddc8d247faddadfdc2b3ed69493f - Sigstore transparency entry: 2297262858
- Sigstore integration time:
-
Permalink:
prokopto-dev/nparse-plus@ae4545a6b4173e63353661e523a66819d7a5c1c8 -
Branch / Tag:
refs/tags/sdk-v1.1.0 - Owner: https://github.com/prokopto-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-sdk.yml@ae4545a6b4173e63353661e523a66819d7a5c1c8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nparseplus_sdk-1.1.0-py3-none-any.whl.
File metadata
- Download URL: nparseplus_sdk-1.1.0-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1208e1bfbffa840df409b3967e5cbb19ffad2d9a1ce377aa3c12394eaca0f267
|
|
| MD5 |
43342a51ce85f3e3af618e08325db1d6
|
|
| BLAKE2b-256 |
6315bea0a7226ea62f845253d34232e30dfc663b19121ed133b43cb26829685d
|
Provenance
The following attestation bundles were made for nparseplus_sdk-1.1.0-py3-none-any.whl:
Publisher:
release-sdk.yml on prokopto-dev/nparse-plus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nparseplus_sdk-1.1.0-py3-none-any.whl -
Subject digest:
1208e1bfbffa840df409b3967e5cbb19ffad2d9a1ce377aa3c12394eaca0f267 - Sigstore transparency entry: 2297262987
- Sigstore integration time:
-
Permalink:
prokopto-dev/nparse-plus@ae4545a6b4173e63353661e523a66819d7a5c1c8 -
Branch / Tag:
refs/tags/sdk-v1.1.0 - Owner: https://github.com/prokopto-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-sdk.yml@ae4545a6b4173e63353661e523a66819d7a5c1c8 -
Trigger Event:
push
-
Statement type: