start implementing outgoing trades

This commit is contained in:
Oliver Hartmann 2023-01-06 15:09:43 +01:00
parent af4de2df62
commit fd14e4578d
8 changed files with 130 additions and 40 deletions

View File

@ -4,6 +4,7 @@ General:
after_sendkeys_key_wait: 0.001 # Amount of seconds to wait after a keypress. Default is 0.01 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_window_title: 'Path of Exile'
poe_path: 'D:\\SteamLibrary\\steamapps\\common\\Path of Exile\\PathOfExileSteam.exe' poe_path: 'D:\\SteamLibrary\\steamapps\\common\\Path of Exile\\PathOfExileSteam.exe'
username: 'Perry3D' # Used for leaving a group
Chat: Chat:
# Define chat messages with the following placeholders: # Define chat messages with the following placeholders:
# message, date, channel, user, guild, to_from, item, amount, currency, tab, row, col, league, # message, date, channel, user, guild, to_from, item, amount, currency, tab, row, col, league,

1
icons/material_door.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M6 42v-3h4V9q0-1.2.9-2.1.9-.9 2.1-.9h22q1.2 0 2.1.9.9.9.9 2.1v30h4v3Zm29-3V9H13v30Zm-6.65-13.45q.7 0 1.2-.5t.5-1.2q0-.7-.5-1.2t-1.2-.5q-.7 0-1.2.5t-.5 1.2q0 .7.5 1.2t1.2.5ZM13 9v30V9Z"/></svg>

After

Width:  |  Height:  |  Size: 264 B

1
icons/material_home.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M11 39h7.5V26.5h11V39H37V19.5L24 9.75 11 19.5Zm-3 3V18L24 6l16 12v24H26.5V29.5h-5V42Zm16-17.65Z"/></svg>

After

Width:  |  Height:  |  Size: 176 B

View File

@ -24,7 +24,7 @@ if __name__ == "__main__":
# app = gui.Gui() # app = gui.Gui()
app, window = gui_pyside6.start_app() app, window = gui_pyside6.start_app()
reader = trader.Log_Reader(window) 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"]}"') log.debug(f'Starting reader thread for "{conf["General"]["log_file"]}"')
reader_thread.start() reader_thread.start()
# clipboard_thread = Thread(target=clipboard.clipboard_poll, args=(app,)) # clipboard_thread = Thread(target=clipboard.clipboard_poll, args=(app,))

View File

