반응형

전에 만들다가 실패한 공부 시간 측정 기능을 완성하였다. 물론 현재도 추가 / 보완해야할 부분이 많지만 우선 기능적인 부분은 완성하였다.

초기 오류

처음에 설계한 방식은 완전히 잘못되었다. 

처음에 설계한 부분은 userList 라는 리스트를 만들어서, 명령어가 입력 되었을 때 명령어를 입력한 사람이 userList에 존재하지 않는다면 userList에 명령어를 입력한 사람을 넣어준 후 반복문을 돌리고, 존재한다면 반복문을 탈출, 공부 시간을 출력 및 userList에서 삭제하는 부분이었다. 하지만 시간을 측정할 sec 변수를 global로 선언하여 모든 유저가 시간(sec)을 공유하게 되었고 반복문의 탈출도 정상적으로 동작하지 않았다. 

이 당시의 명령어 동작 방식은 "$공부시간측정" 이었는데, 이 입력값도 없는 하나의 명령어에 너무 여러가지 기능을 넣으려고 하니 복잡해지기도 하고, 꼬이기도 해서 아예 "$공부시간측정 사용자명"으로 명령어 구조를 바꾸고 로직도 조금 수정하였다.

대략적인 로직

전과 달리 timer라는 이름의 dictionary를 사용하고 key로는 유저의 이름, value로는 그 유저가 공부한 시간(초)가 기록된다. 

측정 시작

"$공부시간측정 수피치" 가 호출되면

timer 내부에 키값으로 "수피치"가 있는지 검사한다.

존재하지 않거나 존재하지만 값이 -1이라면  "수피치"를 key로 0을 value로 timer에 추가한 후 while문을 돌면서 1초에 value가 1씩 증가한다. while문의 조건으로는 vaule가 0보다 커야함을 주었다. 시간 측정을 종료할 때 값을 -1로 주어서 반복문을 탈출하게 만들것이다. 만약 반복문을 돌다가 하루가 지나버리면 경고창을 출력함과 동시에 시간을 초기화한다. 1일이상 하루종일 공부할 경우는 없으니까...

측정 종료

"$공부시간측정 수피치" 가 호출될 때

timer 내부에 key로 "수피치"가 존재함과 동시에(and) value가 -1이 아니라면 이미 수피치의 공부시간은 측정되고 있다는 뜻이므로 공부시간을 출력해주고 시간(value)을 -1로 만들어준다(다시 호출 되었을 때 시간 측정을 하기 위하여). 공부시간을 출력하기 위해 timeConverter라는 함수는 만들었다. 이 함수는 유저명과 시간(해당 유저가 공부한 시간의 초형식)을 인자로 받고 초를 시, 분, 초로 나누어 출력해준다.

동작 화면 

 

코드 구성

@bot.command()
async def 공부시간측정(ctx, *, user):
    global timer

    if user in timer and timer[user] != -1:
        await ctx.send(timeConverter(user, timer[user]))
        timer[user] = -1
        # print('종료')
    else :
        timer[user] = 0
        await ctx.send(f"{user}님의 공부시간을 측정하기 시작합니다.")
        # print(timer)
        while (timer[user] >= 0) :
            timer[user] += 1
            await asyncio.sleep(1)
            # print(timer[user])
            if timer[user] > 3600 * 24 :
                await ctx.send("1일이 경과하였습니다. 시간을 초기화하겠습니다.")
                timer[user] = -1


def timeConverter(user, sec) :
    min = sec // 60
    hour = min // 60
    sec %= 60
    min %= 60

    # print(f'{user}님은 {hour}시간 {min}분 {sec}초 공부하셨습니다.')
    return f'{user}님은 {hour}시간 {min}분 {sec}초 공부하셨습니다.'

보완해야할 부분

SooBot이 여러 서버에 존재할 경우 a에서 "수피치"의 공부시간측정을 시작한 후 b에서 "수피치"의 공부시간측정을 시작하면

b에서 호출되는 즉시 종료된다. 

  • 딕션너리에 서버값도 추가?

a라는 인물이 "수피치"의 공부시간측정을 시작한 후 b라는 인물이 "수피치"의 공부시간측정을 시작하면 시간측정이 종료됨. 

== 타인이 의도적으로 시간측정기능을 끌 수 있음.

  • 딕셔너리에 호출한 유저도 추가?
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기