Skip to content

Commit

Permalink
more logging, handling market search item by gid error
Browse files Browse the repository at this point in the history
  • Loading branch information
Hexalgo committed Nov 7, 2024
1 parent 6fa23ab commit 5f96996
Show file tree
Hide file tree
Showing 13 changed files with 135 additions and 38 deletions.
1 change: 1 addition & 0 deletions pydofus2/com/ankamagames/berilia/managers/KernelEvent.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class KernelEvent(Enum):
MarketSearchResult = auto()
MarketModeSwitch = auto()
MarketPriceInfo = auto()
ExchangeError = auto()

# MVP
MessageReceived = auto()
Expand Down
66 changes: 61 additions & 5 deletions pydofus2/com/ankamagames/dofus/logic/common/frames/MarketFrame.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
from pydofus2.com.ankamagames.dofus.kernel.net.ConnectionsHandler import ConnectionsHandler
from pydofus2.com.ankamagames.dofus.logic.common.managers.MarketBidsManager import MarketBidsManager
from pydofus2.com.ankamagames.dofus.logic.game.common.managers.InactivityManager import InactivityManager
from pydofus2.com.ankamagames.dofus.logic.game.common.managers.TimeManager import TimeManager
from pydofus2.com.ankamagames.dofus.network.enums.ChatActivableChannelsEnum import ChatActivableChannelsEnum
from pydofus2.com.ankamagames.dofus.network.enums.ExchangeErrorEnum import ExchangeErrorEnum
from pydofus2.com.ankamagames.dofus.network.messages.game.context.roleplay.npc.NpcGenericActionRequestMessage import (
NpcGenericActionRequestMessage,
)
Expand All @@ -27,6 +30,9 @@
from pydofus2.com.ankamagames.dofus.network.messages.game.inventory.exchanges.ExchangeBidPriceForSellerMessage import (
ExchangeBidPriceForSellerMessage,
)
from pydofus2.com.ankamagames.dofus.network.messages.game.inventory.exchanges.ExchangeErrorMessage import (
ExchangeErrorMessage,
)
from pydofus2.com.ankamagames.dofus.network.messages.game.inventory.exchanges.ExchangeObjectModifyPricedMessage import (
ExchangeObjectModifyPricedMessage,
)
Expand All @@ -43,6 +49,7 @@
ExchangeTypesItemsExchangerDescriptionForUserMessage,
)
from pydofus2.com.ankamagames.dofus.types.enums.ItemCategoryEnum import ItemCategoryEnum
from pydofus2.com.ankamagames.jerakine.data.I18n import I18n
from pydofus2.com.ankamagames.jerakine.logger.Logger import Logger
from pydofus2.com.ankamagames.jerakine.messages.Frame import Frame
from pydofus2.com.ankamagames.jerakine.messages.Message import Message
Expand Down Expand Up @@ -182,15 +189,64 @@ def process(self, msg: Message) -> bool:
KernelEventsManager().send(KernelEvent.MarketListingRemoved, listing)
return True

if isinstance(msg, ExchangeErrorMessage):
ermsg = msg # Type casting not needed in Python
channelId = ChatActivableChannelsEnum.PSEUDO_CHANNEL_INFO

# Dictionary for error message mapping
error_messages = {
ExchangeErrorEnum.REQUEST_CHARACTER_OCCUPIED: "ui.exchange.cantExchangeCharacterOccupied",
ExchangeErrorEnum.REQUEST_CHARACTER_TOOL_TOO_FAR: "ui.craft.notNearCraftTable",
ExchangeErrorEnum.REQUEST_IMPOSSIBLE: "ui.exchange.cantExchange",
ExchangeErrorEnum.BUY_ERROR: "ui.exchange.cantExchangeBuyError",
ExchangeErrorEnum.MOUNT_PADDOCK_ERROR: "ui.exchange.cantExchangeMountPaddockError",
ExchangeErrorEnum.REQUEST_CHARACTER_JOB_NOT_EQUIPED: "ui.exchange.cantExchangeCharacterJobNotEquiped",
ExchangeErrorEnum.REQUEST_CHARACTER_NOT_SUSCRIBER: "ui.exchange.cantExchangeCharacterNotSuscriber",
ExchangeErrorEnum.REQUEST_CHARACTER_OVERLOADED: "ui.exchange.cantExchangeCharacterOverloaded",
ExchangeErrorEnum.SELL_ERROR: "ui.exchange.cantExchangeSellError",
}

errorMessage = None

# Special case for guest character
if ermsg.errorType == ExchangeErrorEnum.REQUEST_CHARACTER_GUEST:
errorMessage = I18n.getUiText("ui.exchange.cantExchangeCharacterGuest")
# Skip processing for BID_SEARCH_ERROR
elif ermsg.errorType != ExchangeErrorEnum.BID_SEARCH_ERROR:
# Get message from dictionary, default to generic error message
errorMessage = I18n.getUiText(error_messages.get(ermsg.errorType, "ui.exchange.cantExchange"))
Logger().error(f"Received exchange error : {errorMessage}")

