Exemple #1
0
def cmd_play_file_match(bot, user, text, command, parameter):
    music_folder = var.config.get('bot', 'music_folder')
    if parameter is not None:
        files = util.get_recursive_filelist_sorted(music_folder)
        msgs = [ var.config.get('strings', 'file_added') ]
        count = 0
        try:
            for file in files:
                match = re.search(parameter, file)
                if match:
                    count += 1
                    music = {'type': 'file',
                             'path': file,
                             'user': user}
                    logging.info("cmd: add to playlist: " + file)
                    music = var.playlist.append(music)

                    msgs.append("{} ({})".format(music['title'], music['path']))

            if count != 0:
                send_multi_lines(bot, msgs, text)
            else:
                bot.send_msg(var.config.get('strings', 'no_file'), text)

        except re.error as e:
            msg = var.config.get('strings', 'wrong_pattern') % str(e)
            bot.send_msg(msg, text)
    else:
        bot.send_msg(var.config.get('strings', 'bad_parameter') % command)
Exemple #2
0
def download():
    if 'file' in request.args:
        requested_file = request.args['file']
        if '../' not in requested_file:
            folder_path = var.music_folder
            files = util.get_recursive_filelist_sorted(var.music_folder)

            if requested_file in files:
                filepath = os.path.join(folder_path, requested_file)
                try:
                    return send_file(filepath, as_attachment=True)
                except Exception as e:
                    self.log.exception(e)
                    self.Error(400)
    elif 'directory' in request.args:
        requested_dir = request.args['directory']
        folder_path = var.music_folder
        requested_dir_fullpath = os.path.abspath(
            os.path.join(folder_path, requested_dir)) + '/'
        if requested_dir_fullpath.startswith(folder_path):
            if os.path.samefile(requested_dir_fullpath, folder_path):
                prefix = 'all'
            else:
                prefix = secure_filename(
                    os.path.relpath(requested_dir_fullpath, folder_path))
            zipfile = util.zipdir(requested_dir_fullpath, prefix)
            try:
                return send_file(zipfile, as_attachment=True)
            except Exception as e:
                self.log.exception(e)
                self.Error(400)

    return redirect("./", code=400)
Exemple #3
0
def index():
    folder_path = var.music_folder
    files = util.get_recursive_filelist_sorted(var.music_folder)
    music_library = util.Dir(folder_path)
    for file in files:
        music_library.add_file(file)

    return render_template('index.html',
                           all_files=files,
                           music_library=music_library,
                           os=os,
                           playlist=var.playlist,
                           user=var.user,
                           paused=var.botamusique.is_pause)
Exemple #4
0
def cmd_list_file(bot, user, text, command, parameter):
    folder_path = var.config.get('bot', 'music_folder')

    files = util.get_recursive_filelist_sorted(folder_path)
    msgs = [ "<br> <b>Files available:</b>" if not parameter else "<br> <b>Matched files:</b>" ]
    try:
        count = 0
        for index, file in enumerate(files):
            if parameter:
                match = re.search(parameter, file)
                if not match:
                    continue

            count += 1
            msgs.append("<b>{:0>3d}</b> - {:s}".format(index, file))

        if count != 0:
            send_multi_lines(bot, msgs, text)
        else:
            bot.send_msg(var.config.get('strings', 'no_file'), text)

    except re.error as e:
        msg = var.config.get('strings', 'wrong_pattern') % str(e)
        bot.send_msg(msg, text)
