diff --git a/src/bitmessagecli.py b/src/bitmessagecli.py index 4be2898b..5128f98c 100644 --- a/src/bitmessagecli.py +++ b/src/bitmessagecli.py @@ -852,10 +852,9 @@ def inputIndex(prompt='Input a index: ', maximum=-1, alter=[]): global retStrings while True: - cinput = userInput(prompt + '\nTry again, (c) or').lower() + cinput = userInput(prompt + '\nTry again, (c) or').strip().lower() try: if cinput == "c": - cinput = '-1' raise InputException('usercancel') elif cinput in alter: @@ -1065,7 +1064,7 @@ def listAdd(): return '' -def genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): +def genAdd(lbl=None, deterministic=False, passphrase=None, numOfAdd=None, addVNum=None, streamNum=None, ripe=None): """Generate address""" if deterministic is False: # Generates a new address with the user defined label. non-deterministic @@ -1154,7 +1153,7 @@ def dump2File(fileName, fileData, deCoded): except Exception: return '\n Unexpected error: %s.\n' % sys.exc_info()[0] - return ' Successfully saved to: "' + filePath + '"' + return ' Successfully saved to: "%s"' % filePath def attachment(): @@ -1176,7 +1175,7 @@ def attachment(): with open(filePath): break except IOError: - print '\n Failed open file on: ', filePath + '\n' + print '\n Failed open file on: "%s"\n' % filePath # print filesize, and encoding estimate with confirmation if file is over X size (1mb?) invSize = os.path.getsize(filePath) @@ -1240,18 +1239,15 @@ Encoding:base64 """ % (fileName, invSize, fileName, fileName, data) + theAttachmentS = theAttachmentS + theAttachment uInput = userInput('Would you like to add another attachment, (y)es or (N)o?').lower() - - if uInput in inputShorts['yes']: # Allows multiple attachments to be added to one message - theAttachmentS = str(theAttachmentS) + str(theAttachment) + '\n\n' - else: + if uInput not in inputShorts['yes']: # Allows multiple attachments to be added to one message break - theAttachmentS = theAttachmentS + theAttachment return theAttachmentS -def sendMsg(toAddress, fromAddress, subject=None, message=None): +def sendMsg(toAddress=None, fromAddress=None, subject=None, message=None, isBrd=False, attachMessage=None): """ With no arguments sent, sendMsg fills in the blanks. subject and message must be encoded before they are passed. @@ -1259,10 +1255,11 @@ def sendMsg(toAddress, fromAddress, subject=None, message=None): global retStrings, inputShorts - if validAddress(toAddress) is False: - toAddress = inputAddress("What is the To Address indeed?") + if not isBrd: + if not (toAddress and validAddress(toAddress)): + toAddress = inputAddress("Input a valid message receiver:") - if validAddress(fromAddress) is False: + if not (fromAddress and validAddress(fromAddress)): print ' Sender retrieving...', fromAddress response = api.listAddresses() if response['error'] != 0: @@ -1310,21 +1307,39 @@ def sendMsg(toAddress, fromAddress, subject=None, message=None): subject = subject.encode('base64') if message is None: + message = '' while True: + print '\n'.join([ + ' Drafting:', + message, + ' -----------------------------------', + ]) try: - message += '\n' + raw_input('Continue enter your message line by line, end with .\n>') + message += '\n' + raw_input('Continue enter your message line by line, cancel with .\n>') except EOFError: break - uInput = userInput('Would you like to add an attachment, (y)es or (N)o?').lower() + uInput = userInput('Would you like to add attachments, (y)es or (N)o?').lower() if uInput in inputShorts['yes']: message = message + '\n\n' + attachment() - message = message.encode('base64') + if attachMessage: + message = message + '\n' + attachMessage + + print message + message = message.encode('base64') + src = retStrings['usercancel'] + uInput = userInput('Realy want to send upper message, (n)o or (Y)es?').lower() + if uInput in inputShorts['no']: + return src while True: - print ' Message sending...', subject.decode('base64') - ackData = api.sendMessage(toAddress, fromAddress, subject, message) + if isBrd: + print ' Broadcast message sending... (%s)' % subject.decode('base64') + ackData = api.sendBroadcast(fromAddress, subject, message) + else: + print ' Message sending... (%s)' % subject.decode('base64') + ackData = api.sendMessage(toAddress, fromAddress, subject, message) if ackData['error'] == 1: return ackData['errormsg'] elif ackData['error'] != 0: @@ -1333,6 +1348,7 @@ def sendMsg(toAddress, fromAddress, subject=None, message=None): if uInput in inputShorts['no']: break else: + src = '' break if ackData['error'] == 0: @@ -1345,96 +1361,7 @@ def sendMsg(toAddress, fromAddress, subject=None, message=None): else: return ' Message Status:' + status['result'] - return '' - - -def sendBrd(fromAddress=None, subject=None, message=None): - """Send a broadcast""" - - global inputShorts - if fromAddress is None: - print ' Retrieving...', 'Senders' - response = api.listAddresses() - if response['error'] != 0: - return response['errormsg'] - - jsonAddresses = response['result'] - numAddresses = len(jsonAddresses) # Number of addresses - - if numAddresses > 1: # Ask what address to send from if multiple addresses - found = False - while True: - fromAddress = userInput('Enter an Address or Address Label to send from.') - - for addNum in range(0, numAddresses): # processes all of the addresses - label = jsonAddresses[addNum]['label'] - address = jsonAddresses[addNum]['address'] - if fromAddress == label: # address entered was a label and is found - fromAddress = address - found = True - break - - if found is False: - if validAddress(fromAddress) is False: - print '\n Invalid Address. Please try again.\n' - - else: - for addNum in range(0, numAddresses): # processes all of the addresses - address = jsonAddresses[addNum]['address'] - if fromAddress == address: # address entered was a found in our addressbook. - found = True - break - - if found is False: - print '\n The address entered is not one of yours. Please try again.\n' - - if found: - break # Address was found - - else: # Only one address in address book - print ' Using the only address in the addressbook to send from.\n' - fromAddress = jsonAddresses[0]['address'] - - if subject is None: - subject = userInput('Enter your Subject.') - subject = subject.encode('base64') - if message is None: - while True: - try: - message += '\n' + raw_input('Continue enter your message line by line, end with .\n>') - except EOFError: - break - - uInput = userInput('Would you like to add an attachment, (y)es or (N)o?').lower() - if uInput in inputShorts['yes']: - message = message + '\n\n' + attachment() - - message = message.encode('base64') - - while True: - print ' Broadcast message sending...' - ackData = api.sendBroadcast(fromAddress, subject, message) - if ackData['error'] == 1: - return ackData['errormsg'] - elif status['error'] != 0: - print '\n %s.\n' % str(err) - uInput = userInput('Would you like to try again, no or (Y)es?').lower() - if uInput in inputShorts['no']: - break - else: - break - - if ackData['error'] == 0: - print ' Fetching send status...' - status = api.getStatus(ackData['result']) - if status['error'] == 1: - return status['errormsg'] - elif status['error'] != 0: - print status['errormsg'] - else: - return ' Message Status:' + status['result'] - - return '' + return src def inbox(unreadOnly=False, pageNum=20): @@ -1469,9 +1396,9 @@ def inbox(unreadOnly=False, pageNum=20): print ' Read:', message['read'] print ' To:', getLabelForAddress(message['toAddress']) # Get the to address print ' From:', getLabelForAddress(message['fromAddress']) # Get the from address - print ' Subject:', message['subject'].decode('base64') # Get the subject print ' Received:', datetime.datetime.fromtimestamp(float(message['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S') print ' Size: %d(bytes)' % getBase64Len(message['message']) + print ' Subject:', message['subject'].decode('base64') # Get the subject messagesPrinted += 1 if not message['read']: messagesUnread += 1 @@ -1508,11 +1435,11 @@ def outbox(pageNum=20): print ' To:', getLabelForAddress(message['toAddress']) # Get the to address # Get the from address print ' From:', getLabelForAddress(message['fromAddress']) - print ' Subject:', message['subject'].decode('base64') # Get the subject print ' Status:', message['status'] # Get the status print ' Ack:', message['ackData'] # Get the ackData print ' Last Action Time:', datetime.datetime.fromtimestamp(float(message['lastActionTime'])).strftime('%Y-%m-%d %H:%M:%S') print ' Size: %d(bytes)' % getBase64Len(message['message']) + print ' Subject:', message['subject'].decode('base64') # Get the subject if msgNum % pageNum == 0 and msgNum != 0: uInput = userInput('Paused on %d/%d, next [%d],' % (msgNum, numMessages - 1, msgNum - pageNum if msgNum > pageNum else 0)) @@ -1656,12 +1583,12 @@ def readSentMsg(cmd='read', msgNum=-1, messageID=None, trunck=380, withAtta=Fals print ' To:', getLabelForAddress(message['toAddress']) # Get the to address # Get the from address print ' From:', getLabelForAddress(message['fromAddress']) - print ' Subject:', subject # Get the subject print ' Status:', message['status'] # Get the status print ' Ack:', message['ackData'] # Get the ackData print ' Last Action Time:', datetime.datetime.fromtimestamp(float(message['lastActionTime'])).strftime('%Y-%m-%d %H:%M:%S') print ' Length: %d/%d' % (trunck if trunck <= full else full, full) + print ' Subject:', subject # Get the subject print ' Message:\n' print textmsg if trunck < 0 or len(textmsg) <= trunck else textmsg[:trunck] + '\n\n ~< MESSAGE TOO LONG TRUNCKED TO SHOW >~' print ' ', 74 * '-' @@ -1695,9 +1622,9 @@ def readMsg(cmd='read', msgNum=-1, messageID=None, trunck=380, withAtta=False): print ' To:', getLabelForAddress(message['toAddress']) # Get the to address # Get the from address print ' From:', getLabelForAddress(message['fromAddress']) - print ' Subject:', subject # Get the subject print ' Received:', datetime.datetime.fromtimestamp(float(message['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S') print ' Length: %d/%d' % (trunck if trunck <= full else full, full) + print ' Subject:', subject # Get the subject print ' Message:\n' print textmsg if trunck < 0 or len(textmsg) <= trunck else textmsg[:trunck] + '\n\n ~< MESSAGE TOO LONG TRUNCKED TO SHOW >~' print ' ', 74 * '-' @@ -1723,26 +1650,26 @@ def replyMsg(msgNum=-1, messageID=None, forwardORreply=None): message = response['result'][0] subject = message['subject'].decode('base64') content = message['message'].decode('base64') # Message that you are replying too. + fromAdd = message['toAddress'] # Address it was sent To, now the From address + fwdFrom = message['fromAddress'] # Address it was sent To, will attached to fwd + recvTime = datetime.datetime.fromtimestamp(float(message['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S') + full = len(content) textmsg = '' textmsg = attDetect(content, textmsg, subject, True) if forwardORreply == 'forward': attachMessage = '\n'.join([ - '> To: ', fwdFrom, - '> From: ', fromAdd, - '> Subject: ', subject, - '> Received: ', recvTime, + '> To: %s' % fromAdd, + '> From: %s' % fwdFrom, + '> Received: %s' % recvTime, + '> Subject: %s' % subject, '> Message:', ]) else: attachMessage = '' for line in textmsg.splitlines(): - attachMessage = attachMessage + '> ' + line + '\n' - - fromAdd = message['toAddress'] # Address it was sent To, now the From address - fwdFrom = message['fromAddress'] # Address it was sent To, will attached to fwd - recvTime = datetime.datetime.fromtimestamp(float(message['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S') + attachMessage = attachMessage + '\n> ' + line if forwardORreply == 'reply': toAdd = message['fromAddress'] # Address it was From, now the To address @@ -1750,39 +1677,13 @@ def replyMsg(msgNum=-1, messageID=None, forwardORreply=None): elif forwardORreply == 'forward': subject = "Fwd: " + re.sub('^Fwd: *', '', subject) - toAdd = inputAddress("What is the To Address?") + toAdd = None else: return '\n Invalid Selection. Reply or Forward only' subject = subject.encode('base64') - - message = '' - while True: - try: - print '\n'.join([ - ' Drafting:', - message, - ' -----------------------------------', - ]) - message += '\n' + raw_input('Continue enter your message line by line, end with .\n>') - except EOFError: - break - - src = retStrings['usercancel'] - uInput = userInput('Would you like to add an attachment, (y)es or (N)o?').lower() - if uInput in inputShorts['yes']: - message = message + '\n\n' + attachment() - - message = message + '\n\n------------------------------------------------------\n' - message = message + attachMessage - message = message.encode('base64') - - print message - uInput = userInput('Realy want to send upper message, (n)o or (Y)es?').lower() - if uInput not in inputShorts['no']: - src = sendMsg(toAdd, fromAdd, subject, message) - + src = sendMsg(toAdd, fromAdd, subject, None, False, attachMessage) return src @@ -1890,7 +1791,7 @@ def toReadInbox(cmd='read', trunck=380, withAtta=False): src = retStrings['indexoutofbound'] else: - uInput = inputIndex('Input the index of the message you wish to delete or (A)ll to empty the inbox [0-%d]: ' % (numMessages - 1), numMessages - 1, inputShorts['all'][0]).lower() + uInput = inputIndex('Input the index of the message you wish to delete or (A)ll to empty the inbox [0-%d]: ' % (numMessages - 1), numMessages - 1, inputShorts['all']) if uInput in inputShorts['all']: ret = inbox(False) @@ -1985,7 +1886,7 @@ def toReadOutbox(cmd='read', trunck=380, withAtta=False): src = retStrings['indexoutofbound'] else: - uInput = inputIndex('Input the index of the message you wish to delete or (A)ll to empty the outbox [0-%d]: ' % (numMessages - 1), numMessages - 1, inputShorts['all'][0]).lower() + uInput = inputIndex('Input the index of the message you wish to delete or (A)ll to empty the outbox [0-%d]: ' % (numMessages - 1), numMessages - 1, inputShorts['all']) if uInput in inputShorts['all']: ret = outbox() @@ -2272,7 +2173,10 @@ def UI(cmdInput=None): src = showCmdTbl() elif cmdInput in cmdShorts['daemon']: - src = start_daemon(getattr(config, 'start_daemon', '')) + dmUri = getattr(config, 'start_daemon', None) + if not dmUri: + dmUri = getattr(config, 'conn', None) + src = start_daemon(dmUri) elif cmdInput in cmdShorts['apiTest']: # tests the API Connection. print ' API connection test has:', @@ -2312,20 +2216,15 @@ def UI(cmdInput=None): streamNum = 1 isRipe = userInput('Shorten the address, (Y)es or no?').lower() - if isRipe in inputShorts['yes']: - ripe = True - src = genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe) - - else: - ripe = False - src = genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe) + ripe = isRipe in inputShorts['yes'] + src = genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe) else: # Creates a random address with user-defined label deterministic = False - lbl = null = None + lbl = None while lbl is None: lbl = userInput('Input the label for the new address.') - src = genAdd(lbl, deterministic, null, null, null, null, null) + src = genAdd(lbl, deterministic) elif cmdInput in cmdShorts['getAddress']: # Gets the address for/from a passphrase while len(uInput) < 6: @@ -2374,11 +2273,8 @@ def UI(cmdInput=None): elif cmdInput in cmdShorts['send']: # Sends a message or broadcast uInput = userInput('Would you like to send a (b)roadcast or (M)essage?').lower() - null = None - if uInput in inputShorts['broadcast']: - src = sendBrd(null, null, null) - else: - src = sendMsg(null, null, null, null) + isBrd = uInput in inputShorts['broadcast'] + src = sendMsg(isBrd=isBrd) elif cmdInput in cmdShorts['delete']: withAtta = True @@ -2466,7 +2362,7 @@ def UI(cmdInput=None): def CLI(): """Entrypoint for the CLI app""" - global usrPrompt, config, api, cmdStr + global usrPrompt, api, cmdStr if usrPrompt == 0: if config.conn: @@ -2510,8 +2406,6 @@ if __name__ == "__main__": config.parse() bms_allow = False socks_allow = False - if not config.arguments: # Config parse failed, show the help screen and exit - config.parse() if config.action == 'main': try: