예제 #1
0
파일: aimap.py 프로젝트: storedenen/mage
    def getAiPath(self, start, goal):
        bfsQueue = Queue()
        used = set()

        currentState = (start, [], 1)
        bfsQueue.push(currentState)
        while (not bfsQueue.isEmpty() and
               not self.isGoalState(currentState[0], goal)):
            currentState = bfsQueue.pop()
            if (currentState[0] not in used
                and not self.isGoalState(currentState[0], goal)):
                used.add(currentState[0])
                for state in self.getDirections(currentState):
                    newState = (state[0], [], 1)
                    for step in currentState[1]:
                        newState[1].append(step)
                    newState[1].append(state[1])
                    bfsQueue.push(newState)

        print start, goal, currentState[1]
        return currentState[1]
예제 #2
0
class Downloader(object):
    """constructor"""
    def __init__(self, connection):
        self.download_queue = Queue()
        self.current_download = None
        
        self.download_status = 'not_ready'
        self.connection = connection
        self.dcc_connection = None
        
    """start downloader"""
    def start(self):
        self.download_status = 'ready'
        
    """stop downloader"""
    def stop(self):
        self.download_status = 'not_ready'
        
    """is it ready for download?"""
    def is_ready(self):
        return (self.download_status == 'ready')
    
    """add manga to download_queue"""
    def download(self, manga):
        print "Adding %s to download queue" % manga.title
        self.download_queue.push(manga)
        
    """check for download status and determine action to take"""
    def check(self):
        if self.is_ready():
            self.download_next()
        elif ( self.download_status == 'requesting_download' and 
               self.current_download.expired_request_time < time.time() ):
            self.finish_download()
        
    """pop an item from download_queue and request download"""
    def download_next(self):
        assert(self.is_ready())
        
        if self.current_download is not None and not self.current_download.isDownloaded():
            # restart download
            manga = self.current_download.manga
        else:
            manga = self.download_queue.pop()
            if (manga is None):
                return
        
        print "Requesting download of %s" % manga.title
        self.current_download = DownloadItem(manga)
        self.connection.privmsg(manga.bot, "XDCC SEND #%d" % manga.pack_id)
        self.download_status = 'requesting_download'
        
    """initiate a manga download connection"""
    def initiate_download(self, file_name, file_size, dcc_connection):
        print "Downloading %s" % self.current_download.manga.title
        self.download_status = 'downloading'
        self.dcc_connection = dcc_connection
        
        self.current_download.initiateDownload(file_name, file_size)
    
    """receive download data"""
    def receive_data(self, data):
        self.current_download.appendData(data)
        self.dcc_connection.privmsg(struct.pack("!I", self.current_download.received_bytes))
    
    """clean up dcc connection and its state"""
    def finish_download(self):
        if (self.current_download.isDownloaded()):
            print "Finished downloading %s\n" % self.current_download.manga.title
        else:
            print "Failed downloading %s" % self.current_download.manga.title
        self.current_download.finishDownload()
        self.download_status = 'ready'
        self.dcc_connection = None