본문 바로가기
프로젝트/SRT&KTX 매진표 예매

SRT&KTX 기차표 매크로 예매 - (14) 텔레그램, 이메일 환경설정 UI

by 매크로메이커 2024. 1. 17.

이번 프로젝트의 개발 내용으로 마지막이 될 글이다:)

 

텔레그램과 이메일 등 환경설정을 넣을 수 있는 UI를 만들어보자.

 

Qt Designer에서 아래와 같이 환경설정 tab을 하나 더 만들고 UI를 구성하자.

 

환경설정 UI

환경설정 관련된 main.py 코드는 아래와 같다 (뒤쪽 예매파트는 생략)

class UiMainClass(QDialog):
    def __init__(self):
        self.max_error_log = 20
        self.max_try_log = 100

        self.srt = SRT(self.error_callback, self.srt_try_callback)
        self.srt_stations = self.srt.get_stations()
        self.srt_thread = None

        self.srt_radiobuttons = []
        self.srt_schedules = []

        self.srt_reservation_list = []
        self.srt_reservation_idx = 0

        self.ktx = KTX(self.error_callback, self.ktx_try_callback)
        self.ktx_stations = self.ktx.get_stations()
        self.ktx_thread = None

        self.ktx_radiobuttons = []
        self.ktx_schedules = []

        self.ktx_reservation_list = []
        self.ktx_reservation_idx = 0

        self.db = load_db()

        QDialog.__init__(self)
        # UI 선언
        self.main_ui = Ui_dialog()
        # UI 준비
        self.main_ui.setupUi(self)
        self.init_ui()
        # 화면을 보여준다.
        self.show()

    def init_ui(self):
        self.main_ui.label_version.setText(version)
        self.main_ui.label_srt_logged_in.hide()
        self.main_ui.label_ktx_logged_in.hide()

        ### SRT ###
        # db에 데이터가 있는 경우 불러오기
        if 'srt_login_type' in self.db.keys():
            if self.db['srt_login_type'] == 0 or self.db['srt_login_type'] == 1 or self.db['srt_login_type'] == 2:
                self.main_ui.comboBox_srt_login_type.setCurrentIndex(self.db['srt_login_type'])
        if 'srt_id' in self.db.keys():
            self.main_ui.lineEdit_srt_id.setText(self.db['srt_id'])
        if 'srt_pwd' in self.db.keys():
            self.main_ui.lineEdit_srt_pwd.setText(self.db['srt_pwd'])
        if 'srt_save_login_info' in self.db.keys() and self.db['srt_save_login_info']:
            self.main_ui.checkBox_srt_save_login.setChecked(True)

        self.main_ui.comboBox_srt_adult.setCurrentIndex(1)
        self.main_ui.comboBox_srt_dpt_stn.addItems(self.srt_stations.keys())
        self.main_ui.comboBox_srt_arv_stn.addItems(self.srt_stations.keys())
        self.main_ui.comboBox_srt_arv_stn.setCurrentIndex(1)

        self.main_ui.dateTimeEdit_srt_time.setDateTime(datetime.datetime.now())

        self.main_ui.pushButton_srt_reservation.setStyleSheet("QPushButton{background-color : lightblue;}")

        # 로그인 타입 변경
        self.main_ui.comboBox_srt_login_type.currentIndexChanged.connect(self.comboBox_srt_login_type_changed)
        # 로그인
        self.main_ui.pushButton_srt_login.clicked.connect(self.pushButton_srt_login_clicked)
        # 열차 조회
        self.main_ui.pushButton_srt_search.clicked.connect(self.pushButton_srt_search_clicked)
        # 열차 예매
        self.main_ui.pushButton_srt_reservation.clicked.connect(self.pushButton_srt_reservation_clicked)

        ### KTX ###
        # db에 데이터가 있는 경우 불러오기
        if 'ktx_login_type' in self.db.keys():
            if self.db['ktx_login_type'] == 0 or self.db['ktx_login_type'] == 1 or self.db['ktx_login_type'] == 2:
                self.main_ui.comboBox_ktx_login_type.setCurrentIndex(self.db['ktx_login_type'])
        if 'ktx_id' in self.db.keys():
            self.main_ui.lineEdit_ktx_id.setText(self.db['ktx_id'])
        if 'ktx_pwd' in self.db.keys():
            self.main_ui.lineEdit_ktx_pwd.setText(self.db['ktx_pwd'])
        if 'ktx_save_login_info' in self.db.keys() and self.db['ktx_save_login_info']:
            self.main_ui.checkBox_ktx_save_login.setChecked(True)

        self.main_ui.comboBox_ktx_adult.setCurrentIndex(1)
        self.main_ui.comboBox_ktx_dpt_stn.addItems(self.ktx_stations.keys())
        self.main_ui.comboBox_ktx_arv_stn.addItems(self.ktx_stations.keys())
        self.main_ui.comboBox_ktx_arv_stn.setCurrentIndex(1)

        self.main_ui.dateTimeEdit_ktx_time.setDateTime(datetime.datetime.now())

        self.main_ui.pushButton_ktx_reservation.setStyleSheet("QPushButton{background-color : lightblue;}")

        # 로그인 타입 변경
        self.main_ui.comboBox_ktx_login_type.currentIndexChanged.connect(self.comboBox_ktx_login_type_changed)
        # 로그인
        self.main_ui.pushButton_ktx_login.clicked.connect(self.pushButton_ktx_login_clicked)
        # 열차 조회
        self.main_ui.pushButton_ktx_search.clicked.connect(self.pushButton_ktx_search_clicked)
        # 열차 예매
        self.main_ui.pushButton_ktx_reservation.clicked.connect(self.pushButton_ktx_reservation_clicked)

        ### Settings
        if 'max_error_log' in self.db.keys():
            try:
                self.db['max_error_log'] = int(self.db['max_error_log'])
                self.max_error_log = self.db['max_error_log']
            except:
                self.error_callback("DB 로드 실패", f"max_error_log - {self.db['max_error_log']}")
        if 'max_try_log' in self.db.keys():
            try:
                self.db['max_try_log'] = int(self.db['max_try_log'])
                self.max_try_log = self.db['max_try_log']
            except:
                self.error_callback("DB 로드 실패", f"max_try_log - {self.db['max_try_log']}")
        self.main_ui.lineEdit_max_error_log.setText(str(self.max_error_log))
        self.main_ui.lineEdit_max_try_log.setText(str(self.max_try_log))

        self.main_ui.pushButton_settings_save.clicked.connect(self.pushButton_settings_save_clicked)

        ### Telegram
        if 'telegram_enable' in self.db.keys() and self.db['telegram_enable']:
            self.main_ui.checkBox_telegram_enable.setChecked(True)
        if 'telegram_token' in self.db.keys():
            self.main_ui.lineEdit_telegram_token.setText(self.db['telegram_token'])
        if 'telegram_chatid' in self.db.keys():
            self.main_ui.lineEdit_telegram_chatid.setText(self.db['telegram_chatid'])

        self.main_ui.pushButton_telegram_test.clicked.connect(self.pushButton_telegram_test_clicked)
        self.main_ui.pushButton_telegram_save.clicked.connect(self.pushButton_telegram_save_clicked)

        ### Email
        if 'email_enable' in self.db.keys() and self.db['email_enable']:
            self.main_ui.checkBox_email_enable.setChecked(True)
        if 'email_sender' in self.db.keys():
            self.main_ui.lineEdit_email_sender.setText(self.db['email_sender'])
        if 'email_passwd' in self.db.keys():
            self.main_ui.lineEdit_email_passwd.setText(self.db['email_passwd'])
        if 'email_receiver' in self.db.keys():
            self.main_ui.lineEdit_email_receiver.setText(self.db['email_receiver'])

        self.main_ui.pushButton_email_test.clicked.connect(self.pushButton_email_test_clicked)
        self.main_ui.pushButton_email_save.clicked.connect(self.pushButton_email_save_clicked)

    def pushButton_settings_save_clicked(self):
        try:
            max_error_log_tmp = int(self.main_ui.lineEdit_max_error_log.text())
            self.main_ui.lineEdit_max_error_log.setText(str(max_error_log_tmp))
            self.db['max_error_log'] = max_error_log_tmp
        except:
            self.error_callback("DB 저장 실패", f"최대 에러 로그 - {self.main_ui.lineEdit_max_error_log.text()}")
            return False
        try:
            max_try_log_tmp = int(self.main_ui.lineEdit_max_try_log.text())
            self.main_ui.lineEdit_max_try_log.setText(str(max_try_log_tmp))
            self.db['max_try_log'] = max_try_log_tmp
        except:
            self.error_callback("DB 저장 실패", f"최대 예매 로그 - {self.main_ui.lineEdit_max_try_log.text()}")
            return False

        save_db(self.db)
        QMessageBox.about(self, '저장 완료', '저장 완료')

    def pushButton_telegram_test_clicked(self):
        token = self.main_ui.lineEdit_telegram_token.text()
        chatid = self.main_ui.lineEdit_telegram_chatid.text()

        telegram = Telegram(token, chatid, self.error_callback, self.telegram_try_callback)
        if telegram.send_message("기차 예매 프로그램 테스트 메세지입니다"):
            QMessageBox.about(self, '테스트 성공', '텔레그램 발송 성공')
        else:
            QMessageBox.about(self, '테스트 실패', '텔레그램 발송 실패')

    def pushButton_telegram_save_clicked(self):
        self.db['telegram_enable'] = self.main_ui.checkBox_telegram_enable.isChecked()
        self.db['telegram_token'] = self.main_ui.lineEdit_telegram_token.text()
        self.db['telegram_chatid'] = self.main_ui.lineEdit_telegram_chatid.text()

        save_db(self.db)
        QMessageBox.about(self, '저장 완료', '저장 완료')

    def telegram_try_callback(self, msg):
        self.main_ui.tableWidget_telegram_try.insertRow(0)
        self.main_ui.tableWidget_telegram_try.setItem(0, 0, QTableWidgetItem(get_nowtime()))
        self.main_ui.tableWidget_telegram_try.setItem(0, 1, QTableWidgetItem(msg))

        self.main_ui.tableWidget_telegram_try.resizeColumnToContents(0)
        self.main_ui.tableWidget_telegram_try.resizeRowsToContents()

    def pushButton_email_test_clicked(self):
        sender = self.main_ui.lineEdit_email_sender.text() + "@gmail.com"
        passwd = self.main_ui.lineEdit_email_passwd.text()
        receiver = self.main_ui.lineEdit_email_receiver.text()

        email_ = Email(sender, passwd, receiver, self.error_callback, self.email_try_callback)
        if email_.send_email("기차 예매 프로그램 테스트 이메일입니다"):
            QMessageBox.about(self, '테스트 성공', '이메일 발송 성공')
        else:
            QMessageBox.about(self, '테스트 실패', '이메일 발송 실패')

    def pushButton_email_save_clicked(self):
        self.db['email_enable'] = self.main_ui.checkBox_email_enable.isChecked()
        self.db['email_sender'] = self.main_ui.lineEdit_email_sender.text()
        self.db['email_passwd'] = self.main_ui.lineEdit_email_passwd.text()
        self.db['email_receiver'] = self.main_ui.lineEdit_email_receiver.text()

        save_db(self.db)
        QMessageBox.about(self, '저장 완료', '저장 완료')

    def email_try_callback(self, msg):
        self.main_ui.tableWidget_email_try.insertRow(0)
        self.main_ui.tableWidget_email_try.setItem(0, 0, QTableWidgetItem(get_nowtime()))
        self.main_ui.tableWidget_email_try.setItem(0, 1, QTableWidgetItem(msg))

        self.main_ui.tableWidget_email_try.resizeColumnToContents(0)
        self.main_ui.tableWidget_email_try.resizeRowsToContents()
        
    def send_success_message(self, msg):
        if self.main_ui.checkBox_telegram_enable.isChecked():       # 텔레그램 발송
            token = self.main_ui.lineEdit_telegram_token.text()
            chatid = self.main_ui.lineEdit_telegram_chatid.text()

            telegram_ = Telegram(token, chatid, self.error_callback, self.telegram_try_callback)
            telegram_.send_message(msg)

        if self.main_ui.checkBox_email_enable.isChecked():          # 이메일 발송
            sender = self.main_ui.lineEdit_email_sender.text() + "@gmail.com"
            passwd = self.main_ui.lineEdit_email_passwd.text()
            receiver = self.main_ui.lineEdit_email_receiver.text()

            email_ = Email(sender, passwd, receiver, self.error_callback, self.email_try_callback)
            email_.send_email(msg)

 

풀 코드는 깃허브에 있으니 참고하면 된다..!

 

v3.0.0을 이렇게 릴리즈함으로써 프로젝트를 마무리한다!

 

추후 ktx, srt 측 코드가 업데이트되면 수정이 있겠지만, 얼마나 빨리 가능한지는 모른당:)

 

https://github.com/dhgwag/train_reservation/releases/tag/v3.0.0

 

Release Train Reservation 3.0.0 · dhgwag/train_reservation

메세지 발송 기능 구현 2024.01.17 Update Mac 파일은 다운받을 시 OS에서 위험파일로 간주하여 손상된 파일로 인식합니다. Mac 유저들은 clone하셔서 python 파일로 실행하시기 바랍니다ㅜ_ㅠ

github.com