[개발] 스몬 카드 투자[6]

avatar

스몬 카드 투자와 관련된 개발을 진행하고 있는데, 이것도 개발할 사항이 많군요.

우선 소각할 카드를 자동으로 매수하는 부분이 필요한데, 카드 매수 전에 카드 매도 부터 먼저 확인합니다. 일전에 개발한 이력이 있어서 매도는 쉽게 마무리했습니다.

카드 매매를 위해서는 posting key가 필요하므로, 별도로 소스코드를 올리지는 않겠습니다. 대신에 중요한 부분에 대해서는 코드를 설명하도록 하겠습니다.


우선 팔 카드를 입력하는 방식을 정의하여야 합니다. 카드 종류가 많아서 조금 복잡합니다. 아무래도 수량이 많은 것은 1 장 짜리 이므로, 일단 1장 짜리 카드를 파는 방법에 대하여 기술합니다. 여기에서 한 장이란 XP가 0인 카드라고 보시면 됩니다.
아래와 같이 팔 카드 이름과 가격, 원하는 XP와 카드 종류를 입력합니다.

doCardInfo = {"Divine Healer":0.097}
doCardInfoXP = {"Divine Healer":0}
# 0 : alpha, 1 : beta, 2 : promo, 3 : reward
doCardInfoEdition = {"Divine Healer":1}

main에 해당하는 부분입니다. 카드 소유 계정의 이름과 posting key를 입력한 후 account와 steem을 생성합니다.

player = 'my account name'
pass = 'my post pass'

acc = Account(player)
mySteem = Steem(nodes=[STEEM_NODE_ADDR],
            keys=pass)

사용자는 카드 이름을 주로 사용하고, 프로그램에서는 해당하는 ID(숫자 값)을 주로 사용합니다. get_card_id_with_name()는 카드 이름을 주면 해당하는 ID를 돌려주는 함수입니다. 사용자가 입력한 카드 이름이 틀릴 수 있으니, 0보다 큰 값인지 여부를 확인합니다. 그 후 해당 카드를 파는 함수인 doSell()을 호출합니다.

cards = doCardInfo.keys()
total = 0
for  card in doCardInfo :
    targetCardID = get_card_id_with_name(card)
    if ( targetCardID >= 0 ) :
        # xp, edition
        cnt = doSell(player, card, targetCardID, doCardInfo[card], doCardInfoXP[card], doCardInfoEdition[card])
    else :
        print("No such card ", card)

doSell()에서 팔고자 하는 카드를 찾은 후 실제 매도 주문을 합니다.

해당 사용자의 보유 카드를 읽어온다.
 (https://steemmonsters.com/cards/collection/'+사용자명)

보유하고 있는 모든 카드에 대하여 :
      조건을 만족하는 카드가 있으면 :
            팔 카드 리스트에 추가
       팔 카드가 21장 이상 모였으면 :
             판다!!
팔 카드가 있으면
    판다!1

카드를 파는 json 코드는 아래와 같습니다. 팔 카드 수 만큼 파는 카드에 대한 정보를 만든 후 list에 추가합니다.

    result = []
    for card in cards :
        data = {"cards":[card],"currency":"USD","price":str(price),"fee_pct":500}
        result.append(data)

그 후 json_id는 "sm_sell_cards"로 하고 앞에서 만든 팔 카드 리스트를 assign한 후 broadcast하면 됩니다.

    json = result
    ops = [
        operations.CustomJson(**{
            "from": user,
            "id": "sm_sell_cards",
            "json": json,
            "required_auths": [],
            "required_posting_auths": [user],
        }),
    ]

한 번에 최대 25개만 주문을 할 수 있기 때문에 보유하고 있는 카드가 많은 경우에는 매도 주문에 시간이 엄청나게 걸립니다. 따라서 수량이 많은 분들은 자동매도 주문이 필수라고 보여집니다.

전체 코드는 아래와 같습니다.


def sellCards(user, cards, price):
    global mySteem
 #   data  = ""
    result = []
    for card in cards :
        data = {"cards":[card],"currency":"USD","price":str(price),"fee_pct":500}
        result.append(data)

    json = result
    ops = [
        operations.CustomJson(**{
            "from": user,
            "id": "sm_sell_cards",
            "json": json,
            "required_auths": [],
            "required_posting_auths": [user],
        }),
    ]

    broadcast(user, ops)

def doSell(user, targetCardName, targetCardID, price, targetXP, targetED) :
    cnt = 0
    time.sleep(1)

    candidates = []
    r = requests.get('https://steemmonsters.com/cards/collection/' +str(user))
    data = r.json()
    sellTotalCnt = 0
    for card in data["cards"]:
        try:
            player = card["player"]
            uid = card["uid"]  # 카드의 id
            monsterid = card["card_detail_id"]  # 카드의 종류
            buy_price = card["buy_price"]  # 카드의 매수가
            xp = card["xp"]
            edition = card["edition"]  # 0 : alpha, 1: beta
            marketid = card["market_id"]  # 마켓에 나온 것이지 구분

            # 특정 monsterid, xp==1 에 대해서만 매도
            # edition 1: beta, 3: reward
            if (monsterid == targetCardID and marketid == None and xp == targetXP and edition == targetED) : # xp 0, reward만
                if ( xp == 0 ) :  # xp == 0 일반 카드 1장
                    cnt += 1
                    candidates.append(uid)

            if (cnt > 21 ): 
                print("ready to sell", sellTotalCnt, targetCardName, price, xp, edition)
                sellTotalCnt += cnt
                sellCards(user, candidates, price)
                time.sleep(1)
                cnt = 0
                candidates = []
            if ( sellTotalCnt > 1300 ) :
                break
        except Exception as inst:
            print(inst)
            print ("error card list")

    if (cnt > 0 ): 
        sellTotalCnt += cnt
        print("ready to sell", sellTotalCnt, targetCardName, price, xp, edition)
        sellCards(user, candidates, price)
    return sellTotalCnt


def get_card_id_with_name(name, from_file=0) :
    global CARDS
    # get the carddetails from steemmonsters.com
    print("requests get_card_id_with_name")
    if CARDS == [] :
        if (from_file) :
            CARDS = load_json_from_file("sm_get_details.txt")
        else :
            r = requests.get("https://steemmonsters.com/cards/get_details")
            CARDS = r.json()

    for card in CARDS:
        if ( name == card["name"]) :
            return  card["id"]
    return -1

def sellCards(user, cards, price):
    global mySteem
    result = []
    for card in cards :
        data = {"cards":[card],"currency":"USD","price":str(price),"fee_pct":500}
        result.append(data)


0
0
0.000
6 comments
avatar

jcar토큰 9월 구독 보팅입니다.
좋은 하루 보내세요. ^^

0
0
0.000
avatar

정말 대단합니다. 감탄스럽네요.

0
0
0.000
avatar

Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.

0
0
0.000
avatar

Hi @tradingideas!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 4.398 which ranks you at #2480 across all Steem accounts.
Your rank has not changed in the last three days.

In our last Algorithmic Curation Round, consisting of 107 contributions, your post is ranked at #45.

Evaluation of your UA score:
  • Some people are already following you, keep going!
  • The readers like your work!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server

0
0
0.000
avatar

저도 파이썬 스팀몬스터 프로그램 일기를 시작했는데, 트아형님 많은 가르침 감사합니다~

잘 보고 배워 나가겠습니다~

0
0
0.000
avatar

일기 봤어요. 스몬 관련해서도 공부하고 개발할 사항이 넘쳐나는군요. Holger 덕분에 쉽게 갈 수 있기는 합니다. 고마우신 분.

0
0
0.000