Beispiel #1
0
    def setup(self, f):
        # super() for classic classes:
        VolBot.setup(self, f)

        for command in ['add','remove','show','pause','resume','skip','status','dump', 'oops']:
            f.register_command(command, self.request_queue_song)
        self.api_inst = MPDApi()
Beispiel #2
0
class MPDBot(VolBot):
    bot_name = "foss_mpdbot"
    song_request_db = {}
    current_song = None

    def setup(self, f):
        # super() for classic classes:
        VolBot.setup(self, f)

        for command in ['add','remove','show','pause','resume','skip','status','dump', 'oops']:
            f.register_command(command, self.request_queue_song)
        self.api_inst = MPDApi()

    def _playback_status(self):
        if not self.current_song == self.api_inst.current_song:
            self.current_song = self.api_inst.current_song
            if self.current_song:
                self.describe(self.channel, 'Playing "%s" by "%s"' % \
                    (self.current_song['SongName'], self.current_song['ArtistName']))

    def check_status(self):
        threads.deferToThread(self._playback_status).addErrback(util.err_console)

    def _add_lookup_cb(self, song_packet, responder, user):
        if not song_packet:
            responder("No songs found.")

        elif song_packet['SongID'] in self.api_inst.queue:
            responder('"%s" by "%s" is already in queue' % (\
                song_packet['SongName'], song_packet['ArtistName']))
        else:
            responder('Queueing %s: "%s" by "%s" on "%s"' % (\
                song_packet['SongID'], song_packet['SongName'],
                song_packet['ArtistName'], song_packet['AlbumName']))
            self.song_request_db[song_packet['SongID']] = user
            threads.deferToThread(self.api_inst.queue_song, song_packet['SongID']).addErrback(util.err_chat, responder)

    def request_queue_song(self, responder, user, channel, command, msg):
        if channel == self.bot_name and not command in ['show', 'dump', 'status', 'vol']:
            responder("Let's talk to the class")
            return
        if command == "add":
            responder("Got Request, processing")
            threads.deferToThread(self.api_inst.request_song_from_api, msg).addCallback(self._add_lookup_cb, responder, user).addErrback(util.err_chat, responder)

        elif command == "remove":
            if self.api_inst.remove_queue(msg):
                responder('Removed %s' % msg)
            else:
                responder('Could not remove %s' % msg)

        elif command == "oops":
            queue = self.api_inst.queue.reverse()
            for id in queue:
                if user == self.song_request_db[id]:
                    self.api_inst.remove_queue(id)
                    responder('Removed %s' % id)
                    break
            else:
                responder('There was nothing to remove')

        elif command == "show":
            songNames = []
            song_db = self.api_inst.song_db
            for id in self.api_inst.queue:
                songNames.append('"%s" by "%s"' % (song_db[id]['SongName'], song_db[id]['ArtistName']))
            responder(', '.join(songNames))

        elif command == "dump":
            song_db = self.api_inst.song_db
            for id in self.api_inst.queue:
                responder('%s [%s]: "%s" by "%s" on "%s"' % ( id,
                    self.song_request_db.get(id, 'radio'),
                    song_db[id]['SongName'], song_db[id]['ArtistName'],
                    song_db[id]['AlbumName']))

        elif command == "pause":
            threads.deferToThread(self.api_inst.api_pause).addCallback(util.ok, responder).addErrback(util.err_chat, responder)

        elif command == "resume":
            threads.deferToThread(self.api_inst.api_play).addCallback(util.ok, responder).addErrback(util.err_chat, responder)

        elif command == "skip":
            threads.deferToThread(self.api_inst.api_next).addCallback(util.ok, responder).addErrback(util.err_chat, responder)

        elif command == "status":
            song = self.api_inst.current_song
            if song:
                responder('"%s" by "%s"' % (song['SongName'], song['ArtistName']))
            else:
                responder("No song playing.")