변명은 만개 결과는 한개

[Discord] 휴면 계정 리스트업 로직 본문

공부/Discord

[Discord] 휴면 계정 리스트업 로직

노마십가 2020. 9. 1. 01:40
728x90
반응형

들어가며

 제가 소속되어있는 디스코드 커뮤니티에서는 3개월텍스트채널에서 아무런 활동을 하지 않는 회원을 휴면 회원으로 간주하고 GrayMember Role을 부여합니다.

 

 기존에는 기회가 있을 때마다 관리자님들이 모여 일일이 확인하며 진행하였는데, 이를 봇으로 진행하면 실수도 없고 좋을 것 같다는 의견이 있어 고찰해보기로 하였습니다.

 

첫 시도

 디스코드에는 (텍스트)채널 단위로 원하는만큼의 텍스트 내역을 볼 수 있는 history 라는 API가 존재하는데,
부끄럽지만 처음에는 단순하게

Member in channel.history(limit=세달):

의 느낌으로 접근했다가,

무수히 많은 멤버에 대한 Worst case (GRAY 후보 멤버 한사람당 3시간)의 말도 안되는 연산시간으로 포기했습니다.

 

두번째 시도

 이후 생각을 조금 바꾸어 서버 내의 모든 채널 최근 3개월분 메세지 history 를 가져온 뒤, 메세지 authorset 형으로 모으는 방식으로,

 

한사람 한사람을 기준으로 history 를 체크하는게 아닌 채널을 기준으로 일종의 white list 를 만들어,


현재 서버의 멤버중 white list 에 속해있지 않는 멤버를 걸러내 Gray Member list 를 만들었습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# make WhiteList json file
@bot.command()
async def makeWhiteListJson(ctx):
    await ctx.message.delete()
    await ctx.message.author.send('start make WhiteList json')
 
    today = datetime.datetime.today()    # Local (KOR) time
    limitDay = today - datetime.timedelta(days=90)    # Gray limit day : 3 month
 
    whiteIdList = []
    channels = ctx.guild.text_channels
    for channel in channels:
        msgs = await channel.history(limit=None, after=limitDay, oldest_first=False).flatten()
        tmpList = []
        for msg in msgs:
            tmpList.append(msg.author.id)
 
        tmpList = list(set(tmpList))    # remove duplicate message author id
        whiteIdList = whiteIdList + tmpList
 
        whiteIdList = list(set(whiteIdList))    # remove duplicate message author id again
 
    with open("whiteList.json""w"as json_file:
        json.dump(whiteIdList, json_file)
    await ctx.message.author.send('finish make WhiteList json')
cs

 

결론

 제가 소속되어있는 디스코드 커뮤니티 기준

(무수한 채널 중 가장 많은 메세지량을가진 채널의 3개월간 메세지량는 대략 70만건)

모든 채널의 white list 및 gray member list 생성에는 약 3시간 20분이 걸렸으니,

 

기존 Gray 후보 멤버(worst case) 기준 3시간에서 3시간 20분으로의 개선은 의미있다고 생각되네요 :)

(물론 첫번째 시도가 너무 터무니없었지만요)

 

마무리

 비슷한 기능을 구현하려는데 막막하셨던 분들께는 도움이 되었으면 좋겠습니다.

혹시 더 나은 로직이 있다면 댓글로 공유해주세요!

 

읽어주셔서 감사합니다 :)

728x90
반응형