def __init__(self, miner, verbose=False, statusfile=None, blkfound=None):
        self.verbose = verbose
        self.miner = miner
        self.lastUpdate = time() - 1
        self.rate = 0
        self.accepted = 0
        self.invalid = 0
        self.lineLength = 0
        self.connectionType = None
        self.idle = False

        self.statushandler = None
        if statusfile:
            from statusfile import StatusFile
            self.statushandler = StatusFile(path=statusfile)

        self.blkfound = blkfound
 def __init__(self, miner, verbose=False, statusfile=None, blkfound=None):
     self.verbose = verbose
     self.miner = miner
     self.lastUpdate = time() - 1
     self.rate = 0
     self.accepted = 0
     self.invalid = 0
     self.lineLength = 0
     self.connectionType = None
     self.idle = False
     
     self.statushandler = None
     if statusfile:
         from statusfile import StatusFile
         self.statushandler = StatusFile(path=statusfile)
     
     self.blkfound = blkfound
class ConsoleLogger(object):
    """This class will handle printing messages to the console."""

    TIME_FORMAT = '[%d/%m/%Y %H:%M:%S]'

    UPDATE_TIME = 1.0

    def __init__(self, miner, verbose=False, statusfile=None, blkfound=None):
        self.verbose = verbose
        self.miner = miner
        self.lastUpdate = time() - 1
        self.rate = 0
        self.accepted = 0
        self.invalid = 0
        self.lineLength = 0
        self.connectionType = None
        self.idle = False

        self.statushandler = None
        if statusfile:
            from statusfile import StatusFile
            self.statushandler = StatusFile(path=statusfile)

        self.blkfound = blkfound

    def reportRate(self, rate, update=True):
        """Used to tell the logger the current Khash/sec."""
        self.rate = rate
        if self.statushandler:
            self.statushandler.update('HashRate', rate if not self.idle else 0)
        if update:
            self.updateStatus()

    def reportType(self, type):
        self.connectionType = type

    def reportBlock(self, block):
        self.log('Currently on block: ' + str(block))

    def reportFound(self, hash, accepted, diff=0.0):
        if accepted:
            self.accepted += 1
        else:
            self.invalid += 1

        hexHash = hash[::-1]
        hexHash = hexHash[:8].encode('hex')

        if self.statushandler:
            self.statushandler.update('LastBlockFoundTime', int(time()))
            self.statushandler.update('LastBlockFoundDiff', diff)
            self.statushandler.increment('NumBlocksFound')

        self.blkfound and subprocess.Popen(
            ('%s %s %s diff %.2f' %
             (self.blkfound, hexHash, accepted and 'accepted'
              or 'rejected', diff)).split(' '))

        if self.verbose:
            self.log('Result ...%s %s diff %.2f' %
                     (hexHash, 'accepted' if accepted else 'rejected', diff))
        else:
            self.log(
                'Result: %s %s diff %.2f' %
                (hexHash[8:], 'accepted' if accepted else 'rejected', diff))

    def reportMsg(self, message):
        self.log(('MSG: ' + message), True, True)

    def reportConnected(self, connected):
        if connected:
            self.log('Connected to server')
        else:
            self.log('Disconnected from server')

    def reportConnectionFailed(self):
        self.log('Failed to connect, retrying...')

    def reportDebug(self, message):
        if self.verbose:
            self.log(message)

    def updateStatus(self, force=False):
        #only update if last update was more than a second ago
        dt = time() - self.lastUpdate
        if force or dt > self.UPDATE_TIME:
            rate = self.rate if (not self.miner.idle) else 0
            type = " [" + str(
                self.connectionType
            ) + "]" if self.connectionType is not None else ''
            status = ("[" + formatNumber(rate) + "hash/sec] "
                      "[" + str(self.accepted) + " Accepted] "
                      "[" + str(self.invalid) + " Rejected]" + type)
            self.say(status)
            if self.statushandler:
                self.statushandler.update('HashRate', rate)
                self.statushandler.update('Accepted', self.accepted)
                self.statushandler.update('Rejected', self.invalid)
            self.lastUpdate = time()

    def say(self, message, newLine=False, hideTimestamp=False):
        #add new line if requested
        if newLine:
            message += '\n'
            if hideTimestamp:
                timestamp = ''
            else:
                timestamp = datetime.now().strftime(self.TIME_FORMAT) + ' '

            message = timestamp + message

        #erase the previous line
        if self.lineLength > 0:
            sys.stdout.write('\b \b' * self.lineLength)
            sys.stdout.write(' ' * self.lineLength)
            sys.stdout.write('\b \b' * self.lineLength)

        #print the line
        sys.stdout.write(message)
        sys.stdout.flush()

        #cache the current line length
        if newLine:
            self.lineLength = 0
        else:
            self.lineLength = len(message)

    def log(self, message, update=True, hideTimestamp=False):
        self.say(message, True, hideTimestamp)
        if update:
            self.updateStatus(True)
