TUI functionality fully implemented
This commit is contained in:
parent
b2f0b55be4
commit
db283591c0
1 changed files with 116 additions and 12 deletions
126
tui.py
126
tui.py
|
@ -1,9 +1,13 @@
|
|||
import curses
|
||||
import curses.textpad
|
||||
import curses.ascii
|
||||
from requests.exceptions import ConnectionError
|
||||
|
||||
import curses, curses.textpad
|
||||
import subprocess, sys
|
||||
|
||||
from api import Session
|
||||
|
||||
def check_exit(x):
|
||||
pass
|
||||
|
||||
class GUI():
|
||||
def __init__(self, root, h, w, y, x):
|
||||
self.root = root
|
||||
|
@ -12,6 +16,8 @@ class GUI():
|
|||
def create_gui(self):
|
||||
self.create_search_bar()
|
||||
self.create_item_search_results()
|
||||
self.create_order_search_results()
|
||||
self.root.refresh()
|
||||
|
||||
def create_search_bar(self):
|
||||
self.search_box = self.window.subwin(3, self.window.getmaxyx()[1], 0, 0)
|
||||
|
@ -23,6 +29,10 @@ class GUI():
|
|||
self.results_box = self.window.subwin(self.window.getmaxyx()[0] - 3, self.window.getmaxyx()[1] // 3, 3, 0)
|
||||
self.results_box.border()
|
||||
|
||||
def create_order_search_results(self):
|
||||
self.orders_box = self.window.subwin(self.window.getmaxyx()[0] - 3, self.window.getmaxyx()[1] * 2 // 3, 3, self.window.getmaxyx()[1] // 3)
|
||||
self.orders_box.border()
|
||||
|
||||
|
||||
class App():
|
||||
def __init__(self, root):
|
||||
|
@ -36,25 +46,119 @@ class App():
|
|||
|
||||
def update_item_search_results(self):
|
||||
search_str = self.gui.search_in.gather()
|
||||
items = self.client.api_request(url = '/items').get('payload').get('items')
|
||||
items = [item for item in items if search_str.strip().lower() in item.get('item_name').lower()][:self.gui.results_box.getmaxyx()[0] - 2]
|
||||
try:
|
||||
self.item_list
|
||||
except:
|
||||
self.item_list = self.client.api_request(url = '/items').get('payload').get('items')
|
||||
items = [item for item in self.item_list if search_str.strip().lower() in item.get('item_name').lower()][:self.gui.results_box.getmaxyx()[0] - 2]
|
||||
self.gui.results_box.clear()
|
||||
self.gui.results_box.border()
|
||||
for i in range(len(items)):
|
||||
try:
|
||||
self.gui.results_box.addstr(i + 1, 1, items[i]['item_name'][:self.gui.results_box.getmaxyx()[1] - 2])
|
||||
except:
|
||||
pass
|
||||
break
|
||||
self.gui.results_box.refresh()
|
||||
self.items = items
|
||||
|
||||
def update_orders_results(self):
|
||||
orders = sorted(self.client.api_request(url = f'/items/{self.selected_item["url_name"]}/orders').get('payload').get('orders'), key=lambda x: x['platinum'])
|
||||
self.buy_orders = [order for order in orders if order['order_type'] == 'buy' and order['user']['status'] == 'ingame'][:self.gui.orders_box.getmaxyx()[0] - 2]
|
||||
self.buy_orders.reverse()
|
||||
self.sell_orders = [order for order in orders if order['order_type'] == 'sell' and order['user']['status'] == 'ingame'][:self.gui.orders_box.getmaxyx()[0] - 2]
|
||||
|
||||
self.gui.orders_box.clear()
|
||||
self.gui.orders_box.border()
|
||||
for i in range(len(self.sell_orders)):
|
||||
try:
|
||||
self.gui.orders_box.addstr(i + 1, 1, '{:20.20} {: >3}p x{: <3} {: <10}'.format(self.sell_orders[i]['user']['ingame_name'], self.sell_orders[i]['platinum'], self.sell_orders[i]['quantity'], self.sell_orders[i].get('mod_rank', '')))
|
||||
except:
|
||||
break
|
||||
for i in range(len(self.buy_orders)):
|
||||
try:
|
||||
self.gui.orders_box.addstr(i + 1, self.gui.orders_box.getmaxyx()[1] // 2, '{:20.20} {: >3}p x{: <3} {: <10}'.format(self.buy_orders[i]['user']['ingame_name'], self.buy_orders[i]['platinum'], self.buy_orders[i]['quantity'], self.buy_orders[i].get('mod_rank', '')))
|
||||
except:
|
||||
break
|
||||
self.gui.orders_box.refresh()
|
||||
|
||||
def decide_state(self):
|
||||
match self.state:
|
||||
case 0:
|
||||
return self.search
|
||||
case 1:
|
||||
return self.select_item
|
||||
case 2:
|
||||
return self.select_order
|
||||
|
||||
def run(self):
|
||||
self.show_gui()
|
||||
self.state = 0
|
||||
while True:
|
||||
self.decide_state()()
|
||||
|
||||
|
||||
def search(self):
|
||||
self.gui.search_in.edit()
|
||||
self.update_item_search_results()
|
||||
self.state = 1
|
||||
|
||||
def select_item(self):
|
||||
self.gui.results_box.move(1, 1)
|
||||
self.gui.results_box.refresh()
|
||||
x = self.root.getch()
|
||||
while x != 10 and x != 115:
|
||||
if x == curses.KEY_UP:
|
||||
self.gui.results_box.move((self.gui.results_box.getyx()[0] - 1 - 1) % len(self.items) + 1, 1)
|
||||
elif x == curses.KEY_DOWN:
|
||||
self.gui.results_box.move((self.gui.results_box.getyx()[0] - 1 + 1) % len(self.items) + 1, 1)
|
||||
self.gui.results_box.refresh()
|
||||
x = self.root.getch()
|
||||
|
||||
if x == 10:
|
||||
self.selected_item = self.items[self.root.getyx()[0] - 4]
|
||||
self.update_orders_results()
|
||||
self.state = 2
|
||||
else:
|
||||
self.state = 0
|
||||
|
||||
def select_order(self):
|
||||
self.gui.orders_box.move(1, 1)
|
||||
self.gui.orders_box.refresh()
|
||||
x = self.root.getch()
|
||||
col = 0
|
||||
while x != 10 and x != 115 and x != 105:
|
||||
if x == curses.KEY_UP:
|
||||
self.gui.orders_box.move((self.gui.orders_box.getyx()[0] - 1 - 1) % len(self.sell_orders if col == 0 else self.buy_orders) + 1, 1 if col == 0 else self.gui.orders_box.getmaxyx()[1] // 2)
|
||||
elif x == curses.KEY_DOWN:
|
||||
self.gui.orders_box.move((self.gui.orders_box.getyx()[0] - 1 + 1) % len(self.sell_orders if col == 0 else self.buy_orders) + 1, 1 if col == 0 else self.gui.orders_box.getmaxyx()[1] // 2)
|
||||
elif x == curses.KEY_LEFT or x == curses.KEY_RIGHT:
|
||||
col = int(not col)
|
||||
self.gui.orders_box.move(min(self.gui.orders_box.getyx()[0], len(self.buy_orders if col else self.sell_orders)), 1 if col == 0 else self.gui.orders_box.getmaxyx()[1] // 2)
|
||||
self.gui.orders_box.refresh()
|
||||
x = self.root.getch()
|
||||
|
||||
if x == 10:
|
||||
self.selected_order = (self.buy_orders if col else self.sell_orders)[self.gui.orders_box.getyx()[0] - 1]
|
||||
self.copy_whisper()
|
||||
elif x == 115:
|
||||
self.state = 0
|
||||
else:
|
||||
self.state = 1
|
||||
|
||||
def copy_whisper(self):
|
||||
whisper = f'\\w {self.selected_order["user"]["ingame_name"]} {"WTS" if self.selected_order["order_type"] == "buy" else "WTB"} {self.selected_item["item_name"]} listed for {self.selected_order["platinum"]}p on warframe.market'
|
||||
subprocess.run(f'echo \'{whisper}\' | xclip -sel c', shell = True)
|
||||
|
||||
|
||||
|
||||
def main(w):
|
||||
app = App(w)
|
||||
app.show_gui()
|
||||
w.refresh()
|
||||
app.gui.search_in.edit()
|
||||
app.update_item_search_results()
|
||||
w.getch()
|
||||
app.run()
|
||||
|
||||
try:
|
||||
curses.wrapper(main)
|
||||
except KeyboardInterrupt:
|
||||
print('Exiting')
|
||||
except ConnectionError:
|
||||
print("No Internet")
|
||||
sys.exit(1)
|
||||
|
|
Loading…
Reference in a new issue