| Home | Trees | Indices | Help |
|
|---|
|
|
1 print('****************************************************************************');
2 print('SkypeKit Python Wrapper Tutorial: Picking Up Incoming Calls');
3 print('****************************************************************************');
4
5 # This example demonstrates, how to:
6 # 1. Pick up incoming voice calls
7
8 # NB! You will need to launch the SkypeKit runtime before running this example.
9
10 #----------------------------------------------------------------------------------
11 # Importing necessary libraries. Note that you will need to set the keyFileName value
12 # in the keypair.py file.
13
14 import sys;
15 import keypair;
16 from time import sleep;
17
18 sys.path.append(keypair.distroRoot + '/ipc/python');
19 sys.path.append(keypair.distroRoot + '/interfaces/skype/python');
20
21 try:
22 import Skype;
23 except ImportError:
24 raise SystemExit('Program requires Skype and skypekit modules');
25
26 #----------------------------------------------------------------------------------
27 # Taking skypename and password arguments from command-line.
28
29 if len(sys.argv) != 3:
30 print('Usage: python autoanswer.py <skypename> <password>');
31 sys.exit();
32
33 accountName = sys.argv[1];
34 accountPsw = sys.argv[2];
35 loggedIn = False;
36
37 #----------------------------------------------------------------------------------
38 # Defining our own Account property change callback and assigning it to the
39 # Skype.Account class.
40
42 global loggedIn;
43 if property_name == 'status':
44 if self.status == 'LOGGED_IN':
45 loggedIn = True;
46 print('Login complete.');
47
48 Skype.Account.OnPropertyChange = AccountOnChange;
49
50 #----------------------------------------------------------------------------------
51 # The first thing to do here is actually related to our upcoming Skype class.
52 # We will need some way to determine whether we already have a live conversation
53 # up in the system. We also need to have a way to access that live conversation.
54 # The most reasonable place for those is the Skype module, so we can reference
55 # them later as MySkype.isLiveSessionUp and MySkype.liveSession (Conversation object).
56 #
57 # The main reason we need the liveSession variable is that we want to keep getting
58 # OnPropertyChange events for this object even when the conversation goes non-live.
59
60 Skype.Skype.isLiveSessionUp = False;
61 Skype.Skype.liveSession = 0;
62
63 #----------------------------------------------------------------------------------
64 # The next thing will be to add our own Conversation method for picking up calls.
65 # We will be picking up calls from two separate places:
66 # 1. Conversation.OnPropertyChange when local_livestatus goes 'RINGING_FOR_ME'
67 # 2. SkyLib.OnConversationListChange when local_livestatus goes 'RINGING_FOR_ME'
68 # So it makes sense to have the code surrounding the standard Conversation.JoinLiveSession
69 # all in one place.
70
72 participants = self.GetParticipants('OTHER_CONSUMERS');
73 partListStr = '';
74 for p in participants:
75 partListStr = partListStr + ' ' + p.identity;
76
77 print('Incoming call from: ' + partListStr);
78
79 if MySkype.isLiveSessionUp:
80 print('We already have a live session. Cannot have two at the same time.');
81 else:
82 self.JoinLiveSession('');
83 MySkype.liveSession = self;
84
85 Skype.Conversation.PickUpCall = PickUpCall;
86
87 #----------------------------------------------------------------------------------
88 # Conversation.OnPropertyChange event will only fire when the corresponding
89 # Conversation object is already created. This means that we will not get
90 # this event when the object is created as a -result- of a property change.
91 # The -first- Conversation.local_livestatus == 'RINGING_FOR_ME' will -not-
92 # fire for us, because we only get the conversation object as a result of this
93 # property change, in Skype.OnConversationListChange callback.
94
96
97 if property_name == 'local_livestatus':
98
99 if self.local_livestatus == 'RINGING_FOR_ME':
100 print(self.displayname + ' RING! RING! (from Conversation.OnPropertyChange)');
101 self.PickUpCall();
102
103 if self.local_livestatus == 'IM_LIVE':
104 MySkype.isLiveSessionUp = True;
105 MySkype.liveSession = self;
106 print(self.displayname + ' is now live.');
107
108 if self.local_livestatus == 'RECENTLY_LIVE':
109 MySkype.isLiveSessionUp = False;
110 print(self.displayname + ' is no longer live.');
111
112 Skype.Conversation.OnPropertyChange = ConversationOnChange;
113
114 #----------------------------------------------------------------------------------
115 # Skype.Skype (basically our Skype class)
116 # Now, Skype.OnConversationListChange -will- fire on the first incoming call,
117 # as we already have a Skype object and OnConversationListChange is a method of that
118 # class. So the first incoming call in any given conversation we can pick up here,
119 # when the local_livestatus goes 'RINGING_FOR_ME'.
120 #
121 # The problem here is that if the call drops and immediately after that, another call
122 # comes in from the same conversation - the OnConversationListChange event will not
123 # fire again. The reason is that conversations remain in the LIVE_CONVERSATIONS list
124 # for several seconds after the call goes down. Solution is to keep the conversation
125 # object somewhere (in our case the SkyLib.liveSession variable) so that OnPropertyChange
126 # callback will fire, when the second call comes. Then we can pick the call up from there.
127
129
130 if type == 'LIVE_CONVERSATIONS':
131
132 if conversation.local_livestatus == 'RINGING_FOR_ME':
133 print(conversation.displayname + ' RING! RING! (from Skype.OnConversationListChange).');
134 conversation.PickUpCall();
135
136 if added == True:
137 MySkype.liveSession = conversation;
138 print(conversation.displayname + ' added to live list.');
139
140 if added == False:
141 MySkype.liveSession = 0;
142 print(conversation.displayname + ' is no longer in live list.');
143
144 Skype.Skype.OnConversationListChange = SkypeOnConversationListChange;
145
146 #----------------------------------------------------------------------------------
147 # Creating our main Skype object
148
149 try:
150 MySkype = Skype.GetSkype(keypair.keyFileName);
151 MySkype.Start();
152 except Exception:
153 raise SystemExit('Unable to create Skype instance');
154
155 #----------------------------------------------------------------------------------
156 # Retrieving account and logging in with it. Then waiting in loop.
157
158 account = MySkype.GetAccount(accountName);
159
160 print('Logging in with ' + accountName);
161 account.LoginWithPassword(accountPsw, False, False);
162
163 while loggedIn == False:
164 sleep(1);
165
166 print('Now accepting incoming calls..');
167 print('Press ENTER to exit');
168 raw_input('');
169
170 if MySkype.liveSession != 0:
171 # Leaving the live session before calling Skype.Stop() is mandatory.
172 # Otherwise the runtime will exit with an error.
173 print('There is a live conversation up, dropping it before exit.');
174 MySkype.liveSession.LeaveLiveSession();
175
176 print('Exiting..');
177 MySkype.stop();
178
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Fri Mar 16 16:40:38 2012 | http://epydoc.sourceforge.net |