if errorMessage:
KernelEventsManager().send(
KernelEvent.TextInformation, errorMessage, channelId, TimeManager().getTimestamp()
)

KernelEventsManager().send(KernelEvent.ExchangeError, ermsg.errorType)

return True

# Market Operations
def search_item(self, item_gid: int, callback=None) -> None:
self._state = "SEARCHING"

def send_msg():
Logger().info(f"Sending search for item {item_gid}")
msg = ExchangeBidHouseSearchMessage()
msg.init(item_gid, True) # Enable following
ConnectionsHandler().send(msg)
InactivityManager().activity()

if callback:
KernelEventsManager().once(KernelEvent.MarketSearchResult, callback)
msg = ExchangeBidHouseSearchMessage()
msg.init(item_gid, True) # Enable following
ConnectionsHandler().send(msg)
InactivityManager().activity()
KernelEventsManager().once(
KernelEvent.MarketSearchResult,
callback=lambda *_: callback(0, None),
ontimeout=lambda *_: callback(1, "Market search operation timed out!"),
timeout=5,
retryNbr=3,
retryAction=send_msg,
)
send_msg()

def check_price(self, item_gid: int, callback=None) -> None:
self._state = "CHECKING_PRICE"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,5 +332,5 @@ def display_bids(self) -> None:

# Sort by price and quantity
table.sortby = "Price"
self._logger.info("\nCurrent Market Bids:")
self._logger.info("\nCurrent Market Bids:\n")
self._logger.info(table)
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,13 @@ def isBasicAccount(self) -> bool:
# Logger().debug(f"Has rights : {self.hasRights}")
return self.subscriptionEndDate / 1000 <= TimeManager().getUtcTimestamp() and not self.hasRights

def inHavenBag(self):
from pydofus2.com.ankamagames.dofus.logic.game.common.managers.PlayedCharacterManager import (
PlayedCharacterManager,
)

return HavenbagTheme.isMapIdInHavenbag(PlayedCharacterManager().currentMap.mapId)

def isMapInHavenbag(self, mapId: int) -> bool:
return HavenbagTheme.isMapIdInHavenbag(mapId)

