길드 용 로스트아크 디스코드 봇 (2) 봇 인터페이스에 적용

Jeuk Oh·2021년 7월 21일
1

즐거운 로요일입니다.
지난 글에서 크롤러를 구현하고 크롤러를 사용하는 DB.call()을 구현하였는데 이제 이 기능을 봇에 연결시켜주어야합니다

코드에 주석을 달아 설명해보고자 합니다.

@client.command(name='계정연동')
async def link(ctx, Id, user: discord.Member = None) -> None:
	#디스코드 서버의 관리자는 타인의 계정을 그 사람의 디스코드 계정에 연동해주는 기능도 있으면 편리할 것입니다. 
    #코드의 첫 if else 구문들은 이를 구분하기 위해 쓰였습니다.

    if user and ctx.message.author.guild_permissions.administrator:
        hash = user.id
    else:
        if user:
            await ctx.send(f"타인의 계정연동 기능은 관리자만 사용가능합니다.")
            raise PermissionsError('ctx.author does not have permission')
        hash = ctx.author.id
		
    #DB.call()은 hash와 Id를 받고, DB에 hash를 서치해보고 있다면 그 데이터 값을 리턴, 
    #없다면 크롤링하여 리턴한 뒤 크롤링 데이터를 DB에 저장해줍니다.
    call_data = DB.call(hash,Id)
    
    #이후 디스코드 계정에 데이터를 연동해줍니다. 
    #이미 크롤러에서 원정대 내 캐릭터 정보를 아이템 레벨순으로 정렬하였습니다. 
    #call_data의 첫 인덱스의 값을 받아 대표 캐릭터 정보로 사용합니다.
    name, cl, lv = call_data[0][1:]
    role_name = #길드 규칙 및 디스코드 역할에 맡게 지정
    role = discord.utils.get(ctx.guild.roles, name=role_name)
    
    
    # 다시 관리자가 타인의 계정을 연동해준 것이라면 그 멤버의 역할과 닉네임을 바꿔줍니다.
    # 아닌 경우 명령어를 콜한 멤버의 역할과 닉네임을 바꿔줍니다.
    # 대표 캐릭터의 레벨이나 직업에 따라 미리 설정된 role로 user의 디스코드 역할, 디스코드 닉네임을 바꿔줍니다.
    
    if user and ctx.message.author.guild_permissions.administrator:
        try:
            await user.add_roles(role)
            await user.add_roles(discord.utils.get(ctx.guild.roles, name=cl))
            await user.edit(nick=f'{name}')
        except Exception as e:
            print(e)
        nick_ = user.nick
    # 아니면 author꺼 바꿈
    else:
        try:
            await ctx.author.add_roles(role)
            await ctx.author.add_roles(discord.utils.get(ctx.guild.roles, name=cl))
            await ctx.author.edit(nick=f'{name}')
        except Exception as e:
            print(e)
        nick_ = None
	
    #  마지막으로 call_data를 이쁘게 출력하여 계정정보를 보여줍니다.
    
    await ctx.send(f'{nick_ or ctx.author.nick} 님의 계정 연동 사항입니다.\n')
    await ctx.send(embed=embed_print(call_data))

제가 원했던 기능은, 디스코드 내에서

!계정연동 로아ID

를 치면 로스트아크 ID를 인자로 크롤링한 원정대 정보 (캐릭터들)를 DB에 저장하고 디스코드 아이디와 로아 ID를 매칭시켜주는 것입니다.

!계정연동 타인로아ID 타인디스코드nickname 

관리자라면 디스코드 내에서 이러한 명령어를 통해 타인의 데이터를 연동해줄 수 있습니다. 코드를 실행하고 디스코드에 명령어를 입력해 봅시다.

제가 관리자라서 닉네임은 바뀌지 않지만, 역할이 잘 적용되어서 닉네임에 색이 적용되었고 현재 제가 가진 캐릭터들의 정보가 다 출력된 것을 볼 수 있습니다.

현재 DB는 단순하게 딕셔너리를 들고다니며 pickle로 저장, 로드하고 있었는데 원정대 데이터가 쌓일수록 원하는 부분만 뽑아내기에 어려움이 있습니다.

DB를 sqlite3를 사용하여 리펙토링한 뒤 기능들을 몇개 추가해보고자 합니다.

현재 구현된 기능들

  • 계정연동
  • 계정검색
  • 계정업데이트

향후 추가할 기능들

  • help : (명령어 목록 출력)
  • 레이드명 공략 (1줄 복붙가능한 공략 + 필요한 배틀아이템 리스트 ex. 비아키스 공략 or 비아키스 노말 1넴 등등..)
  • 레이드명 보상 (레이드 보상 출력)
  • 레이드명 인원 (현재 DB에 저장된 캐릭터들 중 레이드 참여 가능한 캐릭터 정보 출력)
  • 레이드명 완료 *캐릭터명 (DB에 저장된 캐릭터들 중 해당 레이드 완료된 캐릭터들 입력, 로요일 초기화 전까지 레이드명 인원 명령어에 출력되지 않게 함)
  • 레이드명 (공략, 보상, 정보, 가능인원/완료인원(숫자만) 등등 모두 출력)

하나하나씩 추가해보고자 합니다.

아직 코딩실력이 부족해서 가독성 좋은 코드를 만드는 것이 어렵네요. 다음 로요일 전에 레이드명 인원 기능까지는 만들어보고자 합니다.

profile
개발을 재밌게 하고싶습니다.

0개의 댓글