본문 바로가기
프로젝트/디스코드 봇

[Python] #3-1 디스코드 봇 만들기 - 여러 명 추천

by 알래스카비버 2022. 3. 26.
반응형

목차

     

    명령어 맨 뒤에 숫자를 추가로 입력하면 숫자만큼 추천해주는 기능을 만들어 볼 것입니다.

    #3번 글에서 계속하겠습니다.

    https://howbeautifulworld.tistory.com/55

     

    lol.py

    lol.py의 getResult 함수에서 다음과 같이 수정했습니다.

    랜덤으로 선택하는 부분에서 투탑이나 투정글 등을 갈 수 있겠지만

    라인과 챔피언은 중복이 되면 안되기 때문에 더 괜찮은 코드가 있을 수도 있겠지만

    일단 리스트에 제거를 해서 중복되지 않게 했습니다.

    def getResult(text):
        words = text.split()                # 입력받은 문장
        number = 0                          # 몇 명인지
        lanes_list = lanes.copy()           # 라인 복사
        champions_list = champions.copy()   # 챔피언 복사
    
        # 마지막 단어가 숫자면 number에 입력받은 명수
        try:
            number = int(words[-1])
        except ValueError:
            number = 1
    
        # 사람 수만큼 추가
        result = []
        for _ in range(number):
            result.append({"라인": '', "룬": '', "아이템": '', '챔피언': ''})
    
        # 랜덤으로 선택
        for i in range(number):
            for word in words:
                if word == "라인":
                    index = random.randrange(0, len(lanes_list))
                    result[i]["라인"] = lanes_list[index]
                    del lanes_list[index]
                elif word == "룬":
                    index = random.randrange(0, len(keystones))
                    result[i]["룬"] = keystones[index]
                elif word == "아이템":
                    index = random.randrange(0, len(items))
                    result[i]["아이템"] = items[index]
                elif word == "챔피언":
                    index = random.randrange(0, len(champions_list))
                    result[i]["챔피언"] = champions_list[index]
                    del champions_list[index]
    
        return result

     

    main.py

    위에 getResult 함수에서 반환되는 값이 변경되었기 때문에

    main.py 에서 random_lol 함수에서 다음과 같이 수정했습니다.

    출력되는 형식은 취향에 따라 변경하면 될 것 같습니다.

    async def random_lol(ctx, *, text=''):
        message = ''
        result = lol.getResult(text)
        for i in range(len(result)):
            message += '#' + str(i + 1) + '\n'
            for key, value in result[i].items():
                if value != '':
                    message += key + ' : ' + value + '\n'
            message += '\n'
        await ctx.send(message)

     

    결과

    기존 기능도 잘 되면서

     

    새로운 기능도 잘 됩니다.

     

    전체 코드

    main.py

    더보기
    import discord
    from discord.ext import commands
    import lol
    
    bot = commands.Bot(command_prefix='$')  # 접두사가 '$'
    
    
    @bot.event
    async def on_ready():
        print('We have logged in as {0.user}'.format(bot))
    
    
    @bot.command()
    async def hello(ctx):  # '$hello'라는 메시지를 보냈을 때 @이름 Hello!를 보내줌
        await ctx.send('{0.author.mention} Hello!'.format(ctx))
    
    
    @bot.command(name='롤')
    async def random_lol(ctx, *, text=''):
        message = ''
        result = lol.getResult(text)
        for i in range(len(result)):
            message += '#' + str(i + 1) + '\n'
            for key, value in result[i].items():
                if value != '':
                    message += key + ' : ' + value + '\n'
            message += '\n'
        await ctx.send(message)
    
    
    bot.run('token')	# 이곳에 본인 토큰

     

    lol.py

    더보기
    # lol.py
    
    import random
    
    lanes = ['탑', '정글', '미드', '봇', '서포터']
    keystones = ['집중 공격', '치명적 속도', '기민한 발놀림' ...]
    items = ['돌풍', '크라켄 학살자', '불멸의 철갑궁', ...]
    champions = ['가렌', '갈리오', '갱플랭크', '그라가스', '그레이브즈', ...]
    
    
    def getResult(text):
        words = text.split()                # 입력받은 문장
        number = 0                          # 몇 명인지
        lanes_list = lanes.copy()           # 라인 복사
        champions_list = champions.copy()   # 챔피언 복사
    
        # 마지막 단어가 숫자면 number에 입력받은 명수
        try:
            number = int(words[-1])
        except ValueError:
            number = 1
    
        # 사람 수만큼 추가
        result = []
        for _ in range(number):
            result.append({"라인": '', "룬": '', "아이템": '', '챔피언': ''})
    
        # 랜덤으로 선택
        for i in range(number):
            for word in words:
                if word == "라인":
                    index = random.randrange(0, len(lanes_list))
                    result[i]["라인"] = lanes_list[index]
                    del lanes_list[index]
                elif word == "룬":
                    index = random.randrange(0, len(keystones))
                    result[i]["룬"] = keystones[index]
                elif word == "아이템":
                    index = random.randrange(0, len(items))
                    result[i]["아이템"] = items[index]
                elif word == "챔피언":
                    index = random.randrange(0, len(champions_list))
                    result[i]["챔피언"] = champions_list[index]
                    del champions_list[index]
    
        return result
    반응형

    댓글