Exemple #5
0
    def message_received(self, text):

        message = text.message.strip()
        user = self.mumble.users[text.actor]['name']

        if var.config.getboolean('command', 'split_username_at_space'):
            # in can you use https://github.com/Natenom/mumblemoderator-module-collection/tree/master/os-suffixes , you want to split the username
            user = user.split()[0]

        if message[0] == var.config.get('command', 'command_symbol'):
            # remove the symbol from the message
            message = message[1:].split(' ', 1)

            # use the first word as a command, the others one as  parameters
            if len(message) > 0:
                command = message[0]
                parameter = ''
                if len(message) > 1:
                    parameter = message[1]

            else:
                return

            logging.info(command + ' - ' + parameter + ' by ' + user)

            if command == var.config.get('command', 'joinme'):
                self.mumble.users.myself.move_in(self.mumble.users[text.actor]['channel_id'], token=parameter)
                return

            # Anti stupid guy function
            if not self.is_admin(user) and not var.config.getboolean('bot', 'allow_other_channel_message') and self.mumble.users[text.actor]['channel_id'] != self.mumble.users.myself['channel_id']:
                self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_in_my_channel'))
                return

            if not self.is_admin(user) and not var.config.getboolean('bot', 'allow_private_message') and text.session:
                self.mumble.users[text.actor].send_message(var.config.get('strings', 'pm_not_allowed'))
                return

            ###
            # Admin command
            ###
            for i in var.db.items("user_ban"):
                if user.lower() == i[0]:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'user_ban'))
                    return

            if command == var.config.get('command', 'user_ban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(util.user_ban(parameter))
                    else:
                        self.mumble.users[text.actor].send_message(util.get_user_ban())
                else:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'user_unban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(util.user_unban(parameter))
                else:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'url_ban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(util.url_ban(self.get_url_from_input(parameter)))
                    else:
                        self.mumble.users[text.actor].send_message(util.get_url_ban())
                else:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'url_unban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(util.url_unban(self.get_url_from_input(parameter)))
                else:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))
                return

            if parameter:
                for i in var.db.items("url_ban"):
                    if self.get_url_from_input(parameter.lower()) == i[0]:
                        self.mumble.users[text.actor].send_message(var.config.get('strings', 'url_ban'))
                        return

            ###
            # everyday commands
            ###
            if command == var.config.get('command', 'play_file') and parameter:
                music_folder = var.config.get('bot', 'music_folder')
                # sanitize "../" and so on
                path = os.path.abspath(os.path.join(music_folder, parameter))
                if path.startswith(music_folder):
                    if os.path.isfile(path):
                        filename = path.replace(music_folder, '')
                        music = {'type': 'file',
                                 'path': filename,
                                 'user': user}
                        var.playlist.append(music)
                    else:
                        # try to do a partial match
                        matches = [file for file in util.get_recursive_filelist_sorted(music_folder) if parameter.lower() in file.lower()]
                        if len(matches) == 0:
                            self.send_msg(var.config.get('strings', 'no_file'), text)
                        elif len(matches) == 1:
                            music = {'type': 'file',
                                     'path': matches[0],
                                     'user': user}
                            var.playlist.append(music)
                        else:
                            msg = var.config.get('strings', 'multiple_matches') + '<br />'
                            msg += '<br />'.join(matches)
                            self.send_msg(msg, text)
                else:
                    self.send_msg(var.config.get('strings', 'bad_file'), text)
                self.async_download_next()

            elif command == var.config.get('command', 'play_url') and parameter:
                music = {'type': 'url',
                         'url': self.get_url_from_input(parameter),  # grab the real URL
                         'user': user,
                         'ready': 'validation'}
                var.playlist.append(music)

                if media.url.get_url_info():
                    if var.playlist[-1]['duration'] > var.config.getint('bot', 'max_track_duration'):
                        var.playlist.pop()
                        self.send_msg(var.config.get('strings', 'too_long'), text)
                    else:
                        for i in var.db.options("url_ban"):
                            if var.playlist[-1]['url'] == i:
                                self.mumble.users[text.actor].send_message(var.config.get('strings', 'url_ban'))
                                var.playlist.pop()
                                return
                        var.playlist[-1]['ready'] = "no"
                        self.async_download_next()
                else:
                    var.playlist.pop()
                    self.send_msg(var.config.get('strings', 'unable_download'), text)

            elif command == var.config.get('command', 'play_playlist') and parameter:
                offset = 1  # if you want to start the playlist at a specific index
                try:
                    offset = int(parameter.split(" ")[-1])
                except ValueError:
                    pass
                if media.playlist.get_playlist_info(url=self.get_url_from_input(parameter), start_index=offset, user=user):
                    self.async_download_next()

            elif command == var.config.get('command', 'play_radio') and parameter:
                if var.config.has_option('radio', parameter):
                    parameter = var.config.get('radio', parameter)
                music = {'type': 'radio',
                         'url': self.get_url_from_input(parameter),
                         'user': user}
                var.playlist.append(music)
                self.async_download_next()

            elif command == var.config.get('command', 'help'):
                self.send_msg(var.config.get('strings', 'help'), text)

            elif command == var.config.get('command', 'stop'):
                self.stop()

            elif command == var.config.get('command', 'kill'):
                if self.is_admin(user):
                    self.stop()
                    self.exit = True
                else:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'update'):
                if self.is_admin(user):
                    self.mumble.users[text.actor].send_message("Starting the update")
                    # Need to be improved
                    tp = sp.check_output([var.config.get('bot', 'pip3_path'), 'install', '--upgrade', 'youtube-dl']).decode()
                    msg = ""
                    if "Requirement already up-to-date" in tp:
                        msg += "Youtube-dl is up-to-date"
                    else:
                        msg += "Update done : " + tp.split('Successfully installed')[1]
                    if 'up-to-date' not in sp.check_output(['/usr/bin/env', 'git', 'pull']).decode():
                        # Need to change it with release tag
                        msg += "<br /> I'm up-to-date"
                    else:
                        msg += "<br /> I have available updates, need to do it manually"
                    self.mumble.users[text.actor].send_message(msg)
                else:
                    self.mumble.users[text.actor].send_message(var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'stop_and_getout'):
                self.stop()
                if self.channel:
                    self.mumble.channels.find_by_name(self.channel).move_in()

            elif command == var.config.get('command', 'volume'):
                # The volume is a percentage
                if parameter is not None and parameter.isdigit() and 0 <= int(parameter) <= 100:
                    self.volume = float(float(parameter) / 100)
                    self.send_msg(var.config.get('strings', 'change_volume') % (
                        int(self.volume * 100), self.mumble.users[text.actor]['name']), text)
                    var.db.set('bot', 'volume', str(self.volume))
                else:
                    self.send_msg(var.config.get('strings', 'current_volume') % int(self.volume * 100), text)

            elif command == var.config.get('command', 'current_music'):
                if len(var.playlist) > 0:
                    source = var.playlist[0]["type"]
                    if source == "radio":
                        reply = "[radio] {title} on {url} by {user}".format(
                            title=media.radio.get_radio_title(var.playlist[0]["url"]),
                            url=var.playlist[0]["title"],
                            user=var.playlist[0]["user"]
                        )
                    elif source == "url" and 'from_playlist' in var.playlist[0]:
                        reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format(
                            title=var.playlist[0]["title"],
                            url=var.playlist[0]["playlist_url"],
                            playlist=var.playlist[0]["playlist_title"],
                            user=var.playlist[0]["user"]
                        )
                    elif source == "url":
                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format(
                            title=var.playlist[0]["title"],
                            url=var.playlist[0]["url"],
                            user=var.playlist[0]["user"]
                        )
                    elif source == "file":
                        reply = "[file] {title} by {user}".format(
                            title=var.playlist[0]["title"],
                            user=var.playlist[0]["user"])
                    else:
                        reply = "ERROR"
                        logging.error(var.playlist)
                else:
                    reply = var.config.get('strings', 'not_playing')

                self.send_msg(reply, text)

            elif command == var.config.get('command', 'skip'):
                if parameter is not None and parameter.isdigit() and int(parameter) > 0:  # Allow to remove specific music into the queue with a number
                    if int(parameter) < len(var.playlist):
                        removed = var.playlist.pop(int(parameter))

                        # the Title isn't here if the music wasn't downloaded
                        self.send_msg(var.config.get('strings', 'removing_item') % (removed['title'] if 'title' in removed else removed['url']), text)
                    else:
                        self.send_msg(var.config.get('strings', 'no_possible'), text)
                elif self.next():  # Is no number send, just skip the current music
                    self.launch_music()
                    self.async_download_next()
                else:
                    self.send_msg(var.config.get('strings', 'queue_empty'), text)
                    self.stop()

            elif command == var.config.get('command', 'list'):
                folder_path = var.config.get('bot', 'music_folder')

                files = util.get_recursive_filelist_sorted(folder_path)
                if files:
                    self.send_msg('<br>'.join(files), text)
                else:
                    self.send_msg(var.config.get('strings', 'no_file'), text)

            elif command == var.config.get('command', 'queue'):
                if len(var.playlist) <= 1:
                    msg = var.config.get('strings', 'queue_empty')
                else:
                    msg = var.config.get('strings', 'queue_contents') + '<br />'
                    i = 1
                    for value in var.playlist[1:]:
                        msg += '[{}] ({}) {}<br />'.format(i, value['type'], value['title'] if 'title' in value else value['url'])
                        i += 1

                self.send_msg(msg, text)

            elif command == var.config.get('command', 'repeat'):
                var.playlist.append(var.playlist[0])

            else:
                self.mumble.users[text.actor].send_message(var.config.get('strings', 'bad_command'))
