139 lines
4.8 KiB
Python
139 lines
4.8 KiB
Python
from PySide import QtCore
|
|
from notifications import *
|
|
from settings import Settings
|
|
from profile import Profile
|
|
from toxcore_enums_and_consts import *
|
|
from tox import bin_to_string
|
|
|
|
|
|
class InvokeEvent(QtCore.QEvent):
|
|
EVENT_TYPE = QtCore.QEvent.Type(QtCore.QEvent.registerEventType())
|
|
|
|
def __init__(self, fn, *args, **kwargs):
|
|
QtCore.QEvent.__init__(self, InvokeEvent.EVENT_TYPE)
|
|
self.fn = fn
|
|
self.args = args
|
|
self.kwargs = kwargs
|
|
|
|
|
|
class Invoker(QtCore.QObject):
|
|
|
|
def event(self, event):
|
|
event.fn(*event.args, **event.kwargs)
|
|
return True
|
|
|
|
_invoker = Invoker()
|
|
|
|
|
|
def invoke_in_main_thread(fn, *args, **kwargs):
|
|
QtCore.QCoreApplication.postEvent(_invoker, InvokeEvent(fn, *args, **kwargs))
|
|
|
|
|
|
def self_connection_status(tox_link):
|
|
"""
|
|
:param tox_link: tox instance
|
|
:return: function for tox.callback_self_connection_status
|
|
"""
|
|
def wrapped(tox, connection, user_data):
|
|
print 'Connection status: ', str(connection)
|
|
profile = Profile.get_instance()
|
|
if profile.status is None:
|
|
status = tox_link.self_get_status()
|
|
invoke_in_main_thread(profile.set_status, status)
|
|
elif connection == TOX_CONNECTION['NONE']:
|
|
invoke_in_main_thread(profile.set_status, None)
|
|
return wrapped
|
|
|
|
|
|
def friend_status(tox, friend_num, new_status, user_data):
|
|
"""
|
|
Check friend's status (none, busy, away)
|
|
"""
|
|
print "Friend's #{} status changed! New status: {}".format(friend_num, new_status)
|
|
profile = Profile.get_instance()
|
|
friend = profile.get_friend_by_number(friend_num)
|
|
invoke_in_main_thread(friend.set_status, new_status)
|
|
|
|
|
|
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)
|
|
profile = Profile.get_instance()
|
|
friend = profile.get_friend_by_number(friend_num)
|
|
if new_status == TOX_CONNECTION['NONE']:
|
|
invoke_in_main_thread(friend.set_status, None)
|
|
invoke_in_main_thread(profile.update_filtration)
|
|
|
|
|
|
def friend_name(window):
|
|
"""
|
|
:param window: main window
|
|
:return: function for callback friend_name. It updates friend's name
|
|
and calls window repaint
|
|
"""
|
|
def wrapped(tox, friend_num, name, size, user_data):
|
|
profile = Profile.get_instance()
|
|
friend = profile.get_friend_by_number(friend_num)
|
|
print 'New name: ', str(friend_num), str(name)
|
|
invoke_in_main_thread(friend.set_name, name)
|
|
if profile.get_active_number() == friend_num:
|
|
invoke_in_main_thread(profile.set_active)
|
|
return wrapped
|
|
|
|
|
|
def friend_status_message(window):
|
|
"""
|
|
:param window: main window
|
|
:return: function for callback friend_status_message. It updates friend's status message
|
|
and calls window repaint
|
|
"""
|
|
def wrapped(tox, friend_num, status_message, size, user_data):
|
|
profile = Profile.get_instance()
|
|
friend = profile.get_friend_by_number(friend_num)
|
|
invoke_in_main_thread(friend.set_status_message, status_message)
|
|
print 'User #{} has new status: {}'.format(friend_num, status_message)
|
|
if profile.get_active_number() == friend_num:
|
|
invoke_in_main_thread(profile.set_active)
|
|
return wrapped
|
|
|
|
|
|
def friend_message(window):
|
|
"""
|
|
:param window: main window
|
|
:return: function for tox.callback_friend_message. Adds new message to list
|
|
"""
|
|
def wrapped(tox, friend_number, message_type, message, size, user_data):
|
|
print 'Message: ', message.decode('utf8')
|
|
profile = Profile.get_instance()
|
|
if not window.isActiveWindow() and Settings()['notifications']:
|
|
friend = profile.get_friend_by_number(friend_number)
|
|
tray_notification(friend.name, message.decode('utf8'))
|
|
invoke_in_main_thread(profile.new_message, friend_number, message_type, message)
|
|
return wrapped
|
|
|
|
|
|
def friend_request(tox, public_key, message, message_size, user_data):
|
|
"""
|
|
Called when user get new friend request
|
|
"""
|
|
profile = Profile.get_instance()
|
|
tox_id = bin_to_string(public_key, TOX_PUBLIC_KEY_SIZE)
|
|
invoke_in_main_thread(profile.process_friend_request, tox_id, message.decode('utf-8'))
|
|
|
|
|
|
def init_callbacks(tox, window):
|
|
"""
|
|
Initialization of all callbacks.
|
|
:param tox: tox instance
|
|
:param window: main window
|
|
"""
|
|
tox.callback_friend_status(friend_status, 0)
|
|
tox.callback_friend_message(friend_message(window), 0)
|
|
tox.callback_self_connection_status(self_connection_status(tox), 0)
|
|
tox.callback_friend_connection_status(friend_connection_status, 0)
|
|
tox.callback_friend_name(friend_name(window), 0)
|
|
tox.callback_friend_status_message(friend_status_message(window), 0)
|
|
tox.callback_friend_request(friend_request, 0)
|