Compare commits

...

10 commits

Author SHA1 Message Date
d0c64d75eb fix(sync): enforce THROTTLE as hard floor on threat broadcasts
Large threat deltas could bypass the 0.4 s gate entirely, sending
unbounded SendAddonMessage traffic in early combat (3.3.5 servers
disconnect chatty senders). Throttle now always applies; the
MIN_DELTA filter is checked separately afterwards.
2026-06-10 02:13:58 +02:00
3f71d66b0e ci(release): sync release.yml from coa-template
hide_archive_links is only honored by Gitea on release edit, not create —
add the PATCH step after create/lookup so auto-generated source archive
links actually stay hidden (coa-template 90874c5).
2026-06-10 02:11:46 +02:00
0f5e0c7e01 ci(release): hide auto-generated source archives (hide_archive_links) 2026-05-29 20:51:12 +02:00
76d441e409 fix(libs): pcall AceGUI OnGamePadButtonDown (3.3.5 has no gamepad script type)
All checks were successful
release / release (push) Successful in 2s
2026-05-29 20:23:33 +02:00
7c5fb74e20 fix(sync): register OMSYNC addon-message prefix so the threat relay receives on 3.3.5 2026-05-29 10:43:54 +02:00
1287d50d45 ci: respect GITHUB_REPOSITORY + tolerate per-asset upload failures
All checks were successful
release / release (push) Successful in 2s
2026-05-25 12:16:43 +02:00
737361a29e ci: tolerate 404 on release-tag existence check (set -e safety) 2026-05-25 11:57:40 +02:00
84f045c724 ci: replace release-action with curl (no go/action dep, fewer moving parts) 2026-05-25 11:56:56 +02:00
adccfdec30 ci: point release-action at gitea.com (github mirror doesn't exist) 2026-05-25 11:55:59 +02:00
c64e0baf75 ci: use per-job auto GITHUB_TOKEN (Gitea reserves GITEA_TOKEN) 2026-05-25 11:51:46 +02:00
4 changed files with 77 additions and 9 deletions

View file

@ -18,8 +18,58 @@ jobs:
- name: Build per-addon zip(s)
run: bash tools/build_zip.sh
- name: Publish release
uses: actions/gitea-release-action@v1
with:
files: dist/*.zip
token: ${{ secrets.GITEA_TOKEN }}
- name: Publish release (Gitea API direct; no action dependency)
env:
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
TAG: ${{ github.ref_name }}
API: ${{ github.server_url }}/api/v1
# Gitea attachment ceiling is 200 MiB (see roles/gitea config).
# Skip anything larger so one oversized asset doesn't fail the job.
MAX_BYTES: 209715200
run: |
set -euo pipefail
# Create the release (or reuse if it already exists for this tag).
RID=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"$API/repos/$REPO/releases/tags/$TAG" 2>/dev/null \
| jq -r '.id // empty')
if [ -z "$RID" ]; then
RID=$(curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"$API/repos/$REPO/releases" \
-d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false,hide_archive_links:true}')" \
| jq -r '.id')
fi
echo "release id: $RID"
# Gitea honors hide_archive_links only on edit, not create — PATCH it
# so the auto-generated Source Code (zip/tar.gz) links stay hidden.
curl -sf -X PATCH -H "Authorization: token $GITEA_TOKEN" -H "Content-Type: application/json" \
"$API/repos/$REPO/releases/$RID" -d '{"hide_archive_links":true}' >/dev/null || true
# Upload every dist/*.zip. Per-asset failures don't fail the job —
# we want partial releases to still publish rather than block the
# whole pipeline on one big file.
failed=0
uploaded=0
for f in dist/*.zip; do
name=$(basename "$f")
size=$(stat -c '%s' "$f")
if [ "$size" -gt "$MAX_BYTES" ]; then
echo "::warning::skip $name (${size} B > ${MAX_BYTES} B Gitea limit; host on CDN instead)"
failed=$((failed+1))
continue
fi
echo "uploading $name ($(numfmt --to=iec "$size"))"
if curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \
-F "attachment=@$f" \
"$API/repos/$REPO/releases/$RID/assets?name=$name" \
| jq -r '" -> " + .browser_download_url'; then
uploaded=$((uploaded+1))
else
echo "::warning::upload failed for $name"
failed=$((failed+1))
fi
done
echo "release published: $uploaded uploaded, $failed skipped/failed"
# Only fail the job if NO assets uploaded — a release with zero
# attachments isn't useful to anyone.
[ "$uploaded" -gt 0 ]

View file

@ -199,7 +199,7 @@ local function Constructor()
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
button:SetScript("OnGamePadButtonDown", Keybinding_OnKeyDown)
pcall(button.SetScript, button, "OnGamePadButtonDown", Keybinding_OnKeyDown)
button:SetPoint("BOTTOMLEFT")
button:SetPoint("BOTTOMRIGHT")
button:SetHeight(24)

View file

@ -34,7 +34,7 @@ local Omen = LibStub("AceAddon-3.0"):GetAddon("Omen")
if not Omen then return end
local PREFIX = "OMSYNC"
local THROTTLE = 0.4 -- min seconds between sends per (subject, mob)
local THROTTLE = 0.4 -- hard floor: min seconds between sends per (subject, mob)
local STALE = 8 -- seconds; entries older than this are ignored
local MIN_DELTA = 0.05 -- 5%; smaller changes don't trigger a send
@ -98,7 +98,8 @@ function Omen:SyncBroadcastThreat(subjectGUID, mobGUID, value, isTanking)
local age = now - prev.time
local maxV = math.max(value, prev.value, 1)
local pct = math.abs(value - prev.value) / maxV
if age < THROTTLE and pct < MIN_DELTA then return end
if age < THROTTLE then return end -- hard rate floor
if pct < MIN_DELTA then return end
end
lastSend[subjectGUID][mobGUID] = { value = value, time = now }
@ -110,6 +111,12 @@ end
-- Receiver
-- ---------------------------------------------------------------------------
-- Register the prefix so CHAT_MSG_ADDON fires for our messages on 3.3.5.
-- Without this, incoming OMSYNC packets are silently discarded by the client.
if RegisterAddonMessagePrefix then
RegisterAddonMessagePrefix(PREFIX)
end
local f = CreateFrame("Frame")
f:RegisterEvent("CHAT_MSG_ADDON")
f:RegisterEvent("PLAYER_LEAVING_WORLD")

View file

@ -6,12 +6,23 @@
# - Always archives HEAD, so the working tree state is irrelevant.
# - If more than one addon folder is present, also emits <repo>-all.zip
# with every addon folder side-by-side at the zip root.
# - When run inside Gitea Actions the working tree lives under a
# per-job dir like /var/lib/act_runner/work/.../hostexecutor, so the
# repo name comes from $GITHUB_REPOSITORY (set by the runner) and
# only falls back to the toplevel basename for local invocations.
set -euo pipefail
root=$(git rev-parse --show-toplevel)
cd "$root"
repo_name=$(basename "$root")
# Gitea Actions sets GITHUB_REPOSITORY=owner/repo. The basename of
# `git rev-parse --show-toplevel` inside the runner is the worker dir
# (e.g. `hostexecutor`), which would name the bundle wrong.
if [ -n "${GITHUB_REPOSITORY:-}" ]; then
repo_name="${GITHUB_REPOSITORY##*/}"
else
repo_name=$(basename "$root")
fi
dist="$root/dist"
# Find Foo/Foo.toc pairs at depth 1; ignore libs nested deeper.