plugins fixes, improvements

This commit is contained in:
ingvar1995 2016-06-22 14:35:22 +03:00
parent fb74ea4455
commit 5a0843d98b
18 changed files with 50 additions and 38 deletions

View file

@ -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):

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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')

View file

@ -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':

View file

@ -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

View file

@ -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

View file

@ -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):

View file

@ -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]

View file

@ -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,
chr(len(self._short_name) + LOSSLESS_FIRST_BYTE) + bytes([ord(x) for x in
self._short_name + str(data)) chr(len(self._short_name) + LOSSLESS_FIRST_BYTE) +
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,
chr(len(self._short_name) + LOSSY_FIRST_BYTE) + bytes([ord(x) for x in
self._short_name + str(data)) chr(len(self._short_name) + LOSSY_FIRST_BYTE) +
self._short_name + str(data)
]))
except: except:
return False return False

View file

@ -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_status_message(), tox.self_get_name(),
screen.user_info, tox.self_get_status_message(),
tox.self_get_address()) screen.user_info,
Profile._instance = self tox.self_get_address())
Singleton.__init__(self)
self._screen = screen self._screen = screen
self._messages = screen.messages self._messages = screen.messages
self._tox = tox self._tox = tox

View file

@ -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:

View file

@ -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)

View file

@ -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()

View file

@ -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

View file

@ -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):

View file

@ -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