From 59c72486f4c054f8dcee6d507c9c5c492a3b4751 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sat, 30 Apr 2016 15:18:15 +0300 Subject: [PATCH 1/8] wrapper and docs update. --- README.md | 12 ++++++++-- bootstrap.py | 6 +---- bot.py | 5 ++-- main.py | 2 +- settings.py | 1 - tox.py | 68 +++++++++++++++++++++++----------------------------- 6 files changed, 45 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 92af911..0ead880 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,19 @@ Based on [toxygen](https://github.com/xveduk/toxygen/) toxcore wrapper 1. [Download and install latest Python 2.7](https://www.python.org/downloads/windows/) 2. [Download file bot](https://github.com/ingvar1995/filebot/archive/master.zip) -3. Unpack archive -4. Download latest [libtox.dll](https://build.tox.chat/view/libtoxcore/job/libtoxcore_build_windows_x86_shared_release/lastSuccessfulBuild/artifact/libtoxcore_build_windows_x86_shared_release.zip) build, download latest [libsodium.a](https://build.tox.chat/view/libsodium/job/libsodium_build_windows_x86_static_release/lastSuccessfulBuild/artifact/libsodium_build_windows_x86_static_release.zip) build, put it into libs\ +3. Unpack archive +4. Download latest libtox.dll build, download latest libsodium.a build, put it into \libs\ 5. Run app: ``python main.py path_to_profile`` +[libtox.dll for 32-bit Python](https://build.tox.chat/view/libtoxcore/job/libtoxcore_build_windows_x86_shared_release/lastSuccessfulBuild/artifact/libtoxcore_build_windows_x86_shared_release.zip) + +[libtox.dll for 64-bit Python](https://build.tox.chat/view/libtoxcore/job/libtoxcore_build_windows_x86-64_shared_release/lastSuccessfulBuild/artifact/libtoxcore_build_windows_x86-64_shared_release.zip) + +[libsodium.a for 32-bit Python](https://build.tox.chat/view/libsodium/job/libsodium_build_windows_x86_static_release/lastSuccessfulBuild/artifact/libsodium_build_windows_x86_static_release.zip) + +[libsodium.a for 64-bit Python](https://build.tox.chat/view/libsodium/job/libsodium_build_windows_x86-64_static_release/lastSuccessfulBuild/artifact/libsodium_build_windows_x86-64_static_release.zip) + ### Linux diff --git a/bootstrap.py b/bootstrap.py index 340af37..87ead77 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -2,6 +2,7 @@ import random class Node(object): + def __init__(self, ip, port, tox_key, rand): self._ip, self._port, self._tox_key, self.rand = ip, port, tox_key, rand @@ -80,8 +81,3 @@ def node_generator(): arr = sorted(nodes, key=lambda x: x.rand)[:4] for elem in arr: yield elem.get_data() - - -if __name__ == "__main__": - for elem in node_generator(): - print str(elem) diff --git a/bot.py b/bot.py index b11740a..0d829a1 100644 --- a/bot.py +++ b/bot.py @@ -3,7 +3,7 @@ import os from settings import * from toxcore_enums_and_consts import * from ctypes import * -from util import log, Singleton +from util import Singleton from file_transfers import * from collections import defaultdict @@ -62,7 +62,7 @@ class Bot(Singleton): :param friend_num: number of friend who sent message :param message: text of message """ - id = self._tox.friend_get_public_key(friend_num) + id = self._tox.friend_get_public_key(friend_num) # public key of user settings = Settings.get_instance() message = message.strip() # message parsing @@ -277,6 +277,7 @@ class Bot(Singleton): :param tox_id: tox id of contact :param message: message """ + print 'Friend request:', message self._tox.friend_add_norequest(tox_id) settings = Settings.get_instance() # give friend default rights diff --git a/main.py b/main.py index 2006605..f20136f 100644 --- a/main.py +++ b/main.py @@ -13,7 +13,7 @@ class FileBot(object): self.stop = False self.profile = None self.path = path - print 'FileBot v0.1' + print 'FileBot v0.1.1' def main(self): self.tox = tox_factory(ProfileHelper.open_profile(self.path)) diff --git a/settings.py b/settings.py index 4b1db2d..bd5dff5 100644 --- a/settings.py +++ b/settings.py @@ -1,4 +1,3 @@ -from platform import system import json import os import locale diff --git a/tox.py b/tox.py index c28fa14..68fbc42 100644 --- a/tox.py +++ b/tox.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from ctypes import c_char_p, Structure, CDLL, c_bool, addressof, c_int, c_size_t, POINTER, c_uint16, c_void_p, c_uint64 +from ctypes import c_char_p, Structure, CDLL, c_bool, byref, c_int, c_size_t, POINTER, c_uint16, c_void_p, c_uint64 from ctypes import create_string_buffer, ArgumentError, CFUNCTYPE, c_uint32, sizeof, c_uint8 from platform import system from toxcore_enums_and_consts import * @@ -62,7 +62,7 @@ class Tox(object): else: tox_err_new = c_int() Tox.libtoxcore.tox_new.restype = POINTER(c_void_p) - self._tox_pointer = Tox.libtoxcore.tox_new(tox_options, addressof(tox_err_new)) + self._tox_pointer = Tox.libtoxcore.tox_new(tox_options, byref(tox_err_new)) tox_err_new = tox_err_new.value if tox_err_new == TOX_ERR_NEW['NULL']: raise ArgumentError('One of the arguments to the function was NULL when it was not expected.') @@ -138,7 +138,7 @@ class Tox(object): tox_err_options_new = c_int() f = Tox.libtoxcore.tox_options_new f.restype = POINTER(ToxOptions) - result = f(addressof(tox_err_options_new)) + result = f(byref(tox_err_options_new)) tox_err_options_new = tox_err_options_new.value if tox_err_options_new == TOX_ERR_OPTIONS_NEW['OK']: return result @@ -202,7 +202,7 @@ class Tox(object): """ tox_err_bootstrap = c_int() result = Tox.libtoxcore.tox_bootstrap(self._tox_pointer, c_char_p(address), c_uint16(port), - string_to_bin(public_key), addressof(tox_err_bootstrap)) + string_to_bin(public_key), byref(tox_err_bootstrap)) tox_err_bootstrap = tox_err_bootstrap.value if tox_err_bootstrap == TOX_ERR_BOOTSTRAP['OK']: return bool(result) @@ -228,7 +228,7 @@ class Tox(object): """ tox_err_bootstrap = c_int() result = Tox.libtoxcore.tox_add_tcp_relay(self._tox_pointer, c_char_p(address), c_uint16(port), - c_char_p(public_key), addressof(tox_err_bootstrap)) + c_char_p(public_key), byref(tox_err_bootstrap)) tox_err_bootstrap = tox_err_bootstrap.value if tox_err_bootstrap == TOX_ERR_BOOTSTRAP['OK']: return bool(result) @@ -355,7 +355,7 @@ class Tox(object): """ tox_err_set_info = c_int() result = Tox.libtoxcore.tox_self_set_name(self._tox_pointer, c_char_p(name), - c_size_t(len(name)), addressof(tox_err_set_info)) + c_size_t(len(name)), byref(tox_err_set_info)) tox_err_set_info = tox_err_set_info.value if tox_err_set_info == TOX_ERR_SET_INFO['OK']: return bool(result) @@ -403,7 +403,7 @@ class Tox(object): """ tox_err_set_info = c_int() result = Tox.libtoxcore.tox_self_set_status_message(self._tox_pointer, c_char_p(status_message), - c_size_t(len(status_message)), addressof(tox_err_set_info)) + c_size_t(len(status_message)), byref(tox_err_set_info)) tox_err_set_info = tox_err_set_info.value if tox_err_set_info == TOX_ERR_SET_INFO['OK']: return bool(result) @@ -479,7 +479,7 @@ class Tox(object): """ tox_err_friend_add = c_int() result = Tox.libtoxcore.tox_friend_add(self._tox_pointer, string_to_bin(address), c_char_p(message), - c_size_t(len(message)), addressof(tox_err_friend_add)) + c_size_t(len(message)), byref(tox_err_friend_add)) tox_err_friend_add = tox_err_friend_add.value if tox_err_friend_add == TOX_ERR_FRIEND_ADD['OK']: return result @@ -519,7 +519,7 @@ class Tox(object): """ tox_err_friend_add = c_int() result = Tox.libtoxcore.tox_friend_add_norequest(self._tox_pointer, string_to_bin(public_key), - addressof(tox_err_friend_add)) + byref(tox_err_friend_add)) tox_err_friend_add = tox_err_friend_add.value if tox_err_friend_add == TOX_ERR_FRIEND_ADD['OK']: return result @@ -554,7 +554,7 @@ class Tox(object): """ tox_err_friend_delete = c_int() result = Tox.libtoxcore.tox_friend_delete(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_friend_delete)) + byref(tox_err_friend_delete)) tox_err_friend_delete = tox_err_friend_delete.value if tox_err_friend_delete == TOX_ERR_FRIEND_DELETE['OK']: return bool(result) @@ -574,7 +574,7 @@ class Tox(object): """ tox_err_friend_by_public_key = c_int() result = Tox.libtoxcore.tox_friend_by_public_key(self._tox_pointer, string_to_bin(public_key), - addressof(tox_err_friend_by_public_key)) + byref(tox_err_friend_by_public_key)) tox_err_friend_by_public_key = tox_err_friend_by_public_key.value if tox_err_friend_by_public_key == TOX_ERR_FRIEND_BY_PUBLIC_KEY['OK']: return result @@ -629,7 +629,7 @@ class Tox(object): public_key = create_string_buffer(TOX_PUBLIC_KEY_SIZE) tox_err_friend_get_public_key = c_int() Tox.libtoxcore.tox_friend_get_public_key(self._tox_pointer, c_uint32(friend_number), public_key, - addressof(tox_err_friend_get_public_key)) + byref(tox_err_friend_get_public_key)) tox_err_friend_get_public_key = tox_err_friend_get_public_key.value if tox_err_friend_get_public_key == TOX_ERR_FRIEND_GET_PUBLIC_KEY['OK']: return bin_to_string(public_key, TOX_PUBLIC_KEY_SIZE) @@ -646,7 +646,7 @@ class Tox(object): """ tox_err_last_online = c_int() result = Tox.libtoxcore.tox_friend_get_last_online(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_last_online)) + byref(tox_err_last_online)) tox_err_last_online = tox_err_last_online.value if tox_err_last_online == TOX_ERR_FRIEND_GET_LAST_ONLINE['OK']: return result @@ -665,7 +665,7 @@ class Tox(object): """ tox_err_friend_query = c_int() result = Tox.libtoxcore.tox_friend_get_name_size(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return result @@ -691,7 +691,7 @@ class Tox(object): name = create_string_buffer(self.friend_get_name_size(friend_number)) tox_err_friend_query = c_int() Tox.libtoxcore.tox_friend_get_name(self._tox_pointer, c_uint32(friend_number), name, - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return name.value.decode('utf8') @@ -727,7 +727,7 @@ class Tox(object): """ tox_err_friend_query = c_int() result = Tox.libtoxcore.tox_friend_get_status_message_size(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return result @@ -755,7 +755,7 @@ class Tox(object): status_message = create_string_buffer(self.friend_get_status_message_size(friend_number)) tox_err_friend_query = c_int() Tox.libtoxcore.tox_friend_get_status_message(self._tox_pointer, c_uint32(friend_number), status_message, - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return status_message.value.decode('utf8') @@ -796,7 +796,7 @@ class Tox(object): """ tox_err_friend_query = c_int() result = Tox.libtoxcore.tox_friend_get_status(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return result @@ -835,7 +835,7 @@ class Tox(object): """ tox_err_friend_query = c_int() result = Tox.libtoxcore.tox_friend_get_connection_status(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return result @@ -875,7 +875,7 @@ class Tox(object): """ tox_err_friend_query = c_int() result = Tox.libtoxcore.tox_friend_get_typing(self._tox_pointer, c_uint32(friend_number), - addressof(tox_err_friend_query)) + byref(tox_err_friend_query)) tox_err_friend_query = tox_err_friend_query.value if tox_err_friend_query == TOX_ERR_FRIEND_QUERY['OK']: return bool(result) @@ -918,7 +918,7 @@ class Tox(object): """ tox_err_set_typing = c_int() result = Tox.libtoxcore.tox_self_set_typing(self._tox_pointer, c_uint32(friend_number), - c_bool(typing), addressof(tox_err_set_typing)) + c_bool(typing), byref(tox_err_set_typing)) tox_err_set_typing = tox_err_set_typing.value if tox_err_set_typing == TOX_ERR_SET_TYPING['OK']: return bool(result) @@ -948,7 +948,7 @@ class Tox(object): tox_err_friend_send_message = c_int() result = Tox.libtoxcore.tox_friend_send_message(self._tox_pointer, c_uint32(friend_number), c_int(message_type), c_char_p(message), c_size_t(len(message)), - addressof(tox_err_friend_send_message)) + byref(tox_err_friend_send_message)) tox_err_friend_send_message = tox_err_friend_send_message.value if tox_err_friend_send_message == TOX_ERR_FRIEND_SEND_MESSAGE['OK']: return result @@ -1058,7 +1058,7 @@ class Tox(object): """ tox_err_file_control = c_int() result = Tox.libtoxcore.tox_file_control(self._tox_pointer, c_uint32(friend_number), c_uint32(file_number), - c_int(control), addressof(tox_err_file_control)) + c_int(control), byref(tox_err_file_control)) tox_err_file_control = tox_err_file_control.value if tox_err_file_control == TOX_ERR_FILE_CONTROL['OK']: return bool(result) @@ -1113,7 +1113,7 @@ class Tox(object): """ tox_err_file_seek = c_int() result = Tox.libtoxcore.tox_file_control(self._tox_pointer, c_uint32(friend_number), c_uint32(file_number), - c_uint64(position), addressof(tox_err_file_seek)) + c_uint64(position), byref(tox_err_file_seek)) tox_err_file_seek = tox_err_file_seek.value if tox_err_file_seek == TOX_ERR_FILE_SEEK['OK']: return bool(result) @@ -1143,8 +1143,8 @@ class Tox(object): if file_id is None: file_id = create_string_buffer(TOX_FILE_ID_LENGTH) tox_err_file_get = c_int() - Tox.libtoxcore.tox_file_control(self._tox_pointer, c_uint32(friend_number), c_uint32(file_number), file_id, - addressof(tox_err_file_get)) + Tox.libtoxcore.tox_get_file_id(self._tox_pointer, c_uint32(friend_number), c_uint32(file_number), file_id, + byref(tox_err_file_get)) tox_err_file_get = tox_err_file_get.value if tox_err_file_get == TOX_ERR_FILE_GET['OK']: return bin_to_string(file_id, TOX_FILE_ID_LENGTH) @@ -1207,7 +1207,7 @@ class Tox(object): tox_err_file_send = c_int() result = self.libtoxcore.tox_file_send(self._tox_pointer, c_uint32(friend_number), c_uint32(kind), c_uint64(file_size), string_to_bin(file_id), c_char_p(filename), - c_size_t(len(filename)), addressof(tox_err_file_send)) + c_size_t(len(filename)), byref(tox_err_file_send)) tox_err_file_send = tox_err_file_send.value if tox_err_file_send == TOX_ERR_FILE_SEND['OK']: return result @@ -1242,7 +1242,7 @@ class Tox(object): tox_err_file_send_chunk = c_int() result = self.libtoxcore.tox_file_send_chunk(self._tox_pointer, c_uint32(friend_number), c_uint32(file_number), c_uint64(position), c_char_p(data), c_size_t(len(data)), - addressof(tox_err_file_send_chunk)) + byref(tox_err_file_send_chunk)) tox_err_file_send_chunk = tox_err_file_send_chunk.value if tox_err_file_send_chunk == TOX_ERR_FILE_SEND_CHUNK['OK']: return bool(result) @@ -1383,7 +1383,7 @@ class Tox(object): Return the UDP port this Tox instance is bound to. """ tox_err_get_port = c_int() - result = Tox.libtoxcore.tox_self_get_udp_port(self._tox_pointer, addressof(tox_err_get_port)) + result = Tox.libtoxcore.tox_self_get_udp_port(self._tox_pointer, byref(tox_err_get_port)) tox_err_get_port = tox_err_get_port.value if tox_err_get_port == TOX_ERR_GET_PORT['OK']: return result @@ -1396,17 +1396,9 @@ class Tox(object): relay. """ tox_err_get_port = c_int() - result = Tox.libtoxcore.tox_self_get_tcp_port(self._tox_pointer, addressof(tox_err_get_port)) + result = Tox.libtoxcore.tox_self_get_tcp_port(self._tox_pointer, byref(tox_err_get_port)) tox_err_get_port = tox_err_get_port.value if tox_err_get_port == TOX_ERR_GET_PORT['OK']: return result elif tox_err_get_port == TOX_ERR_GET_PORT['NOT_BOUND']: raise RuntimeError('The instance was not bound to any port.') - - -if __name__ == '__main__': - tox = Tox(Tox.options_new()) - p = tox.get_savedata() - print type(p) - print p - del tox From 92d4deadc28b8e3b54f7c4991c4a6cb12454d5ec Mon Sep 17 00:00:00 2001 From: Ingvar Date: Mon, 2 May 2016 12:21:25 +0300 Subject: [PATCH 2/8] Readme - commands fix --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 0ead880..0fa8f1e 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ Based on [toxygen](https://github.com/xveduk/toxygen/) toxcore wrapper ``python main.py path_to_profile`` #Commands: +``` help - list of commands rights - get access rights @@ -73,6 +74,9 @@ message - send message to friend (masters only) message --all - send message to all friends (masters only) stop - stop bot (masters only) +``` Users with write access can send files to bot. + +Example of settings is [here](/settings.json) From 4582f6dd9d8694b6f22448c8bd57a468d566fbc9 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 3 May 2016 20:05:37 +0300 Subject: [PATCH 3/8] profile saving --- bot.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bot.py b/bot.py index 0d829a1..f12d05c 100644 --- a/bot.py +++ b/bot.py @@ -50,7 +50,7 @@ class Bot(Singleton): elif '.' in last_part: index = last_part.index('.') else: - index = TOX_MAX_MESSAGE_LENGTH - size + index = TOX_MAX_MESSAGE_LENGTH - size - 1 index += size + 1 self._tox.friend_send_message(number, message_type, message[:index]) message = message[index:] @@ -290,6 +290,8 @@ class Bot(Singleton): if 'm' in settings['auto_rights'] and tox_id not in settings['master']: settings['master'].append(tox_id) settings.save() + data = self._tox.get_savedata() + ProfileHelper.save_profile(data) # ----------------------------------------------------------------------------------------------------------------- # File transfers support From 3ea8c049c587206e3350f001ccb1a6273d6a901e Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 2 Oct 2016 20:19:39 +0300 Subject: [PATCH 4/8] max folder size --- bot.py | 20 +++++++++++++++++--- file_transfers.py | 7 +++++-- settings.json | 2 +- settings.py | 3 ++- util.py | 9 +++++++++ 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/bot.py b/bot.py index f12d05c..1bcabef 100644 --- a/bot.py +++ b/bot.py @@ -3,7 +3,7 @@ import os from settings import * from toxcore_enums_and_consts import * from ctypes import * -from util import Singleton +from util import Singleton, folder_size from file_transfers import * from collections import defaultdict @@ -112,6 +112,7 @@ class Bot(Singleton): message - send message to friend (masters only)\n message --all - send message to all friends (masters only)\n stop - stop bot (masters only)\n + fsize - set folder size in MB (masters only)\n Users with write access can send files to bot. """.encode('utf-8')) elif message == 'rights': # get rights @@ -216,7 +217,7 @@ class Bot(Singleton): elif bytes_size < 1024 * 1024: size = u'{} KB'.format(bytes_size / 1024) else: - size = u'{} MB'.format(bytes_size / 1024 * 1024) + size = u'{} MB'.format(bytes_size / (1024 * 1024)) s = u'Size: {} ({} bytes)'.format(size, bytes_size) self.send_message(friend_num, s.encode('utf-8')) elif message.startswith('message '): # send message to friend (all friends) @@ -264,6 +265,17 @@ class Bot(Singleton): raise SystemExit() else: self.send_message(friend_num, 'Not enough rights'.encode('utf-8')) + elif message.startswith('fsize '): + if id not in settings['master']: + self.send_message(friend_num, 'Not enough rights'.encode('utf-8')) + else: + try: + size = int(message[6:]) + settings['size'] = max(size, 10) + settings.save() + self.send_message(friend_num, 'Size was set'.encode('utf-8')) + except: + self.send_message(friend_num, 'Wrong command'.encode('utf-8')) else: self.send_message(friend_num, 'Wrong command'.encode('utf-8')) @@ -307,7 +319,9 @@ class Bot(Singleton): """ id = self._tox.friend_get_public_key(friend_number) settings = Settings.get_instance() - if id in settings['write']: + fsize = folder_size(settings['folder']) + size + max_folder_size = settings['size'] * 1024 * 1024 + if id in settings['write'] and fsize <= max_folder_size: path = settings['folder'] new_file_name, i = file_name, 1 while os.path.isfile(path + '/' + new_file_name): # file with same name already exists diff --git a/file_transfers.py b/file_transfers.py index 32aebcc..fcb59b6 100644 --- a/file_transfers.py +++ b/file_transfers.py @@ -1,5 +1,5 @@ from toxcore_enums_and_consts import TOX_FILE_KIND, TOX_FILE_CONTROL -from os.path import basename, getsize +from os.path import basename, getsize, remove from os import remove from time import time from tox import Tox @@ -25,7 +25,7 @@ class FileTransfer(object): self.state = TOX_FILE_TRANSFER_STATE['RUNNING'] self._file_number = file_number self._creation_time = time() - self._size = float(size) + self._size = size self._done = 0 def set_tox(self, tox): @@ -123,3 +123,6 @@ class ReceiveTransfer(FileTransfer): if position + l > self._file_size: self._file_size = position + l self._done += l + if self._done > self._size: + self.cancel() + remove(self._path) diff --git a/settings.json b/settings.json index 110e102..626efa6 100644 --- a/settings.json +++ b/settings.json @@ -1 +1 @@ -{"write": ["56A1ADE4B65B86BCD51CC73E2CD4E542179F47959FE3E0E21B4B0ACDADE51855"], "auto_rights": "r", "master": [], "read": ["56A1ADE4B65B86BCD51CC73E2CD4E542179F47959FE3E0E21B4B0ACDADE51855"], "folder": "/home/tox_user/tox/shared", "delete": ["56A1ADE4B65B86BCD51CC73E2CD4E542179F47959FE3E0E21B4B0ACDADE51855"]} \ No newline at end of file +{"write": ["56A1ADE4B65B86BCD51CC73E2CD4E542179F47959FE3E0E21B4B0ACDADE51855"], "auto_rights": "r", "master": [], "read": ["56A1ADE4B65B86BCD51CC73E2CD4E542179F47959FE3E0E21B4B0ACDADE51855"], "folder": "/home/tox_user/tox/shared", "size": 500, "delete": ["56A1ADE4B65B86BCD51CC73E2CD4E542179F47959FE3E0E21B4B0ACDADE51855"]} diff --git a/settings.py b/settings.py index bd5dff5..d50cee3 100644 --- a/settings.py +++ b/settings.py @@ -31,7 +31,8 @@ class Settings(Singleton, dict): 'delete': [], 'master': [], 'folder': curr_directory(), - 'auto_rights': 'r' + 'auto_rights': 'r', + 'size': 500 } def save(self): diff --git a/util.py b/util.py index 7e9aae4..8104598 100644 --- a/util.py +++ b/util.py @@ -10,6 +10,15 @@ def curr_directory(): return os.path.dirname(os.path.realpath(__file__)) +def folder_size(path): + size = 0 + for f in os.listdir(path): + f = unicode(f) + if os.path.isfile(os.path.join(path, f)): + size += os.path.getsize(os.path.join(path, f)) + return size + + class Singleton(object): def __new__(cls, *args, **kwargs): From 80c2e620bd6f6372c6134b2ca0921eff62223d45 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Mon, 3 Oct 2016 00:24:34 +0300 Subject: [PATCH 5/8] v 0.2.1 --- README.md | 10 +++++++--- main.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0fa8f1e..da021af 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -###File bot +### File bot A bot which allows you to easily share files with friends and family using [Tox](https://tox.chat/) Based on [toxygen](https://github.com/xveduk/toxygen/) toxcore wrapper @@ -8,7 +8,7 @@ Based on [toxygen](https://github.com/xveduk/toxygen/) toxcore wrapper - Windows - Linux -#Install: +# Install: ### Windows @@ -37,7 +37,7 @@ Based on [toxygen](https://github.com/xveduk/toxygen/) toxcore wrapper 5. Run app: ``python main.py path_to_profile`` -#Commands: +# Commands: ``` help - list of commands @@ -74,9 +74,13 @@ message - send message to friend (masters only) message --all - send message to all friends (masters only) stop - stop bot (masters only) + +fsize - sets size of shared folder (masters only) ``` Users with write access can send files to bot. +Users with delete access can delete and rename files. + Example of settings is [here](/settings.json) diff --git a/main.py b/main.py index f20136f..c19e947 100644 --- a/main.py +++ b/main.py @@ -13,7 +13,7 @@ class FileBot(object): self.stop = False self.profile = None self.path = path - print 'FileBot v0.1.1' + print 'FileBot v0.1.2' def main(self): self.tox = tox_factory(ProfileHelper.open_profile(self.path)) From 3e67104820266e4d3f8e016c4c5990c3eec0ba13 Mon Sep 17 00:00:00 2001 From: Will Breaden Madden Date: Tue, 11 Jul 2017 17:17:41 +0100 Subject: [PATCH 6/8] fix import of os.remove --- file_transfers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/file_transfers.py b/file_transfers.py index fcb59b6..eff9e21 100644 --- a/file_transfers.py +++ b/file_transfers.py @@ -1,5 +1,5 @@ from toxcore_enums_and_consts import TOX_FILE_KIND, TOX_FILE_CONTROL -from os.path import basename, getsize, remove +from os.path import basename, getsize from os import remove from time import time from tox import Tox From fc4548bbe5fffbe88af7676e816ec626abe14b90 Mon Sep 17 00:00:00 2001 From: emdee Date: Thu, 6 Oct 2022 13:44:35 +0000 Subject: [PATCH 7/8] Ported to Python 3 --- README.md | 4 ++ bootstrap.py | 32 ++++++++--- bot.py | 53 +++++++++++++------ callbacks.py | 32 ++++++----- file_transfers.py | 5 +- main.py | 50 +++++++++++++---- settings.py | 20 ++++--- tox.py => tox.py.dst | 0 ...nsts.py => toxcore_enums_and_consts.py.dst | 0 util.py | 4 +- 10 files changed, 144 insertions(+), 56 deletions(-) rename tox.py => tox.py.dst (100%) rename toxcore_enums_and_consts.py => toxcore_enums_and_consts.py.dst (100%) diff --git a/README.md b/README.md index da021af..0d70875 100644 --- a/README.md +++ b/README.md @@ -84,3 +84,7 @@ Users with write access can send files to bot. Users with delete access can delete and rename files. Example of settings is [here](/settings.json) + +## Hard Fork + +https://git.plastiras.org/emdee/filebot diff --git a/bootstrap.py b/bootstrap.py index 87ead77..fd6446d 100644 --- a/bootstrap.py +++ b/bootstrap.py @@ -1,10 +1,19 @@ +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- import random +global LOG +import logging +LOG = logging.getLogger(__name__) + +iNUM_NODES = 6 class Node(object): - def __init__(self, ip, port, tox_key, rand): - self._ip, self._port, self._tox_key, self.rand = ip, port, tox_key, rand + def __init__(self, ip, port, tox_key, rand=0): + self._ip = ip + self._port = port + self._tox_key = tox_key + self.rand = rand def get_data(self): return self._ip, self._port, self._tox_key @@ -12,6 +21,16 @@ class Node(object): def node_generator(): nodes = [] + try: + from wrapper_tests.support_testing import generate_nodes + all = generate_nodes() + random.shuffle(all) + for elt in all[:iNUM_NODES]: + nodes.append(Node(*elt)) + return nodes + except Exception as e: + LOG.warn(e) + # drop through ips = [ "144.76.60.215", "23.226.230.47", "195.154.119.113", "biribiri.org", "46.38.239.179", "178.62.250.138", "130.133.110.14", "104.167.101.29", @@ -76,8 +95,9 @@ def node_generator(): "5625A62618CB4FCA70E147A71B29695F38CC65FF0CBD68AD46254585BE564802", "31910C0497D347FF160D6F3A6C0E317BAFA71E8E03BC4CBB2A185C9D4FB8B31E" ] - for i in xrange(len(ips)): - nodes.append(Node(ips[i], ports[i], ids[i], random.randint(0, 1000000))) - arr = sorted(nodes, key=lambda x: x.rand)[:4] - for elem in arr: + for i in range(len(ips)): + nodes.append(Node(ips[i], ports[i], ids[i]) ) + arr = sorted(nodes) + random.shuffle(arr) + for elem in arr[:iNUM_NODES]: yield elem.get_data() diff --git a/bot.py b/bot.py index 1bcabef..d03e84a 100644 --- a/bot.py +++ b/bot.py @@ -1,12 +1,16 @@ -from tox import Tox +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- +from wrapper.tox import Tox import os from settings import * -from toxcore_enums_and_consts import * +from wrapper.toxcore_enums_and_consts import * from ctypes import * from util import Singleton, folder_size from file_transfers import * from collections import defaultdict +global LOG +import logging +LOG = logging.getLogger(__name__) class Bot(Singleton): @@ -174,10 +178,10 @@ class Bot(Singleton): fl = ' '.join(message.split(' ')[2:]) try: num = self._tox.friend_by_public_key(message.split(' ')[1][:TOX_PUBLIC_KEY_SIZE * 2]) - print num + LOG.debug(num) self.send_file(settings['folder'] + '/' + fl, num) except Exception as ex: - print ex + LOG.warn(ex) self.send_message(friend_num, 'Friend not found'.encode('utf-8')) else: fl = ' '.join(message.split(' ')[2:]) @@ -289,7 +293,7 @@ class Bot(Singleton): :param tox_id: tox id of contact :param message: message """ - print 'Friend request:', message + LOG.info('Friend request:' +message) self._tox.friend_add_norequest(tox_id) settings = Settings.get_instance() # give friend default rights @@ -395,16 +399,28 @@ def tox_factory(data=None, settings=None): :return: new tox instance """ if settings is None: - settings = { - 'ipv6_enabled': True, - 'udp_enabled': True, - 'proxy_type': 0, - 'proxy_host': '0', - 'proxy_port': 0, - 'start_port': 0, - 'end_port': 0, - 'tcp_port': 0 - } + if os.getenv('socks_proxy') != '': + settings = { + 'ipv6_enabled': False, + 'udp_enabled': False, + 'proxy_type': 2, + 'proxy_host': b'127.0.0.1', + 'proxy_port': 9050, + 'start_port': 0, + 'end_port': 0, + 'tcp_port': 0 + } + else: + settings = { + 'ipv6_enabled': True, + 'udp_enabled': True, + 'proxy_type': 0, + 'proxy_host': '0', + 'proxy_port': 0, + 'start_port': 0, + 'end_port': 0, + 'tcp_port': 0 + } tox_options = Tox.options_new() tox_options.contents.udp_enabled = settings['udp_enabled'] tox_options.contents.proxy_type = settings['proxy_type'] @@ -421,4 +437,11 @@ def tox_factory(data=None, settings=None): tox_options.contents.savedata_type = TOX_SAVEDATA_TYPE['NONE'] tox_options.contents.savedata_data = None tox_options.contents.savedata_length = 0 + # overrides + tox_options.contents.local_discovery_enabled = False + tox_options.contents.ipv6_enabled = False + tox_options.contents.hole_punching_enabled = False + + LOG.debug("wrapper.tox.Tox settings: " +repr(settings)) + return Tox(tox_options) diff --git a/callbacks.py b/callbacks.py index 31602fa..9dcf2c1 100644 --- a/callbacks.py +++ b/callbacks.py @@ -1,8 +1,12 @@ +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- from settings import Settings from bot import Bot -from toxcore_enums_and_consts import * -from tox import bin_to_string +from wrapper.toxcore_enums_and_consts import * +from wrapper.tox import bin_to_string +global LOG +import logging +LOG = logging.getLogger(__name__) # ----------------------------------------------------------------------------------------------------------------- # Callbacks - current user @@ -14,7 +18,7 @@ def self_connection_status(): Current user changed connection status (offline, UDP, TCP) """ def wrapped(tox, connection, user_data): - print 'Connection status: ', str(connection) + LOG.debug('Connection status: ' + str(connection)) return wrapped @@ -27,7 +31,7 @@ def friend_connection_status(tox, friend_num, new_status, user_data): """ Check friend's connection status (offline, udp, tcp) """ - print "Friend #{} connected! Friend's status: {}".format(friend_num, new_status) + LOG.info("Friend #{} connected! Friend's status: {}".format(friend_num, new_status)) def friend_message(): @@ -35,7 +39,7 @@ def friend_message(): New message from friend """ def wrapped(tox, friend_number, message_type, message, size, user_data): - print message.decode('utf-8') + LOG.info(message.decode('utf-8')) Bot.get_instance().new_message(friend_number, message.decode('utf-8')) # parse message return wrapped @@ -62,7 +66,7 @@ def tox_file_recv(tox_link): def wrapped(tox, friend_number, file_number, file_type, size, file_name, file_name_size, user_data): profile = Bot.get_instance() if file_type == TOX_FILE_KIND['DATA']: - print 'file' + LOG.info('file') file_name = unicode(file_name[:file_name_size].decode('utf-8')) profile.incoming_file_transfer(friend_number, file_number, size, file_name) else: # AVATAR @@ -109,13 +113,13 @@ def init_callbacks(tox): Initialization of all callbacks. :param tox: tox instance """ - tox.callback_self_connection_status(self_connection_status(), 0) + tox.callback_self_connection_status(self_connection_status()) - tox.callback_friend_message(friend_message(), 0) - tox.callback_friend_connection_status(friend_connection_status, 0) - tox.callback_friend_request(friend_request, 0) + tox.callback_friend_message(friend_message()) + tox.callback_friend_connection_status(friend_connection_status) + tox.callback_friend_request(friend_request) - tox.callback_file_recv(tox_file_recv(tox), 0) - tox.callback_file_recv_chunk(file_recv_chunk, 0) - tox.callback_file_chunk_request(file_chunk_request, 0) - tox.callback_file_recv_control(file_recv_control, 0) + tox.callback_file_recv(tox_file_recv(tox)) + tox.callback_file_recv_chunk(file_recv_chunk) + tox.callback_file_chunk_request(file_chunk_request) + tox.callback_file_recv_control(file_recv_control) diff --git a/file_transfers.py b/file_transfers.py index eff9e21..2a67750 100644 --- a/file_transfers.py +++ b/file_transfers.py @@ -1,8 +1,9 @@ -from toxcore_enums_and_consts import TOX_FILE_KIND, TOX_FILE_CONTROL +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- +from wrapper.toxcore_enums_and_consts import TOX_FILE_KIND, TOX_FILE_CONTROL from os.path import basename, getsize from os import remove from time import time -from tox import Tox +from wrapper.tox import Tox TOX_FILE_TRANSFER_STATE = { diff --git a/main.py b/main.py index c19e947..988cb12 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,40 @@ -from bootstrap import node_generator -from bot import * -from callbacks import init_callbacks +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- + +""" + help - list of commands\n + rights - get access rights\n + files - show list of files (get access)\n + id - get bot's id (get access)\n + share - send file to friend (get access)\n + share --all - send file to all friends (get access)\n + size - get size of file (get access)\n + get - get file with specified filename (get access)\n + get --all - get all files (get access)\n + stats - show statistics (write access)\n + del - remove file with specified filename (delete access)\n + rename --new - rename file (delete access)\n + user - new rights (example: rwdm) for user (masters only)\n + status - new status message (masters only)\n + name - new name (masters only)\n + message - send message to friend (masters only)\n + message --all - send message to all friends (masters only)\n + stop - stop bot (masters only)\n + fsize - set folder size in MB (masters only)\n + Users with write access can send files to bot. +""" + import time import sys +from bootstrap import node_generator +from bot import Bot, tox_factory, ProfileHelper +from callbacks import init_callbacks +from settings import Settings + +global LOG +import logging +logging.basicConfig(level=10) +LOG = logging.getLogger(__name__) class FileBot(object): @@ -13,7 +44,7 @@ class FileBot(object): self.stop = False self.profile = None self.path = path - print 'FileBot v0.1.2' + LOG.info('FileBot v0.1.2+') def main(self): self.tox = tox_factory(ProfileHelper.open_profile(self.path)) @@ -23,7 +54,7 @@ class FileBot(object): self.tox.bootstrap(*data) settings = Settings() self.profile = Bot(self.tox) - print 'Iterate' + LOG.debug('Iterate') try: while not self.stop: self.tox.iterate() @@ -36,10 +67,9 @@ class FileBot(object): if __name__ == '__main__': - if len(sys.argv) > 1: - path = sys.argv[1] - bot = FileBot(path) - bot.main() - else: + if len(sys.argv) <= 1: raise IOError('Path to save file not found') + path = sys.argv[1] + bot = FileBot(path) + bot.main() diff --git a/settings.py b/settings.py index d50cee3..b0c9962 100644 --- a/settings.py +++ b/settings.py @@ -1,24 +1,28 @@ +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- import json import os import locale from util import Singleton, curr_directory -from toxcore_enums_and_consts import * +from wrapper.toxcore_enums_and_consts import * +global LOG +import logging +LOG = logging.getLogger(__name__) class Settings(Singleton, dict): def __init__(self): - self.path = curr_directory() + '/settings.json' + self.path = os.path.join(curr_directory(), 'settings.json') if os.path.isfile(self.path): with open(self.path) as fl: data = fl.read() super(self.__class__, self).__init__(json.loads(data)) else: super(self.__class__, self).__init__(Settings.get_default_settings()) - self['read'] = map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['read'])) - self['write'] = map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['write'])) - self['delete'] = map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['delete'])) - self['master'] = map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['master'])) + self['read'] = list(map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['read']))) + self['write'] = list(map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['write']))) + self['delete'] = list(map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['delete']))) + self['master'] = list(map(lambda x: x[:TOX_PUBLIC_KEY_SIZE * 2], set(self['master']))) if self['folder'][-1] == '/' or self['folder'][-1] == '\\': self['folder'] = self['folder'][:-1] self.save() @@ -31,12 +35,13 @@ class Settings(Singleton, dict): 'delete': [], 'master': [], 'folder': curr_directory(), + 'folder_save': curr_directory(), 'auto_rights': 'r', 'size': 500 } def save(self): - print 'Saving' + LOG.debug('Saving') text = json.dumps(self) with open(self.path, 'w') as fl: fl.write(text) @@ -49,7 +54,6 @@ class ProfileHelper(object): @staticmethod def open_profile(path): - path = path.decode(locale.getpreferredencoding()) ProfileHelper._path = path with open(ProfileHelper._path, 'rb') as fl: data = fl.read() diff --git a/tox.py b/tox.py.dst similarity index 100% rename from tox.py rename to tox.py.dst diff --git a/toxcore_enums_and_consts.py b/toxcore_enums_and_consts.py.dst similarity index 100% rename from toxcore_enums_and_consts.py rename to toxcore_enums_and_consts.py.dst diff --git a/util.py b/util.py index 8104598..6ada7aa 100644 --- a/util.py +++ b/util.py @@ -1,3 +1,5 @@ +# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*- + import os @@ -23,7 +25,7 @@ class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): - cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) + cls._instance = super(Singleton, cls).__new__(cls) return cls._instance @classmethod From 0801537da3c1249547385817a67c463fabf9030b Mon Sep 17 00:00:00 2001 From: emdee Date: Tue, 11 Oct 2022 10:51:16 +0000 Subject: [PATCH 8/8] EOF --- README.md | 2 ++ __init__.py | 0 2 files changed, 2 insertions(+) create mode 100644 __init__.py diff --git a/README.md b/README.md index 0d70875..4054441 100644 --- a/README.md +++ b/README.md @@ -88,3 +88,5 @@ Example of settings is [here](/settings.json) ## Hard Fork https://git.plastiras.org/emdee/filebot + +Work on this project is suspended until the MultiDevice problem is solved. diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29