Exemple #6
0
    def message_received(self, text):
        message = text.message.strip()
        user = self.mumble.users[text.actor]['name']
        if message[0] == '!':
            message = message[1:].split(' ', 1)
            if len(message) > 0:
                command = message[0]
                parameter = ''
                if len(message) > 1:
                    parameter = message[1]

            else:
                return

            logging.info(command + ' - ' + parameter + ' by ' + user)

            if command == var.config.get('command', 'joinme'):
                self.mumble.users.myself.move_in(
                    self.mumble.users[text.actor]['channel_id'])
                return

            if not self.is_admin(user) and not var.config.getboolean(
                    'bot', 'allow_other_channel_message'
            ) and self.mumble.users[text.actor][
                    'channel_id'] != self.mumble.users.myself['channel_id']:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'not_in_my_channel'))
                return

            if not self.is_admin(user) and not var.config.getboolean(
                    'bot', 'allow_private_message') and text.session:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'pm_not_allowed'))
                return

            if command == var.config.get('command', 'play_file') and parameter:
                music_folder = var.config.get('bot', 'music_folder')
                # sanitize "../" and so on
                path = os.path.abspath(os.path.join(music_folder, parameter))
                if path.startswith(music_folder):
                    if os.path.isfile(path):
                        filename = path.replace(music_folder, '')
                        var.playlist.append(["file", filename, user])
                    else:
                        # try to do a partial match
                        matches = [
                            file for file in
                            util.get_recursive_filelist_sorted(music_folder)
                            if parameter.lower() in file.lower()
                        ]
                        if len(matches) == 0:
                            self.mumble.users[text.actor].send_message(
                                var.config.get('strings', 'no_file'))
                        elif len(matches) == 1:
                            var.playlist.append(["file", matches[0], user])
                        else:
                            msg = var.config.get('strings',
                                                 'multiple_matches') + '<br />'
                            msg += '<br />'.join(matches)
                            self.mumble.users[text.actor].send_message(msg)
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'bad_file'))
                self.async_download_next()

            elif command == var.config.get('command',
                                           'play_url') and parameter:
                var.playlist.append(["url", parameter, user])
                self.async_download_next()

            elif command == var.config.get('command',
                                           'play_playlist') and parameter:
                offset = 1
                try:
                    offset = int(parameter.split(" ")[-1])
                except ValueError:
                    pass
                var.playlist.append([
                    "playlist", parameter, user,
                    var.config.getint('bot', 'max_track_playlist'), offset
                ])
                self.async_download_next()

            elif command == var.config.get('command',
                                           'play_radio') and parameter:
                if var.config.has_option('radio', parameter):
                    parameter = var.config.get('radio', parameter)
                var.playlist.append(["radio", parameter, user])
                self.async_download_next()

            elif command == var.config.get('command', 'help'):
                self.send_msg_channel(var.config.get('strings', 'help'))

            elif command == var.config.get('command', 'stop'):
                self.stop()

            elif command == var.config.get('command', 'kill'):
                if self.is_admin(user):
                    self.stop()
                    self.exit = True
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'update'):
                if not self.is_admin(user):
                    self.mumble.users[text.actor].send_message(
                        "Starting the update")
                    tp = sp.check_output([
                        var.config.get('bot', 'pip3_path'), 'install',
                        '--upgrade', 'youtube-dl'
                    ]).decode()
                    msg = ""
                    if "Requirement already up-to-date" in tp:
                        msg += "Youtube-dl is up-to-date"
                    else:
                        msg += "Update done : " + tp.split(
                            'Successfully installed')[1]
                    if 'Your branch is up-to-date' in sp.check_output(
                        ['/usr/bin/env', 'git', 'status']).decode():
                        msg += "<br /> Botamusique is up-to-date"
                    else:
                        msg += "<br /> Botamusique have available update"
                    self.mumble.users[text.actor].send_message(msg)
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'stop_and_getout'):
                self.stop()
                if self.channel:
                    self.mumble.channels.find_by_name(self.channel).move_in()

            elif command == var.config.get('command', 'volume'):
                if parameter is not None and parameter.isdigit(
                ) and 0 <= int(parameter) <= 100:
                    self.volume = float(float(parameter) / 100)
                    self.send_msg_channel(
                        var.config.get('strings', 'change_volume') %
                        (int(self.volume * 100),
                         self.mumble.users[text.actor]['name']))
                    var.db.set('bot', 'volume', str(self.volume))
                else:
                    self.send_msg_channel(
                        var.config.get('strings', 'current_volume') %
                        int(self.volume * 100))

            elif command == var.config.get('command', 'current_music'):
                if var.current_music:
                    source = var.current_music["type"]
                    if source == "radio":
                        reply = "[radio] {title} on {url} by {user}".format(
                            title=media.get_radio_title(
                                var.current_music["path"]),
                            url=var.current_music["title"],
                            user=var.current_music["user"])
                    elif source == "url":
                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format(
                            title=var.current_music["title"],
                            url=var.current_music["path"],
                            user=var.current_music["user"])
                    elif source == "file":
                        reply = "[file] {title} by {user}".format(
                            title=var.current_music["title"],
                            user=var.current_music["user"])
                    elif source == "playlist":
                        reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format(
                            title=var.current_music["title"],
                            url=var.current_music["path"],
                            playlist=var.current_music["playlist_title"],
                            user=var.current_music["user"])
                    else:
                        reply = "(?)[{}] {} {} by {}".format(
                            var.current_music["type"],
                            var.current_music["path"],
                            var.current_music["title"],
                            var.current_music["user"])
                else:
                    reply = var.config.get('strings', 'not_playing')

                self.mumble.users[text.actor].send_message(reply)

            elif command == var.config.get('command', 'next'):
                if self.get_next():
                    self.launch_next()
                    self.async_download_next()
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'queue_empty'))
                    self.stop()

            elif command == var.config.get('command', 'list'):
                folder_path = var.config.get('bot', 'music_folder')

                files = util.get_recursive_filelist_sorted(folder_path)
                if files:
                    self.mumble.users[text.actor].send_message(
                        '<br>'.join(files))
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'no_file'))

            elif command == var.config.get('command', 'queue'):
                if len(var.playlist) == 0:
                    msg = var.config.get('strings', 'queue_empty')
                else:
                    msg = var.config.get('strings',
                                         'queue_contents') + '<br />'
                    for (music_type, path, user) in var.playlist:
                        msg += '({}) {}<br />'.format(music_type, path)

                self.send_msg_channel(msg)

            elif command == var.config.get('command', 'repeat'):
                var.playlist.append([
                    var.current_music["type"], var.current_music["path"],
                    var.current_music["user"]
                ])

            else:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'bad_command'))
Exemple #7
0
    def message_received(self, text):
        message = text.message.strip()
        if message[0] == '!':
            message = message[1:].split(' ', 1)
            if len(message) > 0:
                command = message[0]
                parameter = ''
                if len(message) > 1:
                    parameter = message[1]
            else:
                return

            logging.info(command + ' - ' + parameter + ' by ' +
                         self.mumble.users[text.actor]['name'])

            if command == var.config.get('command', 'play_file') and parameter:
                music_folder = var.config.get('bot', 'music_folder')
                # sanitize "../" and so on
                path = os.path.abspath(os.path.join(music_folder, parameter))
                if path.startswith(music_folder):
                    if os.path.isfile(path):
                        filename = path.replace(music_folder, '')
                        var.playlist.append(["file", filename])
                    else:
                        # try to do a partial match
                        matches = [
                            file for file in
                            util.get_recursive_filelist_sorted(music_folder)
                            if parameter.lower() in file.lower()
                        ]
                        if len(matches) == 0:
                            self.mumble.users[text.actor].send_message(
                                var.config.get('strings', 'no_file'))
                        elif len(matches) == 1:
                            var.playlist.append(["file", matches[0]])
                        else:
                            msg = var.config.get('strings',
                                                 'multiple_matches') + '<br />'
                            msg += '<br />'.join(matches)
                            self.mumble.users[text.actor].send_message(msg)
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'bad_file'))

            elif command == var.config.get('command',
                                           'play_url') and parameter:
                var.playlist.append(["url", parameter])

            elif command == var.config.get('command',
                                           'play_radio') and parameter:
                if var.config.has_option('radio', parameter):
                    parameter = var.config.get('radio', parameter)
                var.playlist.append(["radio", parameter])

            elif command == var.config.get('command', 'help'):
                self.send_msg_channel(var.config.get('strings', 'help'))

            elif command == var.config.get('command', 'stop'):
                self.stop()

            elif command == var.config.get('command', 'kill'):
                if self.is_admin(text.actor):
                    self.stop()
                    self.exit = True
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'stop_and_getout'):
                self.stop()
                if self.channel:
                    self.mumble.channels.find_by_name(self.channel).move_in()

            elif command == var.config.get('command', 'joinme'):
                self.mumble.users.myself.move_in(
                    self.mumble.users[text.actor]['channel_id'])

            elif command == var.config.get('command', 'volume'):
                if parameter is not None and parameter.isdigit(
                ) and 0 <= int(parameter) <= 100:
                    self.volume = float(float(parameter) / 100)
                    self.send_msg_channel(
                        var.config.get('strings', 'change_volume') %
                        (int(self.volume * 100),
                         self.mumble.users[text.actor]['name']))
                else:
                    self.send_msg_channel(
                        var.config.get('strings', 'current_volume') %
                        int(self.volume * 100))

            elif command == var.config.get('command', 'current_music'):
                if var.current_music:
                    source = var.current_music[0]
                    if source == "radio":
                        reply = "[radio] {title} sur {url}".format(
                            title=media.get_radio_title(var.current_music[1]),
                            url=var.current_music[2])
                    elif source == "url":
                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>)".format(
                            title=var.current_music[2],
                            url=var.current_music[1])
                    elif source == "file":
                        reply = "[file] {title}".format(
                            title=var.current_music[2])
                    else:
                        reply = "(?)[{}] {} {}".format(
                            var.current_music[0],
                            var.current_music[1],
                            var.current_music[2],
                        )
                else:
                    reply = var.config.get('strings', 'not_playing')

                self.mumble.users[text.actor].send_message(reply)

            elif command == var.config.get('command', 'next'):
                if var.playlist:
                    var.current_music = [
                        var.playlist[0][0], var.playlist[0][1], None, None
                    ]
                    var.playlist.pop(0)
                    self.launch_next()
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'queue_empty'))
                    self.stop()

            elif command == var.config.get('command', 'list'):
                folder_path = var.config.get('bot', 'music_folder')

                files = util.get_recursive_filelist_sorted(folder_path)
                if files:
                    self.mumble.users[text.actor].send_message(
                        '<br>'.join(files))
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'no_file'))

            elif command == var.config.get('command', 'queue'):
                if len(var.playlist) == 0:
                    msg = var.config.get('strings', 'queue_empty')
                else:
                    msg = var.config.get('strings',
                                         'queue_contents') + '<br />'
                    for (type, path) in var.playlist:
                        msg += '({}) {}<br />'.format(type, path)

                self.send_msg_channel(msg)
            else:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'bad_command'))
