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

hukim·2022년 8월 24일
0

Open API

목록 보기
11/11
post-thumbnail

저번 포스팅에 이어서 작성.

음력, 양력

원래 음력 생일을 입력받아서 괘를 계산하려고 하였는데
요즘에는 음력 생일을 거의 쓰지도 않고 본인 음력생일도 잘 모를 가능성이 있을것 같아서
양력이랑 음력 생일을 둘 다 선택할 수 있게끔 하려고 한다.

라디오 버튼

슬랙의 Block kit Builder에 있는 라디오 버튼을 이용해서 선택지를 준다.

"blocks": [
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Section block with radio buttons"
			},
			"accessory": {
				"type": "radio_buttons",
				"options": [
					{
						"text": {
							"type": "plain_text",
							"text": "*this is plain_text text*",
							"emoji": true
						},
						"value": "value-0"
					},
					{
						"text": {
							"type": "plain_text",
							"text": "*this is plain_text text*",
							"emoji": true
						},
						"value": "value-1"
					},
					{
						"text": {
							"type": "plain_text",
							"text": "*this is plain_text text*",
							"emoji": true
						},
						"value": "value-2"
					}
				],
				"action_id": "radio_buttons-action"
			}
		}
	]

이 코드는 라디오버튼의 생성 예시.
text > text 에 제목을 주면 되고
options에 버튼에 대한 내용들을 주면 된다.

최초 메뉴버튼 클릭 시 -> 양력/음력 선택 -> 생년월일 입력 -> 양력일 시 음력으로 변환 후 계산

이렇게 진행하려고 한다.

음력 변환

파이썬에서 음력변환하기 위해서 라이브러리를 이용했다.
korean-lunar-calendar에서 제공하고있으므로 사용하면 된다.

음력입력일 경우 넘어가고 양력만 변환할거기 때문에

이미지와 같이 이용하면 될거같다.

진행하다보니 육십갑자에 맞게 태세수,월건수,일진수가 필요하게되어 DB에 넣었다.

예를들어서, 양력 03년 4월 15일 생의 2022년 토정비결 구하려고할 때
음력으로 변환하면 03년 3월 14일이되고
조견표를 참고해서 구하면 상괘,중괘,하괘는 각각

4/2/3 이 나오는데, 괘를 구할때는 현재 날짜가 기준이된다.
2022년의 운세를 보는거기 때문에 2022년에 해당하는 것으로 찾아야한다.

중괘의 경우 음력으로 2022년 3월의 달이 '갑진'년이고 30일까지 있어서 대월이다.
대월이면 '월건수 + 30' 소월이면 29를 더해줘야 한다.

하괘의 경우는 음력으로 2022년 3월 14일에 해당하는 육십갑자 정유일로 계산하여야 한다.
생각보다 상당히 복잡하다.

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

    date = validate_date_format(birthdate)

    if not date:
        return "생녈월일을 올바르게 입력해 주세요."

    calendar = KoreanLunarCalendar()

    if birth_type == "solar":
    	# 음력으로 변환
        calendar.setSolarDate(date.year, date.month, date.day)
        date = validate_date_format(calendar.LunarIsoFormat())
	
    # 2022년에 해당하는 육십갑자를 구함.
    calendar.setLunarDate(2022, date.month, date.day, False)
    gapja_text = calendar.getGapJaString()

    # 우선은 2022년 고정 기준으로 작성
    gapja_year = "임인"
    gapja_month = gapja_text[4:6]
    gapja_day = gapja_text[8:10]

    gapja_list = [gapja_year, gapja_month, gapja_day]
    result = await get_sixty_cycle(gapja_list, db)
    
    # 음력의 대월,소월 체크
    check_lunar = KoreanLunarCalendar()
    is_month = check_lunar.setLunarDate(2022, date.month, 30, False)

    # 임인년(2022년) 육십갑자 세팅
    rule1 = 0
    rule2 = 0
    rule3 = 0

    for row in result:
        if row.kor_name == gapja_year:
            rule1 = row.year
        elif row.kor_name == gapja_month:
            rule2 = row.month
        elif row.kor_name == gapja_day:
            rule3 = row.day

    # 상괘 = (올해의 나이 + 태세수) % 8
    # 중괘 = (당해의 음력월 달수의 소월/대월 소월이면 29, 대월이면 30 + 월건수) % 6
    # 하괘 = (음력 생일 + 일진수) % 3

    divination1 = ((2022 - date.year + 1) + rule1) % 8
    divination2 = ((30 if is_month else 29) + rule2) % 6
    divination3 = (date.day + rule3) % 3
    
     if divination1 == 0:
        divination1 = 8
    
    if divination2 == 0:
        divination2 = 6
        
    if divination3 == 0:
        divination3 = 3

    return f"{divination1}/{divination2}/{divination3}"

최초에 양력으로 입력했으면 음력으로 날짜를 먼저 바꿔주고 date 변수에 담아두고
해당 날짜를 연도만 바꿔서 DB에 있는 육십갑자를 얻어낸다.

그리고 2022년 해당월에 30일이 존재하는지 여부를 체크하여 대월,소월 체크를 해준다.
마지막으로는 계산식에 맞게 계산해준다.

나머지가 없는 경우에는 각각 8, 6, 3에 해당하는 값을 넣어준다.

나온 값을 조견표랑 비교해서 확인해준다.

0개의 댓글