Skip to content

Fix/bepinex mod for valheim install - #4938

Closed
yourfate wants to merge 8 commits into
GameServerManagers:developfrom
yourfate:fix/bepinex-valheim-install
Closed

Fix/bepinex mod for valheim install#4938
yourfate wants to merge 8 commits into
GameServerManagers:developfrom
yourfate:fix/bepinex-valheim-install

Conversation

@yourfate

@yourfate yourfate commented Jul 16, 2026

Copy link
Copy Markdown

Description

The Bepinex mod for valheim changed the directory structure in the downloaded zip, which meant the files were now in the wrong position inside serverfiles.

This required a change to the extraction logic for mods, I used the previously unused modsubdirs variable. It was meant to just be the depth of subfolder the mod was in, but that is kind of useless once there are several folders in parallel. Now it is just a prefix you can set, from which the files inside the zip are taken. You can also use multiple folders here like some/dir/in/mod/folder to get to an arbitrary depth. IMHO this improves over the planned functionally of just having a number of dirs there.

If you prefer, I can move it to a new variable in the unzip command, that would then require changing all other mod installers tho.

This is currently an undocumented feature, so no changes to the dev documentation are required. I did update the comment.

Also the preload env vars in the fix_vh.sh script were outdated.

Lastly, the check permissions script caused errors when it checked files inside a wine prefix, which steamCMD ships with some (all?) game servers on linux.

Fixes #[4491]

The fix was created with the help of claude. I have manually written this PR, manually reviewed / edited the changes, and manually tested the fix on two installs.

Type of change

  • Bug fix (a change which fixes an issue).
  • New feature (a change which adds functionality).
  • New Server (new server added).
  • Refactor (restructures existing code).
  • Comment update (typo, spelling, explanation, examples, etc).

Testing

Please list the exact validation you performed and the outcome.

  • Commands/tests run:
    • I tested the valheim install with bepinex on a fresh debian machine, and also on my previously broken server.
  • Result:
    • works now.
  • Environment used (distro/version):
    • debian 13 LXC on proxmox

Risk and rollback

  • Risk level: low
    • no impact on non-modded servers
    • does not mess up previously broken servers further, users have to reinstall the bepinex mod to benefit from the fix.
  • Rollback plan:
    • Users with a broken bepinex install can fix it by removing it first using mods-remove, that should clean it up nicely.
    • For the rest of this PR no rollback plan is required I think?

Breaking changes

  • No breaking changes.
  • Breaking changes included (describe below).

Documentation impact

  • No documentation update required.
  • User documentation update required.
  • Developer documentation update required.

Checklist

PR will not be merged until all steps are complete.

  • This pull request links to an issue.
  • This pull request uses the develop branch as its base.
  • This pull request subject follows the Conventional Commits standard.
  • This code follows the style guidelines of this project.
  • I have performed a self-review of my code.
  • I have provided a detailed enough description of this PR.

Documentation

If documentation does need updating either update it by creating a PR (preferred) or request a documentation update.

Thank you for your Pull Request!