Exemple #8
0
def post():
    folder_path = var.music_folder
    if request.method == 'POST':
        logging.debug("Post request: " + str(request.form))
        if 'add_file_bottom' in request.form and ".." not in request.form[
                'add_file_bottom']:
            path = var.config.get(
                'bot', 'music_folder') + request.form['add_file_bottom']
            if os.path.isfile(path):
                item = {
                    'type': 'file',
                    'path': request.form['add_file_bottom'],
                    'title': '',
                    'user': '******'
                }
                var.playlist.append(util.get_music_tag_info(item))
                logging.info('web: add to playlist(bottom): ' + item['path'])

        elif 'add_file_next' in request.form and ".." not in request.form[
                'add_file_next']:
            path = var.config.get(
                'bot', 'music_folder') + request.form['add_file_next']
            if os.path.isfile(path):
                item = {
                    'type': 'file',
                    'path': request.form['add_file_next'],
                    'title': '',
                    'user': '******'
                }
                var.playlist.insert(var.playlist.current_index + 1,
                                    util.get_music_tag_info(item))
                logging.info('web: add to playlist(next): ' + item['path'])

        elif ('add_folder' in request.form
              and ".." not in request.form['add_folder']) or (
                  'add_folder_recursively' in request.form
                  and ".." not in request.form['add_folder_recursively']):
            try:
                folder = request.form['add_folder']
            except:
                folder = request.form['add_folder_recursively']

            if not folder.endswith('/'):
                folder += '/'

            print('folder:', folder)

            if os.path.isdir(var.config.get('bot', 'music_folder') + folder):

                files = util.get_recursive_filelist_sorted(var.music_folder)
                music_library = util.Dir(folder_path)
                for file in files:
                    music_library.add_file(file)

                if 'add_folder_recursively' in request.form:
                    files = music_library.get_files_recursively(folder)
                else:
                    files = music_library.get_files(folder)

                files = list(
                    map(
                        lambda file: util.get_music_tag_info(
                            {
                                'type': 'file',
                                'path': os.path.join(folder, file),
                                'user': '******'
                            }), files))

                for file in files:
                    logging.info("web: add to playlist: %s" % file['path'])

                var.playlist.extend(files)

        elif 'add_url' in request.form:
            music = {
                'type': 'url',
                'url': request.form['add_url'],
                'user': '******',
                'ready': 'validation'
            }
            media.url.get_url_info(music)
            var.playlist.append(music)
            logging.info("web: add to playlist: " + request.form['add_url'])
            var.playlist.playlist[-1]['ready'] = "no"

        elif 'add_radio' in request.form:
            var.playlist.append({
                'type': 'radio',
                'path': request.form['add_radio'],
                'user': "******"
            })
            logging.info("web: add to playlist: " + request.form['add_radio'])

        elif 'delete_music' in request.form:
            music = var.playlist.playlist[int(request.form['delete_music'])]
            logging.info(
                "web: delete from playlist: " +
                str(music['path'] if 'path' in music else music['url']))

            if var.playlist.length() >= int(request.form['delete_music']):
                if int(request.form['delete_music']
                       ) == var.playlist.current_index:
                    var.playlist.remove(int(request.form['delete_music']))
                    var.botamusique.stop()
                    var.botamusique.launch_music(
                        int(request.form['delete_music']))
                else:
                    var.playlist.remove(int(request.form['delete_music']))

        elif 'play_music' in request.form:
            music = var.playlist.playlist[int(request.form['play_music'])]
            logging.info(
                "web: jump to: " +
                str(music['path'] if 'path' in music else music['url']))

            if len(var.playlist.playlist) >= int(request.form['play_music']):
                var.botamusique.stop()
                var.botamusique.launch_music(int(request.form['play_music']))

        elif 'delete_music_file' in request.form and ".." not in request.form[
                'delete_music_file']:
            path = var.config.get(
                'bot', 'music_folder') + request.form['delete_music_file']
            if os.path.isfile(path):
                logging.info("web: delete file " + path)
                os.remove(path)

        elif 'delete_folder' in request.form and ".." not in request.form[
                'delete_folder']:
            path = var.config.get(
                'bot', 'music_folder') + request.form['delete_folder']
            if os.path.isdir(path):
                logging.info("web: delete folder " + path)
                shutil.rmtree(path)
                time.sleep(0.1)

        elif 'action' in request.form:
            action = request.form['action']
            if action == "randomize":
                var.botamusique.stop()
                var.playlist.randomize()
                var.botamusique.resume()
            elif action == "stop":
                var.botamusique.stop()
            elif action == "pause":
                var.botamusique.pause()
            elif action == "resume":
                var.botamusique.resume()
            elif action == "clear":
                var.botamusique.clear()
            elif action == "volume_up":
                if var.botamusique.volume_set + 0.03 < 1.0:
                    var.botamusique.volume_set = var.botamusique.volume_set + 0.03
                else:
                    var.botamusique.volume_set = 1.0
                logging.info("web: volume up to %d" %
                             (var.botamusique.volume_set * 100))
            elif action == "volume_down":
                if var.botamusique.volume_set - 0.03 > 0:
                    var.botamusique.volume_set = var.botamusique.volume_set - 0.03
                else:
                    var.botamusique.volume_set = 0
                logging.info("web: volume up to %d" %
                             (var.botamusique.volume_set * 100))

        if (var.playlist.length() > 0):
            return jsonify({
                'ver': var.playlist.version,
                'empty': False,
                'play': not var.botamusique.is_pause
            })
        else:
            return jsonify({
                'ver': var.playlist.version,
                'empty': True,
                'play': False
            })
