Plenty of HACKs to get my code to work with Requests
[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 gtk_toolbox
10
11
12 _moduleLogger = logging.getLogger("channel.text")
13
14
15 class DebugPromptChannel(telepathy.server.ChannelTypeText, cmd.Cmd):
16         """
17         Look into implementing ChannelInterfaceMessages for rich text formatting
18         """
19
20         def __init__(self, connection, manager, props, contactHandle):
21                 self.__manager = manager
22                 self.__props = props
23
24                 cmd.Cmd.__init__(self, "Debug Prompt")
25                 self.use_rawinput = False
26                 try:
27                         # HACK Older python-telepathy way
28                         telepathy.server.ChannelTypeText.__init__(self, connection, contactHandle)
29                         self._requested = props[telepathy.interfaces.CHANNEL_INTERFACE + '.Requested']
30                         self._implement_property_get(
31                                 telepathy.interfaces.CHANNEL_INTERFACE,
32                                 {"Requested": lambda: self._requested}
33                         )
34                 except TypeError:
35                         # HACK Newer python-telepathy way
36                         telepathy.server.ChannelTypeText.__init__(self, connection, manager, props)
37                 self.__nextRecievedId = 0
38                 self.__lastMessageTimestamp = datetime.datetime(1, 1, 1)
39
40                 self.__otherHandle = contactHandle
41
42         def get_props(self):
43                 # HACK Older python-telepathy doesn't provide this
44                 _immutable_properties = {
45                         'ChannelType': telepathy.server.interfaces.CHANNEL_INTERFACE,
46                         'TargetHandle': telepathy.server.interfaces.CHANNEL_INTERFACE,
47                         'Interfaces': telepathy.server.interfaces.CHANNEL_INTERFACE,
48                         'TargetHandleType': telepathy.server.interfaces.CHANNEL_INTERFACE,
49                         'TargetID': telepathy.server.interfaces.CHANNEL_INTERFACE,
50                         'Requested': telepathy.server.interfaces.CHANNEL_INTERFACE
51                 }
52                 props = dict()
53                 for prop, iface in _immutable_properties.items():
54                         props[iface + '.' + prop] = \
55                                 self._prop_getters[iface][prop]()
56                 return props
57
58         @gtk_toolbox.log_exception(_moduleLogger)
59         def Send(self, messageType, text):
60                 if messageType != telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL:
61                         raise telepathy.errors.NotImplemented("Unhandled message type: %r" % messageType)
62
63                 self.Sent(int(time.time()), messageType, text)
64
65                 oldStdin, oldStdout = self.stdin, self.stdout
66                 try:
67                         self.stdin = currentStdin = StringIO.StringIO()
68                         self.stdout = currentStdout = StringIO.StringIO()
69                         self.onecmd(text)
70                 finally:
71                         self.stdin, self.stdout = oldStdin, oldStdout
72
73                 self._report_new_message(currentStdout.getvalue())
74
75         @gtk_toolbox.log_exception(_moduleLogger)
76         def Close(self):
77                 self.close()
78
79         def close(self):
80                 telepathy.server.ChannelTypeText.Close(self)
81                 if self.__manager.channel_exists(self.__props):
82                         # HACK Older python-telepathy requires doing this manually
83                         self.__manager.remove_channel(self)
84                 self.remove_from_connection()
85
86         def _report_new_message(self, message):
87                 currentReceivedId = self.__nextRecievedId
88
89                 timestamp = int(time.time())
90                 type = telepathy.CHANNEL_TEXT_MESSAGE_TYPE_NORMAL
91
92                 self.Received(currentReceivedId, timestamp, self.__otherHandle, type, 0, message.strip())
93
94                 self.__nextRecievedId += 1
95
96         def do_reset_state_machine(self, args):
97                 if args:
98                         self._report_new_message("No arguments supported")
99                         return
100
101                 try:
102                         for machine in self._conn.session.stateMachine._machines:
103                                 machine.reset_timers()
104                 except Exception, e:
105                         self._report_new_message(str(e))
106
107         def do_get_state(self, args):
108                 if args:
109                         self._report_new_message("No arguments supported")
110                         return
111
112                 try:
113                         state = self._conn.session.stateMachine.state
114                         self._report_new_message(str(state))
115                 except Exception, e:
116                         self._report_new_message(str(e))
117
118         def do_is_authed(self, args):
119                 if args:
120                         self._report_new_message("No arguments supported")
121                         return
122
123                 try:
124                         isAuthed = self._conn.session.backend.is_authed()
125                         self._report_new_message(str(isAuthed))
126                 except Exception, e:
127                         self._report_new_message(str(e))
128
129         def do_is_dnd(self, args):
130                 if args:
131                         self._report_new_message("No arguments supported")
132                         return
133
134                 try:
135                         isDnd = self._conn.session.backend.is_dnd()
136                         self._report_new_message(str(isDnd))
137                 except Exception, e:
138                         self._report_new_message(str(e))
139
140         def do_get_account_number(self, args):
141                 if args:
142                         self._report_new_message("No arguments supported")
143                         return
144
145                 try:
146                         number = self._conn.session.backend.get_account_number()
147                         self._report_new_message(number)
148                 except Exception, e:
149                         self._report_new_message(str(e))
150
151         def do_get_callback_numbers(self, args):
152                 if args:
153                         self._report_new_message("No arguments supported")
154                         return
155
156                 try:
157                         numbers = self._conn.session.backend.get_callback_numbers()
158                         numbersDisplay = "\n".join(
159                                 "%s: %s" % (name, number)
160                                 for (number, name) in numbers.iteritems()
161                         )
162                         self._report_new_message(numbersDisplay)
163                 except Exception, e:
164                         self._report_new_message(str(e))
165
166         def do_get_callback_number(self, args):
167                 if args:
168                         self._report_new_message("No arguments supported")
169                         return
170
171                 try:
172                         number = self._conn.session.backend.get_callback_number()
173                         self._report_new_message(number)
174                 except Exception, e:
175                         self._report_new_message(str(e))
176
177         def do_call(self, args):
178                 if len(args) != 1:
179                         self._report_new_message("Must specify the phone number and only the phone nunber")
180                         return
181
182                 try:
183                         number = args[0]
184                         self._conn.session.backend.call(number)
185                 except Exception, e:
186                         self._report_new_message(str(e))
187
188         def do_send_sms(self, args):
189                 if 1 < len(args):
190                         self._report_new_message("Must specify the phone number and then message")
191                         return
192
193                 try:
194                         number = args[0]
195                         message = " ".join(args[1:])
196                         self._conn.session.backend.send_sms(number, message)
197                 except Exception, e:
198                         self._report_new_message(str(e))