[Python] 봇에 Epoch Converter 추가

2023. 3. 29. 14:43·Study/Python

근래 타임스탬프를 사용할 일이 많아서 아래의 사이트를 자주 이용하고 있었다.

https://www.epochconverter.com/

 

Epoch Converter

Convert Unix Timestamps (and many other date formats) to regular dates.

www.epochconverter.com

 

필요한 기능만 딱 있고 매우 편리한 사이트이지만...

역시 웹사이트에 접속해야 한다는 것 자체가 나에겐 매우 큰 귀찮음으로 다가왔기 때문에, 이를 봇에 올렸다.

 

1. 클래스 작성

당연히 메인 봇에 코드를 다 때려 넣으면 정신 사나우니 별도의 클래스로 관리한다.

 

from datetime import datetime
from math import trunc
import time


class Epoch:
    # Convert Datetime to Timestamp
    def ConvertTime(year, month, day, hour, min, sec):

        try:
            srcTime = f'{year}-{month}-{day} {hour}:{min}:{sec}'
            detStamp = time.mktime(datetime.strptime(srcTime, '%Y-%m-%d %H:%M:%S').timetuple())

            # Drop point
            detStamp = trunc(detStamp)

        except:
            print("Wrong Datetime Input")
            detStamp = 0

        return detStamp

    # Convert Timestamp to formatted string
    def ConvertStamp(stamp):

        try:
            detTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(stamp))

        except:
            print("Something went wrong while processing ConvertStamp()!!")
            detTime = 0

        return detTime

 

연월일 시분초 입력을 받고 이를 타임스탬프로 변환하는 함수와,

타임스탬프를 받고 이를 연월일 시분초로 포맷된 스트링으로 변환하는 함수를 준비했다.

나중에 다른 기능도 필요할 수 있지만 지금은 이거면 된다.

 

2. 명령어 작성

이제 메인 봇 코드에 명령어를 작성할 시간이다.

 

@client.tree.command()
@app_commands.describe(year='연도', month='월', day='일', hour='시', min='분', sec='초')
async def cvtime(interaction: discord.Interaction, month: app_commands.Range[int, 1, 12], day: app_commands.Range[int, 1, 31], 
                hour: app_commands.Range[int, 0,23 ], min: app_commands.Range[int, 0, 59],
                year: app_commands.Range[int, 0, 9999]=None, sec: app_commands.Range[int, 0, 59]=None):
    """Datetime을 Timestamp로 변환. 24시간 포맷으로 입력할 것."""

    # As default, using current year
    if(year == None):
        year = datetime.datetime.today().year

    # 0 Second is default argument
    if(sec == None):
        sec = 0

    detStamp = ep.ConvertTime(year, month, day, hour, min, sec)

    # Exception Handling
    if(detStamp == 0):
        await interaction.response.send_message("처리 중 문제가 생겼어요. 날짜 및 시간을 제대로 확인해 주세요.")

    else:
        srcTime = ep.ConvertStamp(detStamp)
        await interaction.response.send_message(f'Convert Datetime "{srcTime}" to Timestamp\n{detStamp}', ephemeral=True)

@client.tree.command()
@app_commands.describe(srcstamp='타임스탬프')
async def cvstamp(interaction: discord.Interaction, srcstamp: int):
    """Timestamp를 Datetime으로 변환."""

    detTime = ep.ConvertStamp(srcstamp)

    # Exception Handling
    if(detTime == 0):
        await interaction.response.send_message("처리 중 문제가 생겼어요. 제대로 된 스탬프를 입력했나요?")

    else:
        await interaction.response.send_message(f'Convert Timestamp "{srcstamp}" to Datetime\n{detTime}', ephemeral=True)

 

cvtime()의 입력은 범위를 일일이 지정해 줬다.

mktime()에서 범위를 검사하지만, 입력 단계에서 필터링을 해줘야 별다른 처리 없이 편하게 사용할 수 있을 것이다.

연과 초는 옵션으로 두었다. 연도는 지금의 해가 가장 많이 쓰일 것이고, 초도 0초가 가장 많이 사용될 것이기 때문.

 

cvstamp()는 정말 별거 없다. 음수 타임스탬프를 막기 위한 범위 지정은 하지 않았지만,

이는 strftime()이 알아서 예외처리해 줄 것이다.

 

이제 봇을 켜서 확인해 보자.

 

3. 동작 확인

1. cvtime()

먼저 cvtime()을 확인한다.

 

 

자신이 시간을 제대로 입력했는지 확인하기 위해 Datetime 형식으로 출력하는 것도 잘 동작한다.

 

 

2. cvstamp()

cvstamp()는 어떨까.

 

위의 스탬프에서 숫자만 살짝 바꿔서 입력했다.

문제없이 잘 변환해 준다.

 

4. 마무리

필요할 때마다 하나씩 소소한 기능들을 추가하고 있지만, 역시 봇 메인 코드에 명령어를 때려 박는 건 상당히 잘못됐다.

처음 시작을 잘못한 것의 대가는 크다.

빠른 시일 내에 방법을 찾아서 분리를 해 놓는 게 미래의 나에게도 좋을 것 같다.

'Study > Python' 카테고리의 다른 글

[Python, AWS] csv에서 DynamoDB에로의 교체  (0) 2023.05.10
[Python] 로깅 클래스 추가  (0) 2023.04.03
[Python] 디스코드 봇에 환율 확인 기능 추가  (0) 2023.02.12
[Python] 봇의 명령어 실행 결과를 csv 형식으로 저장하기  (0) 2023.01.22
[Python] CLOUDTYPE으로 디스코드 봇 배포  (0) 2023.01.17
'Study/Python' 카테고리의 다른 글
  • [Python, AWS] csv에서 DynamoDB에로의 교체
  • [Python] 로깅 클래스 추가
  • [Python] 디스코드 봇에 환율 확인 기능 추가
  • [Python] 봇의 명령어 실행 결과를 csv 형식으로 저장하기
BVM
BVM
  • BVM
    E:\
    BVM
  • 전체
    오늘
    어제
    • 분류 전체보기 (168)
      • Thoughts (14)
      • Study (69)
        • Japanese (3)
        • C++ & C# (46)
        • Javascript (3)
        • Python (14)
        • Others (3)
      • Play (1)
        • Battlefield (1)
      • Others (11)
      • Camp (73)
        • T.I.L. (57)
        • Temp (1)
        • Standard (10)
        • Challenge (3)
        • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 본 블로그 개설의 목적
  • 인기 글

  • 태그

    IOCP
    discord py
    7계층
    서버
    Asio
    베데스다
    db
    Network
    boost
    bot
    docker
    스타필드
    OSI
    Selenium
    c#
    Dalamud
    클라우드
    Server
    포인터
    discord
    암호화
    C++
    네트워크 프로그래밍
    Python
    로깅
    cloudtype
    FF14
    네트워크
    JS
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
BVM
[Python] 봇에 Epoch Converter 추가
상단으로

티스토리툴바