Onionr/onionr/static-data/default-plugins/chat/main.py

94 lines
3.4 KiB
Python
Raw Normal View History

2019-03-27 17:38:46 +00:00
'''
2019-06-20 07:59:32 +00:00
Onionr - Private P2P Communication
2019-03-27 17:38:46 +00:00
Instant message conversations with Onionr peers
'''
'''
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 <https://www.gnu.org/licenses/>.
'''
# Imports some useful libraries
import locale, sys, os, threading, json
2019-03-27 17:38:46 +00:00
locale.setlocale(locale.LC_ALL, '')
2019-07-20 06:02:30 +00:00
import onionrservices, logger, config
from onionrservices import bootstrapservice
from onionrutils import stringvalidators, epoch, basicrequests
2019-03-27 17:38:46 +00:00
2019-07-27 21:56:06 +00:00
plugin_name = 'chat'
2019-03-27 17:38:46 +00:00
PLUGIN_VERSION = '0.0.0'
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
2019-04-12 23:45:22 +00:00
import controlapi, peerserver
2019-03-27 17:38:46 +00:00
flask_blueprint = controlapi.flask_blueprint
2019-03-29 17:37:51 +00:00
direct_blueprint = peerserver.direct_blueprint
2019-03-27 17:38:46 +00:00
def exit_with_error(text=''):
if text != '':
logger.error(text)
sys.exit(1)
2019-07-27 21:56:06 +00:00
class Chat:
2019-03-27 17:38:46 +00:00
def __init__(self, pluginapi):
self.peer = None
self.transport = None
self.shutdown = False
def _sender_loop(self):
print('Enter a message to send, with ctrl-d or -s on a new line.')
print('-c on a new line or ctrl-c stops')
message = ''
while not self.shutdown:
try:
message += input()
if message == '-s':
raise EOFError
elif message == '-c':
raise KeyboardInterrupt
else:
message += '\n'
except EOFError:
message = json.dumps({'m': message, 't': epoch.get_epoch()})
2019-07-27 21:56:06 +00:00
print(basicrequests.do_post_request('http://%s/chat/sendto' % (self.transport,), port=self.socks, data=message))
message = ''
except KeyboardInterrupt:
self.shutdown = True
def create(self):
try:
peer = sys.argv[2]
if not stringvalidators.validate_pub_key(peer):
exit_with_error('Invalid public key specified')
except IndexError:
exit_with_error('You must specify a peer public key')
self.peer = peer
# Ask peer for transport address by creating block for them
2019-07-20 06:02:30 +00:00
peer_transport_address = bootstrapservice.bootstrap_client_service(peer)
self.transport = peer_transport_address
2019-07-20 06:02:30 +00:00
self.socks = config.get('tor.socksport')
print('connected with', peer, 'on', peer_transport_address)
2019-07-20 06:02:30 +00:00
if basicrequests.do_get_request('http://%s/ping' % (peer_transport_address,), ignoreAPI=True, port=self.socks) == 'pong!':
print('connected', peer_transport_address)
threading.Thread(target=self._sender_loop).start()
2019-03-27 17:38:46 +00:00
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
2019-07-28 05:33:26 +00:00
chat = Chat(pluginapi)
2019-07-27 21:56:06 +00:00
api.commands.register(['chat'], chat.create)
2019-03-27 17:38:46 +00:00
return