Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 682e843d0e | |||
| 71569928b5 | |||
| c6e924493b | |||
| 1f130dd5b5 | |||
| 010b2da105 | |||
| 1871cd6e1d | |||
| d9a40f18e6 | |||
| d36dbd5ca5 | |||
| 6f41c63922 | |||
| e19fdc0460 | |||
| 8ed0dbc1ad | |||
| fec171302c | |||
| 1d2cd4069c | |||
| 2a6599ac9e | |||
| 87e59c24da | |||
| 62d4024b7e | |||
| b4fc752b4e |
@@ -0,0 +1,55 @@
|
||||
# TurtleMail asset provenance
|
||||
|
||||
Audit date: 2026-08-31
|
||||
|
||||
No visual asset was modified during this documentation pass.
|
||||
|
||||
A software or repository-level notice does not by itself establish ownership or
|
||||
relicensing authority for every visual asset. This file records what can be
|
||||
verified without making broader ownership claims.
|
||||
|
||||
## Bundled visual assets
|
||||
|
||||
| File | Git blob SHA-1 | Immediate upstream | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| `TurtleMail-AH.blp` | `29727e7334dac8891f1483e2a07f8e53d0bae3d5` | `sica42/TurtleMail` | exact upstream Git blob match |
|
||||
| `TurtleMail-RetArrow.blp` | `ac2279ad04168c03e12d693e0056da843d2f3079` | `sica42/TurtleMail` | exact upstream Git blob match |
|
||||
| `TurtleMail-DownArrow.tga` | `fb6c3b2ca14cc6c4f612711a62184c270e329d3f` | `sica42/TurtleMail` | exact upstream Git blob match |
|
||||
|
||||
## Immediate upstream history
|
||||
|
||||
`TurtleMail-AH.blp` and `TurtleMail-RetArrow.blp` were introduced in
|
||||
`sica42/TurtleMail` by commit:
|
||||
|
||||
`814a322b87d3262181e78bbdd1f2e6418ac14f8d`
|
||||
"Add icons for returned & AH mails" — 2025-03-17
|
||||
|
||||
`TurtleMail-DownArrow.tga` appears in the upstream logging work including
|
||||
commit:
|
||||
|
||||
`91142ac27c8fabd651b8e8db6c3d30baa31a604e`
|
||||
"New logging feature" — 2025-03-23
|
||||
|
||||
## Provenance status
|
||||
|
||||
The immediate source is verified. The ultimate creator/source and any separate
|
||||
underlying asset license were not established during this audit.
|
||||
|
||||
Therefore:
|
||||
|
||||
- no claim is made that Dusk-92 created these assets;
|
||||
- no claim is made that sica42 necessarily owned every underlying visual
|
||||
element;
|
||||
- no additional license is asserted for these assets;
|
||||
- the files are retained with documented provenance.
|
||||
|
||||
## Screenshots
|
||||
|
||||
The README references externally hosted screenshots. They are not bundled as
|
||||
repository files.
|
||||
|
||||
## Trademark and game-asset boundary
|
||||
|
||||
World of Warcraft, Warcraft, Blizzard Entertainment, and associated names,
|
||||
marks, artwork, and game assets remain the property of their respective rights
|
||||
holders.
|
||||
@@ -0,0 +1,74 @@
|
||||
# TurtleMail code provenance
|
||||
|
||||
Audit date: 2026-08-31
|
||||
|
||||
## Known fork chain
|
||||
|
||||
1. `shirsig/Mail`
|
||||
- https://github.com/shirsig/Mail
|
||||
- original known Vanilla mail addon source
|
||||
2. `sica42/TurtleMail`
|
||||
- https://github.com/sica42/TurtleMail
|
||||
- immediate upstream fork with TurtleMail features and later maintenance
|
||||
3. `Dusk-92/TurtleMail`
|
||||
- https://github.com/Dusk-92/TurtleMail
|
||||
- current maintained compatibility fork
|
||||
|
||||
GitHub repository metadata confirms that `sica42/TurtleMail` is a fork of
|
||||
`shirsig/Mail`, and `Dusk-92/TurtleMail` is a fork of
|
||||
`sica42/TurtleMail`.
|
||||
|
||||
## Immediate-upstream identity
|
||||
|
||||
The following current files are byte-identical at Git blob level to
|
||||
`sica42/TurtleMail`:
|
||||
|
||||
| File | Git blob SHA-1 |
|
||||
| --- | --- |
|
||||
| `Calendar.lua` | `1a5e918bd4b6bf74f1c4a3372a60e944c5e1dcb8` |
|
||||
| `TurtleMail.lua` | `009463c946c47f9fbf44c666005c5b95468cba97` |
|
||||
| `TurtleMail.xml` | `e0ccb3ca6db13f999468a0eef9a91c564c8adae8` |
|
||||
| `localization.lua` | `2ff7c48bd9c8ee555c7e2e0111bedce86e3e01bc` |
|
||||
| `localization.de.lua` | `40227ed5306eafd43b97189967459a65487b32a9` |
|
||||
| `localization.es.lua` | `3f181ba3dc36d8539e8eb6adb91b68f30ec37b75` |
|
||||
| `localization.fr.lua` | `a72708fd39c212f4478779fa9e73200347495d51` |
|
||||
| `localization.ru.lua` | `732e204b50c88eb410f48a835da3f5874d48c312` |
|
||||
|
||||
The three visual assets are documented separately in
|
||||
`Docs/ASSET_PROVENANCE.md`.
|
||||
|
||||
## Dusk-92-specific maintenance
|
||||
|
||||
The current fork adds an isolated compatibility layer in
|
||||
`TurtleMailFix.lua` and updates addon metadata/documentation around the
|
||||
1.4.6 maintenance release.
|
||||
|
||||
The current `TurtleMail.toc` differs from the immediate upstream version and
|
||||
includes the compatibility layer.
|
||||
|
||||
`AUDIT.md` documents the technical compatibility pass.
|
||||
|
||||
## Calendar provenance
|
||||
|
||||
`Calendar.lua` is unchanged from the immediate upstream.
|
||||
|
||||
Relevant upstream history:
|
||||
|
||||
- commit `91142ac27c8fabd651b8e8db6c3d30baa31a604e`
|
||||
("New logging feature", 2025-03-23)
|
||||
- commit `2a8cc7204c93dd83b54ea95009fbc6c6075d7573`
|
||||
("Fix bug in calendar dropdown", 2025-04-02)
|
||||
|
||||
This establishes the immediate development history without asserting a license
|
||||
that is not present in the upstream repository.
|
||||
|
||||
## Licensing boundary
|
||||
|
||||
Neither `shirsig/Mail` nor `sica42/TurtleMail` exposed an explicit
|
||||
project-wide LICENSE file during this audit.
|
||||
|
||||
A public GitHub repository or fork relationship is not, by itself, proof of a
|
||||
permissive license.
|
||||
|
||||
For that reason, the current fork records provenance rather than assigning an
|
||||
invented license to inherited code.
|
||||
@@ -0,0 +1,30 @@
|
||||
TurtleMail mixed-origin copyright and license notice
|
||||
|
||||
This repository contains material from multiple origins.
|
||||
|
||||
1. Original modifications and documentation authored by Dusk-92
|
||||
Copyright (c) 2026 Dusk-92.
|
||||
All rights reserved unless a specific file states otherwise.
|
||||
|
||||
2. Historical and upstream TurtleMail / Mail code
|
||||
Significant portions of this repository descend from:
|
||||
- https://github.com/shirsig/Mail
|
||||
- https://github.com/sica42/TurtleMail
|
||||
|
||||
No explicit project-wide license was identified in either upstream
|
||||
repository during the 2026-08-31 provenance audit.
|
||||
|
||||
This file does NOT relicense inherited code and does not grant rights that
|
||||
the applicable original copyright holders did not grant.
|
||||
|
||||
3. Visual assets, trademarks, and game-facing material
|
||||
These remain subject to their respective rights holders. The presence of a
|
||||
file in this repository does not by itself establish ownership or a right to
|
||||
relicense any underlying third-party or game-derived asset.
|
||||
|
||||
World of Warcraft, Warcraft, Blizzard Entertainment, Turtle WoW, and associated
|
||||
names, marks, artwork, and game assets remain the property of their respective
|
||||
rights holders.
|
||||
|
||||
See THIRD_PARTY_NOTICES.md, PROJECT_IDENTITY.md, and Docs/ for provenance and
|
||||
scope details.
|
||||
@@ -0,0 +1,20 @@
|
||||
# License and provenance records
|
||||
|
||||
No explicit project-wide LICENSE file was identified in either known upstream
|
||||
repository during the 2026-08-31 audit:
|
||||
|
||||
- https://github.com/shirsig/Mail
|
||||
- https://github.com/sica42/TurtleMail
|
||||
|
||||
For that reason, this directory does not contain an invented upstream license
|
||||
text.
|
||||
|
||||
The repository root `LICENSE` is a **mixed-origin scope notice**. It applies
|
||||
only to original Dusk-92 material where stated and explicitly does not
|
||||
relicense inherited code or assets.
|
||||
|
||||
See:
|
||||
|
||||
- `../THIRD_PARTY_NOTICES.md`
|
||||
- `../Docs/CODE_PROVENANCE.md`
|
||||
- `../Docs/ASSET_PROVENANCE.md`
|
||||
@@ -0,0 +1,48 @@
|
||||
# TurtleMail project identity
|
||||
|
||||
## Canonical project
|
||||
|
||||
The canonical repository designated by the current maintainer is:
|
||||
|
||||
- https://github.com/Dusk-92/TurtleMail
|
||||
|
||||
Mirrors, package caches, downstream forks, repackaged copies, and modified
|
||||
versions hosted elsewhere are independent unless the canonical project
|
||||
explicitly states otherwise.
|
||||
|
||||
## Independent community project
|
||||
|
||||
TurtleMail is an independent community-maintained fork.
|
||||
|
||||
It is not affiliated with, sponsored by, approved by, or endorsed by Blizzard
|
||||
Entertainment, Turtle WoW, OctoWoW-like projects, shirsig, sica42, or any other
|
||||
referenced project unless explicitly stated by that party.
|
||||
|
||||
Compatibility with World of Warcraft 1.12-compatible clients, Turtle WoW-like
|
||||
environments, Octo-like environments, or pfUI does not imply affiliation,
|
||||
endorsement, partnership, or ownership.
|
||||
|
||||
World of Warcraft, Warcraft, Blizzard Entertainment, and associated names,
|
||||
marks, artwork, and game assets remain the property of their respective rights
|
||||
holders.
|
||||
|
||||
## Upstream relationship
|
||||
|
||||
The known fork chain is:
|
||||
|
||||
- https://github.com/shirsig/Mail
|
||||
- https://github.com/sica42/TurtleMail
|
||||
- https://github.com/Dusk-92/TurtleMail
|
||||
|
||||
The current fork preserves upstream attribution and maintains its compatibility
|
||||
changes independently.
|
||||
|
||||
Nothing in this repository should be read as a statement that upstream authors
|
||||
or compatibility-target projects endorse, support, or are responsible for this
|
||||
fork or its releases.
|
||||
|
||||
## Support boundary
|
||||
|
||||
Dusk-92 is responsible only for changes and releases published by the canonical
|
||||
fork. Upstream authors and compatibility-target projects are not responsible
|
||||
for this fork's modifications or current behavior.
|
||||
@@ -1,53 +1,177 @@
|
||||
# TurtleMail - WoW 1.12 / Turtle WoW
|
||||
# 📬 TurtleMail — Turtle WoW
|
||||
|
||||
This fork keeps the original TurtleMail features while adding a compatibility and safety layer for **Turtle WoW 1.18.x / Octo**.
|
||||
A lightweight mailbox enhancement for **World of Warcraft 1.12**, maintained for **Turtle WoW 1.18.x / Octo-like environments**.
|
||||
|
||||
> Stable release: **1.4.6**
|
||||
> Based on upstream **sica42/TurtleMail 1.4.5**.
|
||||
> The compatibility work is isolated in `TurtleMailFix.lua` so upstream changes remain easy to compare and merge.
|
||||
TurtleMail improves the Vanilla mail interface with faster mail handling, multiple attachments, recipient autocomplete, mail logging and useful Auction House / returned-mail indicators.
|
||||
|
||||
## Features
|
||||
> This fork keeps the original TurtleMail workflow while adding a compatibility and safety layer for modern Turtle WoW 1.12 environments.
|
||||
|
||||
- **Automatically opens mail, very rapidly**
|
||||
- **Mails multiple items at once, very rapidly**
|
||||
- **Autocompletes recipient names**
|
||||
- **Icons to show if mail was returned or is from AH**
|
||||
- **Shows collected gold from opened mails**
|
||||
- **Apply COD to 1st or all mails**
|
||||
- **Logging of all sent and received mails**
|
||||
## 📦 Installation
|
||||
|
||||
**\<Right Click>** on inbox items to loot the gold, loot the item and destroy the letter, in that order, if any.<br/>
|
||||
**\<Right Click>** or **\<Left Drag>** to add inventory items to the attachments.<br/>
|
||||
**\<Right Click>** to add inventory items to the trade frame.
|
||||
1. Download the addon.
|
||||
2. Make sure the addon folder is named `TurtleMail`.
|
||||
3. Copy it to:
|
||||
|
||||
Note that COD is always ignored when opening, both automatically as well as by **\<Right Click>**.
|
||||
`World of Warcraft\Interface\AddOns\TurtleMail`
|
||||
|
||||
Logging is disabled by default. Enable with `/tm log`.
|
||||
4. Restart the game.
|
||||
5. Make sure **TurtleMail** is enabled in the AddOns menu.
|
||||
|
||||
## Turtle WoW compatibility fixes
|
||||
No additional addon is required for the core functionality.
|
||||
|
||||
Version **1.4.6** addresses:
|
||||
## ✨ Features
|
||||
|
||||
- `MailHorizontalBarLeft` / `MailHorizontalBarRight` nil crashes.
|
||||
- Missing or malformed `TurtleMail_AutoCompleteNames` SavedVariables.
|
||||
- Broken learning of sender names for autocomplete.
|
||||
- Sent-money logging not being recorded correctly.
|
||||
- Inbox index/COD nil safety during automatic opening.
|
||||
- Stale AH/returned icons on empty inbox rows.
|
||||
- Fragile mailbox/package-frame lookups.
|
||||
- A calendar tooltip nil/stale-value edge case.
|
||||
- Several additional guards around mailbox UI replacements and malformed state.
|
||||
- Quickly open multiple mails.
|
||||
- Quickly send multiple item attachments.
|
||||
- Recipient name autocomplete.
|
||||
- Automatically learns names from received mail.
|
||||
- Auction House mail indicators.
|
||||
- Returned-mail indicators.
|
||||
- Displays the amount of gold collected while opening mail.
|
||||
- Apply **Cash on Delivery (COD)** to the first attachment or all outgoing mails.
|
||||
- Optional logging for sent and received mail.
|
||||
- Dedicated mail log interface.
|
||||
- Multiple localization support.
|
||||
- Vanilla-style mailbox integration.
|
||||
|
||||
See [`AUDIT.md`](AUDIT.md) for the full audit and remaining architectural risks.
|
||||
## 🖱️ Mail controls
|
||||
|
||||
## Validation status
|
||||
### Inbox
|
||||
|
||||
Version **1.4.6** has been promoted to stable after in-game testing on Turtle WoW 1.18.x completed without Lua errors in the tested setup.
|
||||
**Right-click** an inbox entry to automatically:
|
||||
|
||||
The patch intentionally keeps the original send/open workflow instead of redesigning it. Addons that heavily replace or re-parent the Blizzard mail UI can still create compatibility issues; known architectural risks are documented in `AUDIT.md`.
|
||||
1. Loot attached gold.
|
||||
2. Loot the attached item.
|
||||
3. Delete the empty letter.
|
||||
|
||||
## Screenshots
|
||||
COD mail is intentionally ignored by automatic opening and right-click collection.
|
||||
|
||||
### Attachments
|
||||
|
||||
- **Right-click** an inventory item to add it to an outgoing mail.
|
||||
- **Left-drag** an inventory item to add it to the attachment list.
|
||||
- **Right-click** an inventory item to add it to the trade frame.
|
||||
|
||||
## 📝 Mail logging
|
||||
|
||||
Mail logging is disabled by default.
|
||||
|
||||
Enable or disable it with:
|
||||
|
||||
`/tm log`
|
||||
|
||||
When enabled, TurtleMail records sent and received mail information in its dedicated log.
|
||||
|
||||
## ⚙️ Commands
|
||||
|
||||
| Command | Description |
|
||||
|---|---|
|
||||
| `/tm` | Display TurtleMail help |
|
||||
| `/turtlemail` | Long version of `/tm` |
|
||||
| `/tm help` | Display TurtleMail commands |
|
||||
| `/tm log` | Toggle mail logging |
|
||||
| `/tm clear sent` | Clear the sent-mail log |
|
||||
| `/tm clear received` | Clear the received-mail log |
|
||||
| `/tm clear names` | Clear saved autocomplete recipient names |
|
||||
|
||||
## 🔧 Turtle WoW compatibility
|
||||
|
||||
Version **1.4.7** extends the compatibility and safety layer for Turtle WoW 1.18.x environments.
|
||||
|
||||
The compatibility work is isolated in `TurtleMailFix.lua` so the original TurtleMail code remains easier to compare with upstream versions.
|
||||
|
||||
### Main fixes
|
||||
|
||||
- Fixed `MailHorizontalBarLeft` / `MailHorizontalBarRight` nil crashes.
|
||||
- Added validation and repair for malformed autocomplete SavedVariables.
|
||||
- Fixed learning sender names for recipient autocomplete.
|
||||
- Fixed persistent autocomplete timestamp aging across client restarts.
|
||||
- Fixed sent-money logging.
|
||||
- Added safer inbox index and COD handling.
|
||||
- Prevented stale Auction House and returned-mail icons.
|
||||
- Added guards for missing or replaced mailbox frames.
|
||||
- Improved package-frame safety.
|
||||
- Added safer handling for malformed log entries.
|
||||
- Fixed calendar tooltip nil/stale-value cases.
|
||||
- Rebound the safer `OnUpdate` handler correctly after loading the compatibility layer.
|
||||
- Prevented the send queue from remaining stuck when an attachment becomes unavailable during sending.
|
||||
|
||||
The complete technical audit is available in [`AUDIT.md`](AUDIT.md).
|
||||
|
||||
## 🛡️ Compatibility notes
|
||||
|
||||
TurtleMail directly interacts with several Blizzard mailbox functions and frames.
|
||||
|
||||
Most standard Turtle WoW setups should work normally, but addons that heavily replace or re-parent the default mail interface may conflict with TurtleMail.
|
||||
|
||||
The compatibility layer keeps the upstream workflow intact where possible and only replaces fragile paths when needed for compatibility or safety.
|
||||
|
||||
## 🌍 Localization
|
||||
|
||||
TurtleMail includes localization support for:
|
||||
|
||||
- English
|
||||
- French
|
||||
- German
|
||||
- Spanish
|
||||
- Russian
|
||||
|
||||
## 🔧 Compatibility
|
||||
|
||||
- World of Warcraft 1.12
|
||||
- Interface version `11200`
|
||||
- Turtle WoW 1.18.x
|
||||
- Octo-like Vanilla environments
|
||||
- Vanilla Blizzard mailbox UI
|
||||
- Optional pfUI integration
|
||||
|
||||
## 📜 Version
|
||||
|
||||
Current stable version:
|
||||
|
||||
**1.4.7**
|
||||
|
||||
Based on upstream **TurtleMail 1.4.5**.
|
||||
|
||||
Version 1.4.7 has been validated in-game on Turtle WoW 1.18.x without Lua errors in the tested setup.
|
||||
|
||||
## 🖼️ Screenshots
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 📜 Project identity & licensing
|
||||
|
||||
TurtleMail is an independent community-maintained fork with this known source
|
||||
chain:
|
||||
|
||||
- [shirsig/Mail](https://github.com/shirsig/Mail)
|
||||
- [sica42/TurtleMail](https://github.com/sica42/TurtleMail)
|
||||
- this maintained fork
|
||||
|
||||
No explicit project-wide license was identified in the two known upstream
|
||||
repositories during the provenance audit, so this fork does **not** claim to
|
||||
relicense inherited code.
|
||||
|
||||
Compatibility with **World of Warcraft**, **Turtle WoW / Octo-like
|
||||
environments**, or **pfUI** does not imply affiliation, endorsement, or
|
||||
sponsorship.
|
||||
|
||||
For details, see:
|
||||
|
||||
- [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)
|
||||
- [PROJECT_IDENTITY.md](PROJECT_IDENTITY.md)
|
||||
- [Docs/CODE_PROVENANCE.md](Docs/CODE_PROVENANCE.md)
|
||||
- [Docs/ASSET_PROVENANCE.md](Docs/ASSET_PROVENANCE.md)
|
||||
- [LICENSES/](LICENSES/)
|
||||
|
||||
## 🙏 Credits
|
||||
|
||||
Original TurtleMail addon by **shirsig / sica**.
|
||||
|
||||
Upstream maintenance by **sica42**.
|
||||
|
||||
Turtle WoW compatibility fixes and additional maintenance by **Dusk-92**.
|
||||
|
||||
This fork aims to preserve the original TurtleMail experience while improving compatibility and stability on modern Vanilla server environments.
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
# TurtleMail third-party notices
|
||||
|
||||
Audit date: 2026-08-31
|
||||
|
||||
This file records known upstream sources, inherited code, assets, compatibility
|
||||
references, and unresolved licensing for the Dusk-92 TurtleMail fork.
|
||||
|
||||
Existing source comments, Git history, upstream repository metadata, and README
|
||||
credits remain part of the provenance trail.
|
||||
|
||||
## Historical source: shirsig/Mail
|
||||
|
||||
The original known source repository is:
|
||||
|
||||
- https://github.com/shirsig/Mail
|
||||
|
||||
It provides the earlier Vanilla WoW mail addon from which TurtleMail ultimately
|
||||
descends.
|
||||
|
||||
No explicit project-wide LICENSE file was present in that repository during
|
||||
this audit.
|
||||
|
||||
## Immediate upstream: sica42/TurtleMail
|
||||
|
||||
The immediate upstream repository is:
|
||||
|
||||
- https://github.com/sica42/TurtleMail
|
||||
|
||||
That repository is itself a fork of `shirsig/Mail`.
|
||||
|
||||
No explicit project-wide LICENSE file was present in the immediate upstream
|
||||
repository during this audit.
|
||||
|
||||
Accordingly, this fork does **not** claim that inherited TurtleMail or Mail code
|
||||
is MIT, GPL, public domain, or otherwise freely relicensed. The root `LICENSE`
|
||||
notice is intentionally limited in scope and does not override upstream rights.
|
||||
|
||||
## Dusk-92 compatibility layer
|
||||
|
||||
The current fork adds and maintains Turtle WoW / Octo-like compatibility and
|
||||
safety work.
|
||||
|
||||
Notably:
|
||||
|
||||
- `TurtleMailFix.lua` is maintained in this fork as an isolated compatibility
|
||||
layer.
|
||||
- `AUDIT.md` documents the compatibility/stability audit.
|
||||
- `TurtleMail.toc` and `README.md` include fork-specific maintenance and
|
||||
compatibility changes.
|
||||
|
||||
Historical Git commits remain the authoritative record for individual changes.
|
||||
|
||||
## Unchanged immediate-upstream files
|
||||
|
||||
At the time of this audit, the following runtime files in the Dusk-92 fork were
|
||||
byte-identical at Git blob level to `sica42/TurtleMail`:
|
||||
|
||||
- `Calendar.lua`
|
||||
- `TurtleMail.lua`
|
||||
- `TurtleMail.xml`
|
||||
- `localization.lua`
|
||||
- `localization.de.lua`
|
||||
- `localization.es.lua`
|
||||
- `localization.fr.lua`
|
||||
- `localization.ru.lua`
|
||||
- `TurtleMail-AH.blp`
|
||||
- `TurtleMail-RetArrow.blp`
|
||||
- `TurtleMail-DownArrow.tga`
|
||||
|
||||
This establishes immediate provenance, not a new license grant.
|
||||
|
||||
## Calendar
|
||||
|
||||
`Calendar.lua` is inherited unchanged from `sica42/TurtleMail`.
|
||||
|
||||
The immediate upstream history shows the calendar as part of the 2025 logging
|
||||
work, with a later calendar dropdown bug fix by Sica.
|
||||
|
||||
No separate license for that file was identified, so it remains documented as
|
||||
upstream-derived material under unresolved project-wide licensing.
|
||||
|
||||
## Visual assets
|
||||
|
||||
The three bundled visual assets are tracked in
|
||||
`Docs/ASSET_PROVENANCE.md`.
|
||||
|
||||
Their immediate upstream source is verified, but their ultimate artistic source
|
||||
or underlying asset license was not established during this audit.
|
||||
|
||||
No additional ownership or relicensing claim is made.
|
||||
|
||||
## pfUI integration
|
||||
|
||||
TurtleMail includes optional compatibility/integration behavior for pfUI.
|
||||
|
||||
Compatibility or API integration does not imply that pfUI is bundled, nor does
|
||||
it imply affiliation or endorsement.
|
||||
|
||||
## Turtle WoW / Octo-like compatibility
|
||||
|
||||
This fork targets Turtle WoW 1.18.x and Octo-like Vanilla environments.
|
||||
|
||||
Compatibility, naming, testing, or behavioral reference does not create an
|
||||
affiliation, endorsement, partnership, or ownership relationship with those
|
||||
projects or their maintainers.
|
||||
|
||||
## Project identity and trademarks
|
||||
|
||||
Canonical maintained fork:
|
||||
|
||||
- https://github.com/Dusk-92/TurtleMail
|
||||
|
||||
World of Warcraft, Warcraft, Blizzard Entertainment, and associated names,
|
||||
marks, artwork, and game assets remain the property of their respective rights
|
||||
holders.
|
||||
|
||||
See `PROJECT_IDENTITY.md`.
|
||||
|
||||
## Preservation rule
|
||||
|
||||
Do not remove historical attribution, source comments, upstream references, or
|
||||
provenance records merely because inherited code is later modified.
|
||||
|
||||
When replacing or substantially rewriting inherited material, update the
|
||||
provenance record rather than erasing the historical chain.
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
## Interface: 11200
|
||||
## Title: |cffabd473Turtle|cffffffffMail
|
||||
## Author: shirsig/sica, Dusk-92 (compatibility fixes)
|
||||
## Version: 1.4.6
|
||||
## Version: 1.4.7
|
||||
## Notes: Mailbox enhancement - Turtle WoW 1.18.x compatibility
|
||||
## SavedVariables: TurtleMail_AutoCompleteNames
|
||||
## SavedVariablesPerCharacter: TurtleMail_To TurtleMail_Point TurtleMail_Log
|
||||
|
||||
+141
-1
@@ -8,7 +8,7 @@ local m = TurtleMail
|
||||
local getn = table.getn
|
||||
local function pack( ... ) return arg end
|
||||
|
||||
m.compat_version = "1.4.6"
|
||||
m.compat_version = "1.4.7"
|
||||
|
||||
local DEFAULT_SENT_FILTERS = {
|
||||
Money = 1,
|
||||
@@ -476,3 +476,143 @@ if m.calendar and m.calendar.show then
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Validated targeted fixes: persistent autocomplete timestamps and clean send abort.
|
||||
-- Kept in a local block so integrating the former test file does not alter scope.
|
||||
do
|
||||
local m = TurtleMail
|
||||
local getn = table.getn
|
||||
local AUTOCOMPLETE_MAX_AGE = 60 * 60 * 24 * 30
|
||||
local EPOCH_THRESHOLD = 1000000000
|
||||
|
||||
local function autocomplete_key()
|
||||
local realm = m.api.GetCVar and m.api.GetCVar( "realmName" ) or "UnknownRealm"
|
||||
local faction = m.api.UnitFactionGroup and m.api.UnitFactionGroup( "player" ) or "UnknownFaction"
|
||||
return tostring( realm or "UnknownRealm" ) .. "|" .. tostring( faction or "UnknownFaction" )
|
||||
end
|
||||
|
||||
local function ensure_autocomplete_table()
|
||||
if type( m.api.TurtleMail_AutoCompleteNames ) ~= "table" then
|
||||
m.api.TurtleMail_AutoCompleteNames = {}
|
||||
end
|
||||
|
||||
local key = autocomplete_key()
|
||||
if type( m.api.TurtleMail_AutoCompleteNames[ key ] ) ~= "table" then
|
||||
m.api.TurtleMail_AutoCompleteNames[ key ] = {}
|
||||
end
|
||||
|
||||
return m.api.TurtleMail_AutoCompleteNames[ key ]
|
||||
end
|
||||
|
||||
-- Older TurtleMail builds stored GetTime() values here. GetTime() is session uptime,
|
||||
-- so those values cannot be compared reliably across game/client restarts. Convert
|
||||
-- legacy uptime-style values to a safe current timestamp, then expire names using time().
|
||||
local function migrate_and_prune_autocomplete()
|
||||
local names = ensure_autocomplete_table()
|
||||
local now = time()
|
||||
|
||||
for name, last_seen in pairs( names ) do
|
||||
if type( name ) ~= "string" or type( last_seen ) ~= "number" then
|
||||
names[ name ] = nil
|
||||
else
|
||||
if last_seen < EPOCH_THRESHOLD then
|
||||
last_seen = now
|
||||
names[ name ] = last_seen
|
||||
end
|
||||
|
||||
if now - last_seen > AUTOCOMPLETE_MAX_AGE then
|
||||
names[ name ] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Store persistent timestamps for newly learned recipients.
|
||||
function m.add_auto_complete_name( name )
|
||||
if type( name ) ~= "string" or name == "" then return end
|
||||
local names = ensure_autocomplete_table()
|
||||
names[ name ] = time()
|
||||
end
|
||||
|
||||
-- Keep the complete existing login flow, but migrate before the legacy cleanup
|
||||
-- runs and prune again afterwards using persistent timestamps.
|
||||
local original_player_login = m.PLAYER_LOGIN
|
||||
function m.PLAYER_LOGIN()
|
||||
migrate_and_prune_autocomplete()
|
||||
if original_player_login then original_player_login() end
|
||||
migrate_and_prune_autocomplete()
|
||||
end
|
||||
|
||||
-- The send flow can remain stuck in sendmail_sending when an attachment
|
||||
-- disappears or cannot be attached between queueing and the actual SendMail call.
|
||||
-- Keep the upstream behavior, but explicitly abort the send state on that failure.
|
||||
function m.sendmail_send()
|
||||
if type( m.sendmail_state ) ~= "table" or type( m.sendmail_state.attachments ) ~= "table" then
|
||||
m.sendmail_sending = false
|
||||
m.sendmail_update = nil
|
||||
return
|
||||
end
|
||||
|
||||
local item = table.remove( m.sendmail_state.attachments, 1 )
|
||||
if item then
|
||||
m.api.ClearCursor()
|
||||
m.orig.ClickSendMailItemButton()
|
||||
m.api.ClearCursor()
|
||||
m.orig.PickupContainerItem( unpack( item ) )
|
||||
m.orig.ClickSendMailItemButton()
|
||||
|
||||
if not m.api.GetSendMailItem() then
|
||||
m.api.DEFAULT_CHAT_FRAME:AddMessage( "|cffabd473TurtleMail|r: " .. m.api.ERROR_CAPS, 1, 0, 0 )
|
||||
m.sendmail_sending = false
|
||||
m.sendmail_update = nil
|
||||
m.sendmail_state = nil
|
||||
m.api.ClearCursor()
|
||||
if m.api.SendMailFrame_Update then
|
||||
m.api.SendMailFrame_Update()
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
local amount = m.sendmail_state.money
|
||||
m.sendmail_state.sent_money = m.sendmail_state.money
|
||||
m.sendmail_state.sent = false
|
||||
|
||||
if amount > 0 then
|
||||
if not m.api.SendMailCODAllButton:GetChecked() then
|
||||
m.sendmail_state.money = 0
|
||||
end
|
||||
if m.sendmail_state.cod then
|
||||
m.sendmail_state.cod = amount
|
||||
m.api.SetSendMailCOD( amount )
|
||||
else
|
||||
m.sendmail_state.money = 0
|
||||
m.api.SetSendMailMoney( amount )
|
||||
end
|
||||
end
|
||||
|
||||
local subject = m.sendmail_state.subject
|
||||
if subject == "" then
|
||||
if item then
|
||||
local item_name, texture, stack_count = m.api.GetSendMailItem()
|
||||
subject = item_name .. (stack_count > 1 and " (" .. stack_count .. ")" or "")
|
||||
m.sendmail_state.item = item_name
|
||||
m.sendmail_state.icon = texture
|
||||
else
|
||||
subject = "<" .. m.api.NO_ATTACHMENTS .. ">"
|
||||
end
|
||||
elseif m.sendmail_state.numMessages > 1 then
|
||||
subject = subject .. string.format( " [%d/%d]", m.sendmail_state.numMessages - getn( m.sendmail_state.attachments ),
|
||||
m.sendmail_state.numMessages )
|
||||
end
|
||||
|
||||
m.sendmail_state.sent_subject = subject
|
||||
|
||||
m.debug( "SendMail" )
|
||||
m.api.SendMail( m.sendmail_state.to, subject, m.sendmail_state.body )
|
||||
|
||||
if getn( m.sendmail_state.attachments ) == 0 then
|
||||
m.sendmail_sending = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user