Expand All @@ -140,7 +147,7 @@ def formatTagName(
return name + (self.TAG_PREFIX + displayedTag if not tag else "") + (" (" + other + ")" if not other else "")

def addTagStyleToText(self, tagStyleName: str, text: str) -> str:
return '<span class="' + tagStyleName + '">' + text + "</span>"
return f'<span class="{tagStyleName}">{text}</span>'

def destroy(self) -> None:
self._self = None
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,10 @@ def process(self, msg: Message) -> bool:
PlayedCharacterManager().inventoryWeightMax = msg.weightMax
if msg.inventoryWeight / msg.weightMax > 0.95:
KernelEventsManager().send(KernelEvent.PlayerPodsFull)

Logger().info(
f"Inventory weight percent changed to : {round(100 * msg.inventoryWeight / msg.weightMax, 1)}%"
)
KernelEventsManager().send(
KernelEvent.InventoryWeightUpdate, lastInventoryWeight, msg.inventoryWeight, msg.weightMax
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ def process(self, msg: Message) -> bool:
if isinstance(msg, GameMapSpeedMovementMessage):
gmsmm = msg
newSpeedAjust = 10 * (gmsmm.speedMultiplier - 1)
pcm.PlayedCharacterManager().speedAjust = newSpeedAjust
pcm.PlayedCharacterManager().speedAdjust = newSpeedAjust
if (
DofusEntities().getEntity(pcm.PlayedCharacterManager().id) is not None
and self.roleplayContextFrame is not None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def __init__(self):
self.achievementPercent = 0
self.applicationInfo = None
self.guildApplicationInfo = None
self.speedAjust: int = 0
self.speedAdjust: int = 0
self.isInParty: bool = False
self.playerMaxForgettableSpellsfloat: int = -1
self._knownZaapMapIds: list[float] = list()
Expand Down Expand Up @@ -133,18 +133,27 @@ def currVertex(self) -> Vertex:

if self.currentZoneRp is None or self.currentMap is None:
return None

v = WorldGraph().getVertex(self.currentMap.mapId, self.currentZoneRp)
if v is None:
potentialvertices = WorldGraph().getVertices(PlayedCharacterManager().currentMap.mapId)
if not potentialvertices:
Logger().error(f"Weird that no vertex is found for map {PlayedCharacterManager().currentMap.mapId}!")
possible_vertices = WorldGraph().getVertices(PlayedCharacterManager().currentMap.mapId)
if not possible_vertices:
Logger().debug("Checking if its a haven bag ...")
from pydofus2.com.ankamagames.dofus.logic.common.managers.PlayerManager import PlayerManager

if PlayerManager().isMapInHavenbag(PlayedCharacterManager().currentMap.mapId):
Logger().warning("Current player vertex is undefined because player is inside its haven bag ...")
else:
Logger().error(
f"Weird that no vertex is found for map {PlayedCharacterManager().currentMap.mapId}!"
)
else:
Logger().debug(potentialvertices)
for zoneId, v in potentialvertices.items():
Logger().debug(possible_vertices)
for zoneId, v in possible_vertices.items():
if self.currentZoneRp and zoneId == self.currentZoneRp:
return v
else:
return potentialvertices[1]
return possible_vertices[1]
else:
return v

Expand Down
24 changes: 12 additions & 12 deletions pydofus2/com/ankamagames/dofus/logic/game/common/misc/Inventory.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ def removeView(self, name: str) -> None:
if view:
del self._views[name]

def getItem(self, uid: int) -> ItemWrapper:
def getItem(self, uid: int) -> "ItemSet":
return self._itemsDict.get(uid)

def getItemMaskCount(self, uid: int, mask: str) -> int:
itemSet: ItemSet = self._itemsDict[uid]
itemSet = self._itemsDict[uid]
if not itemSet:
return 0
if itemSet.masks.get(mask):
Expand All @@ -61,7 +61,7 @@ def initialize(self, items: list[ItemWrapper]) -> None:

def initializeFromObjectItems(self, items: list[ObjectItem]) -> None:
self._itemsDict = dict()
iteml: list[ItemWrapper] = list[ItemWrapper]()
iteml = list[ItemWrapper]()
for item in items:
iw = ItemWrapper.create(
item.position,
Expand All @@ -75,7 +75,7 @@ def initializeFromObjectItems(self, items: list[ObjectItem]) -> None:
self.initializeViews(iteml)

def addObjectItem(self, item: ObjectItem) -> ItemWrapper:
iw: ItemWrapper = ItemWrapper.create(
iw = ItemWrapper.create(
item.position,
item.objectUID,
item.objectGID,
Expand All @@ -87,7 +87,7 @@ def addObjectItem(self, item: ObjectItem) -> ItemWrapper:
return iw

def addItem(self, item: ItemWrapper) -> None:
itemSet: ItemSet = self._itemsDict.get(item.objectUID)
itemSet = self._itemsDict.get(item.objectUID)
if itemSet:
oldItem = item.clone()
itemSet.item.quantity += item.quantity
Expand All @@ -99,7 +99,7 @@ def addItem(self, item: ItemWrapper) -> None:
self.addItemToViews(itemSet)

def removeItem(self, itemUID: int, quantity: int = -1) -> None:
itemSet: ItemSet = self._itemsDict.get(int(itemUID))
itemSet = self._itemsDict.get(int(itemUID))
if itemSet is None:
return
if quantity == -1 or quantity == itemSet.item.quantity:
Expand All @@ -114,7 +114,7 @@ def removeItem(self, itemUID: int, quantity: int = -1) -> None:
self.modifyItemFromViews(itemSet, oldItem)

def modifyItemQuantity(self, itemUID: int, quantity: int) -> None:
itemSet: ItemSet = self._itemsDict.get(itemUID)
itemSet = self._itemsDict.get(itemUID)
if not itemSet:
Logger().error("We are trying to modify quantity of a non existing item!")
return
Expand All @@ -124,7 +124,7 @@ def modifyItemQuantity(self, itemUID: int, quantity: int) -> None:
return iw

def modifyItemPosition(self, itemUID: int, position: int) -> None:
itemSet: ItemSet = self._itemsDict.get(itemUID)
itemSet = self._itemsDict.get(itemUID)
if not itemSet:
Logger().warning("On essaye de modifier la position d'un objet qui n'existe pas")
return
Expand Down Expand Up @@ -158,7 +158,7 @@ def modifyObjectItem(self, item: ObjectItem) -> ItemWrapper:

def modifyItem(self, item: ItemWrapper) -> None:
oldItem: ItemWrapper = None
itemSet: ItemSet = self._itemsDict.get(item.objectUID)
itemSet = self._itemsDict.get(item.objectUID)
if itemSet:
oldItem = itemSet.item.clone()
self.copyItem(itemSet.item, item)
Expand All @@ -167,22 +167,22 @@ def modifyItem(self, item: ItemWrapper) -> None:
self.addItem(item)

def addItemMask(self, objectUID: int, name: str, size: int) -> None:
itemSet: ItemSet = self._itemsDict.get(objectUID)
itemSet = self._itemsDict.get(objectUID)
if not itemSet:
Logger().error("On essaye de masquer un item qui n'existe pas dans l'inventaire")
return
itemSet.masks[name] = size
self.modifyItemFromViews(itemSet, itemSet.item)

def removeItemMask(self, objectUID: int, name: str) -> None:
itemSet: ItemSet = self._itemsDict.get(objectUID)
itemSet = self._itemsDict.get(objectUID)
if not itemSet:
return
del itemSet.masks[name]
self.modifyItemFromViews(itemSet, itemSet.item)

def removeAllItemMasks(self, name: str) -> None:
itemSet: ItemSet = None
itemSet = None
for itemSet in self._itemsDict:
if itemSet.masks.get(name):
del itemSet.masks[name]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,12 @@ def isListening(self, item: ItemWrapper) -> bool:
def getItemTypes(self) -> dict:
return self._types

def getItemByUID(self, uid):
for item in self._content:
if item.objectUID == uid:
return item
return None

def getItemIndex(self, item: ItemWrapper, iwlist: list[ItemWrapper] = None) -> int:
if iwlist is None:
iwlist = self._content
Expand Down Expand Up @@ -226,12 +232,7 @@ def compareFunction(self, a: ItemWrapper, b: ItemWrapper, sortDepth: int = 0) ->
return self.compareFunction(a, b, sortDepth + 1)

def getItemAveragePrice(self, pItemGID: int) -> float:
avgPricesFrame = Kernel().averagePricesFrame
return (
float(avgPricesFrame.pricesData.items[pItemGID])
if avgPricesFrame.pricesData.items.get(pItemGID) is not None
else 0
)
return Kernel().averagePricesFrame.getItemAveragePrice(pItemGID)

def updateView(self) -> None:
sameSort: bool = True
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,8 @@ def process(self, msg: Message):
PlayedCharacterManager().isIndoor = False

if isinstance(msg, MapComplementaryInformationsWithCoordsMessage):
mciwcmsg = msg
PlayedCharacterManager().isIndoor = True
self._worldPoint = WorldPointWrapper(mciwcmsg.mapId, True, mciwcmsg.worldX, mciwcmsg.worldY)
self._worldPoint = WorldPointWrapper(msg.mapId, True, msg.worldX, msg.worldY)

elif isinstance(msg, MapComplementaryInformationsDataInHouseMessage):
self.checkPlayerInHouse(msg)
Expand Down Expand Up @@ -295,7 +294,7 @@ def process(self, msg: Message):
ac = self.addOrUpdateActor(actor1)
if ac:
if ac.id == PlayedCharacterManager().id:
ac.speedAdjust = PlayedCharacterManager().speedAjust
ac.speedAdjust = PlayedCharacterManager().speedAdjust
character = actor1
if isinstance(character, GameRolePlayCharacterInformations):
for option in character.humanoidInfo.options:
Expand Down Expand Up @@ -351,6 +350,8 @@ def process(self, msg: Message):
Logger().debug("Played entered haven bag")
KernelEventsManager().send(KernelEvent.InHavenBag)
KernelEventsManager().send(KernelEvent.ClientStatusUpdate, ClientStatusEnum.MAP_DATA_PROCESSED)
if PlayedCharacterManager().currVertex is None:
raise Exception("At the end of map data processing, we still have no player position!")
return True

if isinstance(msg, GameRolePlayShowActorMessage):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def pushed(self):
def pulled(self) -> bool:
return True

def teleportRequest(self, cost, sourceType, destinationType, mapId):
def sendTeleportRequest(self, cost, sourceType, destinationType, mapId):
if cost <= PlayedCharacterManager().characteristics.kamas:
trmsg = TeleportRequestMessage()
trmsg.init(sourceType, destinationType, mapId)
Expand Down
15 changes: 15 additions & 0 deletions pydofus2/com/ankamagames/dofus/network/enums/ExchangeErrorEnum.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from enum import IntEnum


class ExchangeErrorEnum(IntEnum):
REQUEST_IMPOSSIBLE = 1
REQUEST_CHARACTER_OCCUPIED = 2
REQUEST_CHARACTER_JOB_NOT_EQUIPED = 3
REQUEST_CHARACTER_TOOL_TOO_FAR = 4
REQUEST_CHARACTER_OVERLOADED = 5
REQUEST_CHARACTER_NOT_SUSCRIBER = 6
REQUEST_CHARACTER_GUEST = 8
SELL_ERROR = 63
BUY_ERROR = 64
MOUNT_PADDOCK_ERROR = 10
BID_SEARCH_ERROR = 11
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,10 @@ def run(self):
if self._connecting.is_set():
self.onConnectionTimeout()
else:
Logger().error(errno.errorcode[e.errno])
Logger().error(
f"Socket interrupted because of unknown error [{e.errno}] : {errno.errorcode[e.errno]}",
exc_info=True,
)
err = e
self._closing.set()
self.onClose(err)

0 comments on commit 5f96996

Please sign in to comment.