From fd14e4578dbeb633fbfad66a4bd527b1f605c3b4 Mon Sep 17 00:00:00 2001 From: Oliver Hartmann Date: Fri, 6 Jan 2023 15:09:43 +0100 Subject: [PATCH] start implementing outgoing trades --- config.yaml | 1 + icons/material_door.svg | 1 + icons/material_home.svg | 1 + main.py | 2 +- src/pyside6/gui_pyside6.py | 54 +++++++++++++++++--------- src/pyside6/trade_widget.py | 76 ++++++++++++++++++++++++++++++------- src/sendkeys.py | 12 ++++++ src/trader.py | 23 +++++++---- 8 files changed, 130 insertions(+), 40 deletions(-) create mode 100644 icons/material_door.svg create mode 100644 icons/material_home.svg diff --git a/config.yaml b/config.yaml index 33f0e70..8ac4432 100644 --- a/config.yaml +++ b/config.yaml @@ -4,6 +4,7 @@ General: after_sendkeys_key_wait: 0.001 # Amount of seconds to wait after a keypress. Default is 0.01 poe_window_title: 'Path of Exile' poe_path: 'D:\\SteamLibrary\\steamapps\\common\\Path of Exile\\PathOfExileSteam.exe' + username: 'Perry3D' # Used for leaving a group Chat: # Define chat messages with the following placeholders: # message, date, channel, user, guild, to_from, item, amount, currency, tab, row, col, league, diff --git a/icons/material_door.svg b/icons/material_door.svg new file mode 100644 index 0000000..e67d0c7 --- /dev/null +++ b/icons/material_door.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/material_home.svg b/icons/material_home.svg new file mode 100644 index 0000000..6a00126 --- /dev/null +++ b/icons/material_home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/main.py b/main.py index 12b200f..5f7408e 100644 --- a/main.py +++ b/main.py @@ -24,7 +24,7 @@ if __name__ == "__main__": # app = gui.Gui() app, window = gui_pyside6.start_app() reader = trader.Log_Reader(window) - reader_thread = Thread(target=reader.read_log, args=(conf['General']['log_file'], window)) + reader_thread = Thread(target=reader.read_log, args=(conf['General']['log_file'],)) log.debug(f'Starting reader thread for "{conf["General"]["log_file"]}"') reader_thread.start() # clipboard_thread = Thread(target=clipboard.clipboard_poll, args=(app,)) diff --git a/src/pyside6/gui_pyside6.py b/src/pyside6/gui_pyside6.py index 3ead8ce..1f04288 100644 --- a/src/pyside6/gui_pyside6.py +++ b/src/pyside6/gui_pyside6.py @@ -4,7 +4,7 @@ from src.data import log from src.data import Message, compile_regex from src.pyside6.trade_widget import TradeCollection from PySide6 import QtCore -from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget, QSizePolicy, QWidget +from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget, QSizePolicy import qdarktheme @@ -17,7 +17,8 @@ class ResizingTabWidget(QTabWidget): self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum) self.setGeometry(0, 0, 20, 20) - self.trade_collections = {} + self.trade_in_collections = {} + self.trade_out_collections = {} self.setTabsClosable(True) self.tabCloseRequested.connect(self.del_tab) @@ -38,16 +39,29 @@ class ResizingTabWidget(QTabWidget): self.adjustSize() self.main_window.updateSizes() - def new_trade(self, message: Message): + def new_in_trade(self, message: Message): if message.trade: unique_item = message.trade.unique_item() - if unique_item in self.trade_collections: - self.trade_collections[unique_item].add_trade(message) + if unique_item in self.trade_in_collections: + self.trade_in_collections[unique_item].add_trade(message) else: collection = TradeCollection(message, self) - collection.setParent(self) self.addTab(collection, message.trade.item) - self.trade_collections[message.trade.unique_item()] = collection + self.trade_in_collections[message.trade.unique_item()] = collection + + self.main_window.show() + + self.main_window.updateSizes() + + def new_out_trade(self, message: Message): + if message.trade: + unique_item = message.trade.unique_item() + if unique_item in self.trade_out_collections: + self.trade_out_collections[unique_item].add_trade(message) + else: + collection = TradeCollection(message, self) + self.addTab(collection, message.trade.item) + self.trade_out_collections[message.trade.unique_item()] = collection self.main_window.show() @@ -56,14 +70,14 @@ class ResizingTabWidget(QTabWidget): def del_tab(self, index: int): collection = self.widget(index) assert isinstance(collection, TradeCollection) - self.trade_collections[collection.unique_item].deleteLater() - del self.trade_collections[collection.unique_item] - if not self.trade_collections: + self.trade_in_collections[collection.unique_item].deleteLater() + del self.trade_in_collections[collection.unique_item] + if not self.trade_in_collections: self.main_window.hide() def del_collection(self, unique_item: str): - del self.trade_collections[unique_item] - if not self.trade_collections: + del self.trade_in_collections[unique_item] + if not self.trade_in_collections: self.main_window.hide() @@ -90,8 +104,12 @@ class MainWindow(QMainWindow): self.resize(self.tab_widget.minimumSizeHint()) @QtCore.Slot() - def new_trade(self, message: Message): - self.tab_widget.new_trade(message) + def new_in_trade(self, message: Message): + self.tab_widget.new_in_trade(message) + + @QtCore.Slot() + def new_out_trade(self, message: Message): + self.tab_widget.new_out_trade(message) def start_app(): @@ -124,8 +142,8 @@ if __name__ == "__main__": assert message2 assert message3 app, window = start_app() - window.new_trade(message) - window.new_trade(message) - window.new_trade(message2) - window.new_trade(message3) + window.new_in_trade(message) + window.new_in_trade(message) + window.new_in_trade(message2) + window.new_in_trade(message3) app.exec() diff --git a/src/pyside6/trade_widget.py b/src/pyside6/trade_widget.py index 6921005..000e389 100644 --- a/src/pyside6/trade_widget.py +++ b/src/pyside6/trade_widget.py @@ -24,17 +24,6 @@ class TradeWidget(QWidget): self.setLayout(self.main_layout) assert message.trade - self.inv_button = self.new_button('icons/material_invite.svg', 'Invite', self.inv_callback) - self.trade_button = self.new_button('icons/material_trade.svg', 'Trade', self.trade_callback) - self.thank_button = self.new_button('icons/material_thank.svg', 'Thank you', self.thank_callback) - self.wait_button = self.new_button('icons/material_wait2.svg', 'Busy', self.wait_callback) - self.close_button = self.new_button('icons/material_close.svg', 'Dismiss', self.close_callback) - - self.label_item = self.new_Label(message.trade.item) - self.label_price = self.new_Label(f'{message.trade.amount} {message.trade.currency}') - self.label_user = self.new_Label(message.user) - self.label_tab = self.new_Label(message.trade.tab) - def new_button(self, icon_filename: str, tooltip: str, callback: Callable[[], None]) -> QPushButton: icon = QIcon(icon_filename) button = QPushButton(icon=icon, text='', parent=self) @@ -52,6 +41,27 @@ class TradeWidget(QWidget): self.main_layout.addWidget(label) return label + +class Trade_In_Widget(TradeWidget): + + def __init__(self, + message: Message, + parent): + super(Trade_In_Widget, self).__init__(message=message, parent=parent) + + self.inv_button = self.new_button('icons/material_invite.svg', 'Invite', self.inv_callback) + self.trade_button = self.new_button('icons/material_trade.svg', 'Trade', self.trade_callback) + self.thank_button = self.new_button('icons/material_thank.svg', 'Thank you', self.thank_callback) + self.wait_button = self.new_button('icons/material_wait2.svg', 'Busy', self.wait_callback) + self.close_button = self.new_button('icons/material_close.svg', 'Dismiss', self.close_callback) + + # self.label_item = self.new_Label(message.trade.item) + self.label_price = self.new_Label(f'{message.trade.amount} {message.trade.currency}') + self.label_user = self.new_Label(message.user) + assert message.trade + if message.trade.tab: + self.label_tab = self.new_Label(message.trade.tab) + def inv_callback(self): sendkeys.invite(message=self.message) sendkeys.send_to_format(type='pickup', message=self.message) @@ -72,6 +82,46 @@ class TradeWidget(QWidget): self.parent.del_trade(self.message) +class Trade_Out_Widget(TradeWidget): + + def __init__(self, + message: Message, + parent): + super(Trade_Out_Widget, self).__init__(message=message, parent=parent) + + self.inv_button = self.new_button('icons/material_door.svg', 'Join', self.join_callback) + self.trade_button = self.new_button('icons/material_trade.svg', 'Trade', self.trade_callback) + self.thank_button = self.new_button('icons/material_thank.svg', 'Thank you', self.thank_callback) + self.wait_button = self.new_button('icons/material_leave.svg', 'Leave group', self.leave_callback) + self.wait_button = self.new_button('icons/material_home.svg', 'Return to Hideout', self.return_callback) + self.close_button = self.new_button('icons/material_close.svg', 'Dismiss', self.close_callback) + + # self.label_item = self.new_Label(message.trade.item) + assert message.trade + self.label_price = self.new_Label(f'{message.trade.amount} {message.trade.currency}') + self.label_user = self.new_Label(message.user) + + def join_callback(self): + sendkeys.join(message=self.message) + + def thank_callback(self): + sendkeys.send_to_format(type='ty', message=self.message) + sendkeys.kick(message=self.message) + + def trade_callback(self): + sendkeys.trade(message=self.message) + + def leave_callback(self): + sendkeys.leave() + + def return_callback(self): + sendkeys.return_to_ho() + + def close_callback(self): + self.deleteLater() + self.parent.del_trade(self.message) + + class TradeCollection(QWidget): """This holds the content of one tab. One tab corresponds to a unique item.""" @@ -90,7 +140,7 @@ class TradeCollection(QWidget): self.main_layout.setContentsMargins(0, 0, 0, 0) self.setContentsMargins(0, 0, 0, 0) self.setLayout(self.main_layout) - trade = TradeWidget(message, self) + trade = Trade_In_Widget(message, self) self.main_layout.addWidget(trade) self.trades = {message.unique_trade(): trade} @@ -104,7 +154,7 @@ class TradeCollection(QWidget): assert message.trade if message.unique_trade() in self.trades: return - trade = TradeWidget(message, self) + trade = Trade_In_Widget(message, self) self.main_layout.addWidget(trade) self.trades[message.unique_trade()] = trade diff --git a/src/sendkeys.py b/src/sendkeys.py index 8adbcb8..0f454db 100644 --- a/src/sendkeys.py +++ b/src/sendkeys.py @@ -67,9 +67,21 @@ def invite(message: data.Message) -> None: send_text(f'/invite {message.user}') +def join(message: data.Message) -> None: + send_text(f'/hideout {message.user}') + + +def return_to_ho() -> None: + send_text('/hideout') + + def kick(message: data.Message) -> None: send_text(f'/kick {message.user}') +def leave() -> None: + send_text(f'/kick {config.conf["General"]["username"]}') + + def trade(message: data.Message) -> None: send_text(f'/tradewith {message.user}') diff --git a/src/trader.py b/src/trader.py index 91da799..26ea17b 100644 --- a/src/trader.py +++ b/src/trader.py @@ -4,26 +4,33 @@ from . import gui from .data import log from io import TextIOWrapper from PySide6 import QtCore +from src.pyside6.gui_pyside6 import MainWindow class Log_Reader(QtCore.QObject): - new_trade_signal = QtCore.Signal(Message) + new_in_trade_signal = QtCore.Signal(Message) + new_out_trade_signal = QtCore.Signal(Message) - def __init__(self, window): + def __init__(self, window: MainWindow): super().__init__() - self.new_trade_signal.connect(window.new_trade, QtCore.Qt.QueuedConnection) + self.new_in_trade_signal.connect(window.new_in_trade, QtCore.Qt.QueuedConnection) + self.new_out_trade_signal.connect(window.new_out_trade, QtCore.Qt.QueuedConnection) - def read_log(self, logfile: str, app) -> None: + def read_log(self, logfile: str) -> None: try: with open(logfile, 'r', encoding='utf8') as file: loglines = self.follow(file) for line in loglines: message = Message.from_text(line) log.debug(message) - if message and message.trade and message.to_from == 'From': - log.debug(message.trade) - # app.add_tab(30, message) - self.new_trade_signal.emit(message) + if message and message.trade: + if message.to_from == 'From': + log.debug(message.trade) + # app.add_tab(30, message) + self.new_in_trade_signal.emit(message) + if message.to_from == 'To': + log.debug(message.trade) + self.new_out_trade_signal.emit(message) except IOError: log.error(f'Error opening log file {logfile}.')