Exemple #9
0
    def message_received(self, text):
        message = text.message.strip()
        user = self.mumble.users[text.actor]['name']
        if var.config.getboolean('command', 'split_username_at_space'):
            user = user.split()[0]
        if message[0] == var.config.get('command', 'command_symbol'):
            message = message[1:].split(' ', 1)
            if len(message) > 0:
                command = message[0]
                parameter = ''
                if len(message) > 1:
                    parameter = message[1]

            else:
                return

            logging.info(command + ' - ' + parameter + ' by ' + user)

            if command == var.config.get('command', 'joinme'):
                self.mumble.users.myself.move_in(
                    self.mumble.users[text.actor]['channel_id'])
                return

            if not self.is_admin(user) and not var.config.getboolean(
                    'bot', 'allow_other_channel_message'
            ) and self.mumble.users[text.actor][
                    'channel_id'] != self.mumble.users.myself['channel_id']:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'not_in_my_channel'))
                return

            if not self.is_admin(user) and not var.config.getboolean(
                    'bot', 'allow_private_message') and text.session:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'pm_not_allowed'))
                return

            for i in var.db.items("user_ban"):
                if user.lower() == i[0]:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'user_ban'))
                    return

            if command == var.config.get('command', 'user_ban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(
                            util.user_ban(parameter))
                    else:
                        self.mumble.users[text.actor].send_message(
                            util.get_user_ban())
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'user_unban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(
                            util.user_unban(parameter))
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'url_ban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(
                            util.url_ban(self.get_url_from_input(parameter)))
                    else:
                        self.mumble.users[text.actor].send_message(
                            util.get_url_ban())
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'url_unban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_message(
                            util.url_unban(self.get_url_from_input(parameter)))
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))
                return

            if parameter:
                for i in var.db.items("url_ban"):
                    if self.get_url_from_input(parameter.lower()) == i[0]:
                        self.mumble.users[text.actor].send_message(
                            var.config.get('strings', 'url_ban'))
                        return

            if command == var.config.get('command', 'play_file') and parameter:
                music_folder = var.config.get('bot', 'music_folder')
                # sanitize "../" and so on
                path = os.path.abspath(os.path.join(music_folder, parameter))
                if path.startswith(music_folder):
                    if os.path.isfile(path):
                        filename = path.replace(music_folder, '')
                        music = {
                            'type': 'file',
                            'path': filename,
                            'user': user
                        }
                        var.playlist.append(music)
                    else:
                        # try to do a partial match
                        matches = [
                            file for file in
                            util.get_recursive_filelist_sorted(music_folder)
                            if parameter.lower() in file.lower()
                        ]
                        if len(matches) == 0:
                            self.send_msg(var.config.get('strings', 'no_file'),
                                          text)
                        elif len(matches) == 1:
                            music = {
                                'type': 'file',
                                'path': matches[0],
                                'user': user
                            }
                            var.playlist.append(music)
                        else:
                            messages = var.config.get(
                                'strings', 'multiple_matches') + '<br />'
                            messages += '<br />'.join(matches)
                            self.send_msg(messages, text)
                else:
                    self.send_msg(var.config.get('strings', 'bad_file'), text)
                self.async_download_next()

            elif command in [
                    var.config.get('command', 'play_url'),
                    var.config.get('command', 'play_search')
            ] and parameter:
                if command == var.config.get('command', 'play_search'):
                    parameter = media.url.search_youtube_url(parameter)
                    if not parameter:
                        self.send_msg(
                            var.config.get('strings', 'unable_download'), text)
                        return

                music = {
                    'type': 'url',
                    'url': self.get_url_from_input(parameter),
                    'user': user,
                    'ready': 'validation'
                }
                var.playlist.append(music)

                if media.url.get_url_info():
                    if var.playlist[-1]['duration'] > var.config.getint(
                            'bot', 'max_track_duration'):
                        var.playlist.pop()
                        self.send_msg(var.config.get('strings', 'too_long'),
                                      text)
                    else:
                        for i in var.db.options("url_ban"):
                            print(i, ' -> ', {var.playlist[-1]["url"]})
                            if var.playlist[-1]['url'] == i:
                                self.mumble.users[text.actor].send_message(
                                    var.config.get('strings', 'url_ban'))
                                var.playlist.pop()
                                return
                        var.playlist[-1]['ready'] = "no"
                        self.async_download_next()
                else:
                    var.playlist.pop()
                    self.send_msg(var.config.get('strings', 'unable_download'),
                                  text)

            elif command == var.config.get('command',
                                           'play_playlist') and parameter:
                offset = 0
                try:
                    offset = int(parameter.split(" ")[-1])
                except ValueError:
                    pass
                if media.playlist.get_playlist_info(
                        url=self.get_url_from_input(parameter),
                        start_index=offset,
                        user=user):
                    self.async_download_next()

            elif command == var.config.get('command',
                                           'play_autoplay') and parameter:
                parameter = media.url.search_youtube_url(parameter)
                music = {
                    'type': 'url',
                    'url': self.get_url_from_input(parameter),
                    'user': user,
                    'ready': 'validation'
                }
                var.playlist.append(music)

                for i in range(var.config.getint('bot', 'max_track_playlist')):
                    if media.url.get_url_info():
                        if var.playlist[-1]['duration'] > var.config.getint(
                                'bot', 'max_track_duration'):
                            var.playlist.pop()
                            self.send_msg(
                                var.config.get('strings', 'too_long'), text)
                        else:
                            for i in var.db.options("url_ban"):
                                print(i, ' -> ', {var.playlist[-1]["url"]})
                                if var.playlist[-1]['url'] == i:
                                    self.mumble.users[text.actor].send_message(
                                        var.config.get('strings', 'url_ban'))
                                    var.playlist.pop()
                                    return
                            var.playlist[-1]['ready'] = "no"
                            self.async_download_next()
                            parameter = media.url.get_youtube_recommendation(
                                parameter)
                            music = {
                                'type': 'url',
                                'url': self.get_url_from_input(parameter),
                                'user': user,
                                'ready': 'validation'
                            }
                            var.playlist.append(music)
                    else:
                        var.playlist.pop()
                        self.send_msg(
                            var.config.get('strings', 'unable_download'), text)

            elif command == var.config.get('command',
                                           'play_radio') and parameter:
                if var.config.has_option('radio', parameter):
                    parameter = var.config.get('radio', parameter)
                music = {
                    'type': 'radio',
                    'url': self.get_url_from_input(parameter),
                    'user': user
                }
                var.playlist.append(music)
                self.async_download_next()

            elif command == var.config.get('command', 'help'):
                self.send_msg(var.config.get('strings', 'help'), text)

            elif command == var.config.get('command', 'stop'):
                self.stop()

            elif command == var.config.get('command', 'kill'):
                if self.is_admin(user):
                    self.stop()
                    self.exit = True
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'update'):
                if self.is_admin(user):
                    self.mumble.users[text.actor].send_message(
                        "Starting the update")
                    tp = sp.check_output([
                        var.config.get('bot', 'pip3_path'), 'install',
                        '--upgrade', 'youtube-dl'
                    ]).decode()
                    messages = []
                    need_restart = False
                    if "Requirement already up-to-date" in tp:
                        messages.append("Youtube-dl is up-to-date")
                    else:
                        messages.append("Update done : " +
                                        tp.split('Successfully installed')[1])
                    if 'up to date' in sp.check_output(
                        ['/usr/bin/git', 'pull']).decode():
                        messages.append("I'm up-to-date")
                    else:
                        messages.append("Updated source code, restarting..")
                        need_restart = True
                    self.mumble.users[text.actor].send_message(
                        '<br>'.join(messages))
                    if need_restart:
                        sp.check_output([
                            var.config.get('bot', 'pip3_path'), 'install',
                            '-r', 'requirements.txt'
                        ]).decode()
                        os.execv(sys.executable, ['python'] + sys.argv)
                else:
                    self.mumble.users[text.actor].send_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'stop_and_getout'):
                self.stop()
                if self.channel:
                    self.mumble.channels.find_by_name(self.channel).move_in()

            elif command == var.config.get('command', 'volume'):
                if parameter is not None and parameter.isdigit(
                ) and 0 <= int(parameter) <= 100:
                    self.volume = float(float(parameter) / 100)
                    self.send_msg(
                        var.config.get('strings', 'change_volume') %
                        (int(self.volume * 100),
                         self.mumble.users[text.actor]['name']), text)
                    var.db.set('bot', 'volume', str(self.volume))
                else:
                    self.send_msg(
                        var.config.get('strings', 'current_volume') %
                        int(self.volume * 100), text)

            elif command == var.config.get('command', 'current_music'):
                if len(var.playlist) > 0:
                    source = var.playlist[0]["type"]
                    if source == "radio":
                        reply = "[radio] {title} on {url} by {user}".format(
                            title=media.radio.get_radio_title(
                                var.playlist[0]["url"]),
                            url=var.playlist[0]["title"],
                            user=var.playlist[0]["user"])
                    elif source == "url" and 'from_playlist' in var.playlist[0]:
                        reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format(
                            title=var.playlist[0]["title"],
                            url=var.playlist[0]["playlist_url"],
                            playlist=var.playlist[0]["playlist_title"],
                            user=var.playlist[0]["user"])
                    elif source == "url":
                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format(
                            title=var.playlist[0]["title"],
                            url=var.playlist[0]["url"],
                            user=var.playlist[0]["user"])
                    elif source == "file":
                        reply = "[file] {title} by {user}".format(
                            title=var.playlist[0]["title"],
                            user=var.playlist[0]["user"])
                    else:
                        reply = "ERROR"
                        logging.error(var.playlist)
                else:
                    reply = var.config.get('strings', 'not_playing')

                self.send_msg(reply, text)

            elif command == var.config.get('command', 'skip'):
                if parameter == '':
                    parameter = 0
                elif parameter.isdigit():
                    parameter = int(parameter)
                else:
                    self.send_msg(var.config.get('strings', 'no_possible'),
                                  text)
                    return

                if len(var.playlist) > 0:
                    removed = var.playlist.pop(parameter)
                    removed = removed.get('title', removed['url'])
                    self.send_msg(
                        var.config.get('strings', 'removing_item') % removed,
                        text)

                    if len(var.playlist) == 0:
                        self.stop()
                    else:
                        self.launch_music()
                        self.async_download_next()

                if len(var.playlist) == 0:
                    self.send_msg(var.config.get('strings', 'queue_empty'),
                                  text)

            elif command == var.config.get('command', 'list'):
                folder_path = var.config.get('bot', 'music_folder')

                files = util.get_recursive_filelist_sorted(folder_path)
                if files:
                    self.send_msg('<br>'.join(files), text)
                else:
                    self.send_msg(var.config.get('strings', 'no_file'), text)

            elif command == var.config.get('command', 'queue'):
                if len(var.playlist) <= 1:
                    messages = var.config.get('strings', 'queue_empty')
                else:
                    messages = var.config.get('strings',
                                              'queue_contents') + '<br />'
                    i = 1
                    for value in var.playlist[1:]:
                        messages += '[{}] ({}) {}<br />'.format(
                            i, value['type'], value['title']
                            if 'title' in value else value['url'])
                        i += 1

                self.send_msg(messages, text)

            elif command == var.config.get('command', 'repeat'):
                var.playlist.append(var.playlist[0])

            else:
                self.mumble.users[text.actor].send_message(
                    var.config.get('strings', 'bad_command'))
