Sobes.tech
Back to tasks
Junior — Middle+
51

Оптимизация кода модуля обработки торговых предложений

Companies where asked:

EX CORP
Get help with live coding in real time with Sobes Copilot
Task condition

Требуется провести рефакторинг представленного ниже фрагмента Python‑кода, который отвечает за проверку текущих офферов, ожидающих разблокировки в Steam, и установку их окончательных статусов.


# coding: utf-8
# noqa:flake8
# Модуль проверяет текущие офферы, которые должны уже были разблокироваться в Steam.
# И выставляет конечные статусы.

import logging
logging.basicConfig(format='%(asctime)s :%(message)s', level=logging.INFO)

# our modules
from .history import state_class
from .others import Database
from .shared import CSGO_APPID

# other
import time
import traceback
from collections import namedtuple
from datetime import *

offer = namedtuple("offer", ["offer_id", "tradeoffer_id", "steamid"])
status_map = {'Accept': 'Accept Hold', 'Decline': 'Decline Hold'}

def handle_hold_offers(database, state_object, offer, start_time=datetime.now()):
    # получить через внешний HTTP API состояние тренаоффера
    offer_data = state_object.get_offer_state(api_key=offer.steam_api_key,
                                            tradeofferid=offer.tradeoffer_id,
                                            steamid=offer.steamid)
    
    # бизнес логика: в этот обработчик попадают все оферы, которые уходили в Hold состояние
    # но в конечно итоге перешли в завершенное состояние, нужно чтобы Accept -> зафиксировался
    # как Accept Hold, Decline как Decline Hold, остальные остались как есть
    offer_state = status_map[offer_data.offer_state]

    reaction_time = datetime.now() - offer_data.updated_timestamp
    logging.info("offer_id=( ) steamid=( ) reaction_time=( ) state=( ):".format(
        offer.offer_id,
        offer.steamid,
        reaction_time,
        offer_state))

    try:
        # WDMOHWTH COCTORHWE ooOepa n 5A
        state_object.set_state(offer_state, offer.offer_id, database, offer_data)
    except:
        logging.error(traceback.format_exc())
        database.rollback()