From f432d9193e94d44f14c5c0e54e849f33e832b674 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Mon, 16 Jul 2018 02:40:58 -0500 Subject: [PATCH] + implemented some menus and message drafting in pm plugin * prevent block types from being too large in metadata processing --- onionr/onionrutils.py | 4 +- .../static-data/default-plugins/pms/info.json | 5 + .../static-data/default-plugins/pms/main.py | 130 ++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 onionr/static-data/default-plugins/pms/info.json create mode 100644 onionr/static-data/default-plugins/pms/main.py diff --git a/onionr/onionrutils.py b/onionr/onionrutils.py index 6d2922a9..cb1054bf 100644 --- a/onionr/onionrutils.py +++ b/onionr/onionrutils.py @@ -256,7 +256,9 @@ class OnionrUtils: Read metadata from a block and cache it to the block database ''' myBlock = Block(blockHash, self._core) - self._core.updateBlockInfo(blockHash, 'dataType', myBlock.getType()) + blockType = myBlock.getType() + if len(blockType) <= 10: + self._core.updateBlockInfo(blockHash, 'dataType', blockType) def escapeAnsi(self, line): ''' diff --git a/onionr/static-data/default-plugins/pms/info.json b/onionr/static-data/default-plugins/pms/info.json new file mode 100644 index 00000000..454b9bd6 --- /dev/null +++ b/onionr/static-data/default-plugins/pms/info.json @@ -0,0 +1,5 @@ +{ + "name" : "pms", + "version" : "1.0", + "author" : "onionr" +} diff --git a/onionr/static-data/default-plugins/pms/main.py b/onionr/static-data/default-plugins/pms/main.py new file mode 100644 index 00000000..7a331271 --- /dev/null +++ b/onionr/static-data/default-plugins/pms/main.py @@ -0,0 +1,130 @@ +''' + Onionr - P2P Microblogging Platform & Social network + + This default plugin handles private messages in an email like fashion +''' +''' + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' + +# Imports some useful libraries +import logger, config, threading, time, readline +from onionrblockapi import Block +import onionrexceptions + +plugin_name = 'pms' +PLUGIN_VERSION = '0.0.1' + +class MailStrings: + def __init__(self, mailInstance): + self.mailInstance = mailInstance + + self.programTag = 'OnionrMail v%s' % (PLUGIN_VERSION) + choices = ['view inbox', 'view sentbox', 'send message', 'help', 'quit'] + self.mainMenuChoices = choices + self.mainMenu = '''\n +----------------- +1. %s +2. %s +3. %s +4. %s +5. %s''' % (choices[0], choices[1], choices[2], choices[3], choices[4]) + +class OnionrMail: + def __init__(self, pluginapi): + self.myCore = pluginapi.get_core() + self.strings = MailStrings(self) + + return + + def inbox(self): + print('PM Blocks:') + for blockHash in self.myCore.getBlocksByType('pm'): + print(blockHash) + + return + + def draftMessage(self): + message = '' + newLine = '' + recip = '' + entering = True + + while entering: + try: + recip = logger.readline('Enter peer address, or q to stop:').strip() + if recip in ('-q', 'q'): + raise EOFError + if not self.myCore._utils.validatePubKey(recip): + raise onionrexceptions.InvalidPubkey('Must be a valid ed25519 base32 encoded public key') + except onionrexceptions.InvalidPubkey: + logger.warn('Invalid public key') + except (KeyboardInterrupt, EOFError): + entering = False + else: + break + else: + # if -q or ctrl-c/d, exit function here, otherwise we successfully got the public key + return + + print('Enter your message, stop by entering -q on a new line.') + while newLine != '-q': + try: + newLine = input() + except (KeyboardInterrupt, EOFError): + pass + if newLine == '-q': + continue + newLine += '\n' + message += newLine + + print('Inserting encrypted message as Onionr block....') + + self.myCore.insertBlock(message, header='pm', encryptType='asym', asymPeer=recip) + + def menu(self): + choice = '' + while True: + + print(self.strings.programTag + self.strings.mainMenu.title()) # print out main menu + + try: + choice = logger.readline('Enter 1-%s:\n' % (len(self.strings.mainMenuChoices))).lower() + except (KeyboardInterrupt, EOFError): + choice = '5' + + if choice in (self.strings.mainMenuChoices[0], '1'): + self.inbox() + elif choice in (self.strings.mainMenuChoices[2], '3'): + self.draftMessage() + elif choice in (self.strings.mainMenuChoices[4], '5'): + logger.info('Goodbye.') + break + else: + logger.warn('Invalid choice.') + return + + +def on_init(api, data = None): + ''' + This event is called after Onionr is initialized, but before the command + inputted is executed. Could be called when daemon is starting or when + just the client is running. + ''' + + pluginapi = api + mail = OnionrMail(pluginapi) + api.commands.register(['mail'], mail.menu) + api.commands.register_help('mail', 'Interact with OnionrMail') + return \ No newline at end of file