dgibbs64 and others added 7 commits May 4, 2026 12:58
chore(deps): bump webfactory/ssh-agent from 0.9.0 to 0.10.0 (GameServerManagers#4910)

Bumps [webfactory/ssh-agent](https://github.com/webfactory/ssh-agent) from 0.9.0 to 0.10.0.
- [Release notes](https://github.com/webfactory/ssh-agent/releases)
- [Changelog](https://github.com/webfactory/ssh-agent/blob/master/CHANGELOG.md)
- [Commits](webfactory/ssh-agent@v0.9.0...v0.10.0)

---
updated-dependencies:
- dependency-name: webfactory/ssh-agent
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
chore(deps): bump dessant/lock-threads from 5 to 6 (GameServerManagers#4909)

Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 5 to 6.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](dessant/lock-threads@v5...v6)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
feat: sync GitHub issue types with `type:` labels

feat: enable manual backfill for issue labels

This change introduces a `workflow_dispatch` triggered job that allows for manually re-evaluating and applying labels to existing issues.

The new job iterates through a specified set of issues (filtered by state and an optional limit), adds a temporary `maintenance: relabel-backfill` label, and immediately removes it. The primary `labeling-issues` workflow is updated to specifically *not* ignore these bot-generated label events when the temporary label is involved, thus forcing a re-evaluation of the issue by the current labeling logic.

This provides a mechanism to correct mislabeled issues or apply updated labeling rules to the entire issue backlog.

feat: enhance relabel backfill with detailed summary and update github-script

This change significantly improves the observability of the manual issue relabel backfill workflow by introducing:

- Detailed console logging for each issue being processed.
- A comprehensive `core.summary` output in the workflow run, providing tables for overall statistics, processed issues, and any encountered failures.

Additionally, the `actions/github-script` action is updated to v8.

chore: make issue type inference more robust by respecting existing labels

Previously, the automated issue type inference relied solely on the issue title. This could result in valid `type:` labels being removed if the title was ambiguous or didn't explicitly match a predefined pattern.

This change introduces a fallback mechanism where existing `type:` labels are considered if a type cannot be clearly inferred from the title. This reduces unnecessary label churn and improves the accuracy of automated labeling.

fix: backfill runs triage inline instead of label-toggle

GitHub does not fire new workflow runs when GITHUB_TOKEN creates label
events (built-in loop prevention). Replace the label-toggle backfill
approach with an inline version that mirrors the deterministic
reconciliation logic from issue-ai-maintenance directly: type labels,
command/distro labels, game/engine labels, Issue Type GraphQL sync,
and tmux false-positive cleanup. No AI call is made during backfill.

Also removes the now-unnecessary BACKFILL_TRIGGER_LABEL exemption from
the bot-loop guard in issue-ai-maintenance.

fix: track issue type + locked state in backfill summary

- Add 'Issue Type set' column to processed issues summary table
- Track issueTypeSet per issue (null when already correct/unchanged)
- Skip REST label mutations for locked issues (they return 403) with
  a console note; Issue Type GraphQL sync still runs for locked issues
- Show lock emoji in issue number column when issue is locked
- Track actual applied add/remove counts (not desired counts)

fix: allow backfill label updates on locked issues

Remove locked-issue skip branch in backfill so label add/remove operations
run for locked issues as well. Keep lock marker in summary for visibility.

fix: keep legacy server request issues classified correctly

Recognize 'server request' anywhere in issue titles (e.g. '[callofduty1] Server Request')
and prefer type: game server request over generic feature when both labels exist.
Apply this in both issue-ai-maintenance and backfill logic.

fix: classify legacy server-request titles in backfill and maintenance

Detect legacy server-request phrasing in issue titles:
- bracketed game/server titles ending with 'Creation'
- titles containing 'Server Creation'
- titles containing 'Server Support' or 'Support for ... server'

Apply the same heuristics in both issue-ai-maintenance and backfill
inferTypeFromTitle paths so old issues are not downgraded to feature.

feat: infer game labels from legacy issue text in relabel

When no structured Game form section is present, infer game labels/scripts
deterministically from title/body using serverlist alias mappings.
Apply this to both issue-ai-maintenance and backfill to improve
historical game labeling without relying on AI.

feat: add optional AI fallback for backfill game detection

Add workflow_dispatch input ai_game_fallback (default false).
In backfill mode, only call AI when deterministic game mapping finds no
match; accept only high-confidence results and map through known game
aliases/labels. Include AI usage stats in the run summary table.

fix: avoid pruning legacy game labels without structured game input

Only remove existing game:* labels when an issue has explicit structured
Game form selections. For legacy title/body inference (and AI fallback),
add matched game labels but do not remove other existing game labels.
This prevents edge cases like issue GameServerManagers#1 from losing valid multi-game tags.

fix: require alias evidence for AI game fallback labels

Backfill AI game fallback now accepts a detected game only when the issue
text contains a literal alias token for the mapped game label. Add explicit
logs for AI accept/reject/unmapped outcomes to make attribution auditable
in job logs and prevent false positives like issue GameServerManagers#17.

feat: annotate game label adds with detection source in backfill logs

Each game label add now shows its source in the per-issue log line:
  GameServerManagers#240: added "game: Opposing Force" (text-match)
  GameServerManagers#248: added "game: Counter-Strike: Global Offensive" (form-field)
  #N:   added "game: X" (ai-fallback)

Non-game labels (engine, type, needs, etc.) are unchanged.

fix: add missing hasAliasHitForLabel to backfill script context

Each github-script step runs in its own isolated JS context. The backfill
step was calling hasAliasHitForLabel (used by the AI alias-evidence gate)
but the function was only defined in the triage step, causing a ReferenceError
on any issue that triggered AI fallback.

fix: retry AI fallback once on HTTP 429 with Retry-After backoff

When the GitHub Models API rate-limits the backfill (429), read the
Retry-After header (capped at 60s), wait, then retry the request once.
If the retry also fails the issue is skipped as before.

fix: accept joined-token alias evidence in AI game fallback gate

Alias evidence now allows multi-token aliases to match when words are
joined in issue text (e.g. counterstrike vs counter strike), while
keeping exact token checks for single-word aliases.

fix: treat generic AI detections as non-game in backfill

When AI fallback returns generic platform/engine terms (e.g. srcds,
source dedicated server, steamcmd), treat them as non-game detections
instead of logging them as unmapped games. Also prompt the model to
return null for generic terms.

chore: log AI rate-limit headers and 429 count in backfill

Capture Retry-After, X-RateLimit-* and request id on 429 responses,
log them on retry and final skip, and include total AI 429 hits in the
workflow summary table.

fix: disable AI fallback for run on long Retry-After cooldown

When GitHub Models returns 429 with a large Retry-After (over 300s),
stop AI fallback for the remainder of the backfill run instead of
sleeping and retrying per issue. Include disable reason in summary.

fix: prevent overlapping game alias double-matches in text detection

Prefer longest non-overlapping alias matches so titles like
"Killing Floor 2" do not also infer "Killing Floor" unless both
are explicitly present as separate mentions.

fix: prune stale broad game labels when specific game is inferred

For legacy issues without structured game selection, remove existing game
labels only when they are broader overlaps of a newly inferred specific
game label (e.g. remove Killing Floor when Killing Floor 2 is inferred).

fix: stop relabel backfill early when API rate limit is hit

Detect GitHub API rate limit errors during processing, stop the run
gracefully, and report header-derived rate limit details in logs and
summary instead of emitting repeated per-issue failures.

feat(labeler): implement Linux support verification for server requests

* Added checks for Linux support based on issue content and Steam API data.
* Integrated AI analysis for documentation to assess Linux compatibility.
* Automatically create or remove labels based on support verification results.
* Enhanced feedback for users regarding Linux server support status.

Co-authored-by: Copilot <copilot@github.com>

fix(labeler): broaden Linux support check triggers for server requests

fix(labeler): improve game detection logic for structured fields

* Refine fallback logic to avoid guessing from free text when a structured Game field exists.
* Ensure AI-detected game fallback only occurs when no structured Game field is present.

Co-authored-by: Copilot <copilot@github.com>

fix(labeler): update game section extraction logic

* Adjusted the extraction of the game field to accommodate both 'Game server' and 'Game' sections.
* This change improves compatibility with different input formats in server requests and bug reports.

Co-authored-by: Copilot <copilot@github.com>

feat(labeler): enhance Linux support detection logic

* Added handling for dedicated server tool AppIDs in Steam API checks.
* Introduced a checkbox confirmation mechanism for Linux support, improving evidence assessment.
* Updated verdict messaging to clarify Linux support status based on new checks.

Co-authored-by: Copilot <copilot@github.com>

feat(labeler): implement SteamCMD Linux support check

* Added a new function `runSteamCmdLinuxCheck` to assess Linux platform support using SteamCMD.
* Enhanced existing logic to incorporate SteamCMD results alongside Steam API checks.
* Updated comments to clarify the distinction between server tool AppIDs and client platform support.
* Improved error handling and logging for SteamCMD assessments.

Co-authored-by: Copilot <copilot@github.com>

feat(labeler): add confirmed Linux support label logic

* Introduced logic to determine and apply a `status: linux support confirmed` label based on AI assessment and Steam confirmation.
* Implemented error handling for label creation if it does not exist.
* Enhanced existing label management to ensure accurate representation of Linux support status.

Co-authored-by: Copilot <copilot@github.com>

fix(labeler): refine Steam support checks for dedicated servers

* Updated comments to clarify the purpose of Steam Store API checks.
* Removed unnecessary checks for Steam API results in determining Linux support.
* Enhanced logging and reasoning for server tool AppIDs.
* Improved clarity in the output messages regarding Linux support status.

Co-authored-by: Copilot <copilot@github.com>

feat(labeler): enhance Linux support check comment formatting

* Added conditional header for Linux support check comments.
* Included a block to indicate if the confirmed Linux label was applied.

Co-authored-by: Copilot <copilot@github.com>

fix: apply linux status labels directly instead of via deferred labelsToAdd set

chore: synced file(s) with dgibbs64/repo-sync (GameServerManagers#4911)

* chore: synced local '.github/' with remote 'general/.github/'

* chore: synced local './' with remote 'bash/'
refactor: rename labeler.yml to issue-triage-automation.yml and consolidate sync-game-labels

- Rename 'labeler.yml' to 'issue-triage-automation.yml' to better reflect the workflow's expanded responsibilities (issue triage, game detection, AI analysis, Linux support verification, and label syncing)
- Consolidate 'sync-game-labels.yml' into the main workflow
- Add push trigger for serverlist.csv changes
- Add sync-game-labels job that runs on push events when serverlist.csv is modified
- Remove the separate sync-game-labels.yml workflow

This simplifies workflow organization by having all issue/PR maintenance logic in a single, well-named workflow.

refactor: standardize workflow filenames with action prefix

chore(sync): synced local '.github/' with remote 'general/.github/' (GameServerManagers#4918)

Synced from dgibbs64/repo-sync@732370f — chore(workflow): add permissions section to action-sync.yml

* Added an empty `permissions` section to the workflow file.
* This change ensures that permissions are explicitly defined for the jobs.
- mods_list: set modsubdirs="BepInExPack_Valheim" so only the pack
  contents (not loose Thunderstore metadata) are installed to serverfiles
- mods_core: implement modsubdirs subfolder isolation in fn_mod_install_files;
  when modsubdirs is not "0", the named subfolder becomes the extract root
- fix_vh: update BepInEx env vars to match current start_server_bepinex.sh
  (DOORSTOP_ENABLED/DOORSTOP_TARGET_ASSEMBLY replacing old names,
  remove defunct DOORSTOP_CORLIB_OVERRIDE_PATH)
- mods_list: update modsubdirs field comment to reflect its actual semantics

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SteamCMD creates a Wine prefix at serverfiles/steamapps/compatdata/
containing a z: symlink pointing to /. Without excluding this path,
`find "${serverfiles}"` traverses the entire filesystem, causing
check_permissions.sh to hang indefinitely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rs#4919)

* chore(sync): synced local '.github/' with remote 'general/.github/'

Synced from dgibbs64/repo-sync@0d089f2 — chore: remove opensuseleap15 exclusion from latest ansible-core (now Python 3.11 / Leap 15.6)

* chore(sync): synced local './' with remote 'bash/'

Synced from dgibbs64/repo-sync@0d089f2 — chore: remove opensuseleap15 exclusion from latest ansible-core (now Python 3.11 / Leap 15.6)
@dgibbs64 dgibbs64 added this to the v26.2.0 milestone Jul 19, 2026
@github-actions github-actions Bot added engine: unity3d Issues related to unity3d engine game: Valheim Issues related to Valheim labels Jul 19, 2026
@dgibbs64
dgibbs64 enabled auto-merge July 19, 2026 13:51
@dgibbs64
dgibbs64 self-requested a review July 19, 2026 13:54
@dgibbs64
dgibbs64 added this pull request to the merge queue Jul 19, 2026
@dgibbs64
dgibbs64 removed this pull request from the merge queue due to a manual request Jul 19, 2026
@dgibbs64
dgibbs64 changed the base branch from master to develop July 19, 2026 13:57
@dgibbs64

Copy link
Copy Markdown
Member

Thanks for the fix! This PR was opened against master, and retargeting it to develop (our merge base for releases) surfaced conflicts from an unrelated merge commit picked up along the way, not from your actual change. I rebuilt your two commits cleanly onto develop with authorship preserved in #4939 — closing this one in favor of that. Appreciate the contribution and the testing writeup.

@dgibbs64 dgibbs64 closed this Jul 19, 2026
dgibbs64 added a commit that referenced this pull request Jul 19, 2026
* fix: exclude Wine prefix from serverfiles ownership check

SteamCMD creates a Wine prefix at serverfiles/steamapps/compatdata/
containing a z: symlink pointing to /. Without excluding this path,
`find "${serverfiles}"` traverses the entire filesystem, causing
check_permissions.sh to hang indefinitely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(vh): correct BepInEx mod extraction and env vars

- mods_list: set modsubdirs="BepInExPack_Valheim" so only the pack
  contents (not loose Thunderstore metadata) are installed to serverfiles
- mods_core: implement modsubdirs subfolder isolation in fn_mod_install_files;
  when modsubdirs is not "0", the named subfolder becomes the extract root
- fix_vh: update BepInEx env vars to match current start_server_bepinex.sh
  (DOORSTOP_ENABLED/DOORSTOP_TARGET_ASSEMBLY replacing old names,
  remove defunct DOORSTOP_CORLIB_OVERRIDE_PATH)
- mods_list: update modsubdirs field comment to reflect its actual semantics

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
dgibbs64 added a commit that referenced this pull request Jul 19, 2026
* feat(tf2c): add Team Fortress 2 Classified server (#4898)

* Release v26.1.0

* fix(alert_slack): add missing closing brace on section object

The 'section' block containing 'fields' and 'accessory' was missing its
closing '}' before EOF, producing malformed JSON and breaking all Slack
alerts silently (jq -c . would fail on the payload).

Also add missing ntfy alert settings to tf2cserver _default.cfg for
consistency with other server configs.

* fix: address review feedback

- core_dl.sh: use array assignment for steamcmdcommand instead of
  read -r -a to avoid word-splitting on paths
- fix_st.sh: correct module header typo (fix_ts.sh -> fix_st.sh)
- command_skeleton.sh: fix grammar 'Creates an copy' -> 'Creates a copy'
- serverlist-validate-game-icons.sh: anchor grep to start-of-line and
  require trailing comma to prevent false positives (e.g. 'tf' matching
  'tf2' entries)
- cs2server/_default.cfg: remove duplicate ntfy alert settings block

* fix(vints): assign remotebuild instead of unused remotebuildversion

The API version lookup was setting remotebuildversion but all subsequent
jq queries used ${remotebuild}, which was never populated. This caused
'Unable to get remote build' on every install/update.

* fix(xnt): unset exitbypass after command_stop.sh in fn_update_localbuild

* fix(ci): resolve super-linter failures

- Set DEFAULT_BRANCH to current branch to fix 'master not found' error
- Use fetch-depth: 0 so GITHUB_BEFORE_SHA can be resolved
- Set update_etl.sh executable bit (BASH_EXEC)
- Fix .codespellrc tab indentation (EDITORCONFIG)
- Add .gitleaks.toml allowlist for GA4 Measurement Protocol API secret (GITLEAKS)
- Fix .markdown-lint.yml: disable MD030/MD013/MD033/MD041/MD051 to match
  existing repo style (MARKDOWN)

* chore(ci): upgrade webfactory/ssh-agent from v0.9.0 to v0.10.0

v0.10.0 upgrades from Node.js 20 to Node.js 24, resolving the
deprecation warning ahead of the June 2026 forced migration.

* fix(steamcmd): add libtinfo.so.5 symlink fix for readline warning (#4899)

* fix(steamcmd): add libtinfo.so.5 symlink fix for readline warning

On distros shipping libtinfo.so.6 but not libtinfo.so.5 (Ubuntu 22.04+,
Debian 12+), SteamCMD prints:

  WARNING: Failed to load 32-bit libtinfo.so.5 or libncurses.so.5.
  Please install (lib32tinfo5 / ncurses-libs.i686 / equivalent) to
  enable readline.

lib32tinfo5 does not exist on Ubuntu 24.04. Creating a user-space
symlink inside the steamcmd directory resolves the warning without
requiring root or a missing package.

* fix(steamcmd): address Copilot review feedback on libtinfo symlink fix

- Iterate over all candidate steamcmd dirs (HOME/.steam/steamcmd,
  steamcmddir, HOME/.local/share/Steam/steamcmd) matching the pattern
  used for steamclient.so fixes elsewhere in the module
- Replace '! -f && ! -L' guard with '! -e' so broken/dangling symlinks
  are also repaired rather than silently skipped
- Add mkdir -p before ln in case the directory does not exist yet
- Capture exitcode=$? after ln so fn_fix_msg_end reports failures

---------

Co-authored-by: LinuxGSM <dev@linuxgsm.com>

* feat(newserver): Military Conflict: Vietnam

Add support for the Military Conflict: Vietnam dedicated game server.

Supersedes #4594 (original WIP PR from @knoxed — completing the implementation).

Changes:
- Added mcvserver default configuration
- Added mcv to serverlist and all distro CSV files
- Added install_config handler for mcvserver
- Added dependency info for all distros
- Added game icons
- Fixed CI workflow issues

Co-authored-by: Knoxed <1338733+knoxed@users.noreply.github.com>

* fix: support legacy game servers on older Ubuntu/Debian runners (#4903)

* fix(workflows): support legacy game servers on older Ubuntu/Debian runners

Multiple game servers have glibc compatibility requirements that prevent
them from running on Ubuntu 24.04:

- bfv, bf1942: Require Ubuntu <= 22.04 or Debian <= 12 (glibc 2.31)
- btl, onset: Require Ubuntu <= 20.04 or Debian <= 11 (glibc 2.31)

Changes:
- Add runner field to details-check matrix generation
- Map legacy servers to appropriate ubuntu-XX.04 LTS runners
- Modern servers continue on ubuntu-latest (24.04)
- Update details-check.yml to use dynamic runner from matrix

This ensures all server tests pass in CI without breaking modern server
testing on current GitHub Actions runners.

* fix(workflows): run details-check on PRs and normalize ref resolution

Details Check was not running for PR #4903 because the workflow only
triggered on push to develop/workflow_dispatch. Also, pull_request refs
(refs/pull/*) are not valid raw-content refs for GitHub downloads.

Changes:
- Trigger Details Check on pull_request to develop
- Add LGSM_REF env resolved to PR head SHA or branch ref name
- Use LGSM_REF for linuxgsm.sh download and LGSM_GITHUBBRANCH usage
- Use LGSM_REF in matrix generation when fetching serverlist.csv

This ensures legacy server jobs (bfv, bf1942, btl, onset) are included
and executed during PR validation.

* fix(workflows): run update-check on PRs and normalize ref resolution

Apply the same PR-safe workflow behavior used in details-check:
- Trigger update-check on pull_request to develop
- Resolve LGSM_REF to PR head SHA or branch ref name
- Use LGSM_REF for linuxgsm.sh download and LGSM_GITHUBBRANCH calls

This ensures update-check validates PR changes instead of only running on
develop pushes.

* fix(check_deps): avoid false Debian version check on Ubuntu

Ubuntu reports ID_LIKE=debian, which caused Debian upper-version checks to
run on Ubuntu and incorrectly fail legacy titles on Ubuntu 22.04.x.

Use distroid==debian for Debian limits in legacy compatibility guards so:
- bf1942/bfv pass on Ubuntu 22.04.x as intended
- btl/onset limits still apply correctly
- Debian limits still apply on Debian only

* fix(workflows): add PR trigger to version-check; replace archived action in docker trigger

version-check.yml:
- Add pull_request trigger targeting develop so version format is
  validated on PRs before merge

trigger-docker-build.yml:
- Replace archived convictional/trigger-workflow-and-wait@v1.6.5 with
  native gh CLI approach (trigger + watch run ID)
- Uses GH_TOKEN env var with PERSONAL_ACCESS_TOKEN secret
- gh workflow run dispatches the workflow; gh run watch polls for
  completion and exits non-zero on failure, preserving job dependencies

* fix(workflows): use timestamp filter to reliably identify triggered run ID

Using --limit 1 to find the run ID is a race condition if another run
of the same workflow starts concurrently. Capture a timestamp before
dispatching and pass --created >=${before} to gh run list so we
always select the run we just triggered.

* remove pr check

* chore(deps): bump dessant/lock-threads from 5 to 6 (#4864)

Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 5 to 6.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](dessant/lock-threads@v5...v6)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>

* papermc: add OpenJDK-25 (headless) dependency

Dev builds of papermc will not work on older jre, albeit it's still in alpha/beta, some time in the future it will be the stable build. I have not noticed any issues running the stable build with jre-25.

* fix(pmc): use openjdk-25-jre instead of headless variant, update vpmc to java 25

* feat(deps): update Java deps to openjdk-25-jre and add Ubuntu 26.04 support (#4908)

- ubuntu-24.04: update pz, rw, wmc to openjdk-25-jre
- debian-13: update vpmc to openjdk-25-jre, fix wmc typo (openjdk21-jre -> openjdk-25-jre)
- add ubuntu-26.04.csv with all Java deps on openjdk-25-jre

* chore: synced file(s) with dgibbs64/repo-sync (#4904)

* chore: synced local '.github/' with remote 'general/.github/'

* chore: synced local './' with remote 'bash/'

---------

Co-authored-by: unknown <unknown@example.com>

* fix(jbep3): add distro deps entries and game icon

* feat(bb): add BrainBread server update functionality (#4912)

* feat(bb): add BrainBread server update functionality

* Implemented `update_bb.sh` to handle updates for BrainBread servers.
* Integrated new update checks in `command_check_update.sh` and `command_update.sh`.
* Updated `install_server_files.sh` to include BrainBread server installation logic.

Co-authored-by: Copilot <copilot@github.com>

* feat(bb): enhance BrainBread update process

* Updated `fn_update_dl` to use `remotebuildhash` for file integrity.
* Added handling for missing `remotebuildhash` to default to "nohash".
* Included `update_steamcmd.sh` call to ensure both Steam app and GitHub package updates are performed.

Co-authored-by: Copilot <copilot@github.com>

* fix(steamcmd): ensure core HL1 files are present after appid 90 update

* Added checks to verify the presence of core HL1 files after updating appid 90.
* If files are missing, an update is forced and errors are logged.
* Exits the script if files are still missing after the retry.

* fix(steamcmd): update error messages for GoldSrc engine

* Changed appid 90 references to GoldSrc for clarity.
* Updated error messages to reflect the correct engine context.
* Ensures users are informed about missing core HL1 files after GoldSrc updates.

Co-authored-by: Copilot <copilot@github.com>

* feat(serverlist): add Military Conflict: Vietnam server entry

* Introduced new server entry for `Military Conflict: Vietnam` in `serverlist.csv`.
* Enhances the variety of game servers available for users.

---------

Co-authored-by: Copilot <copilot@github.com>

* fix(deps): update .NET runtime version for Vintage Story (#4913)

* Changed `dotnet-runtime-8.0` to `dotnet-runtime-10.0` in dependency lists for Ubuntu and Debian.
* Enhanced the `check_deps.sh` script to dynamically check for the required .NET runtime version.
* Added a warning for users on older distributions regarding potential missing .NET runtimes.

* feat(newserver): Jabroni Brawl: Episode 3 (#4702)

* Added jbep3server

* fix(jbep3): add distro deps entries and game icon

* fix(jbep3): bootstrap config from server.sample.cfg

* chore(prettier): format code

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>

* chore: add AI issue triage workflow and structured-field label rules (#4915)

- Add AI triage workflow that flags low-quality issues and requests missing info
- Add sync-game-labels script and workflow to maintain game labels from serverlist
- Add structured label rules for severity, reproducibility, priority, and scope
- Update labeler workflow to support both issues and PRs with dedicated config
- Add PR review guidance instructions for maintainers

* chore: update issue templates, PR template, and CoC (#4914)

- bug_report: add expected/actual behavior fields, script name,
  pre-check checkbox, required steps to reproduce, and AI triage
  metadata (severity, reproducibility, regression, affects-latest)
- feature_request: add priority field, problem statement, scope/impact,
  alternatives considered; make command optional; remove irrelevant
  bug-specific triage fields
- server_request: add dedicated server checkbox, official docs and
  Linux binary proof fields; fix CoC placeholder URL; remove
  irrelevant bug/feature triage fields
- config.yml: add private security reporting contact link
- pull_request_template: add testing, risk/rollback, breaking changes,
  and documentation impact sections
- CODE_OF_CONDUCT: upgrade from Contributor Covenant v2.1 to v3.0;
  fill reporting placeholders with GitHub advisory and Discord links

* fix: use is-sponsor-label-action v2 (v3 does not exist)

The v3 release does not exist for JasonEtco/is-sponsor-label-action.
Use v2 which is the latest stable release. The Node.js 24 compatibility
is handled by the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 environment variable.

* fix: remove AI triage workflow

The GitHub Models API requires specialized authentication that is not available
through secrets.GITHUB_TOKEN. The workflow consistently fails with 401 Unauthorized.

The rule-based label automation (labeler.yml) continues to function correctly
and provides automated labeling based on structured template fields.

* Revert "fix: remove AI triage workflow"

This reverts commit a183369.

* docs: clarify GitHub Models availability in AI triage workflow

Add comments explaining that GitHub Models access may not be available in all
environments and that 401 (Unauthorized) errors are expected and handled
gracefully. The workflow will skip AI triage silently but continue processing
the issue through other automation.

* fix(ai-triage): grant models permission to GITHUB_TOKEN

* fix(ai-triage): use GitHub Models REST inference endpoint

* chore(actions): tidy workflows and script layout

* chore(actions): tidy workflows and script layout

* fix: Update Debian 13 dependencies and add to issue templates (#4916)

- Replace libncursesw5 with libncursesw6 (removed from Debian 13)
- Replace libxml2-utils with libxml2 (removed from Debian 13)
- Add Debian 13 to bug report and feature request distro options

Fixes #4847: libncursesw5 and libxml2-utils do not exist on Debian 13

* fix: Correct CSV file path in update-lgsm command (#4917)

The distro CSV file was being fetched with an absolute path
instead of a repository-relative path, causing malformed URLs
like /master//home/user/lgsm/data/debian-12.csv

Changed fn_fetch_file_github first parameter from "${datadir}"
to "lgsm/data" to match the correct repository path structure.

Fixes #4856: ERROR: Downloading debian-12.csv on update-lgsm

* chore(actions): Optimize details-check workflow for PRs

Enhances the `details-check` workflow to run more efficiently on pull requests.

This commit introduces logic to:
- Trigger the workflow on pull requests to the `develop` branch.
- Analyze changed files to determine the scope of the checks required:
  - Run a full matrix if core `details`-related scripts are modified.
  - Run a targeted matrix only for servers whose `config-lgsm` files are changed.
  - Skip the check entirely if no relevant files are touched.
- Provide a concise summary of the `details`, `parse-game-details`, and `query-raw` outcomes directly in the GitHub Actions job summary.

This optimization significantly reduces CI/CD run times and resource consumption for pull requests by avoiding unnecessary checks across all game servers, improving developer efficiency.

* fix(mods_list): update AMX Mod X version to latest release (#4932)

* feat(check_deps.sh): Add “nullmailer” als allowed MTA for email notifications (#4871)

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>

* fix(mods): BepInEx Valheim install fix (rebased from #4938) (#4939)

* fix: exclude Wine prefix from serverfiles ownership check

SteamCMD creates a Wine prefix at serverfiles/steamapps/compatdata/
containing a z: symlink pointing to /. Without excluding this path,
`find "${serverfiles}"` traverses the entire filesystem, causing
check_permissions.sh to hang indefinitely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(vh): correct BepInEx mod extraction and env vars

- mods_list: set modsubdirs="BepInExPack_Valheim" so only the pack
  contents (not loose Thunderstore metadata) are installed to serverfiles
- mods_core: implement modsubdirs subfolder isolation in fn_mod_install_files;
  when modsubdirs is not "0", the named subfolder becomes the extract root
- fix_vh: update BepInEx env vars to match current start_server_bepinex.sh
  (DOORSTOP_ENABLED/DOORSTOP_TARGET_ASSEMBLY replacing old names,
  remove defunct DOORSTOP_CORLIB_OVERRIDE_PATH)
- mods_list: update modsubdirs field comment to reflect its actual semantics

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(mods): BepInEx_Valheim prevents startup on systems with newer glibc (#4788)

* fix(mods): BepInEx_Valheim prevents startup on systems with newer glibc

Load the libdoorstop_x64.so solely for the dedicated server executable
and not for the whole startup routine, which causes errors in startup or
not loading the mods at all. (see #4149 and #4491)

* chore(prettier): format code

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>

* fix(ci): fetch full history in details-check so base ref diff works (#4940)

The create-matrix job runs 'git diff origin/${base_ref}...HEAD' to
detect which servers a PR touches, but actions/checkout defaults to a
shallow single-branch fetch, so origin/develop does not exist in the
runner and the diff fails with 'ambiguous argument' on every PR that
reaches this job. Set fetch-depth: 0 so the base ref is available.

* feat(alerts): add Matrix alert provider (#4901)

* feat(alerts): add Matrix alert provider

* fix(alerts): use PUT instead of POST for Matrix send-event endpoint

The Matrix Client-Server API requires PUT for
/_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId}; sending
POST would be rejected by any spec-compliant homeserver (405), so
alerts would never actually send. Also documents that matrixroom
must be the internal room ID, not the human-readable room alias.

* fix: restore executable bit on alert_matrix.sh

* fix(alerts): register alert_matrix module and harden dispatch

Addresses review feedback on the Matrix alert provider:
- Register alert_matrix.sh in core_modules.sh so the module actually
  resolves when alert.sh calls it (without this the call fails as an
  unknown command and no alert is ever sent).
- Use curl -sSL to follow redirects, matching the other alert modules
  (some homeservers/reverse proxies redirect the client API).
- Require matrixhomeserver to be set in the dispatch condition,
  consistent with the TEST-ALERT checks, to avoid building a broken
  URL when it is empty.

* fix(ci): make Prettier workflow pass on develop (#4941)

* style(alerts): prettier-format alert_matrix.sh

Add the space in '2> /dev/null' that prettier-plugin-sh expects. This
was in the original #4901 code and tripped the Prettier workflow on
develop after merge (the workflow auto-formats and then can't push to
the protected branch, so the run fails).

* ci(prettier): ignore package-lock.json

package-lock.json is machine-generated by npm; Prettier reformatting it
conflicts with npm's own output and causes the Prettier auto-commit
workflow to try (and fail) to push lockfile churn to protected develop.
Ignoring it lets the workflow find nothing to change and pass.

* fix(jbep3): correct servercfgdefault to server.cfg (#4942)

The jbep3server details-check CI job fails because servercfgdefault was
set to "server.sample.cfg", but the Game-Server-Configs repo only ships
jbep3/server.cfg. The download step (curl -f) 404s and the job exits 22.

jbep3 was the only server using "server.sample.cfg"; all other
Source-engine servers (and 69 servers overall) use "server.cfg", which is
the file that actually exists in the configs repo.

* fix: Set TERM=screen for all non-interactive tmux calls (#4860)

When connected to a server via ssh, and the server doesn't have the
  proper terminfo, tmux will fail with 'unsupported terminal' errors.

  These errors are not surfaced by the scripts, e.g. details, start,
  stop, so they result in either silent failures or don't work at all.

      e.g. `./mcserver details` on my server showed 0% CPU, 0% Memory,
           and STOPPED for the server status when the server was
           actually running. This was because the tmux calls to get
           this info failed.

           The root cause of this was that I was connected to my server
           via kitty, a terminal emulator that my server did not have
           terminfo for.

  This can be resolved via running `infocmp -x xterm-kitty | ssh
  YOUR-SERVER -- tic -x -` and replacing `xterm-kitty` with whatever
  is appropriate, or by setting TERM=xterm-256color in the ssh config,
  but that is not obvious to do when presented with silent failures.

  This commit sets TERM=screen for all non-interactive tmux calls,
  which resolves the issue. Note that the `console` command does not
  set this, as that is an interactive shell, and the user's terminfo
  should be passed.

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>

* feat(stop): add option to only stop server if no players (#4595)

* add no stop if players online

* remove dev message

* monitor will now restart the server if requested earlier

* changed var name

* add npm check to install gamedig

* new line

* add var

* remove from non supported servers

* typo

* word

* move restart request

* change lock file name

* restart and monitor

* refactor(stop): share player-online check + add stoponlyifnoplayersallcommands

- Extract the duplicated gamedig player-count query (previously copy-pasted
  in command_stop, command_restart and command_monitor) into a new shared
  check_players_online.sh module that sets ${playersonline}; registered in
  core_modules.sh.
- Add stoponlyifnoplayersallcommands (default on) so the stoponlyifnoplayers
  protection applies to every command that stops the server (e.g. update).
  Set to off to limit it to explicit stop/restart, allowing update to stop
  the server even while players are online.
- Add the new setting to all game server _default.cfg files.
- Resolve merge with develop (check_gamedig now keeps develop's npm-update
  branch plus the 'install Node.js' hint).

* fix(stop): clear stale restart-request lock + warn on failed player query

Addresses Copilot review feedback on #4595:
- command_restart.sh: clear the *-restart-request.lock once a restart
  actually proceeds. Previously the lock was only written when postponing
  and never removed, so every subsequent monitor run would see the stale
  lock and trigger a repeat restart indefinitely. Fixed and verified against
  a live server: postponed restart -> monitor executes it and clears the
  lock -> a second monitor run no longer restarts.
- check_players_online.sh: if the gamedig query fails for every configured
  IP (e.g. gamedig/jq missing), playersonline now still fails open (so a
  broken query can't permanently block stop/restart) but prints a clear
  warning that the safety check could not run, instead of silently
  behaving as if the server were empty.

* Release v26.2.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: unknown <unknown@example.com>
Co-authored-by: LinuxGSM <dev@linuxgsm.com>
Co-authored-by: Knoxed <1338733+knoxed@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: WildPenguin <ville.aakko@gmail.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Jacob Gerega <22921310+jgerega107@users.noreply.github.com>
Co-authored-by: dgibbs64 <dgibbs64@users.noreply.github.com>
Co-authored-by: Nikolay Asenov <10465782+nasenov@users.noreply.github.com>
Co-authored-by: Fabian Raab <fabian@raab.link>
Co-authored-by: yourfate <2371889-youRFate@users.noreply.gitlab.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fwillo <37631375+fwillo@users.noreply.github.com>
Co-authored-by: Silas J. Matson <sjmatson01@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

engine: unity3d Issues related to unity3d engine game: Valheim Issues related to Valheim

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Valheim bepinex: ERROR: ld.so: object 'libdoorstop_x64.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored

2 participants