18MiB of Pythonic Rage
This commit is contained in:
parent
41c46be8a2
commit
93f77609cf
77
client/moontalk.py
Normal file
77
client/moontalk.py
Normal file
@ -0,0 +1,77 @@
|
||||
# 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())
|
Loading…
Reference in New Issue
Block a user