def checkOnlineStatus(self): global are_we_offline try : log("Checking online presence", INFO) if settings.get_use_global_status(): new_telepathy_presence = self.getPresence() if new_telepathy_presence and new_telepathy_presence != self.telepathy_presence: self.telepathy_presence = new_telepathy_presence self.skype.ChangeUserStatus(SKYPESTATUS[self.telepathy_presence]) self.skype_presence = SKYPESTATUS[self.telepathy_presence] return AppletRunning if not self.onlinepresenceupdatepending: return AppletRunning self.onlinepresenceupdatepending = False new_skype_presence = self.skype.CurrentUserStatus if new_skype_presence == "OFFLINE": are_we_offline = True if self.skype_presence != new_skype_presence: self.skype_presence = new_skype_presence if settings.get_use_global_status(): new_telepathy_presence = SKYPETOTELEPATHY[self.skype_presence] self.setPresence(new_telepathy_presence) self.telepathy_presence = new_telepathy_presence limitcpu() except Exception, e: log("Checking online presence failed "+str(e), WARNING) raise
def initSkypeFirstStart(self, count=0) : global are_we_offline self.telepathy_presence = self.getPresence() if self.telepathy_presence == "OFFLINE" and not settings.get_use_global_status(): self.skype.ChangeUserStatus(SKYPESTATUS[self.telepathy_presence]) self.skype_presence = self.skype.CurrentUserStatus try : log("Initializing online status for users", INFO) max_wait_time = 0 while self.skype.CurrentUserStatus == "OFFLINE": log("We are offline", INFO) time.sleep(0.5) max_wait_time = max_wait_time + 1 if max_wait_time == 20: are_we_offline = True break if self.skype.CurrentUserStatus != "OFFLINE": are_we_offline = False if not settings.get_notify_on_initializing(): time.sleep(5) if self.skype.Friends: for friend in self.skype.Friends: if not friend.Handle in self.usersonline: if friend.OnlineStatus != "OFFLINE": self.usersonline[friend.Handle] = friend except Exception, e: if count < 5: log("SkypeBehaviour::initSkypeFirstStart() failed, trying again", WARNING) self.initSkypeFirstStart ( count+1 ) else: log("Completely failed to initialize skype-wrapper: "+str(e), ERROR) sys.exit(2) # perhaps its an issue with the dbus
def getPresence(self) : if not helpers.isInstalled('telepathy-mission-control-5') or 'mission-control' not in commands.getoutput('ps -A | grep mission-control' ) or not settings.get_use_global_status(): return None account_manager = bus.get_object('org.freedesktop.Telepathy.AccountManager', '/org/freedesktop/Telepathy/AccountManager') accounts = account_manager.Get( 'org.freedesktop.Telepathy.AccountManager', 'ValidAccounts') for account_path in accounts: if str(account_path) == '/org/freedesktop/Telepathy/Account/ring/tel/ring': continue account = bus.get_object('org.freedesktop.Telepathy.AccountManager', account_path) enabled = account.Get('org.freedesktop.Telepathy.Account', 'Enabled') if not enabled: continue i,s,t = account.Get('org.freedesktop.Telepathy.Account', 'RequestedPresence') return i return None
def setPresence(self, presence): if not helpers.isInstalled('telepathy-mission-control-5') or 'mission-control' not in commands.getoutput('ps -A | grep mission-control' ) or not settings.get_use_global_status(): return account_manager = bus.get_object('org.freedesktop.Telepathy.AccountManager', '/org/freedesktop/Telepathy/AccountManager') accounts = account_manager.Get( 'org.freedesktop.Telepathy.AccountManager', 'ValidAccounts') for account_path in accounts: if str(account_path) == '/org/freedesktop/Telepathy/Account/ring/tel/ring': continue account = bus.get_object('org.freedesktop.Telepathy.AccountManager', account_path) enabled = account.Get('org.freedesktop.Telepathy.Account', 'Enabled') if not enabled: continue presence_text = "" if presence in STATUSLIST: presence_text = STATUSLIST[presence] account.Set('org.freedesktop.Telepathy.Account', 'RequestedPresence', \ dbus.Struct((dbus.UInt32(presence), presence_text, ''), signature='uss'), dbus_interface='org.freedesktop.DBus.Properties')
class SkypeBehaviour: def MessageStatus(self, message, status): self.messageupdatepending = True def OnlineStatus(self, message, status): self.onlineuserupdatepending = True self.onlinepresenceupdatepending = True def FileTransferStatusChanged(self, message, status): self.filetransferupdatepending = True def CallStatus(self, call, status): global active_player, player_paused, volume_level if status == "RINGING": if settings.get_control_music_player() and active_player == "unknown" and player_paused == False: controlMusicPlayer() if settings.get_restore_volume(): SaveRestore_Volume() self.call_ringing = self.call_ringing + 1 self.calls[call.PartnerHandle] = call else: self.call_ringing = self.call_ringing - 1 #if status == "INPROGRESS":LOCALHOLD if (status == "MISSED" or status == "FINISHED" or status == "REFUSED" or status == "CANCELLED") and call.PartnerHandle in self.calls: if settings.get_restore_volume(): SaveRestore_Volume() volume_level = "unknown" if settings.get_control_music_player(): controlMusicPlayer() active_player = "unknown" player_paused = False del self.calls[call.PartnerHandle] unitylauncher.createCallsQuickList(self.calls, self.cb_call_action) unitylauncher.redrawQuicklist() # wiggle the launcher if self.call_ringing > 0 and not self.calls_ringing_started: unitylauncher.urgent() GObject.timeout_add(1000, self.calls_ringing) icon = "" if settings.get_display_notification_avatars(): avatar = SkypeAvatar(call.PartnerHandle) if avatar.filename: icon = avatar.filename else: icon = "/usr/share/skype-wrapper/icons/skype-wrapper-48.svg" partner = call.PartnerDisplayName or call.PartnerHandle notification = "" if status == "RINGING" and (call.Type == "INCOMING_P2P" or call.Type == "INCOMING_PSTN"): notification = "* Incoming call"; if status == "INPROGRESS": notification = "* Call started"; if status == "MISSED": notification = "* Missed call"; if status == "FINISHED": notification = "* Call ended"; if status == "REMOTEHOLD": notification = "* Call put on hold"; if notification: helpers.notify(partner, notification, icon, "call://"+call.PartnerHandle, True, True) def cb_call_action(self, widget, data = None): log("Quicklist showing conversation", INFO) id = widget.property_get("id") action = widget.property_get("action") if not id in self.calls: return if action == 'HOLD': self.calls[id].Hold() if action == 'FINISH': self.calls[id].Finish() if action == 'ANSWER': self.calls[id].Answer() if action == 'RESUME': self.calls[id].Resume() if action == 'VIDEOOUT': self.calls[id].StartVideoSend() if action == 'VIDEOIN': self.calls[id].StartVideoReceive() if action == 'ENDVIDEOOUT': self.calls[id].StopVideoSend() if action == 'ENDVIDEOIN': self.calls[id].StopVideoReceive() if action == 'MUTE': self.skype._SetMute(True) if action == 'UNMUTE': self.skype._SetMute(False) unitylauncher.createCallsQuickList(self.calls, self.cb_call_action) unitylauncher.redrawQuicklist() def calls_ringing(self) : self.calls_ringing_started = True if self.call_ringing > 0: unitylauncher.urgent() else : self.calls_ringing_started = False return self.call_ringing > 0 # initialize skype def __init__(self): log("Initializing Skype API", INFO) self.skype = Skype4Py.Skype(None, Transport='x11') self.call_ringing = 0 self.calls_ringing_started = False #register events self.skype.RegisterEventHandler('MessageStatus', self.MessageStatus) self.skype.RegisterEventHandler('OnlineStatus', self.OnlineStatus) self.skype.RegisterEventHandler('FileTransferStatusChanged', self.FileTransferStatusChanged) self.skype.RegisterEventHandler('CallStatus', self.CallStatus) self.skype.Timeout = 500 if not isSkypeRunning(): if settings.get_start_skype_cmd_params(): log("Starting Skype with extra params", INFO) subprocess.Popen(shlex.split("skype "+settings.get_start_skype_cmd_params())) else: if not helpers.isSkypeWrapperDesktopOnUnityLauncher(): log("Starting Skype process", INFO) subprocess.Popen(shlex.split("skype")) else: log("Starting Skype", INFO) self.skype.Client.Start(Minimized=True) log("Waiting for Skype Process", INFO) while True: if isSkypeRunning(): break log("Attaching skype-wrapper to Skype process", INFO) while True: try: # don't know if its our authorization request but we will wait our turn if not helpers.isAuthorizationRequestOpen(): self.skype.Attach(Wait=True) break else: log("Authorization dialog still open", INFO) sys.exit(2) except: # we tell the parent process that the skype couldn't attached log("Failed to attach skype-wrapper to Skype process", WARNING) sys.exit(2) log("Attached complete", INFO) #self.skype.Timeout = 30000 unitylauncher.launcher.SkypeAgent = self.skype.Client unitylauncher.launcher.skype = self.skype unitylauncher.launcher.redrawQuicklist() self.skype.Client.Minimize() self.name_mappings = {} self.unread_conversations = {} # we will store all outdated messages here, anything not here will get net notified self.conversations = {} # store all the users online for notifying if they're on self.usersonline = {} # stor all file transfers self.filetransfers = {} self.incomingfilecount = 0 # store all calls current self.calls = {} self.cb_show_conversation = None self.cb_show_indicator = None self.cb_user_status_change = None self.cb_log_message = None self.cb_read_within_skype = None self.cb_log_transfer = None self.initSkypeFirstStart() self.messageupdatepending = True GObject.timeout_add(CB_INTERVALS, self.checkUnreadMessages) self.onlineuserupdatepending = True GObject.timeout_add(CB_INTERVALS, self.checkOnlineUsers) self.onlinepresenceupdatepending = True GObject.timeout_add(CB_INTERVALS, self.checkOnlineStatus) self.filetransferupdatepending = True GObject.timeout_add(CB_INTERVALS, self.checkFileTransfers) def SetShowConversationCallback(self, func): self.cb_show_conversation = func def SetShowIndicatorCallback(self, func): self.cb_show_indicator = func def SetUserOnlineStatusChangeCallback(self, func): self.cb_user_status_change = func def SetNewMessageCallback(self, func): self.cb_log_message = func def SetFileTransferCallback(self, func): self.cb_log_transfer = func def SetSkypeReadCallback(self, func): self.cb_read_within_skype = func def remove_conversation(self, id): try : display_name = self.unread_conversations[int(id)].display_name for _id in self.unread_conversations: if display_name == self.unread_conversations[int(_id)].display_name: self.unread_conversations[int(_id)].Read = True self.unread_conversations[int(id)].Read = True except: # tried to access a non existent conversation pass def logMessage(self, conversation): if not conversation: return id = conversation.id if not id in self.conversations: log("Logging Message", INFO) self.conversations[id] = conversation if self.cb_log_message: self.cb_log_message(conversation) def initSkypeFirstStart(self, count=0) : global are_we_offline self.telepathy_presence = self.getPresence() if self.telepathy_presence == "OFFLINE" and not settings.get_use_global_status(): self.skype.ChangeUserStatus(SKYPESTATUS[self.telepathy_presence]) self.skype_presence = self.skype.CurrentUserStatus try : log("Initializing online status for users", INFO) max_wait_time = 0 while self.skype.CurrentUserStatus == "OFFLINE": log("We are offline", INFO) time.sleep(0.5) max_wait_time = max_wait_time + 1 if max_wait_time == 20: are_we_offline = True break if self.skype.CurrentUserStatus != "OFFLINE": are_we_offline = False if not settings.get_notify_on_initializing(): time.sleep(5) if self.skype.Friends: for friend in self.skype.Friends: if not friend.Handle in self.usersonline: if friend.OnlineStatus != "OFFLINE": self.usersonline[friend.Handle] = friend except Exception, e: if count < 5: log("SkypeBehaviour::initSkypeFirstStart() failed, trying again", WARNING) self.initSkypeFirstStart ( count+1 ) else: log("Completely failed to initialize skype-wrapper: "+str(e), ERROR) sys.exit(2) # perhaps its an issue with the dbus if self.telepathy_presence and settings.get_use_global_status(): self.skype.ChangeUserStatus(SKYPESTATUS[self.telepathy_presence]) self.skype_presence = self.skype.CurrentUserStatus return AppletRunning