Files
ttyverse-extensions/soundpack.pl
2025-07-29 11:29:27 -04:00

77 lines
2.6 KiB
Perl

# TTYverse Sound Pack Extension
# Adapted from the original TTYtter soundpack by Storm Dragon: https://stormux.org/
# Support Storm Dragon's work: https://patreon.com/stormux
# Published under the Floodgap Free Software License: http://www.floodgap.com/software/ffsl/
# Plays sounds for different fediverse activities:
# Core: default, mention, dm, me
# Fediverse: follow, boost, favourite, poll, announcement
#
# Configure in RC file with:
# extpref_sound_command=paplay # Sound command (paplay, play, ogg123, etc.)
# extpref_soundpack=default # Sound pack name
# notifytype=soundpack # Enable sound notifications
# notifies=default,mention,dm,me,follow,boost,favourite
sub notifier_soundpack {
my $class = shift;
my $text = shift;
my $ref = shift;
# Debug output
print $stdout "-- DEBUG: soundpack notifier called with class='$class'\n" if (defined($class) && $verbose);
# Determine sound command (default to paplay for modern Linux)
my $sound_command;
if (!$extpref_sound_command) {
$sound_command = "paplay"; # Modern default for PulseAudio
} else {
$sound_command = $extpref_sound_command;
}
# Determine sound pack name
my $sound_pack;
if (!$extpref_soundpack) {
$sound_pack = "default";
} else {
$sound_pack = $extpref_soundpack;
}
# Skip if silent mode enabled
return 1 if ($silent);
if (!defined($class)) {
# Initialize - show loaded message
print $stdout "-- TTYverse sound pack loaded: $sound_pack\n";
print $stdout "-- Supported sounds: default, mention, dm, me, follow, boost, favourite, poll, announcement\n" if (!$silent);
return 1;
}
# Build sound file path using XDG data directory
my $data_dir = "$ENV{'HOME'}/.local/share/ttyverse";
my $sound_file = "$data_dir/sounds/$sound_pack/" . lc($class) . ".ogg";
if (!-f $sound_file) {
# Only warn once per session per class
my $warn_key = "warned_missing_sound_$class";
if (!$store->{$warn_key}) {
print $stdout "-- Warning: Sound file '$class.ogg' not found in pack '$sound_pack'\n";
print $stdout "-- Place sound files in $data_dir/sounds/$sound_pack/\n";
$store->{$warn_key} = 1;
}
return 1;
}
# Play the sound in background (suppress output)
print $stdout "-- DEBUG: Playing sound: $sound_command \"$sound_file\"\n" if ($verbose);
system("$sound_command \"$sound_file\" >/dev/null 2>&1 &");
return 1;
}
# Mark extension as successfully loaded
$store->{'loaded'} = 1;
# Extension loaded successfully
1;