Beispiel #1
0
 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
Beispiel #2
0
 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')
Beispiel #5
0
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