diff --git a/command.py b/command.py index 8d3ba10..b4f2103 100644 --- a/command.py +++ b/command.py @@ -70,6 +70,7 @@ def register_all_commands(bot): bot.register_command(commands('kill'), cmd_kill, admin=True) bot.register_command(commands('list_webinterface_user'), cmd_web_user_list, admin=True) bot.register_command(commands('remove_webinterface_user'), cmd_web_user_remove, admin=True) + bot.register_command(commands('max_volume'), cmd_max_volume, admin=True) bot.register_command(commands('update'), cmd_update, no_partial_match=True, admin=True) bot.register_command(commands('url_ban'), cmd_url_ban, no_partial_match=True, admin=True) bot.register_command(commands('url_ban_list'), cmd_url_ban_list, no_partial_match=True, admin=True) @@ -673,15 +674,38 @@ def cmd_volume(bot, user, text, command, parameter): global log # The volume is a percentage + max_vol = min(int(var.config.getfloat('bot', 'max_volume') * 100), 100.0) + if var.db.has_option('bot', 'max_volume'): + max_vol = float(var.db.get('bot', 'max_volume')) * 100.0 if parameter and parameter.isdigit() and 0 <= int(parameter) <= 100: - bot.volume_helper.set_volume(float(parameter) / 100.0) - bot.send_msg(tr('change_volume', volume=parameter, user=bot.mumble.users[text.actor]['name']), text) - var.db.set('bot', 'volume', str(float(parameter) / 100.0)) - log.info(f'cmd: volume set to {float(parameter) / 100.0}') + if int(parameter) <= max_vol: + vol = int(parameter) + bot.send_msg(tr('change_volume', volume=int(parameter), user=bot.mumble.users[text.actor]['name']), text) + else: + vol = max_vol + bot.send_msg(tr('max_volume', max=int(vol)), text) + bot.volume_helper.set_volume(float(vol) / 100.0) + var.db.set('bot', 'volume', str(float(vol) / 100.0)) + log.info(f'cmd: volume set to {float(vol) / 100.0}') else: bot.send_msg(tr('current_volume', volume=int(bot.volume_helper.plain_volume_set * 100)), text) - +def cmd_max_volume(bot, user, text, command, parameter): + global log + + if parameter and parameter.isdigit() and 0 <= int(parameter) <= 100: + max_vol = float(parameter) / 100.0 + var.db.set('bot', 'max_volume', float(parameter) / 100.0) + bot.send_msg(tr('change_max_volume', max=parameter, user=bot.mumble.users[text.actor]['name']), text) + if int(bot.volume_helper.plain_volume_set) > max_vol: + bot.volume_helper.set_volume(max_vol) + log.info(f'cmd: max volume set to {max_vol}') + else: + max_vol = var.config.getfloat('bot', 'max_volume') * 100.0 + if var.db.has_option('bot', 'max_volume'): + max_vol = var.db.getfloat('bot', 'max_volume') * 100.0 + bot.send_msg(tr('current_max_volume', max=int(max_vol)), text) + def cmd_ducking(bot, user, text, command, parameter): global log diff --git a/configuration.default.ini b/configuration.default.ini index 17cea84..6d74530 100644 --- a/configuration.default.ini +++ b/configuration.default.ini @@ -49,6 +49,7 @@ language = en_US logfile = max_track_duration = 60 max_track_playlist = 20 +max_volume = 1.0 music_database_path = music.db music_folder = music_folder/ pip3_path = venv/bin/pip @@ -117,6 +118,7 @@ kill = kill last = last list_file = listfile list_webinterface_user = webuserlist +max_volume = maxvolume mode = mode pause = pause play = p, play diff --git a/configuration.example.ini b/configuration.example.ini index 68668a7..5d0242d 100644 --- a/configuration.example.ini +++ b/configuration.example.ini @@ -111,6 +111,9 @@ port = 64738 # and reload it the next time it start. It requires save_music_library to be True to function. #save_playlist = True +# 'max_volume': Maximum volume able to be set by users. 0.0 - 1.0 +#max_volume = 0.8 + # 'max_track_playlist': Maximum track played when a playlist is added. #max_track_playlist = 20 diff --git a/lang/en_US.json b/lang/en_US.json index 5c71a94..371fb2a 100644 --- a/lang/en_US.json +++ b/lang/en_US.json @@ -9,6 +9,7 @@ "bad_url": "Bad URL requested.", "cache_refreshed": "Cache refreshed!", "change_ducking_volume": "Volume on ducking set to {volume} by {user}.", + "change_max_volume": "Max volume set to {max} by {user}", "change_mode": "Playback mode set to {mode} by {user}.", "change_volume": "Volume set to {volume} by {user}.", "cleared": "Playlist emptied.", @@ -16,6 +17,7 @@ "cleared_tags_from_all": "Removed all tags from songs on the playlist.", "command_disabled": "{command}: command disabled!", "current_ducking_volume": "Volume on ducking: {volume}.", + "current_max_volume": "Current max volume: {max}.", "current_mode": "Current playback mode is {mode}.", "current_volume": "Current volume: {volume}.", "database_dropped": "Database dropped. All records have gone.", @@ -29,6 +31,7 @@ "help": "

Commands

\nControl\n\nPlaylist\n\nMusic Library\n\nOther\n", "invalid_index": "Invalid index {index}. Use !queue to see the playlist.", "last_song_on_the_queue": "Last one on the queue.", + "max_volume": "Volume exceeds max volume of {max}. Setting volume to max.", "multiple_file_added": "Multiple items added:", "multiple_file_deleted": "Multiple items deleted from the library:", "multiple_file_found": "Found:", @@ -167,4 +170,4 @@ "url_placeholder": "URL...", "volume_slider": "Volume Slider" } -} \ No newline at end of file +} diff --git a/mumbleBot.py b/mumbleBot.py index 42501a0..20bf878 100644 --- a/mumbleBot.py +++ b/mumbleBot.py @@ -137,9 +137,13 @@ class MumbleBot: # ====== Volume ====== self.volume_helper = util.VolumeHelper() + max_vol = var.config.getfloat('bot', 'max_volume') + if var.db.has_option('bot', 'max_volume'): + max_vol = var.db.getfloat('bot', 'max_volume') _volume = var.config.getfloat('bot', 'volume') if var.db.has_option('bot', 'volume'): _volume = var.db.getfloat('bot', 'volume') + _volume = min(_volume, max_vol) self.volume_helper.set_volume(_volume) self.is_ducking = False