class ConsoleLogger(object):
    """This class will handle printing messages to the console."""
    
    TIME_FORMAT = '[%d/%m/%Y %H:%M:%S]'
    
    UPDATE_TIME = 1.0
    
    def __init__(self, miner, verbose=False, statusfile=None, blkfound=None):
        self.verbose = verbose
        self.miner = miner
        self.lastUpdate = time() - 1
        self.rate = 0
        self.accepted = 0
        self.invalid = 0
        self.lineLength = 0
        self.connectionType = None
        self.idle = False
        
        self.statushandler = None
        if statusfile:
            from statusfile import StatusFile
            self.statushandler = StatusFile(path=statusfile)
        
        self.blkfound = blkfound
    
    def reportRate(self, rate, update=True):
        """Used to tell the logger the current Khash/sec."""
        self.rate = rate
        if self.statushandler:
            self.statushandler.update('HashRate', rate if not self.idle else 0)
        if update:
            self.updateStatus()
    
    def reportType(self, type):
        self.connectionType = type
    
    def reportBlock(self, block):
        self.log('Currently on block: ' + str(block))
        
    def reportFound(self, hash, accepted, diff=0.0):
        if accepted:
            self.accepted += 1
        else:
            self.invalid += 1
        
        hexHash = hash[::-1]
        hexHash = hexHash[:8].encode('hex')
        
        if self.statushandler:
            self.statushandler.update('LastBlockFoundTime',int(time()))
            self.statushandler.update('LastBlockFoundDiff',diff)
            self.statushandler.increment('NumBlocksFound')
        
        self.blkfound and subprocess.Popen(('%s %s %s diff %.2f' % (self.blkfound,hexHash,accepted and 'accepted' or 'rejected',diff)).split(' '))
        
        if self.verbose:
            self.log('Result ...%s %s diff %.2f' % (hexHash,
                'accepted' if accepted else 'rejected',diff))
        else:
            self.log('Result: %s %s diff %.2f' % (hexHash[8:],
                'accepted' if accepted else 'rejected',diff))
            
    def reportMsg(self, message):
        self.log(('MSG: ' + message), True, True)
    
    def reportConnected(self, connected):
        if connected:
            self.log('Connected to server')
        else:
            self.log('Disconnected from server')
    
    def reportConnectionFailed(self):
        self.log('Failed to connect, retrying...')
    
    def reportDebug(self, message):
        if self.verbose:
            self.log(message)
        
    def updateStatus(self, force=False):
        #only update if last update was more than a second ago
        dt = time() - self.lastUpdate
        if force or dt > self.UPDATE_TIME:
            rate = self.rate if (not self.miner.idle) else 0
            type = " [" + str(self.connectionType) + "]" if self.connectionType is not None else ''
            status = (
                "[" + formatNumber(rate) + "hash/sec] "
                "[" + str(self.accepted) + " Accepted] "
                "[" + str(self.invalid) + " Rejected]" + type)
            self.say(status)
            if self.statushandler:
                self.statushandler.update('HashRate',rate)
                self.statushandler.update('Accepted',self.accepted)
                self.statushandler.update('Rejected',self.invalid)
            self.lastUpdate = time()
        
    def say(self, message, newLine=False, hideTimestamp=False):
        #add new line if requested
        if newLine:
            message += '\n'
            if hideTimestamp:
                timestamp = ''
            else:
                timestamp = datetime.now().strftime(self.TIME_FORMAT) + ' '
                
            message = timestamp + message
        
        #erase the previous line
        if self.lineLength > 0:
            sys.stdout.write('\b \b' * self.lineLength)
            sys.stdout.write(' ' * self.lineLength)
            sys.stdout.write('\b \b' * self.lineLength)

        #print the line
        sys.stdout.write(message)
        sys.stdout.flush()
        
        #cache the current line length
        if newLine:
            self.lineLength = 0
        else:
            self.lineLength = len(message)

    def log(self, message, update=True, hideTimestamp=False):
        self.say(message, True, hideTimestamp)
        if update:
            self.updateStatus(True)