모바일 알람 - Slack 활용

gogori6565·2022년 5월 31일
0

Opensw-Basis-project

목록 보기
10/10

마감예정과제 마감 x시간 전에 알람주기

#문자열 분석해서 .이랑 :이거를 죄다 ,(쉼표)로 바꿔서 datetime에 넣기 -> 22,6,5,23,59
for i in range(0,len(DA_deadline)):
    DA_deadline[i]=DA_deadline[i].replace('.',',')
    DA_deadline[i]=DA_deadline[i].replace(':',',')
    DA_deadline[i]=DA_deadline[i].replace(' ','') #공백없애기
  • replace() 사용해 22. 6. 3 23:59 로 불러와지는 마감기한을 datetime()에 넣을 수 있게 22,6,3,23,59 로 변경시킴
DA=DA_deadline[i].split(',')
  • 이후, datetime(Y,m,d,H,M,S,M.S(마이크로세컨드))로 보내줘야 하기 때문에
    split()을 사용해['22','6','3','23','59']로 또 하나씩 분류하는 리스트를 만듦
    (slack에 전송하는 for문에서 수행될 예정)

마감 x시간 전에 알람. 단, 중복되지 않고 한 번만 보낸다

<문제>
1) 마감 x시간 전에 해당하는 알람은 단 한 번만 줄 것임
2) 코드는 x분 간격으로 반복 실행할 것임 (계속해서 업데이트 시킬 것이기 때문)
3) 과제 마감시간이 지나 과제가 사라질 경우 DA_deadline 리스트가 변경될 위험이 있음

  • 변수에 1을 넣어 1일 경우, 0일 경우로 나눠서 중복을 방지하려 했으나 3) 조건이 방해함
    : DA_deadline 리스트가 변경돼 버리면 1/0을 담는 check리스트의 값을 초기화해줘야 하는데 그걸 해줄 방법이 없다. -> 리스트가 이전리스트와 다를 경우를 검사하려 했으나 2) 조건 때문에 이전리스트 변수가 현재 리스트와 다름을 유지할 수가 없다!

문제 해결 코드

전역변수로 remain[], text[], pre_text[] 리스트 전부 ""로 초기화, 이때 리스트 크기는 20으로 미리 고정
**중요!** remain, text, pre_text 는 절대 반복실행 할 때 초기화해서는 안됨!!

for i in range(len(DA_deadline)):
    	해당 인덱스의 과제와 몇 시간 남았는지 계산
        (일단, 24시간(하루), 1시간 전으로 테스트)

        if 남은 시간이 1440(24시간) 이하라면,
            text[i]=DeadlineAss_cours[i]+"의 ["+DeadlineAss_title[i][4:]+"] 과제가 1일(24시간) 남았습니다."
            if 남은 시간이 60(1시간) 이하라면,
                text[i]=DeadlineAss_cours[i]+"의 ["+DeadlineAss_title[i][4:]+"] 과제가 1시간 남았습니다."
                
    if text[i]가 이전(pre_text[i])와 동일하지 않을 경우 실행:
              슬랙으로 text[i] 보내기
              pre_text[i]=text[i] #이전과 동일한지 검사하기 위해
    

과제리스트가 변경되었을 때, 변경되어 앞으로 온 과제도 1시간 남았을 경우 text가 같으면 어떡하지? 라는 생각을 했는데 그럴 필요가 없었다! -> 어짜피 title 내용이 반드시 다를 것이기 때문에 리스트가 변경되면 text도 변한다!!

<해결>
remain, text, pre_text는 반복실행 시 '초기화 되지 않는 리스트'로 만들 것이다.
text[i]의 내용을 먼저 조건에 따라 생성시키게 하고, 맨 마지막에 pre_text[i]에 현재 text[i]를 저장해 다음 번 실행 때, 해당 메세지를 보냈는지 여부를 pre_text와 text가 같은지로 판단할 것이다.
이 경우,
1) 처음 메세지를 보낼 경우 pre_text의 공백과 다르기에 메세지 전송이 가능,
2) 과제마감이 끝나거나 제출하여 과제 리스트가 변경될 경우, 새로운 text가 생성되었을 때 새로운 메세지를 보낼 수 있게 하는 것이 가능하다.
text는 과제리스트의 인덱스와 같은 인덱스로 매칭해야 하기 때문에 .append()가 아닌 계속해서 [i]인덱스로 접근해 해당 인덱스의 내용을 아예 바꾸는 것이기 때문에 <문제>에서 언급되었던 반복실행 시 변수를 1/0으로 바꿀 수 없는 문제를 해결할 수 있었다!

from datetime import datetime
import requests #슬랙

##프로그램 반복실행 시 절대 다시 돌리면 안되는 변수 - 초기화 시키면X ##
diff=[0 for i in range(20)] #뺀 시간
remain=["" for i in range(20)] #남은 시간
text_=["" for i in range(20)] #슬랙 메세지
pre_text=["" for i in range(20)] #슬랙 이전 메세지 (중복방지)
DA=["" for i in range(20)] #날짜/시간 콤마로 짤라 넣을 리스트

##과제마감시간 슬랙으로 알림##

#문자열 분석해서 .이랑 :이거를 죄다 ,(쉼표)로 바꿔서 datetime에 넣기 -> 22,6,5,23,59
for i in range(0,len(DA_deadline)):
    DA_deadline[i]=DA_deadline[i].replace('.',',')
    DA_deadline[i]=DA_deadline[i].replace(':',',')
    DA_deadline[i]=DA_deadline[i].replace(' ','') #공백없애기

#input으로 사용자한테 받아야함
token = "[사용자 토큰]" #사용자 토큰
channel = "#chatbot" #채널이름

#하루, 1시간 전으로 테스트
for i in range(0,len(DA_deadline)):
    #몇분 남았는지 계산
    now = datetime.now()
    DA=DA_deadline[i].split(',')
    future = datetime(int("20"+DA[0]),int(DA[1]),int(DA[2]),int(DA[3]),int(DA[4]))
    print(future)
    diff[i]=future-now
    remain[i]=(diff[i].days*1440)+(diff[i].seconds/60) #일수*1440(하루 1440분)+시간 차이의 초를 /60으로 나눠서 분으로 만듦
        
    #remain[i]은 과제까지 남은 '분'
    if remain[i]<=24*60:
        text_[i]=DeadlineAss_cours[i]+"의 ["+DeadlineAss_title[i][4:]+"] 과제가 1일(24시간) 남았습니다."
            
        if remain[i]<=60:
            text_[i]=DeadlineAss_cours[i]+"의 ["+DeadlineAss_title[i][4:]+"] 과제가 1시간 남았습니다."
        
    if pre_text[i]!=text_[i]:
        text=text_[i]
        requests.post("https://slack.com/api/chat.postMessage",
            headers={"Authorization": "Bearer "+token},
            data={"channel": channel,"text": text})
        pre_text[i]=text_[i] #이전 텍스트에 넣어서 중복여부 파악

profile
p(´∇`)q

0개의 댓글