feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: donations-only mode — skip block scan (#430) - #432

Merged
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode
May 12, 2026
Merged

feat: donations-only mode — skip block scan (#430)#432
tastybento merged 1 commit into
developfrom
feat/430-donations-only-mode

Conversation

@tastybento

Copy link
Copy Markdown
Member

Closes#430.

Summary

  • New donations-only config option in config.yml (default false). When true, the per-recalculation island chunk scan is skipped entirely and the island level is computed only from blocks donated via /island donate.
  • IslandLevelCalculator.scanIsland short-circuits straight to tidyUp() in this mode, which already reads the donated points from LevelsManager.getDonatedPoints(island) and applies the configured level-calc formula. The death penalty is still applied.
  • /island detail is not registered in this mode (per the issue thread — there are no scanned blocks to break down). /island level, /island top, /island value, and /island donate continue to work; /island level reports the level based on donated blocks alone.

Why this scope

From the issue thread:

The donation menu provides automatic level counting, so the "/ob level" command is not needed […]
I think you still need to see your level though, but it will be based on only the donated blocks. […] I agree that the detail command will not be required.

So the change keeps the rest of the player commands intact and only drops the detail command, which has no useful output when there is no block scan.

Test plan

  • mvn test — 217/217 pass (1 new test for the gated detail command)
  • In-game with donations-only: true: /island level reports a level based only on donated points; /island detail is not registered; /island donate hand/inv still works and updates the level
  • In-game with donations-only: false (default): all five player commands register and the existing scan-based flow is unchanged

🤖 Generated with Claude Code

Adds a `donations-only` config option that bypasses the island chunk scan
entirely. The island level is computed only from blocks donated via
`/island donate`, removing the per-recalculation CPU cost of scanning.
When the option is enabled:
- IslandLevelCalculator.scanIsland short-circuits to tidyUp(), which adds
the donated points (`LevelsManager.getDonatedPoints`) and runs the
configured level-calc formula on those points alone.
- The /island detail command is not registered, since there are no
scanned blocks to break down per the issue thread.
- /island level, /island top, /island value, and /island donate continue
to work; /island level reports the level based on donations only.
Closes#430.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@tastybento
tastybento merged commit c7f7bfb into developMay 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Donate menu

1 participant

@tastybento