diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index c687d59..2f93975 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -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 ] diff --git a/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua index ee5a83b..07c8f76 100644 --- a/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua +++ b/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua @@ -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) diff --git a/Omen/OmenSync.lua b/Omen/OmenSync.lua index 40de513..e0ec9fc 100644 --- a/Omen/OmenSync.lua +++ b/Omen/OmenSync.lua @@ -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") diff --git a/tools/build_zip.sh b/tools/build_zip.sh index f9c2d68..45d1400 100755 --- a/tools/build_zip.sh +++ b/tools/build_zip.sh @@ -6,12 +6,23 @@ # - Always archives HEAD, so the working tree state is irrelevant. # - If more than one addon folder is present, also emits -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.