13 _moduleLogger = logging.getLogger("gvoice.session")
16 class Session(object):
18 def __init__(self, cookiePath = None):
22 self._backend = backend.GVoiceBackend(cookiePath)
24 self._addressbook = addressbook.Addressbook(self._backend)
25 self._addressbookStateMachine = state_machine.UpdateStateMachine([self.addressbook], "Addressbook")
26 self._addressbookStateMachine.set_state_strategy(
27 state_machine.StateMachine.STATE_DND,
28 state_machine.NopStateStrategy()
30 self._addressbookStateMachine.set_state_strategy(
31 state_machine.StateMachine.STATE_IDLE,
32 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(hours=6))
34 self._addressbookStateMachine.set_state_strategy(
35 state_machine.StateMachine.STATE_ACTIVE,
36 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(hours=2))
39 self._voicemails = conversations.Conversations(self._backend.get_voicemails)
40 self._voicemailsStateMachine = state_machine.UpdateStateMachine([self.voicemails], "Voicemail")
41 self._voicemailsStateMachine.set_state_strategy(
42 state_machine.StateMachine.STATE_DND,
43 state_machine.NopStateStrategy()
45 self._voicemailsStateMachine.set_state_strategy(
46 state_machine.StateMachine.STATE_IDLE,
47 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=60))
49 self._voicemailsStateMachine.set_state_strategy(
50 state_machine.StateMachine.STATE_ACTIVE,
51 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=10))
53 self._voicemails.updateSignalHandler.register_sink(
54 self._voicemailsStateMachine.request_reset_timers
57 self._texts = conversations.Conversations(self._backend.get_texts)
58 self._textsStateMachine = state_machine.UpdateStateMachine([self.texts], "Texting")
59 self._textsStateMachine.set_state_strategy(
60 state_machine.StateMachine.STATE_DND,
61 state_machine.NopStateStrategy()
63 self._textsStateMachine.set_state_strategy(
64 state_machine.StateMachine.STATE_IDLE,
65 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=30))
67 self._textsStateMachine.set_state_strategy(
68 state_machine.StateMachine.STATE_ACTIVE,
69 state_machine.GeometricStateStrategy(
70 state_machine.to_milliseconds(seconds=20),
71 state_machine.to_milliseconds(milliseconds=500),
72 state_machine.to_milliseconds(minutes=10),
75 self._texts.updateSignalHandler.register_sink(
76 self._textsStateMachine.request_reset_timers
79 self._masterStateMachine = state_machine.MasterStateMachine()
80 self._masterStateMachine.append_machine(self._addressbookStateMachine)
81 self._masterStateMachine.append_machine(self._voicemailsStateMachine)
82 self._masterStateMachine.append_machine(self._textsStateMachine)
84 self._lastDndCheck = 0
85 self._cachedIsDnd = False
88 self._texts.load(os.sep.join((path, "texts.cache")))
89 self._voicemails.load(os.sep.join((path, "voicemails.cache")))
92 self._texts.save(os.sep.join((path, "texts.cache")))
93 self._voicemails.save(os.sep.join((path, "voicemails.cache")))
96 self._voicemails.updateSignalHandler.unregister_sink(
97 self._voicemailsStateMachine.request_reset_timers
99 self._texts.updateSignalHandler.unregister_sink(
100 self._textsStateMachine.request_reset_timers
102 self._masterStateMachine.close()
104 def login(self, username, password):
105 self._username = username
106 self._password = password
107 self._backend.login(self._username, self._password)
109 self._masterStateMachine.start()
112 self._masterStateMachine.stop()
113 self._backend.logout()
115 self._username = None
116 self._password = None
118 def is_logged_in(self):
119 if self._username is None and self._password is None:
120 _moduleLogger.info("Hasn't even attempted to login yet")
122 elif self._backend.is_authed():
126 loggedIn = self._backend.login(self._username, self._password)
127 except RuntimeError, e:
128 _moduleLogger.exception("Re-authenticating and erroring")
133 _moduleLogger.info("Login failed")
137 def set_dnd(self, doNotDisturb):
138 self._backend.set_dnd(doNotDisturb)
139 self._cachedIsDnd = doNotDisturb
142 # To throttle checking with the server, use a 30s cache
143 newTime = time.time()
144 if self._lastDndCheck + 30 < newTime:
145 self._lasDndCheck = newTime
146 self._cachedIsDnd = self._backend.is_dnd()
147 return self._cachedIsDnd
152 Login enforcing backend
154 assert self.is_logged_in(), "User not logged in"
158 def addressbook(self):
159 return self._addressbook
166 def voicemails(self):
167 return self._voicemails
170 def stateMachine(self):
171 return self._masterStateMachine
174 def addressbookStateMachine(self):
175 return self._addressbookStateMachine
178 def voicemailsStateMachine(self):
179 return self._voicemailsStateMachine
182 def textsStateMachine(self):
183 return self._textsStateMachine