Exemple #10
0
def index():
    folder_path = var.music_folder
    files = util.get_recursive_filelist_sorted(var.music_folder)
    music_library = util.Dir(folder_path)
    for file in files:
        music_library.add_file(file)

    if request.method == 'POST':
        print(request.form)
        if 'add_file' in request.form and ".." not in request.form['add_file']:
            item = {'type': 'file',
                    'path' : request.form['add_file'],
                    'user' : 'Web'}
            var.playlist.append(item)

        elif ('add_folder' in request.form and ".." not in request.form['add_folder']) or ('add_folder_recursively' in request.form and ".." not in request.form['add_folder_recursively']):
            try:
                folder = request.form['add_folder']
            except:
                folder = request.form['add_folder_recursively']

            if not folder.endswith('/'):
                folder += '/'

            print('folder:', folder)
            if 'add_folder_recursively' in request.form:
                files = music_library.get_files_recursively(folder)
            else:
                files = music_library.get_files(folder)
            files = list(map(lambda file: {'type':'file','path': os.path.join(folder, file), 'user':'******'}, files))
            print('Adding to playlist: ', files)
            var.playlist.extend(files)

        elif 'add_url' in request.form:
            var.playlist.append({'type':'url',
                                'url': request.form['add_url'],
                                'user': '******',
                                'ready': 'validation'})
            media.url.get_url_info()
            var.playlist[-1]['ready'] = "no"

        elif 'add_radio' in request.form:
            var.playlist.append({'type': 'radio',
                                'path': request.form['add_radio'],
                                'user': "******"})

        elif 'delete_music' in request.form:
            if len(var.playlist) >= request.form['delete_music']:
                var.playlist.pop(request.form['delete_music'])
        
        elif 'action' in request.form:
            action = request.form['action']
            if action == "randomize":
                random.shuffle(var.playlist)

    return render_template('index.html',
                           all_files=files,
                           music_library=music_library,
                           os=os,
                           playlist=var.playlist,
                           user=var.user)
Exemple #11
0
def cmd_play_file(bot, user, text, command, parameter):
    music_folder = var.config.get('bot', 'music_folder')
    # if parameter is {index}
    if parameter.isdigit():
        files = util.get_recursive_filelist_sorted(music_folder)
        if int(parameter) < len(files):
            filename = files[int(parameter)].replace(music_folder, '')
            music = {'type': 'file',
                     'path': filename,
                     'user': user}
            logging.info("cmd: add to playlist: " + filename)
            var.playlist.append(music)
            bot.send_msg(var.config.get('strings', 'file_added') + music['title'], text)

    # if parameter is {path}
    else:
        # sanitize "../" and so on
        path = os.path.abspath(os.path.join(music_folder, parameter))
        if not path.startswith(os.path.abspath(music_folder)):
            bot.send_msg(var.config.get('strings', 'no_file'), text)
            return

        if os.path.isfile(path):
            music = {'type': 'file',
                     'path': parameter,
                     'user': user}
            logging.info("cmd: add to playlist: " + parameter)
            music = var.playlist.append(music)
            bot.send_msg(var.config.get('strings', 'file_added') + music['title'], text)
            return

        # if parameter is {folder}
        elif os.path.isdir(path):
            if parameter != '.' and parameter != './':
                if not parameter.endswith("/"):
                    parameter += "/"
            else:
                parameter = ""

            files = util.get_recursive_filelist_sorted(music_folder)
            music_library = util.Dir(music_folder)
            for file in files:
                music_library.add_file(file)

            files = music_library.get_files(parameter)
            msgs = [var.config.get('strings', 'file_added')]
            count = 0

            for file in files:
                count += 1
                music = {'type': 'file',
                         'path': file,
                         'user': user}
                logging.info("cmd: add to playlist: " + file)
                music = var.playlist.append(music)

                msgs.append("{} ({})".format(music['title'], music['path']))

            if count != 0:
                send_multi_lines(bot, msgs, text)
            else:
                bot.send_msg(var.config.get('strings', 'no_file'), text)

        else:
            # try to do a partial match
            files = util.get_recursive_filelist_sorted(music_folder)
            matches = [(index, file) for index, file in enumerate(files) if parameter.lower() in file.lower()]
            if len(matches) == 0:
                bot.send_msg(var.config.get(
                    'strings', 'no_file'), text)
            elif len(matches) == 1:
                music = {'type': 'file',
                         'path': matches[0][1],
                         'user': user}
                logging.info("cmd: add to playlist: " + matches[0][1])
                music = var.playlist.append(music)
                bot.send_msg(var.config.get( 'strings', 'file_added')
                             + "{} ({})".format(music['title'], music['path']), text)
            else:
                msgs = [ var.config.get('strings', 'multiple_matches') ]
                for match in matches:
                    msgs.append("<b>{:0>3d}</b> - {:s}".format(match[0], match[1]))
                send_multi_lines(bot, msgs, text)
