Switching to shipping parts of python-telepathy with The One Ring so random changes...
[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
12
13 _moduleLogger = logging.getLogger("channel.text")
14
15
16 class DebugPromptChannel(tp.ChannelTypeText, cmd.Cmd):
17         """
18         Look into implementing ChannelInterfaceMessages for rich text formatting
19         """
20
21         def __init__(self, connection, manager, props, contactHandle):
22                 self.__manager = manager
23                 self.__props = props
24
25                 cmd.Cmd.__init__(self, "Debug Prompt")
26                 self.use_rawinput = False
27                 tp.ChannelTypeText.__init__(self, connection, manager, props)
28                 self.__nextRecievedId = 0
29                 self.__lastMessageTimestamp = datetime.datetime(1, 1, 1)
30
31                 self.__otherHandle = contactHandle
32
33         @gtk_toolbox.log_exception(_moduleLogger)
34         def Send(self, messageType, text):
35                 if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
36                         raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
37
38                 self.Sent(int(time.time()), messageType, text)
39
40                 oldStdin, oldStdout = self.stdin, self.stdout
41                 try:
42                         self.stdin = currentStdin = StringIO.StringIO()
43                         self.stdout = currentStdout = StringIO.StringIO()
44                         self.onecmd(text)
45                 finally:
46                         self.stdin, self.stdout = oldStdin, oldStdout
47
48                 self._report_new_message(currentStdout.getvalue())
49
50         @gtk_toolbox.log_exception(_moduleLogger)
51         def Close(self):
52                 self.close()
53
54         def close(self):
55                 tp.ChannelTypeText.Close(self)
56                 self.remove_from_connection()
57
58         def _report_new_message(self, message):
59                 currentReceivedId = self.__nextRecievedId
60
61                 timestamp = int(time.time())
62                 type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL
63
64                 self.Received(currentReceivedId, timestamp, self.__otherHandle, type, 0, message.strip())
65
66                 self.__nextRecievedId += 1
67
68         def do_reset_state_machine(self, args):
69                 if args:
70                         self._report_new_message("No arguments supported")
71                         return
72
73                 try:
74                         for machine in self._conn.session.stateMachine._machines:
75                                 machine.reset_timers()
76                 except Exception, e:
77                         self._report_new_message(str(e))
78
79         def do_get_state(self, args):
80                 if args:
81                         self._report_new_message("No arguments supported")
82                         return
83
84                 try:
85                         state = self._conn.session.stateMachine.state
86                         self._report_new_message(str(state))
87                 except Exception, e:
88                         self._report_new_message(str(e))
89
90         def do_is_authed(self, args):
91                 if args:
92                         self._report_new_message("No arguments supported")
93                         return
94
95                 try:
96                         isAuthed = self._conn.session.backend.is_authed()
97                         self._report_new_message(str(isAuthed))
98                 except Exception, e:
99                         self._report_new_message(str(e))
100
101         def do_is_dnd(self, args):
102                 if args:
103                         self._report_new_message("No arguments supported")
104                         return
105
106                 try:
107                         isDnd = self._conn.session.backend.is_dnd()
108                         self._report_new_message(str(isDnd))
109                 except Exception, e:
110                         self._report_new_message(str(e))
111
112         def do_get_account_number(self, args):
113                 if args:
114                         self._report_new_message("No arguments supported")
115                         return
116
117                 try:
118                         number = self._conn.session.backend.get_account_number()
119                         self._report_new_message(number)
120                 except Exception, e:
121                         self._report_new_message(str(e))
122
123         def do_get_callback_numbers(self, args):
124                 if args:
125                         self._report_new_message("No arguments supported")
126                         return
127
128                 try:
129                         numbers = self._conn.session.backend.get_callback_numbers()
130                         numbersDisplay = "\n".join(
131                                 "%s: %s" % (name, number)
132                                 for (number, name) in numbers.iteritems()
133                         )
134                         self._report_new_message(numbersDisplay)
135                 except Exception, e:
136                         self._report_new_message(str(e))
137
138         def do_get_callback_number(self, args):
139                 if args:
140                         self._report_new_message("No arguments supported")
141                         return
142
143                 try:
144                         number = self._conn.session.backend.get_callback_number()
145                         self._report_new_message(number)
146                 except Exception, e:
147                         self._report_new_message(str(e))
148
149         def do_call(self, args):
150                 if len(args) != 1:
151                         self._report_new_message("Must specify the phone number and only the phone nunber")
152                         return
153
154                 try:
155                         number = args[0]
156                         self._conn.session.backend.call(number)
157                 except Exception, e:
158                         self._report_new_message(str(e))
159
160         def do_send_sms(self, args):
161                 if 1 < len(args):
162                         self._report_new_message("Must specify the phone number and then message")
163                         return
164
165                 try:
166                         number = args[0]
167                         message = " ".join(args[1:])
168                         self._conn.session.backend.send_sms(number, message)
169                 except Exception, e:
170                         self._report_new_message(str(e))