12 _moduleLogger = logging.getLogger("gvoice.session")
15 class Session(object):
17 def __init__(self, cookiePath = None):
21 self._backend = backend.GVoiceBackend(cookiePath)
23 self._addressbook = addressbook.Addressbook(self._backend)
24 self._addressbookStateMachine = state_machine.UpdateStateMachine([self.addressbook], "Addressbook")
25 self._addressbookStateMachine.set_state_strategy(
26 state_machine.StateMachine.STATE_DND,
27 state_machine.NopStateStrategy()
29 self._addressbookStateMachine.set_state_strategy(
30 state_machine.StateMachine.STATE_IDLE,
31 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(hours=6))
33 self._addressbookStateMachine.set_state_strategy(
34 state_machine.StateMachine.STATE_ACTIVE,
35 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(hours=2))
38 self._voicemails = conversations.Conversations(self._backend.get_voicemails)
39 self._voicemailsStateMachine = state_machine.UpdateStateMachine([self.voicemails], "Voicemail")
40 self._voicemailsStateMachine.set_state_strategy(
41 state_machine.StateMachine.STATE_DND,
42 state_machine.NopStateStrategy()
44 self._voicemailsStateMachine.set_state_strategy(
45 state_machine.StateMachine.STATE_IDLE,
46 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=60))
48 self._voicemailsStateMachine.set_state_strategy(
49 state_machine.StateMachine.STATE_ACTIVE,
50 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=10))
52 self._voicemails.updateSignalHandler.register_sink(
53 self._voicemailsStateMachine.request_reset_timers
56 self._texts = conversations.Conversations(self._backend.get_texts)
57 self._textsStateMachine = state_machine.UpdateStateMachine([self.texts], "Texting")
58 self._textsStateMachine.set_state_strategy(
59 state_machine.StateMachine.STATE_DND,
60 state_machine.NopStateStrategy()
62 self._textsStateMachine.set_state_strategy(
63 state_machine.StateMachine.STATE_IDLE,
64 state_machine.ConstantStateStrategy(state_machine.to_milliseconds(minutes=30))
66 self._textsStateMachine.set_state_strategy(
67 state_machine.StateMachine.STATE_ACTIVE,
68 state_machine.GeometricStateStrategy(
69 state_machine.to_milliseconds(seconds=20),
70 state_machine.to_milliseconds(milliseconds=500),
71 state_machine.to_milliseconds(minutes=10),
74 self._texts.updateSignalHandler.register_sink(
75 self._textsStateMachine.request_reset_timers
78 self._masterStateMachine = state_machine.MasterStateMachine()
79 self._masterStateMachine.append_machine(self._addressbookStateMachine)
80 self._masterStateMachine.append_machine(self._voicemailsStateMachine)
81 self._masterStateMachine.append_machine(self._textsStateMachine)
84 self._texts.load(os.sep.join((path, "texts.cache")))
85 self._voicemails.load(os.sep.join((path, "voicemails.cache")))
88 self._texts.save(os.sep.join((path, "texts.cache")))
89 self._voicemails.save(os.sep.join((path, "voicemails.cache")))
92 self._voicemails.updateSignalHandler.unregister_sink(
93 self._voicemailsStateMachine.request_reset_timers
95 self._texts.updateSignalHandler.unregister_sink(
96 self._textsStateMachine.request_reset_timers
98 self._masterStateMachine.close()
100 def login(self, username, password):
101 self._username = username
102 self._password = password
103 self._backend.login(self._username, self._password)
105 self._masterStateMachine.start()
108 self._masterStateMachine.stop()
109 self._backend.logout()
111 self._username = None
112 self._password = None
114 def is_logged_in(self):
115 if self._username is None and self._password is None:
116 _moduleLogger.info("Hasn't even attempted to login yet")
118 elif self._backend.is_authed():
122 loggedIn = self._backend.login(self._username, self._password)
123 except RuntimeError, e:
124 _moduleLogger.exception("Re-authenticating and erroring")
129 _moduleLogger.info("Login failed")
136 Login enforcing backend
138 assert self.is_logged_in(), "User not logged in"
142 def addressbook(self):
143 return self._addressbook
150 def voicemails(self):
151 return self._voicemails
154 def stateMachine(self):
155 return self._masterStateMachine
158 def addressbookStateMachine(self):
159 return self._addressbookStateMachine
162 def voicemailsStateMachine(self):
163 return self._voicemailsStateMachine
166 def textsStateMachine(self):
167 return self._textsStateMachine