Removing @todo/@bugs because we are now on bugs.maemo.org
[theonering] / src / channel / debug_prompt.py
1 import cmd
2 import StringIO
3 import time
4 import datetime
5 import logging
6
7 import telepathy
8
9 import tp
10 import gtk_toolbox
11 import gvoice
12
13
14 _moduleLogger = logging.getLogger("channel.text")
15
16
17 class DebugPromptChannel(tp.ChannelTypeText, cmd.Cmd):
18
19         def __init__(self, connection, manager, props, contactHandle):
20                 self.__manager = manager
21                 self.__props = props
22
23                 cmd.Cmd.__init__(self, "Debug Prompt")
24                 self.use_rawinput = False
25                 tp.ChannelTypeText.__init__(self, connection, manager, props)
26                 self.__nextRecievedId = 0
27                 self.__lastMessageTimestamp = datetime.datetime(1, 1, 1)
28
29                 self.__otherHandle = contactHandle
30
31         @gtk_toolbox.log_exception(_moduleLogger)
32         def Send(self, messageType, text):
33                 if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
34                         raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
35
36                 self.Sent(int(time.time()), messageType, text)
37
38                 oldStdin, oldStdout = self.stdin, self.stdout
39                 try:
40                         self.stdin = currentStdin = StringIO.StringIO()
41                         self.stdout = currentStdout = StringIO.StringIO()
42                         self.onecmd(text)
43                 finally:
44                         self.stdin, self.stdout = oldStdin, oldStdout
45
46                 self._report_new_message(currentStdout.getvalue())
47
48         @gtk_toolbox.log_exception(_moduleLogger)
49         def Close(self):
50                 self.close()
51
52         def close(self):
53                 _moduleLogger.debug("Closing debug")
54                 tp.ChannelTypeText.Close(self)
55                 self.remove_from_connection()
56
57         def _report_new_message(self, message):
58                 currentReceivedId = self.__nextRecievedId
59
60                 timestamp = int(time.time())
61                 type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL
62
63                 self.Received(currentReceivedId, timestamp, self.__otherHandle, type, 0, message.strip())
64
65                 self.__nextRecievedId += 1
66
67         def do_reset_state_machine(self, args):
68                 if args:
69                         self._report_new_message("No arguments supported")
70                         return
71
72                 try:
73                         for machine in self._conn.session.stateMachine._machines:
74                                 machine.reset_timers()
75                 except Exception, e:
76                         self._report_new_message(str(e))
77
78         def help_reset_state_machine(self):
79                 self._report_new_message("Reset the refreshing state machine")
80
81         def do_get_state(self, args):
82                 if args:
83                         self._report_new_message("No arguments supported")
84                         return
85
86                 try:
87                         state = self._conn.session.stateMachine.state
88                         self._report_new_message(str(state))
89                 except Exception, e:
90                         self._report_new_message(str(e))
91
92         def help_get_state(self):
93                 self._report_new_message("Print the current state the refreshing state machine is in")
94
95         def do_is_authed(self, args):
96                 if args:
97                         self._report_new_message("No arguments supported")
98                         return
99
100                 try:
101                         isAuthed = self._conn.session.backend.is_authed()
102                         self._report_new_message(str(isAuthed))
103                 except Exception, e:
104                         self._report_new_message(str(e))
105
106         def help_is_authed(self):
107                 self._report_new_message("Print whether logged in to Google Voice")
108
109         def do_is_dnd(self, args):
110                 if args:
111                         self._report_new_message("No arguments supported")
112                         return
113
114                 try:
115                         isDnd = self._conn.session.backend.is_dnd()
116                         self._report_new_message(str(isDnd))
117                 except Exception, e:
118                         self._report_new_message(str(e))
119
120         def help_is_dnd(self):
121                 self._report_new_message("Print whether Do-Not-Disturb mode enabled on the Google Voice account")
122
123         def do_get_account_number(self, args):
124                 if args:
125                         self._report_new_message("No arguments supported")
126                         return
127
128                 try:
129                         number = self._conn.session.backend.get_account_number()
130                         self._report_new_message(number)
131                 except Exception, e:
132                         self._report_new_message(str(e))
133
134         def help_get_account_number(self):
135                 self._report_new_message("Print the Google Voice account number")
136
137         def do_get_callback_numbers(self, args):
138                 if args:
139                         self._report_new_message("No arguments supported")
140                         return
141
142                 try:
143                         numbers = self._conn.session.backend.get_callback_numbers()
144                         numbersDisplay = "\n".join(
145                                 "%s: %s" % (name, number)
146                                 for (number, name) in numbers.iteritems()
147                         )
148                         self._report_new_message(numbersDisplay)
149                 except Exception, e:
150                         self._report_new_message(str(e))
151
152         def help_get_callback_numbers(self):
153                 self._report_new_message("Print a list of all configured callback numbers")
154
155         def do_get_sane_callback_number(self, args):
156                 if args:
157                         self._report_new_message("No arguments supported")
158                         return
159
160                 try:
161                         number = gvoice.backend.get_sane_callback(self._conn.session.backend)
162                         self._report_new_message(number)
163                 except Exception, e:
164                         self._report_new_message(str(e))
165
166         def help_get_sane_callback_number(self):
167                 self._report_new_message("Print the best guess of callback numbers to use")
168
169         def do_get_callback_number(self, args):
170                 if args:
171                         self._report_new_message("No arguments supported")
172                         return
173
174                 try:
175                         number = self._conn.session.backend.get_callback_number()
176                         self._report_new_message(number)
177                 except Exception, e:
178                         self._report_new_message(str(e))
179
180         def help_get_callback_number(self):
181                 self._report_new_message("Print the callback number currently enabled")
182
183         def do_call(self, args):
184                 if len(args) != 1:
185                         self._report_new_message("Must specify the phone number and only the phone nunber")
186                         return
187
188                 try:
189                         number = args[0]
190                         self._conn.session.backend.call(number)
191                 except Exception, e:
192                         self._report_new_message(str(e))
193
194         def help_call(self):
195                 self._report_new_message("\n".join(["call NUMBER", "Initiate a callback, Google forwarding the call to the callback number"]))
196
197         def do_send_sms(self, args):
198                 if 1 < len(args):
199                         self._report_new_message("Must specify the phone number and then message")
200                         return
201
202                 try:
203                         number = args[0]
204                         message = " ".join(args[1:])
205                         self._conn.session.backend.send_sms(number, message)
206                 except Exception, e:
207                         self._report_new_message(str(e))
208
209         def help_send_sms(self):
210                 self._report_new_message("\n".join(["send_sms NUMBER MESSAGE0 MESSAGE1 ...", "Send an sms to number NUMBER"]))