[FastAPI] 슬랙 슬래시커맨드(Slash Command) (토정비결 1)

hukim·2022년 8월 9일
0

Open API

목록 보기
10/11
post-thumbnail

저번 포스팅에서 메뉴로 분리했었는데 메뉴 두번째에 만들 항목은 컨셉질에 맞게 토정비결 보는 것을
만들어보려고 한다.

토정비결?

이 블로그에서 상세하게 이 토정비결에 대해서 설명하기는 좀 그렇고
그냥 간단하게 운세 보는 책이라고 생각하면 된다.

보는 방법

나이 기준표

상괘, 중괘, 하괘

위의 이미지에서 나이를 보고 상괘를 뽑고 태어난 월에 맞는 중괘, 태어난 날에 맞는 하괘를 뽑는다.
단, 생년월일은 음력기준으로 한다.

예를 들어, 스무살 2003년생 4월 15일 생인 경우 작괘(숫자)는 '451'이 된다.

451 작괘에 대한 운세이고, 주소는 네이버 지식백과에서 이용하였다.

토정비결 괘 계산법

육십갑자

먼저 괘를 계산하기 편하려면 육십갑자 달력이 있으면 편하다.
위의 이미지에서 태세수, 월건수, 일진수 등이 전부 나와있다. (블로그참조)

상괘 계산법

계산법은 해당 블로그에 상세하게 나와있어 참고하였다.

상괘 = (올해의 나이 + 태세수) % 8

  • 올해의 나이는 한국 나이를 기준으로 한다. (만 나이가 아닌)
  • 나이와 태세수를 합한 후 8로 나눈 나머지 값을 상괘로 뽑습니다.
  • 8로 나눈 나머지 값이 0인 경우는 상괘가 8이 됩니다.

올해 2022년은 임인년이므로 태세수는 16이다.
위에 게산했던 2003년생 기준으로 하면 (20 + 16) % 8 이 되고
나머지가 4가 나오며 이게 바로 본인의 상괘가 된다.

중괘 계산법

중괘 = (당해의 음력월 달수 + 월건수) % 6

  • 당해의 음력월 달수와 월건수를 더한 후 6으로 나눈 나머지 값을 중괘로 뽑는다.
  • 6으로 나눈 나머지 값이 0인 경우는 중괘가 6이 된다.

중괘는 월건수를 더한 후 6으로 나눈 나머지가 된다.

하괘 계산법

하괘 = (음력 생일 + 일진수) % 3

  • 음력 생일은 토정비결을 보고자 하는 분의 음력 생일의 숫자를 의미한다.
  • 음력 생일과 일진수를 더한 후 3으로 나눈 나머지 값을 하괘로 뽑는다.
  • 3으로 나눈 나머지 값이 0인 경우는 하괘가 3이다.

너무 토정비결 관련 내용이 많아졌는데
결론은 육십갑자에 나오는 년도에 있는 태세수, 월건수, 일진수를 가지고 있으면 입력 하는 생년월일에 따라
괘를 계산할 수 있을 것으로 보인다.

우선은 육십갑자 중 2022년인 임인년을 기준으로 해서 하드코딩으로 수들을 세팅한 후 입력했을 때
상,중,하괘를 찾는 것으로 시작해본다.

async def tojeong_secret_book(birthdate: str):
    if not birthdate:
        message = "생년월일을 입력해 주시기 바랍니다."
        return message

    if len(birthdate) != 6:
        message = "생년월일 6자리를 맞춰서 입력해 주시기 바랍니다."
        return message

    # 임인년 육십갑자 세팅
    rule1 = 16  # 태세수
    rule2 = 13  # 월건수
    rule3 = 14  # 일진수

    year = birthdate[0:2]
    month = birthdate[2:4]
    day = birthdate[4:6]

    message = f"{year}/{month}/{day}"

    return message

생년월일을 6자리 ('030415') 형태로 입력받고 슬라이스해서 각각 년, 월, 일을 분리해준다.
임인년 육십갑자 세팅은 우선은 하드코딩으로 작성하였고 나중에는
연도별로 db에서 관리할수도 있을것같다.

@router.post("/interactive")
async def post_message(request: Request, db: Session = Depends(get_db)):
    form_data = await request.form()
    payload = json.loads(form_data.get("payload"))
    message = "message"
    actions = payload["actions"][0]
    plain_text = payload["message"]["text"]
    text_input_value = payload["actions"][0]["value"]

    if payload:
        if actions["type"] == "plain_text_input":
            if plain_text == "나의이름은":
                message = await interactive_myname(myname=text_input_value, db=db)
            elif plain_text == "토정비결":
                message = await tojeong_secret_book(birthdate=text_input_value)
        elif actions["type"] == "button":
            if actions["value"] == "menu1":
                await input_myname()
                return
            elif actions["value"] == "menu2":
                await input_birthdate()
                return

    slack_client.post_message(
        channel_id=url.channel_id,
        text=message,
    )

    return

menu2를 눌렀을 때 마찬가지로 plain_text_input를 유저에게 제공하고
생년월일을 입력하면 토정비결 로직으로 이동할 수 있게 수정한다.

다음 포스팅에서 이어서...

0개의 댓글