# Copyright 2024 Anonymous # Licensed under the terms of MIT+NIGGER # Notable issues: # No word wrap in the result box. It's a listbox and should probably be a textbox of some kind. # When it is closed it shits into the console like no tomorrow, too bad. # Overall this is a disgusting hack of python garbage import asyncio from tkinter import * from tkinter.ttk import * running = True root = Tk() root.option_add("*Font", 'TkFixedFont') def tk_kill(): # no good, nasty way to stop everything global running running = False root.destroy() root.protocol("WM_DELETE_WINDOW", tk_kill) root.geometry("700x400") root.rowconfigure(tuple(range(11)), weight=3) # needed for css-like grid behavior root.columnconfigure(tuple(range(6)), weight=3) message_log = Listbox(root) message_log.grid(rowspan=9, row=0, column=0, columnspan=6, sticky='nsew') input_var = StringVar() input_box = Entry(root, textvariable=input_var) input_box.grid(row=10, column=0, columnspan=5, sticky='nsew') def tk_send_message(): content = input_var.get() loop = asyncio.get_running_loop() asyncio.run_coroutine_threadsafe(outbound_queue.put(content), loop) input_var.set("") submit_button = Button(root, text = 'Submit', command = tk_send_message) submit_button.grid(row=10, column=5, columnspan=1, sticky='nsew') # potential improvement: bind enter on input_box to submit as well outbound_queue = asyncio.Queue() def add_message(content: str): message_log.insert(END, content.strip()) async def consume_message(reader: asyncio.StreamReader): while not reader.at_eof(): line = await reader.readline() add_message(line.decode('ascii')) async def submit_message(writer: asyncio.StreamWriter): while True: content: str = await outbound_queue.get() content = content + "\n" # all messages must newline writer.write(content.encode('ascii')) add_message(f"YOU: {content}") # echo it back outbound_queue.task_done() async def update_tk(): while running: root.update() await asyncio.sleep(0.01) raise asyncio.CancelledError async def main(): reader, writer = await asyncio.open_connection( "7ks473deh6ggtwqsvbqdurepv5i6iblpbkx33b6cydon3ajph73sssad.onion", 50000 ) await asyncio.gather(update_tk(), consume_message(reader), submit_message(writer)) if __name__ == "__main__": asyncio.run(main())