2012-10-20 22:38:28 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import sys
|
|
|
|
from rflib import *
|
|
|
|
import rflib.chipcon_nic as rfnic
|
|
|
|
import atexit
|
|
|
|
from libtoorchat import *
|
2012-10-21 03:21:22 +00:00
|
|
|
from os import system
|
|
|
|
import curses
|
2012-10-21 22:20:03 +00:00
|
|
|
import webbrowser
|
2012-10-21 03:21:22 +00:00
|
|
|
import time
|
|
|
|
from threading import Thread
|
2012-10-20 22:38:28 +00:00
|
|
|
|
2012-10-21 21:14:55 +00:00
|
|
|
def find_message_in_website(message, visual):
|
|
|
|
found = False
|
|
|
|
for item in visual.website_buffer:
|
|
|
|
if message.index == item.index:
|
|
|
|
found = True
|
|
|
|
if not found:
|
|
|
|
visual.website_buffer.append(message)
|
|
|
|
|
2012-10-21 03:21:22 +00:00
|
|
|
def thread_run(visual):
|
|
|
|
''' This is our function for the thread '''
|
|
|
|
#Thread should run until exit
|
|
|
|
while not visual.exit:
|
2012-10-20 22:38:28 +00:00
|
|
|
try:
|
2012-10-21 03:21:22 +00:00
|
|
|
msg, timestamp = visual.badge.RFrecv()
|
2012-10-21 18:28:19 +00:00
|
|
|
toor_message = ToorChatProtocol.parse_message(msg)
|
2012-10-21 03:59:50 +00:00
|
|
|
if toor_message != None:
|
2012-10-21 18:23:58 +00:00
|
|
|
if toor_message.type == ToorChatProtocol.get_chat_type():
|
|
|
|
visual.message_queue.append(toor_message)
|
|
|
|
if toor_message.type == ToorChatProtocol.get_web_request_type():
|
2012-10-21 20:56:58 +00:00
|
|
|
#If we are registered as a server, lets type to make that request
|
2012-10-21 18:23:58 +00:00
|
|
|
if visual.server:
|
2012-10-21 21:56:05 +00:00
|
|
|
visual.request_xid = toor_message.xid
|
2012-10-21 18:23:58 +00:00
|
|
|
ToorChatProtocol.get_web_messages(toor_message.data, visual)
|
2012-10-21 21:14:55 +00:00
|
|
|
if toor_message.type == ToorChatProtocol.get_web_response_type():
|
|
|
|
# lets see if its the response were looking for
|
|
|
|
if toor_message.xid == visual.request_xid:
|
2012-10-21 21:42:39 +00:00
|
|
|
find_message_in_website(toor_message, visual)
|
2012-10-21 22:20:03 +00:00
|
|
|
if len(visual.website_buffer) == int(toor_message.last)+1:
|
2012-10-21 21:14:55 +00:00
|
|
|
#sort messages
|
2012-10-21 22:20:03 +00:00
|
|
|
newlist = sorted(visual.website_buffer, key=lambda x: int(x.index), reverse=False)
|
2012-10-21 22:25:19 +00:00
|
|
|
try:
|
|
|
|
os.remove('temp.html')
|
|
|
|
except Exception:
|
|
|
|
#There is a chance this file might now exist
|
|
|
|
pass
|
2012-10-21 22:20:03 +00:00
|
|
|
temp_file = open('temp.html', 'w')
|
|
|
|
total = ""
|
|
|
|
for item in newlist:
|
|
|
|
total += item.data
|
|
|
|
temp_file.write(total)
|
|
|
|
temp_file.close()
|
2012-10-21 22:39:17 +00:00
|
|
|
visual.website_buffer = []
|
2012-10-21 21:14:55 +00:00
|
|
|
#Render website
|
2012-10-21 22:20:03 +00:00
|
|
|
webbrowser.get('firefox').open_new('temp.html')
|
2012-10-21 18:23:58 +00:00
|
|
|
|
2012-10-20 22:38:28 +00:00
|
|
|
except ChipconUsbTimeoutException:
|
|
|
|
pass
|
|
|
|
|
2012-10-21 03:21:22 +00:00
|
|
|
class Visualizer():
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
self.screen = curses.initscr()
|
|
|
|
self.screen.nodelay(1)
|
|
|
|
self.badge = RfCat(idx=0)
|
|
|
|
self.badge.setModeRX()
|
|
|
|
self.protocol = ToorChatProtocol(self.badge)
|
|
|
|
self.message_queue = []
|
2012-10-21 19:51:06 +00:00
|
|
|
self.website_buffer = []
|
2012-10-21 04:44:30 +00:00
|
|
|
self.user = None
|
2012-10-21 19:27:53 +00:00
|
|
|
self.channel = None
|
|
|
|
self.frequency = None
|
2012-10-21 21:14:55 +00:00
|
|
|
self.request_xid = None
|
2012-10-21 03:21:22 +00:00
|
|
|
#This when set to True will kill the thread
|
|
|
|
self.exit = False
|
2012-10-21 18:23:58 +00:00
|
|
|
self.server = False
|
|
|
|
|
|
|
|
def set_server(self):
|
|
|
|
self.server = True
|
2012-10-21 03:21:22 +00:00
|
|
|
|
|
|
|
def start(self):
|
|
|
|
self.__start_recv_thread__()
|
|
|
|
self.__run__()
|
|
|
|
|
|
|
|
def __start_recv_thread__(self):
|
|
|
|
'''This spins off a thread to deal with recving information from the rf device '''
|
|
|
|
self.thread = Thread(target=thread_run, args=(self,))
|
|
|
|
self.thread.start()
|
|
|
|
|
|
|
|
def __run__(self):
|
|
|
|
try:
|
|
|
|
self.screen_max_y, self.screen_max_x = self.screen.getmaxyx()
|
|
|
|
self.__draw_frame__()
|
|
|
|
self.screen.refresh()
|
2012-10-21 05:03:08 +00:00
|
|
|
self.last_message_index = 0
|
2012-10-21 03:21:22 +00:00
|
|
|
while True:
|
|
|
|
self.screen_max_y, self.screen_max_x = self.screen.getmaxyx()
|
2012-10-21 19:49:39 +00:00
|
|
|
self.screen.addstr(0, 1, "[S] Message [U] Username [C] Channel [F] Frequency [W] Load Webpage")
|
2012-10-21 05:03:08 +00:00
|
|
|
self.__add_message_to_screen__()
|
2012-10-21 03:21:22 +00:00
|
|
|
entry = self.screen.getch()
|
|
|
|
if entry == curses.KEY_RESIZE:
|
2012-10-21 05:10:47 +00:00
|
|
|
self.__draw_frame__(False)
|
2012-10-21 22:44:47 +00:00
|
|
|
if entry == 10:
|
2012-10-21 03:21:22 +00:00
|
|
|
self.screen.nodelay(0)
|
2012-10-21 03:24:44 +00:00
|
|
|
user_input = self.screen.getstr(1, 1, 60)
|
2012-10-21 18:23:58 +00:00
|
|
|
old_message = self.protocol.send_chat_message(user_input, self.user)
|
2012-10-21 05:03:08 +00:00
|
|
|
self.message_queue.append(old_message)
|
2012-10-21 03:21:22 +00:00
|
|
|
self.screen.nodelay(1)
|
2012-10-21 04:44:30 +00:00
|
|
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
|
|
|
if entry == ord('u'):
|
|
|
|
self.screen.nodelay(0)
|
|
|
|
user_input = self.screen.getstr(1, 1, 60)
|
2012-10-21 04:46:59 +00:00
|
|
|
self.user = user_input[:USER_NAME_SIZE]
|
2012-10-21 04:44:30 +00:00
|
|
|
self.screen.nodelay(1)
|
|
|
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
2012-10-21 19:27:53 +00:00
|
|
|
if entry == ord('c'):
|
|
|
|
self.screen.nodelay(0)
|
|
|
|
user_input = self.screen.getstr(1, 1, 60)
|
|
|
|
self.channel = self.protocol.change_channel(user_input)
|
|
|
|
self.screen.nodelay(1)
|
|
|
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
|
|
|
if entry == ord('f'):
|
|
|
|
self.screen.nodelay(0)
|
|
|
|
user_input = self.screen.getstr(1, 1, 60)
|
|
|
|
self.frequency = self.protocol.change_frequency(user_input)
|
2012-10-21 19:49:39 +00:00
|
|
|
self.screen.nodelay(1)
|
|
|
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
2012-10-21 18:23:58 +00:00
|
|
|
if entry == ord('w'):
|
|
|
|
self.screen.nodelay(0)
|
|
|
|
user_input = self.screen.getstr(1, 1, 60)
|
2012-10-21 21:47:55 +00:00
|
|
|
self.request_xid = ToorMessage.get_random_xid()
|
2012-10-21 22:39:17 +00:00
|
|
|
self.website_buffer = []
|
2012-10-21 21:47:55 +00:00
|
|
|
request = self.protocol.send_web_request(user_input, self.request_xid)
|
2012-10-21 18:23:58 +00:00
|
|
|
self.screen.nodelay(1)
|
|
|
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
2012-10-21 03:21:22 +00:00
|
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
self.exit = True
|
|
|
|
self.stop()
|
|
|
|
|
2012-10-21 05:03:08 +00:00
|
|
|
def __add_message_to_screen__(self):
|
|
|
|
if len(self.message_queue) > 0:
|
|
|
|
message = self.message_queue[len(self.message_queue)-1]
|
|
|
|
message_string = str(message.user)+":"+ str(message.data)
|
|
|
|
self.screen.addstr(self.last_message_index+3,1, message_string + " "*(self.screen_max_x-(2+len(message_string))))
|
|
|
|
self.last_message_index +=1
|
|
|
|
self.message_queue.pop()
|
|
|
|
if self.last_message_index > self.screen_max_y-5:
|
|
|
|
self.last_message_index = 0
|
2012-10-21 05:10:47 +00:00
|
|
|
self.__draw_frame__()
|
2012-10-21 05:03:08 +00:00
|
|
|
|
2012-10-21 05:10:47 +00:00
|
|
|
def __draw_frame__(self, clear = True):
|
|
|
|
if clear:
|
|
|
|
self.screen.clear()
|
2012-10-21 03:21:22 +00:00
|
|
|
self.screen.border(0)
|
|
|
|
self.screen.addstr(2,1,"_"*(self.screen_max_x-2))
|
|
|
|
|
|
|
|
def stop(self):
|
|
|
|
curses.endwin()
|
2012-10-20 22:38:28 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2012-10-21 03:21:22 +00:00
|
|
|
visual = Visualizer()
|
2012-10-21 18:23:58 +00:00
|
|
|
if len(sys.argv) > 1:
|
|
|
|
if sys.argv[1] == "-s":
|
2012-10-21 19:51:06 +00:00
|
|
|
print "SET server"
|
2012-10-21 18:23:58 +00:00
|
|
|
visual.set_server()
|
2012-10-21 19:51:06 +00:00
|
|
|
visual.start()
|