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
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,

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, 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,))

View File

@ -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()

View File

@ -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

View File

@ -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}')

View File

@ -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':
if message and message.trade:
if message.to_from == 'From':
log.debug(message.trade)
# app.add_tab(30, message)
self.new_trade_signal.emit(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}.')