728x90
반응형

이번에는 다른사람에게 돈을 보내는 기능을 만들어보자

이 기능은 게임봇을 만들게 된 동기중 하나다

 

#user.py
...
def getMoney(_name, _id):
	loadFile()
    
    for row in range(2, ws.max_row+2):
    	if ws.cell(row, c_name).value == _name and ws.cell(row,c_id).value == hex(_id):
        	return ws.cell(row,c_money).value
            break
        else:
        	return 0
            break
 ...
@bot.command()
async def 송금(ctx, user: discord.User, money):
    if checkName(user.name, user.id):
        await ctx.send("등록되지 않는 사용자입니다.")
    else:
        if getMoney(ctx.author.name, ctx.author.id) >= int(money):
            await ctx.send("송금")
        else:
            await ctx.send("돈이 충분하지 않습니다.")

 

돈이 충분하면 송금
불충분하면 충분하지 않다고 나온다

 

이제 진짜로 돈을 보내보자

 

그전에 로직개선을 한번 했다

lektion-von-erfolglosigkeit.tistory.com/90


 

유저가 보낼만한 돈이 있는 것도 확인했으니 DB에서 수정하고 그에 따른 안내 메세지를 보내면 될듯 하다

#user.py
...
def remit(sender, s_id, receiver, r_id, _amount):
    loadFile()
    
    receiver_row = findRow(receiver, r_id)
    sender_row = findRow(sender, s_id)
    
    ws.cell(receiver_row, c_money).value += int(_amount)
    ws.cell(sender_row, c_money).value -= int(_amount)

    saveFile()
...

보내는 사람과 받는 사람의 이름과 아이디를 받고

각각의 위치를 찾은 다음

DB의 값을 수정한 뒤 저장한다

더보기

나중에 한번 더 로직을 개선할 필요가 있는 것 같다

보기 쉽게 블로그의 코드에는 print가 다 빠져있지만 github에 올라간 코드에는 수많은 print가 있다

송금 한번 하는데 findRow만 6번 쓰이니 그만큼의 엄청난 print가 찍히고 있다

그리고 print가 많은만큼 함수마다 구분도 해주어야 할 것같다

 

마지막으로 확인해보니 보내는 사람이 DB에 있는지는 확인하지 않아 돈이 부족하다고만 나온다

 

그리고 main.py의 송금함수는 아래와 같다

#main.py
...
@bot.command()
async def 송금(ctx, user: discord.User, money):
    if findRow(user.name, user.id) == None:
        await ctx.send("등록되지 않는 사용자입니다.")
    else:
        s_money = getMoney(ctx.author.name, ctx.author.id)
        r_money = getMoney(user.name, user.id)

        if s_money >= int(money):
            remit(ctx.author.name, ctx.author.id, user.name, user.id, money)

            embed = discord.Embed(title="송금 완료", description = "송금된 돈: " + money, color = 0x77ff00)
            embed.add_field(name = "보낸 사람: " + ctx.author.name, value = "현재 자산: " + str(getMoney(ctx.author.name, ctx.author.id)))
            embed.add_field(name = ":arrow_forward:", value = "")
            embed.add_field(name="받은 사람: " + user.name, value="현재 자산: " + str(getMoney(user.name, user.id)))
                    
            await ctx.send(embed=embed)
        else:
            await ctx.send("돈이 충분하지 않습니다.")
 ...

 

위에서 말했듯이 로직 개선을 한번 한뒤에 본격적으로 돈으로 할 수 있는 컨텐츠를 만들 예정이다