diff --git a/.changeset/hip-squids-ask.md b/.changeset/hip-squids-ask.md new file mode 100644 index 0000000..2dfa08a --- /dev/null +++ b/.changeset/hip-squids-ask.md @@ -0,0 +1,5 @@ +--- +'elden-ring-github': minor +--- + +feat: add lost grace discovered support diff --git a/README.md b/README.md index 0540b0b..84ed011 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,9 @@ Access settings by clicking the extension icon: - **๐Ÿ†• Show on PR creation**: Toggle banner display when PRs are created - **โœ… Show on PR approve**: Toggle banner display when PRs are approved - **๐Ÿ”Š Play sound effect**: Toggle the iconic Elden Ring achievement sound +- **๐ŸŽต Sound Type**: Choose between different celebration sounds: + - **You Died** - The classic defeat sound + - **Lost Grace Discovered** - The grace discovery sound - **โฑ๏ธ Banner Duration**: Choose how long celebrations last (3-10 seconds) - **๐Ÿ“Š Page Status**: See if you're currently on a GitHub page - **๐Ÿงช Test Banner**: Preview the banner effect anytime @@ -99,7 +102,8 @@ src/ โ”‚ โ”œโ”€โ”€ settings.ts # Settings interface โ”‚ โ””โ”€โ”€ global.d.ts # Global type declarations โ””โ”€โ”€ assets/ # Static resources - โ”œโ”€โ”€ elden_ring_sound.mp3 + โ”œโ”€โ”€ you-die-sound.mp3 # "You Died" sound effect + โ”œโ”€โ”€ lost-grace-discovered.mp3 # Lost Grace discovery sound โ”œโ”€โ”€ pull-request-created.png # PR creation banner โ”œโ”€โ”€ pull-request-merged.png # PR merge banner โ”œโ”€โ”€ approve-pull-request.webp # PR approval banner diff --git a/src/assets/lost-grace-discovered.mp3 b/src/assets/lost-grace-discovered.mp3 new file mode 100644 index 0000000..ffeee02 Binary files /dev/null and b/src/assets/lost-grace-discovered.mp3 differ diff --git a/src/assets/elden_ring_sound.mp3 b/src/assets/you-die-sound.mp3 similarity index 100% rename from src/assets/elden_ring_sound.mp3 rename to src/assets/you-die-sound.mp3 diff --git a/src/content/content.test.ts b/src/content/content.test.ts index b543709..537e7b6 100644 --- a/src/content/content.test.ts +++ b/src/content/content.test.ts @@ -153,7 +153,8 @@ describe('EldenRingMerger', () => { global.Audio = vi.fn().mockImplementation(() => mockAudio); global.chrome.runtime.getURL = vi.fn(() => 'chrome-extension://mock/sound.mp3'); - const audio = new Audio(chrome.runtime.getURL('assets/elden_ring_sound.mp3')); + const soundType = 'you-die-sound'; + const audio = new Audio(chrome.runtime.getURL(`assets/${soundType}.mp3`)); audio.volume = 0.35; audio.play(); @@ -162,6 +163,21 @@ describe('EldenRingMerger', () => { expect(mockAudio.volume).toBe(0.35); }); + it('should support sound type selection', () => { + const soundTypes: Array<'you-die-sound' | 'lost-grace-discovered'> = [ + 'you-die-sound', + 'lost-grace-discovered', + ]; + + soundTypes.forEach((soundType) => { + const expectedPath = `assets/${soundType}.mp3`; + expect(expectedPath).toContain('.mp3'); + expect(expectedPath).toContain(soundType); + }); + + expect(soundTypes.length).toBe(2); + }); + it('should add event listeners to merge buttons', () => { // Setup DOM with merge button document.body.innerHTML = ` diff --git a/src/content/content.ts b/src/content/content.ts index f0b4bc3..07f8fb6 100644 --- a/src/content/content.ts +++ b/src/content/content.ts @@ -4,27 +4,39 @@ class EldenRingMerger { private showOnPRMerged: boolean = true; private showOnPRCreate: boolean = true; private showOnPRApprove: boolean = true; + private soundType: 'you-die-sound' | 'lost-grace-discovered' = 'you-die-sound'; private soundUrl: string; constructor() { - this.soundUrl = chrome.runtime.getURL('assets/elden_ring_sound.mp3'); + this.soundUrl = this.getSoundUrl(); this.loadSettings(); this.init(); } + private getSoundUrl(): string { + return chrome.runtime.getURL(`assets/${this.soundType}.mp3`); + } + + private updateSoundUrl(): void { + this.soundUrl = this.getSoundUrl(); + } + private loadSettings(): void { chrome.storage.sync.get( - ['soundEnabled', 'showOnPRMerged', 'showOnPRCreate', 'showOnPRApprove'], + ['soundEnabled', 'showOnPRMerged', 'showOnPRCreate', 'showOnPRApprove', 'soundType'], (result: { soundEnabled?: boolean; showOnPRMerged?: boolean; showOnPRCreate?: boolean; showOnPRApprove?: boolean; + soundType?: 'you-die-sound' | 'lost-grace-discovered'; }) => { this.soundEnabled = result.soundEnabled !== false; // default true this.showOnPRMerged = result.showOnPRMerged !== false; // default true this.showOnPRCreate = result.showOnPRCreate !== false; // default true this.showOnPRApprove = result.showOnPRApprove !== false; // default true + this.soundType = result.soundType || 'you-die-sound'; // default you-die-sound + this.updateSoundUrl(); }, ); @@ -43,6 +55,10 @@ class EldenRingMerger { if (changes.showOnPRApprove) { this.showOnPRApprove = changes.showOnPRApprove.newValue; } + if (changes.soundType) { + this.soundType = changes.soundType.newValue; + this.updateSoundUrl(); + } }, ); } diff --git a/src/popup/popup.html b/src/popup/popup.html index 0b41326..cec8bd9 100644 --- a/src/popup/popup.html +++ b/src/popup/popup.html @@ -57,6 +57,15 @@ Play sound effect +
+ +
diff --git a/src/popup/popup.ts b/src/popup/popup.ts index c6a2a9f..fa67095 100644 --- a/src/popup/popup.ts +++ b/src/popup/popup.ts @@ -6,6 +6,7 @@ document.addEventListener('DOMContentLoaded', (): void => { const soundEnabledCheckbox = document.getElementById('soundEnabled') as HTMLInputElement; const showOnPRCreateCheckbox = document.getElementById('showOnPRCreate') as HTMLInputElement; const showOnPRApproveCheckbox = document.getElementById('showOnPRApprove') as HTMLInputElement; + const soundTypeSelect = document.getElementById('soundType') as HTMLSelectElement; const durationSelect = document.getElementById('duration') as HTMLSelectElement; const pageStatusElement = document.getElementById('pageStatus') as HTMLSpanElement; @@ -21,6 +22,7 @@ document.addEventListener('DOMContentLoaded', (): void => { soundEnabledCheckbox?.addEventListener('change', saveSettings); showOnPRCreateCheckbox?.addEventListener('change', saveSettings); showOnPRApproveCheckbox?.addEventListener('change', saveSettings); + soundTypeSelect?.addEventListener('change', saveSettings); durationSelect?.addEventListener('change', saveSettings); function checkCurrentPage(): void { @@ -54,12 +56,20 @@ document.addEventListener('DOMContentLoaded', (): void => { function loadSettings() { chrome.storage.sync.get( - ['showOnPRMerged', 'soundEnabled', 'showOnPRCreate', 'showOnPRApprove', 'duration'], + [ + 'showOnPRMerged', + 'soundEnabled', + 'showOnPRCreate', + 'showOnPRApprove', + 'soundType', + 'duration', + ], function (result) { showOnPRMergedCheckbox.checked = result.showOnPRMerged !== false; // default true soundEnabledCheckbox.checked = result.soundEnabled !== false; // default true showOnPRCreateCheckbox.checked = result.showOnPRCreate !== false; // default true showOnPRApproveCheckbox.checked = result.showOnPRApprove !== false; // default true + soundTypeSelect.value = result.soundType || 'you-die-sound'; // default you-die-sound durationSelect.value = result.duration || '5000'; // default 5 seconds }, ); @@ -71,6 +81,7 @@ document.addEventListener('DOMContentLoaded', (): void => { soundEnabled: soundEnabledCheckbox.checked, showOnPRCreate: showOnPRCreateCheckbox.checked, showOnPRApprove: showOnPRApproveCheckbox.checked, + soundType: soundTypeSelect.value, duration: parseInt(durationSelect.value), }; @@ -85,7 +96,7 @@ document.addEventListener('DOMContentLoaded', (): void => { chrome.scripting.executeScript({ target: { tabId: currentTab.id! }, func: updateExtensionSettings, - args: [settings], + args: [settings as EldenRingSettings], }); } }); @@ -109,9 +120,10 @@ function createAndShowBanner(): boolean { document.body.appendChild(banner); // Play sound effect if enabled - chrome.storage.sync.get(['soundEnabled'], function (soundResult) { + chrome.storage.sync.get(['soundEnabled', 'soundType'], function (soundResult) { if (soundResult.soundEnabled !== false) { - const audio = new Audio(chrome.runtime.getURL('assets/elden_ring_sound.mp3')); + const soundType = soundResult.soundType || 'you-die-sound'; + const audio = new Audio(chrome.runtime.getURL(`assets/${soundType}.mp3`)); audio.volume = 0.35; audio.play().catch((err) => console.log('Sound playback failed:', err)); } @@ -154,9 +166,10 @@ function createAndShowBanner(): boolean { document.body.appendChild(banner); // Play sound effect if enabled - chrome.storage.sync.get(['soundEnabled'], function (soundResult) { + chrome.storage.sync.get(['soundEnabled', 'soundType'], function (soundResult) { if (soundResult.soundEnabled !== false) { - const audio = new Audio(chrome.runtime.getURL('assets/elden_ring_sound.mp3')); + const soundType = soundResult.soundType || 'you-die-sound'; + const audio = new Audio(chrome.runtime.getURL(`assets/${soundType}.mp3`)); audio.volume = 0.35; audio.play().catch((err) => console.log('Sound playback failed:', err)); } diff --git a/src/types/settings.ts b/src/types/settings.ts index 520082a..dda0f1d 100644 --- a/src/types/settings.ts +++ b/src/types/settings.ts @@ -4,4 +4,5 @@ export interface EldenRingSettings { duration?: number; showOnPRCreate?: boolean; showOnPRApprove?: boolean; + soundType?: 'you-die-sound' | 'lost-grace-discovered'; }