plugins fixes, improvements
This commit is contained in:
parent
fb74ea4455
commit
5a0843d98b
@ -65,7 +65,7 @@ class IncomingCallWidget(widgets.CenteredWidget):
|
|||||||
QtCore.QThread.__init__(self)
|
QtCore.QThread.__init__(self)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
class AudioFile(object):
|
class AudioFile:
|
||||||
chunk = 1024
|
chunk = 1024
|
||||||
|
|
||||||
def __init__(self, fl):
|
def __init__(self, fl):
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
class Node(object):
|
class Node:
|
||||||
def __init__(self, ip, port, tox_key, rand):
|
def __init__(self, ip, port, tox_key, rand):
|
||||||
self._ip, self._port, self._tox_key, self.rand = ip, port, tox_key, rand
|
self._ip, self._port, self._tox_key, self.rand = ip, port, tox_key, rand
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ CALL_TYPE = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class AV(object):
|
class AV:
|
||||||
|
|
||||||
def __init__(self, toxav):
|
def __init__(self, toxav):
|
||||||
self._toxav = toxav
|
self._toxav = toxav
|
||||||
|
@ -7,7 +7,7 @@ except ImportError:
|
|||||||
from toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE
|
from toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE
|
||||||
|
|
||||||
|
|
||||||
class Contact(object):
|
class Contact:
|
||||||
"""
|
"""
|
||||||
Class encapsulating TOX contact
|
Class encapsulating TOX contact
|
||||||
Properties: name (alias of contact or name), status_message, status (connection status)
|
Properties: name (alias of contact or name), status_message, status (connection status)
|
||||||
|
@ -15,7 +15,7 @@ MESSAGE_OWNER = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class History(object):
|
class History:
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self._name = name
|
self._name = name
|
||||||
@ -148,7 +148,7 @@ class History(object):
|
|||||||
def messages_getter(self, tox_id):
|
def messages_getter(self, tox_id):
|
||||||
return History.MessageGetter(self._name, tox_id)
|
return History.MessageGetter(self._name, tox_id)
|
||||||
|
|
||||||
class MessageGetter(object):
|
class MessageGetter:
|
||||||
def __init__(self, name, tox_id):
|
def __init__(self, name, tox_id):
|
||||||
chdir(settings.ProfileHelper.get_path())
|
chdir(settings.ProfileHelper.get_path())
|
||||||
self._db = connect(name + '.hstr')
|
self._db = connect(name + '.hstr')
|
||||||
|
@ -2,7 +2,7 @@ from platform import system
|
|||||||
from ctypes import CDLL
|
from ctypes import CDLL
|
||||||
|
|
||||||
|
|
||||||
class LibToxCore(object):
|
class LibToxCore:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if system() == 'Linux':
|
if system() == 'Linux':
|
||||||
@ -17,7 +17,7 @@ class LibToxCore(object):
|
|||||||
return self._libtoxcore.__getattr__(item)
|
return self._libtoxcore.__getattr__(item)
|
||||||
|
|
||||||
|
|
||||||
class LibToxAV(object):
|
class LibToxAV:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if system() == 'Linux':
|
if system() == 'Linux':
|
||||||
@ -33,7 +33,7 @@ class LibToxAV(object):
|
|||||||
return self._libtoxav.__getattr__(item)
|
return self._libtoxav.__getattr__(item)
|
||||||
|
|
||||||
|
|
||||||
class LibToxEncryptSave(object):
|
class LibToxEncryptSave:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if system() == 'Linux':
|
if system() == 'Linux':
|
||||||
|
@ -18,7 +18,7 @@ import profile
|
|||||||
from plugin_support import PluginLoader
|
from plugin_support import PluginLoader
|
||||||
|
|
||||||
|
|
||||||
class Toxygen(object):
|
class Toxygen:
|
||||||
|
|
||||||
def __init__(self, path_or_uri=None):
|
def __init__(self, path_or_uri=None):
|
||||||
super(Toxygen, self).__init__()
|
super(Toxygen, self).__init__()
|
||||||
@ -322,7 +322,7 @@ class Toxygen(object):
|
|||||||
self.toxav.iterate()
|
self.toxav.iterate()
|
||||||
self.msleep(self.toxav.iteration_interval())
|
self.msleep(self.toxav.iteration_interval())
|
||||||
|
|
||||||
class Login(object):
|
class Login:
|
||||||
|
|
||||||
def __init__(self, arr):
|
def __init__(self, arr):
|
||||||
self.arr = arr
|
self.arr = arr
|
||||||
|
@ -9,7 +9,7 @@ MESSAGE_TYPE = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Message(object):
|
class Message:
|
||||||
|
|
||||||
def __init__(self, message_type, owner, time):
|
def __init__(self, message_type, owner, time):
|
||||||
self._time = time
|
self._time = time
|
||||||
|
@ -35,7 +35,7 @@ def tray_notification(title, text, tray, window):
|
|||||||
tray.connect(tray, QtCore.SIGNAL("messageClicked()"), message_clicked)
|
tray.connect(tray, QtCore.SIGNAL("messageClicked()"), message_clicked)
|
||||||
|
|
||||||
|
|
||||||
class AudioFile(object):
|
class AudioFile:
|
||||||
chunk = 1024
|
chunk = 1024
|
||||||
|
|
||||||
def __init__(self, fl):
|
def __init__(self, fl):
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
import util
|
import util
|
||||||
import profile
|
import profile
|
||||||
import os
|
import os
|
||||||
import imp
|
import importlib
|
||||||
import inspect
|
import inspect
|
||||||
import plugins.plugin_super_class as pl
|
import plugins.plugin_super_class as pl
|
||||||
import toxencryptsave
|
import toxencryptsave
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
class PluginLoader(util.Singleton):
|
class PluginLoader(util.Singleton):
|
||||||
|
|
||||||
def __init__(self, tox, settings):
|
def __init__(self, tox, settings):
|
||||||
PluginLoader._instance = self
|
super().__init__()
|
||||||
self._profile = profile.Profile.get_instance()
|
self._profile = profile.Profile.get_instance()
|
||||||
self._settings = settings
|
self._settings = settings
|
||||||
self._plugins = {} # dict. key - plugin unique short name, value - tuple (plugin instance, is active)
|
self._plugins = {} # dict. key - plugin unique short name, value - tuple (plugin instance, is active)
|
||||||
@ -33,13 +34,15 @@ class PluginLoader(util.Singleton):
|
|||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
util.log('Plugin dir not found')
|
util.log('Plugin dir not found')
|
||||||
return
|
return
|
||||||
|
else:
|
||||||
|
sys.path.append(path)
|
||||||
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
|
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
|
||||||
for fl in files:
|
for fl in files:
|
||||||
if fl in ('plugin_super_class.py', '__init__.py') or not fl.endswith('.py'):
|
if fl in ('plugin_super_class.py', '__init__.py') or not fl.endswith('.py'):
|
||||||
continue
|
continue
|
||||||
name = fl[:-3] # module name without .py
|
name = fl[:-3] # module name without .py
|
||||||
try:
|
try:
|
||||||
module = imp.load_source('plugins.' + name, path + fl) # import plugin
|
module = importlib.import_module(name) # import plugin
|
||||||
except ImportError:
|
except ImportError:
|
||||||
util.log('Import error in module ' + name)
|
util.log('Import error in module ' + name)
|
||||||
continue
|
continue
|
||||||
@ -48,7 +51,7 @@ class PluginLoader(util.Singleton):
|
|||||||
continue
|
continue
|
||||||
for elem in dir(module):
|
for elem in dir(module):
|
||||||
obj = getattr(module, elem)
|
obj = getattr(module, elem)
|
||||||
if inspect.isclass(obj) and issubclass(obj, pl.PluginSuperClass): # looking for plugin class in module
|
if inspect.isclass(obj) and hasattr(obj, 'is_plugin') and obj.is_plugin: # looking for plugin class in module
|
||||||
print('Plugin', elem)
|
print('Plugin', elem)
|
||||||
try: # create instance of plugin class
|
try: # create instance of plugin class
|
||||||
inst = obj(self._tox, self._profile, self._settings, self._encr)
|
inst = obj(self._tox, self._profile, self._settings, self._encr)
|
||||||
@ -148,6 +151,6 @@ class PluginLoader(util.Singleton):
|
|||||||
"""
|
"""
|
||||||
App is closing, stop all plugins
|
App is closing, stop all plugins
|
||||||
"""
|
"""
|
||||||
for key in self._plugins.keys():
|
for key in list(self._plugins.keys()):
|
||||||
self._plugins[key][0].close()
|
self._plugins[key][0].close()
|
||||||
del self._plugins[key]
|
del self._plugins[key]
|
||||||
|
@ -26,13 +26,14 @@ def log(name, data):
|
|||||||
:param data: data for saving in log
|
:param data: data for saving in log
|
||||||
"""
|
"""
|
||||||
with open(path_to_data(name) + 'logs.txt', 'a') as fl:
|
with open(path_to_data(name) + 'logs.txt', 'a') as fl:
|
||||||
fl.write(str(data) + '\n')
|
fl.write(bytes(data, 'utf-8') + b'\n')
|
||||||
|
|
||||||
|
|
||||||
class PluginSuperClass(object):
|
class PluginSuperClass:
|
||||||
"""
|
"""
|
||||||
Superclass for all plugins. Plugin is python module with at least one class derived from PluginSuperClass.
|
Superclass for all plugins. Plugin is python module with at least one class derived from PluginSuperClass.
|
||||||
"""
|
"""
|
||||||
|
is_plugin = True
|
||||||
|
|
||||||
def __init__(self, name, short_name, tox=None, profile=None, settings=None, encrypt_save=None):
|
def __init__(self, name, short_name, tox=None, profile=None, settings=None, encrypt_save=None):
|
||||||
"""
|
"""
|
||||||
@ -159,9 +160,9 @@ class PluginSuperClass(object):
|
|||||||
"""
|
"""
|
||||||
This method loads settings of plugin and returns raw data
|
This method loads settings of plugin and returns raw data
|
||||||
"""
|
"""
|
||||||
with open(path_to_data(self._short_name) + 'settings.json') as fl:
|
with open(path_to_data(self._short_name) + 'settings.json', 'rb') as fl:
|
||||||
data = fl.read()
|
data = fl.read()
|
||||||
return data
|
return str(data, 'utf-8')
|
||||||
|
|
||||||
def save_settings(self, data):
|
def save_settings(self, data):
|
||||||
"""
|
"""
|
||||||
@ -169,7 +170,7 @@ class PluginSuperClass(object):
|
|||||||
:param data: string with data
|
:param data: string with data
|
||||||
"""
|
"""
|
||||||
with open(path_to_data(self._short_name) + 'settings.json', 'wb') as fl:
|
with open(path_to_data(self._short_name) + 'settings.json', 'wb') as fl:
|
||||||
fl.write(data)
|
fl.write(bytes(data, 'utf-8'))
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Callbacks
|
# Callbacks
|
||||||
@ -212,8 +213,10 @@ class PluginSuperClass(object):
|
|||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
return self._tox.friend_send_lossless_packet(friend_number,
|
return self._tox.friend_send_lossless_packet(friend_number,
|
||||||
|
bytes([ord(x) for x in
|
||||||
chr(len(self._short_name) + LOSSLESS_FIRST_BYTE) +
|
chr(len(self._short_name) + LOSSLESS_FIRST_BYTE) +
|
||||||
self._short_name + str(data))
|
self._short_name + str(data)
|
||||||
|
]))
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -228,7 +231,9 @@ class PluginSuperClass(object):
|
|||||||
data = ''
|
data = ''
|
||||||
try:
|
try:
|
||||||
return self._tox.friend_send_lossy_packet(friend_number,
|
return self._tox.friend_send_lossy_packet(friend_number,
|
||||||
|
bytes([ord(x) for x in
|
||||||
chr(len(self._short_name) + LOSSY_FIRST_BYTE) +
|
chr(len(self._short_name) + LOSSY_FIRST_BYTE) +
|
||||||
self._short_name + str(data))
|
self._short_name + str(data)
|
||||||
|
]))
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
@ -26,11 +26,12 @@ class Profile(contact.Contact, Singleton):
|
|||||||
:param tox: tox instance
|
:param tox: tox instance
|
||||||
:param screen: ref to main screen
|
:param screen: ref to main screen
|
||||||
"""
|
"""
|
||||||
super(Profile, self).__init__(tox.self_get_name(),
|
contact.Contact.__init__(self,
|
||||||
|
tox.self_get_name(),
|
||||||
tox.self_get_status_message(),
|
tox.self_get_status_message(),
|
||||||
screen.user_info,
|
screen.user_info,
|
||||||
tox.self_get_address())
|
tox.self_get_address())
|
||||||
Profile._instance = self
|
Singleton.__init__(self)
|
||||||
self._screen = screen
|
self._screen = screen
|
||||||
self._messages = screen.messages
|
self._messages = screen.messages
|
||||||
self._tox = tox
|
self._tox = tox
|
||||||
|
@ -14,7 +14,7 @@ class Settings(dict, Singleton):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
Settings._instance = self
|
Singleton.__init__(self)
|
||||||
self.path = ProfileHelper.get_path() + str(name) + '.json'
|
self.path = ProfileHelper.get_path() + str(name) + '.json'
|
||||||
self.name = name
|
self.name = name
|
||||||
if os.path.isfile(self.path):
|
if os.path.isfile(self.path):
|
||||||
@ -201,7 +201,7 @@ class ProfileHelper(Singleton):
|
|||||||
Class with methods for search, load and save profiles
|
Class with methods for search, load and save profiles
|
||||||
"""
|
"""
|
||||||
def __init__(self, path, name):
|
def __init__(self, path, name):
|
||||||
ProfileHelper._instance = self
|
Singleton.__init__(self)
|
||||||
self._path = path + name + '.tox'
|
self._path = path + name + '.tox'
|
||||||
self._directory = path
|
self._directory = path
|
||||||
# create /avatars if not exists:
|
# create /avatars if not exists:
|
||||||
|
@ -14,7 +14,7 @@ class SmileyLoader(util.Singleton):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, settings):
|
def __init__(self, settings):
|
||||||
SmileyLoader._instance = self
|
super().__init__()
|
||||||
self._settings = settings
|
self._settings = settings
|
||||||
self._curr_pack = None # current pack name
|
self._curr_pack = None # current pack name
|
||||||
self._smileys = {} # smileys dict. key - smiley (str), value - path to image (str)
|
self._smileys = {} # smileys dict. key - smiley (str), value - path to image (str)
|
||||||
|
@ -31,7 +31,7 @@ def bin_to_string(raw_id, length):
|
|||||||
return res.upper()
|
return res.upper()
|
||||||
|
|
||||||
|
|
||||||
class Tox(object):
|
class Tox:
|
||||||
|
|
||||||
libtoxcore = LibToxCore()
|
libtoxcore = LibToxCore()
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ from libtox import LibToxAV
|
|||||||
from toxav_enums import *
|
from toxav_enums import *
|
||||||
|
|
||||||
|
|
||||||
class ToxAV(object):
|
class ToxAV:
|
||||||
"""
|
"""
|
||||||
The ToxAV instance type. Each ToxAV instance can be bound to only one Tox instance, and Tox instance can have only
|
The ToxAV instance type. Each ToxAV instance can be bound to only one Tox instance, and Tox instance can have only
|
||||||
one ToxAV instance. One must make sure to close ToxAV instance prior closing Tox instance otherwise undefined
|
one ToxAV instance. One must make sure to close ToxAV instance prior closing Tox instance otherwise undefined
|
||||||
|
@ -39,7 +39,7 @@ class LibToxEncryptSave(util.Singleton):
|
|||||||
libtoxencryptsave = libtox.LibToxEncryptSave()
|
libtoxencryptsave = libtox.LibToxEncryptSave()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
LibToxEncryptSave._instance = self
|
super().__init__()
|
||||||
self._passphrase = None
|
self._passphrase = None
|
||||||
|
|
||||||
def set_password(self, passphrase):
|
def set_password(self, passphrase):
|
||||||
|
@ -29,6 +29,9 @@ def convert_time(t):
|
|||||||
class Singleton:
|
class Singleton:
|
||||||
_instance = None
|
_instance = None
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.__class__._instance = self
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_instance(cls):
|
def get_instance(cls):
|
||||||
return cls._instance
|
return cls._instance
|
||||||
|
Loading…
Reference in New Issue
Block a user