즐거운 로요일입니다.
지난 글에서 크롤러를 구현하고 크롤러를 사용하는 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를 사용하여 리펙토링한 뒤 기능들을 몇개 추가해보고자 합니다.
현재 구현된 기능들
향후 추가할 기능들
하나하나씩 추가해보고자 합니다.
아직 코딩실력이 부족해서 가독성 좋은 코드를 만드는 것이 어렵네요. 다음 로요일 전에 레이드명 인원 기능까지는 만들어보고자 합니다.