Exemple #12
0
    def message_received(self, text):

        message = text.message.strip()
        user = self.mumble.users[text.actor]['name']

        if var.config.getboolean('command', 'split_username_at_space'):
            # in can you use https://github.com/Natenom/mumblemoderator-module-collection/tree/master/os-suffixes , you want to split the username
            user = user.split()[0]

        if message[0] == var.config.get('command', 'command_symbol'):
            # remove the symbol from the message
            message = message[1:].split(' ', 1)

            # use the first word as a command, the others one as  parameters
            if len(message) > 0:
                command = message[0]
                parameter = ''
                if len(message) > 1:
                    parameter = message[1]

            else:
                return

            logging.info(command + ' - ' + parameter + ' by ' + user)

            if command == var.config.get('command', 'joinme'):
                self.mumble.users.myself.move_in(
                    self.mumble.users[text.actor]['channel_id'],
                    token=parameter)
                return

            # Anti stupid guy function
            if not self.is_admin(user) and not var.config.getboolean(
                    'bot', 'allow_other_channel_message'
            ) and self.mumble.users[text.actor][
                    'channel_id'] != self.mumble.users.myself['channel_id']:
                self.mumble.users[text.actor].send_text_message(
                    var.config.get('strings', 'not_in_my_channel'))
                return

            if not self.is_admin(user) and not var.config.getboolean(
                    'bot', 'allow_private_message') and text.session:
                self.mumble.users[text.actor].send_text_message(
                    var.config.get('strings', 'pm_not_allowed'))
                return

            ###
            # Admin command
            ###
            for i in var.db.items("user_ban"):
                if user.lower() == i[0]:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'user_ban'))
                    return

            if command == var.config.get('command', 'user_ban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_text_message(
                            util.user_ban(parameter))
                    else:
                        self.mumble.users[text.actor].send_text_message(
                            util.get_user_ban())
                else:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'user_unban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_text_message(
                            util.user_unban(parameter))
                else:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'url_ban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_text_message(
                            util.url_ban(self.get_url_from_input(parameter)))
                    else:
                        self.mumble.users[text.actor].send_text_message(
                            util.get_url_ban())
                else:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'not_admin'))
                return

            elif command == var.config.get('command', 'url_unban'):
                if self.is_admin(user):
                    if parameter:
                        self.mumble.users[text.actor].send_text_message(
                            util.url_unban(self.get_url_from_input(parameter)))
                else:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'not_admin'))
                return

            if parameter:
                for i in var.db.items("url_ban"):
                    if self.get_url_from_input(parameter.lower()) == i[0]:
                        self.mumble.users[text.actor].send_text_message(
                            var.config.get('strings', 'url_ban'))
                        return

            ###
            # everyday commands
            ###
            if command == var.config.get('command', 'play_file') and parameter:
                music_folder = var.config.get('bot', 'music_folder')
                # sanitize "../" and so on
                path = os.path.abspath(os.path.join(music_folder, parameter))
                if path.startswith(music_folder):
                    if os.path.isfile(path):
                        filename = path.replace(music_folder, '')
                        music = {
                            'type': 'file',
                            'path': filename,
                            'user': user
                        }
                        var.playlist.append(music)
                    else:
                        # try to do a partial match
                        matches = [
                            file for file in
                            util.get_recursive_filelist_sorted(music_folder)
                            if parameter.lower() in file.lower()
                        ]
                        if len(matches) == 0:
                            self.send_msg(var.config.get('strings', 'no_file'),
                                          text)
                        elif len(matches) == 1:
                            music = {
                                'type': 'file',
                                'path': matches[0],
                                'user': user
                            }
                            var.playlist.append(music)
                        else:
                            msg = var.config.get('strings',
                                                 'multiple_matches') + '<br />'
                            msg += '<br />'.join(matches)
                            self.send_msg(msg, text)
                else:
                    self.send_msg(var.config.get('strings', 'bad_file'), text)
                self.async_download_next()

            elif command == var.config.get('command',
                                           'play_url') and parameter:
                music = {
                    'type': 'url',
                    # grab the real URL
                    'url': self.get_url_from_input(parameter),
                    'user': user,
                    'ready': 'validation'
                }
                var.playlist.append(music)

                if media.url.get_url_info():
                    if var.playlist[-1]['duration'] > var.config.getint(
                            'bot', 'max_track_duration'):
                        var.playlist.pop()
                        self.send_msg(var.config.get('strings', 'too_long'),
                                      text)
                    else:
                        for i in var.db.options("url_ban"):
                            if var.playlist[-1]['url'] == i:
                                self.mumble.users[
                                    text.actor].send_text_message(
                                        var.config.get('strings', 'url_ban'))
                                var.playlist.pop()
                                return
                        var.playlist[-1]['ready'] = "no"
                        self.async_download_next()
                else:
                    var.playlist.pop()
                    self.send_msg(var.config.get('strings', 'unable_download'),
                                  text)

            elif command == var.config.get('command',
                                           'play_playlist') and parameter:
                offset = 1  # if you want to start the playlist at a specific index
                try:
                    offset = int(parameter.split(" ")[-1])
                except ValueError:
                    pass
                if media.playlist.get_playlist_info(
                        url=self.get_url_from_input(parameter),
                        start_index=offset,
                        user=user):
                    self.async_download_next()

            elif command == var.config.get('command', 'play_radio'):
                if not parameter:
                    all_radio = var.config.items('radio')
                    msg = var.config.get('strings',
                                         'preconfigurated_radio') + " :"
                    for i in all_radio:
                        comment = ""
                        if len(i[1].split(maxsplit=1)) == 2:
                            comment = " - " + i[1].split(maxsplit=1)[1]
                        msg += "<br />" + i[0] + comment
                    self.send_msg(msg, text)
                else:
                    if var.config.has_option('radio', parameter):
                        parameter = var.config.get('radio', parameter)
                        parameter = parameter.split()[0]
                    url = self.get_url_from_input(parameter)
                    if url:
                        music = {'type': 'radio', 'url': url, 'user': user}
                        var.playlist.append(music)
                        self.async_download_next()
                    else:
                        self.send_msg(var.config.get('strings', 'bad_url'))
            # query http://www.radio-browser.info API for a radio station
            elif command == var.config.get('command', 'rb_query'):
                logging.info('Querying radio stations')
                if not parameter:
                    logging.debug('rbquery without parameter')
                    msg += 'You have to add a query text to search for a matching radio stations.'
                    self.send_msg(msg, text)
                else:
                    logging.debug('Found query parameter: ' + parameter)
                    # self.send_msg('Searching for stations - this may take some seconds...', text)
                    rb_stations = radiobrowser.getstations_byname(parameter)
                    msg = var.config.get('strings', 'rbqueryresult') + " :"
                    msg += '\n<table><tr><th>!rbplay ID</th><th>Station Name</th><th>Genre</th><th>Codec/Bitrate</th><th>Country</th></tr>'
                    if not rb_stations:
                        logging.debug('No matches found for rbquery ' +
                                      parameter)
                        self.send_msg(
                            'Radio-Browser found no matches for ' + parameter,
                            text)
                    else:
                        for s in rb_stations:
                            stationid = s['id']
                            stationname = s['stationname']
                            country = s['country']
                            codec = s['codec']
                            bitrate = s['bitrate']
                            genre = s['genre']
                            # msg += f'<tr><td>{stationid}</td><td>{stationname}</td><td>{genre}</td><td>{codec}/{bitrate}</td><td>{country}</td></tr>'
                            msg += '<tr><td>%s</td><td>%s</td><td>%s</td><td>%s/%s</td><td>%s</td></tr>' % (
                                stationid, stationname, genre, codec, bitrate,
                                country)
                        msg += '</table>'
                        # Full message as html table
                        if len(msg) <= 5000:
                            self.send_msg(msg, text)
                        # Shorten message if message too long (stage I)
                        else:
                            logging.debug('Result too long stage I')
                            msg = var.config.get(
                                'strings',
                                'rbqueryresult') + " :" + ' (shortened L1)'
                            msg += '\n<table><tr><th>!rbplay ID</th><th>Station Name</th></tr>'
                            for s in rb_stations:
                                stationid = s['id']
                                stationname = s['stationname']
                                # msg += f'<tr><td>{stationid}</td><td>{stationname}</td>'
                                msg += '<tr><td>%s</td><td>%s</td>' % (
                                    stationid, stationname)
                            msg += '</table>'
                            if len(msg) <= 5000:
                                self.send_msg(msg, text)
                            # Shorten message if message too long (stage II)
                            else:
                                logging.debug('Result too long stage II')
                                msg = var.config.get(
                                    'strings',
                                    'rbqueryresult') + " :" + ' (shortened L2)'
                                msg += '!rbplay ID - Station Name'
                                for s in rb_stations:
                                    stationid = s['id']
                                    stationname = s['stationname'][:12]
                                    # msg += f'{stationid} - {stationname}'
                                    msg += '%s - %s' % (stationid, stationname)
                                if len(msg) <= 5000:
                                    self.send_msg(msg, text)
                                # Message still too long
                                else:
                                    self.send_msg(
                                        'Query result too long to post (> 5000 characters), please try another query.',
                                        text)
            # Play a secific station (by id) from http://www.radio-browser.info API
            elif command == var.config.get('command', 'rb_play'):
                logging.debug('Play a station by ID')
                if not parameter:
                    logging.debug('rbplay without parameter')
                    msg += 'Please enter a station ID from rbquery. Example: !rbplay 96748'
                    self.send_msg(msg, text)
                else:
                    logging.debug('Retreiving url for station ID ' + parameter)
                    rstation = radiobrowser.getstationname_byid(parameter)
                    stationname = rstation[0]['name']
                    country = rstation[0]['country']
                    codec = rstation[0]['codec']
                    bitrate = rstation[0]['bitrate']
                    genre = rstation[0]['tags']
                    homepage = rstation[0]['homepage']
                    msg = 'Radio station added to playlist:'
                    # msg += '<table><tr><th>ID</th><th>Station Name</th><th>Genre</th><th>Codec/Bitrate</th><th>Country</th><th>Homepage</th></tr>' + \
                    #       f'<tr><td>{parameter}</td><td>{stationname}</td><td>{genre}</td><td>{codec}/{bitrate}</td><td>{country}</td><td>{homepage}</td></tr></table>'
                    msg += '<table><tr><th>ID</th><th>Station Name</th><th>Genre</th><th>Codec/Bitrate</th><th>Country</th><th>Homepage</th></tr>' + \
                          '<tr><td>%s</td><td>%s</td><td>%s</td><td>%s/%s</td><td>%s</td><td>%s</td></tr></table>' \
                           % (parameter, stationname, genre, codec, bitrate, country, homepage)
                    logging.debug('Added station to playlist %s' % stationname)
                    self.send_msg(msg, text)
                    url = radiobrowser.geturl_byid(parameter)
                    if url != "-1":
                        logging.info('Found url: ' + url)
                        music = {'type': 'radio', 'url': url, 'user': user}
                        var.playlist.append(music)
                        self.async_download_next()
                    else:
                        logging.info('No playable url found.')
                        msg += "No playable url found for this station, please try another station."
                        self.send_msg(msg, text)

            elif command == var.config.get('command', 'help'):
                self.send_msg(var.config.get('strings', 'help'), text)
                if self.is_admin(user):
                    self.send_msg(var.config.get('strings', 'admin_help'),
                                  text)

            elif command == var.config.get('command', 'stop'):
                self.stop()

            elif command == var.config.get('command', 'kill'):
                if self.is_admin(user):
                    self.stop()
                    self.exit = True
                else:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'update'):
                if self.is_admin(user):
                    self.mumble.users[text.actor].send_text_message(
                        "Starting the update")
                    # Need to be improved
                    msg = util.update(version)
                    self.mumble.users[text.actor].send_text_message(msg)
                else:
                    self.mumble.users[text.actor].send_text_message(
                        var.config.get('strings', 'not_admin'))

            elif command == var.config.get('command', 'stop_and_getout'):
                self.stop()
                if self.channel:
                    self.mumble.channels.find_by_name(self.channel).move_in()

            elif command == var.config.get('command', 'volume'):
                # The volume is a percentage
                if parameter is not None and parameter.isdigit(
                ) and 0 <= int(parameter) <= 100:
                    self.volume = float(float(parameter) / 100)
                    self.send_msg(
                        var.config.get('strings', 'change_volume') %
                        (int(self.volume * 100),
                         self.mumble.users[text.actor]['name']), text)
                    var.db.set('bot', 'volume', str(self.volume))
                else:
                    self.send_msg(
                        var.config.get('strings', 'current_volume') %
                        int(self.volume * 100), text)

            elif command == var.config.get('command', 'current_music'):
                if len(var.playlist) > 0:
                    source = var.playlist[0]["type"]
                    if source == "radio":
                        reply = "[radio] {title} on {url} by {user}".format(
                            title=media.radio.get_radio_title(
                                var.playlist[0]["url"]),
                            url=var.playlist[0]["title"],
                            user=var.playlist[0]["user"])
                    elif source == "url" and 'from_playlist' in var.playlist[0]:
                        reply = "[playlist] {title} (from the playlist <a href=\"{url}\">{playlist}</a> by {user}".format(
                            title=var.playlist[0]["title"],
                            url=var.playlist[0]["playlist_url"],
                            playlist=var.playlist[0]["playlist_title"],
                            user=var.playlist[0]["user"])
                    elif source == "url":
                        reply = "[url] {title} (<a href=\"{url}\">{url}</a>) by {user}".format(
                            title=var.playlist[0]["title"],
                            url=var.playlist[0]["url"],
                            user=var.playlist[0]["user"])
                    elif source == "file":
                        reply = "[file] {title} by {user}".format(
                            title=var.playlist[0]["title"],
                            user=var.playlist[0]["user"])
                    else:
                        reply = "ERROR"
                        logging.error(var.playlist)
                else:
                    reply = var.config.get('strings', 'not_playing')

                self.send_msg(reply, text)

            elif command == var.config.get('command', 'skip'):
                # Allow to remove specific music into the queue with a number
                if parameter is not None and parameter.isdigit(
                ) and int(parameter) > 0:
                    if int(parameter) < len(var.playlist):
                        removed = var.playlist.pop(int(parameter))

                        # the Title isn't here if the music wasn't downloaded
                        self.send_msg(
                            var.config.get('strings', 'removing_item') %
                            (removed['title']
                             if 'title' in removed else removed['url']), text)
                    else:
                        self.send_msg(var.config.get('strings', 'no_possible'),
                                      text)
                elif self.next(
                ):  # Is no number send, just skip the current music
                    self.launch_music()
                    self.async_download_next()
                else:
                    self.send_msg(var.config.get('strings', 'queue_empty'),
                                  text)
                    self.stop()

            elif command == var.config.get('command', 'list'):
                folder_path = var.config.get('bot', 'music_folder')

                files = util.get_recursive_filelist_sorted(folder_path)
                if files:
                    self.send_msg('<br>'.join(files), text)
                else:
                    self.send_msg(var.config.get('strings', 'no_file'), text)

            elif command == var.config.get('command', 'queue'):
                if len(var.playlist) <= 1:
                    msg = var.config.get('strings', 'queue_empty')
                else:
                    msg = var.config.get('strings',
                                         'queue_contents') + '<br />'
                    i = 1
                    for value in var.playlist[1:]:
                        msg += '[{}] ({}) {}<br />'.format(
                            i, value['type'], value['title']
                            if 'title' in value else value['url'])
                        i += 1

                self.send_msg(msg, text)

            elif command == var.config.get('command', 'repeat'):
                var.playlist.append(var.playlist[0])

            else:
                self.mumble.users[text.actor].send_text_message(
                    var.config.get('strings', 'bad_command'))