@ -4,7 +4,7 @@ from src.data import log
from src.data import Message, compile_regex from src.data import Message, compile_regex
from src.pyside6.trade_widget import TradeCollection from src.pyside6.trade_widget import TradeCollection
from PySide6 import QtCore from PySide6 import QtCore
from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget, QSizePolicy, QWidget from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget, QSizePolicy
import qdarktheme import qdarktheme
@ -17,7 +17,8 @@ class ResizingTabWidget(QTabWidget):
self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum) self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
self.setGeometry(0, 0, 20, 20) self.setGeometry(0, 0, 20, 20)
self.trade_collections = {} self.trade_in_collections = {}
self.trade_out_collections = {}
self.setTabsClosable(True) self.setTabsClosable(True)
self.tabCloseRequested.connect(self.del_tab) self.tabCloseRequested.connect(self.del_tab)
@ -38,16 +39,29 @@ class ResizingTabWidget(QTabWidget):
self.adjustSize() self.adjustSize()
self.main_window.updateSizes() self.main_window.updateSizes()
def new_trade(self, message: Message): def new_in_trade(self, message: Message):
if message.trade: if message.trade:
unique_item = message.trade.unique_item() unique_item = message.trade.unique_item()
if unique_item in self.trade_collections: if unique_item in self.trade_in_collections:
self.trade_collections[unique_item].add_trade(message) self.trade_in_collections[unique_item].add_trade(message)
else: else:
collection = TradeCollection(message, self) collection = TradeCollection(message, self)
collection.setParent(self)
self.addTab(collection, message.trade.item) 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() self.main_window.show()
@ -56,14 +70,14 @@ class ResizingTabWidget(QTabWidget):
def del_tab(self, index: int): def del_tab(self, index: int):
collection = self.widget(index) collection = self.widget(index)
assert isinstance(collection, TradeCollection) assert isinstance(collection, TradeCollection)
self.trade_collections[collection.unique_item].deleteLater() self.trade_in_collections[collection.unique_item].deleteLater()
del self.trade_collections[collection.unique_item] del self.trade_in_collections[collection.unique_item]
if not self.trade_collections: if not self.trade_in_collections:
self.main_window.hide() self.main_window.hide()
def del_collection(self, unique_item: str): def del_collection(self, unique_item: str):
del self.trade_collections[unique_item] del self.trade_in_collections[unique_item]
if not self.trade_collections: if not self.trade_in_collections:
self.main_window.hide() self.main_window.hide()
@ -90,8 +104,12 @@ class MainWindow(QMainWindow):
self.resize(self.tab_widget.minimumSizeHint()) self.resize(self.tab_widget.minimumSizeHint())
@QtCore.Slot() @QtCore.Slot()
def new_trade(self, message: Message): def new_in_trade(self, message: Message):
self.tab_widget.new_trade(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(): def start_app():
@ -124,8 +142,8 @@ if __name__ == "__main__":
assert message2 assert message2
assert message3 assert message3
app, window = start_app() app, window = start_app()
window.new_trade(message) window.new_in_trade(message)
window.new_trade(message) window.new_in_trade(message)
window.new_trade(message2) window.new_in_trade(message2)
window.new_trade(message3) window.new_in_trade(message3)
app.exec() app.exec()

View File

@ -24,17 +24,6 @@ class TradeWidget(QWidget):
self.setLayout(self.main_layout) self.setLayout(self.main_layout)
assert message.trade 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: def new_button(self, icon_filename: str, tooltip: str, callback: Callable[[], None]) -> QPushButton:
icon = QIcon(icon_filename) icon = QIcon(icon_filename)
button = QPushButton(icon=icon, text='', parent=self) button = QPushButton(icon=icon, text='', parent=self)
@ -52,6 +41,27 @@ class TradeWidget(QWidget):
self.main_layout.addWidget(label) self.main_layout.addWidget(label)
return 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): def inv_callback(self):
sendkeys.invite(message=self.message) sendkeys.invite(message=self.message)
sendkeys.send_to_format(type='pickup', 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) 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): class TradeCollection(QWidget):
"""This holds the content of one tab. """This holds the content of one tab.
One tab corresponds to a unique item.""" One tab corresponds to a unique item."""
@ -90,7 +140,7 @@ class TradeCollection(QWidget):
self.main_layout.setContentsMargins(0, 0, 0, 0) self.main_layout.setContentsMargins(0, 0, 0, 0)
self.setContentsMargins(0, 0, 0, 0) self.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.main_layout) self.setLayout(self.main_layout)
trade = TradeWidget(message, self) trade = Trade_In_Widget(message, self)
self.main_layout.addWidget(trade) self.main_layout.addWidget(trade)
self.trades = {message.unique_trade(): trade} self.trades = {message.unique_trade(): trade}
@ -104,7 +154,7 @@ class TradeCollection(QWidget):
assert message.trade assert message.trade
if message.unique_trade() in self.trades: if message.unique_trade() in self.trades:
return return
trade = TradeWidget(message, self) trade = Trade_In_Widget(message, self)
self.main_layout.addWidget(trade) self.main_layout.addWidget(trade)
self.trades[message.unique_trade()] = trade self.trades[message.unique_trade()] = trade

View File

@ -67,9 +67,21 @@ def invite(message: data.Message) -> None:
send_text(f'/invite {message.user}') 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: def kick(message: data.Message) -> None:
send_text(f'/kick {message.user}') send_text(f'/kick {message.user}')
def leave() -> None:
send_text(f'/kick {config.conf["General"]["username"]}')
def trade(message: data.Message) -> None: def trade(message: data.Message) -> None:
send_text(f'/tradewith {message.user}') send_text(f'/tradewith {message.user}')

View File

@ -4,26 +4,33 @@ from . import gui
from .data import log from .data import log
from io import TextIOWrapper from io import TextIOWrapper
from PySide6 import QtCore from PySide6 import QtCore
from src.pyside6.gui_pyside6 import MainWindow
class Log_Reader(QtCore.QObject): 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__() 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: try:
with open(logfile, 'r', encoding='utf8') as file: with open(logfile, 'r', encoding='utf8') as file:
loglines = self.follow(file) loglines = self.follow(file)
for line in loglines: for line in loglines:
message = Message.from_text(line) message = Message.from_text(line)
log.debug(message) log.debug(message)
if message and message.trade and message.to_from == 'From': if message and message.trade:
log.debug(message.trade) if message.to_from == 'From':
# app.add_tab(30, message) log.debug(message.trade)
self.new_trade_signal.emit(message) # 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: except IOError:
log.error(f'Error opening log file {logfile}.') log.error(f'Error opening log file {logfile}.')