diff --git a/bot.py b/bot.py index e6e0139..8d5686f 100644 --- a/bot.py +++ b/bot.py @@ -1,19 +1,319 @@ #! /usr/bin/env python3 # modules +import os import sys import time import json +from random import choice from pprint import pprint import telepot from telepot.loop import MessageLoop +from telepot.namedtuple import ReplyKeyboardMarkup, ReplyKeyboardRemove # config -from config import NAME, TOKEN -from interface import Kuser +from config import NAME, URL, TOKEN +from kcoj import KCOJ +import promote +import external bot = telepot.Bot(TOKEN) users = {} +class Kuser: + def __init__(self, userid, username='', password='', status='第一次用', question='題外'): + self._userid = userid + self._username = username + self._password = password + self._status = status + self._question = question + self._api = KCOJ(URL) + + def new_user(self): + self.help() + self.press_username() + + def press_username(self): + self._status = '輸入學號' + self._question = '題外' + bot.sendMessage(self._userid, "請輸入您的學號:", reply_markup=ReplyKeyboardRemove()) + + def press_password(self, text): + self._status = '輸入密碼' + self._question = '題外' + self._username = text + bot.sendMessage(self._userid, "輸入完可刪除訊息以策安全!\n" + "請輸入您的密碼:", reply_markup=ReplyKeyboardRemove()) + + def press_oldpassword(self): + self._status = '舊的密碼' + self._question = '題外' + bot.sendMessage(self._userid, "請輸入要原本的舊密碼:", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠"] + ], resize_keyboard=True)) + + def press_newpassword(self, text): + if text != self._password: + self._status = '正常使用' + self._question = '題外' + bot.sendMessage(self._userid, "密碼錯誤!", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠"] + ], resize_keyboard=True)) + else: + self._status = '修改密碼' + self._question = '題外' + bot.sendMessage(self._userid, "使用此功能請務必小心!\n" + "請輸入要設定的新密碼:", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠"] + ], resize_keyboard=True)) + + def change_password(self, text): + self._status = '正常使用' + self._question = '題外' + self._password = text + bot.sendMessage(self._userid, "修改成功!" if self._api.change_password(self._password) == True else "修改失敗。", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠"] + ], resize_keyboard=True)) + + def login(self, text): + self._status = '正常使用' + self._question = '題外' + self._password = text + bot.sendMessage(self._userid, "登入中...", reply_markup=ReplyKeyboardRemove()) + if self.check_online(self._userid) == True: + self.show_homepage(self._userid) + + def login_failed(self, chat_id, message_id): + self._status = '正常使用' + self._question = '題外' + if chat_id != self._userid: + bot.sendMessage(chat_id, "登入失敗,請先私訊我重新登入 KCOJ", reply_to_message_id=message_id) + bot.sendMessage(self._userid, "哇...登入失敗,讓我們重新開始", reply_markup=ReplyKeyboardRemove()) + self.press_username() + + def connect_failed(self, chat_id, message_id): + self._status = '正常使用' + self._question = '題外' + if chat_id != self._userid: + bot.sendMessage(chat_id, "KCOJ 離線中!請稍後再試", reply_to_message_id=message_id) + else: + bot.sendMessage(self._userid, "KCOJ 離線中!請稍後再試", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "幫助📚"] + ], resize_keyboard=True)) + + def check_online(self, chat_id, message_id=''): + result = self._api.check_online() + if result == None: + self.connect_failed(chat_id, message_id) + return False + else: + if result == False: + self._api.login(self._username, self._password, 2) + result = self._api.check_online() + if result == False: + self.login_failed(chat_id, message_id) + elif result == None: + self.connect_failed(chat_id, message_id) + return result == True + + def logout(self): + self._status = '正常使用' + self._question = '題外' + bot.sendMessage(self._userid, "您現在已經是登出的狀態。", reply_markup=ReplyKeyboardRemove()) + self.press_username() + + def show_homepage(self, chat_id): + self._status = '正常使用' + self._question = '題外' + q_dict = self._api.list_questions() + q_str = '' + for key in q_dict.keys(): + if q_dict[key][1] == '期限未到': + q_str += "📗" + key + " (DL: " + q_dict[key][0] + ")\n [[" + q_dict[key][3] + "]] [[" + q_dict[key][2] + "]]" + q_str += "⚠️" if q_dict[key][2] == '未繳' else "✅" + q_str += " /question_" + key + "\n\n" + bot.sendMessage(chat_id, "💁 " + self._username + " " + NAME + "\n" + "➖➖➖➖➖\n" + "📝可繳交的作業\n\n" + q_str + \ + "➖➖➖➖➖\n" + choice(promote.sentences), + parse_mode='HTML', + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["題庫📝"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True) if chat_id == self._userid else ReplyKeyboardRemove(), + disable_web_page_preview=False) + + def list_questions(self, chat_id): + self._status = '正常使用' + self._question = '題外' + q_dict = self._api.list_questions() + q_str = '' + for key in q_dict.keys(): + q_str += "📗" if q_dict[key][1] == '期限未到' else "📕" + q_str += "" + key + " (DL: " + q_dict[key][0] + ")\n [[" + q_dict[key][3] + "]] [[" + q_dict[key][2] + "]]" + q_str += "⚠️" if q_dict[key][2] == '未繳' else "✅" + q_str += " /question_" + key + "\n\n" + reply = bot.sendMessage(chat_id, "💁 " + self._username + " " + NAME + "\n" + "➖➖➖➖➖\n" + "📝所有作業\n\n" + q_str + \ + "➖➖➖➖➖\n" + choice(promote.sentences), + parse_mode='HTML', + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "更新🔃"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True) if chat_id == self._userid else ReplyKeyboardRemove(), + disable_web_page_preview=False) + bot.sendMessage(chat_id, "點我到題庫頂", reply_to_message_id=reply['message_id']) + + def show_question(self, number, chat_id): + self._status = '查看題目' + self._question = number + if number in external.QUESTION: + ext_q = True + content = external.QUESTION[number] + else: + ext_q = False + content = '```\n' + self._api.show_question(number) + '\n```' + q = self._api.list_questions()[number] + q_str = "💁 *" + self._username + "* [" + NAME + "]\n" + q_str += "➖➖➖➖➖\n" + q_str += "📗" if q[1] == '期限未到' else "📕" + q_str += "*" + number + "* (DL: " + q[0] + ")\n [[[" + q[3] + "]]] [[[" + q[2] + "]]]" + q_str += "⚠️" if q[2] == '未繳' else "✅" + reply = bot.sendMessage(chat_id, q_str + "\n\n" + content, + parse_mode='Markdown', + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "題庫📝"], + ["交作業📮" if q[1] == '期限未到' else '', "看結果☑️" if q[2] == '已繳' else '', "通過者🌐"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True) if chat_id == self._userid else ReplyKeyboardRemove()) + if ext_q == False: + bot.sendMessage(chat_id, "點我到題目頂", reply_to_message_id=reply['message_id']) + + def help(self): + bot.sendMessage(self._userid, "這裡是 Kuo C Online Judge Bot!\n" + "可以簡稱 KCOJ Bot,目前定居於 [" + NAME + "]\n" + "作用是讓大家可以方便的透過我使用郭老程設課的 Online Judge\n" + "➡️[OJ 傳送門](" + URL + ")\n" + "操作很簡單(?)\n\n" + "還是稍微提幾個需要注意的地方:\n" + "1. 📗代表還可以繳交的作業,📕代表已經不能繳交的作業\n" + "2. ⚠️代表還沒有繳交的作業,✅代表已經繳交的作業\n" + "3. 其實在查看題目的畫面就可以用「拖曳」的方式 *上傳作業📮*\n" + "4. *刪除作業⚔️* 的功能被放在 *上傳作業📮* 裡面\n" + "5. 學號與密碼將以「明文」方式儲存\n" + "6. 郭老的 Online Judge 其實也是以「明文」方式儲存您的帳號密碼\n" + "7. 我以我的人格擔保,不會使用您提供的資訊侵害您的權利\n\n" + "本專案採用 *MIT License*\n" + "聯絡我請私訊 @PinLin\n" + "原始碼被託管於 GitHub,如果想要鼓勵我的話可以幫我按個星星> " + self._username + " " + NAME + "\n" + q_str += "➖➖➖➖➖\n" + q_str += "📗" if q[1] == '期限未到' else "📕" + q_str += "" + self._question + " (DL: " + q[0] + ")\n [[" + q[3] + "]] [[" + q[2] + "]]" + q_str += "⚠️" if q[2] == '未繳' else "✅" + bot.sendMessage(self._userid, q_str + "\n\n現在請把你的程式碼讓我看看(請別超過 20 MB)\n" + "可以使用「文字訊息」或是「傳送檔案」的方式\n" + "(注意:可在程式碼前後加上單獨成行的 ``` 避免可能的錯誤。)", parse_mode='HTML', + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["刪除作業⚔️"] if self._api.list_questions()[self._question][2] == '已繳' else [], + ["首頁🏠", "回題目📜"] + ], resize_keyboard=True)) + + def send_answer(self, text, file_id): + self._status = '正常使用' + # define filename + filename = sys.path[0] + '/' + self._username + self._question + if self._api.list_questions()[self._question][3] == 'Python': + filename += '.py' + else: + filename += '.c' + + if text != '': + with open(filename, 'w') as f: + f.write(text) + else: + bot.download_file(file_id, filename) + self._api.delete_answer(self._question) + if self._api.upload_answer(self._question, filename) == True: + bot.sendMessage(self._userid, "上傳成功", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "回題目📜"], + ["看結果☑️"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True)) + else: + bot.sendMessage(self._userid, "上傳失敗", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "回題目📜"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True)) + os.remove(filename) + + def delete_answer(self): + bot.sendMessage(self._userid, "移除成功" if self._api.delete_answer(self._question) == True else "移除失敗", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "回題目📜"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True)) + + def send_failed(self): + self._status = '正常使用' + bot.sendMessage(self._userid, "檔案不能超過 20 MB!上傳失敗", + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "回題目📜"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True)) + + def list_passers(self): + self._status = '正常使用' + q = self._api.list_questions()[self._question] + q_str = "💁 " + self._username + " " + NAME + "\n" + q_str += "➖➖➖➖➖\n" + q_str += "📗" if q[1] == '期限未到' else "📕" + q_str += "" + self._question + " (DL: " + q[0] + ")\n [[" + q[3] + "]] [[" + q[2] + "]]" + q_str += "⚠️" if q[2] == '未繳' else "✅" + q_str += "\n" + for passer in self._api.list_passers(self._question): + q_str += "\n" + passer + reply = bot.sendMessage(self._userid, q_str + "", + parse_mode='HTML', + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "回題目📜"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True)) + bot.sendMessage(self._userid, "點我到名單頂", reply_to_message_id=reply['message_id']) + + def list_results(self): + self._status = '正常使用' + q = self._api.list_questions()[self._question] + q_str = "💁 " + self._username + " " + NAME + "\n" + q_str += "➖➖➖➖➖\n" + q_str += "📗" if q[1] == '期限未到' else "📕" + q_str += "" + self._question + " (DL: " + q[0] + ")\n" + for result in self._api.list_results(self._question, self._username): + q_str += "\n測試編號 " + result[0] + ":" + q_str += "✔️ " if result[1] == '通過測試' else "❌ " + q_str += result[1] + bot.sendMessage(self._userid, q_str, + parse_mode='HTML', + reply_markup=ReplyKeyboardMarkup(keyboard=[ + ["首頁🏠", "回題目📜"], + ["交作業📮" if q[1] == '期限未到' else '', "通過者🌐"], + ["登出🚪", "改密碼💱", "幫助📚"] + ], resize_keyboard=True)) + def on_chat(msg): content_type, chat_type, chat_id = telepot.glance(msg) from_id = msg['from']['id'] diff --git a/interface.py b/interface.py deleted file mode 100644 index dc91235..0000000 --- a/interface.py +++ /dev/null @@ -1,310 +0,0 @@ -#! /usr/bin/env python3 - -# modules -import os -import sys -from random import choice -import telepot -from telepot.namedtuple import ReplyKeyboardMarkup, ReplyKeyboardRemove -# config -from config import NAME, URL, TOKEN -from kcoj import KCOJ -import promote -import external - -bot = telepot.Bot(TOKEN) - -class Kuser: - def __init__(self, userid, username='', password='', status='第一次用', question='題外'): - self._userid = userid - self._username = username - self._password = password - self._status = status - self._question = question - self._api = KCOJ(URL) - - def new_user(self): - self.help() - self.press_username() - - def press_username(self): - self._status = '輸入學號' - self._question = '題外' - bot.sendMessage(self._userid, "請輸入您的學號:", reply_markup=ReplyKeyboardRemove()) - - def press_password(self, text): - self._status = '輸入密碼' - self._question = '題外' - self._username = text - bot.sendMessage(self._userid, "輸入完可刪除訊息以策安全!\n" - "請輸入您的密碼:", reply_markup=ReplyKeyboardRemove()) - - def press_oldpassword(self): - self._status = '舊的密碼' - self._question = '題外' - bot.sendMessage(self._userid, "請輸入要原本的舊密碼:", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠"] - ], resize_keyboard=True)) - - def press_newpassword(self, text): - if text != self._password: - self._status = '正常使用' - self._question = '題外' - bot.sendMessage(self._userid, "密碼錯誤!", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠"] - ], resize_keyboard=True)) - else: - self._status = '修改密碼' - self._question = '題外' - bot.sendMessage(self._userid, "使用此功能請務必小心!\n" - "請輸入要設定的新密碼:", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠"] - ], resize_keyboard=True)) - - def change_password(self, text): - self._status = '正常使用' - self._question = '題外' - self._password = text - bot.sendMessage(self._userid, "修改成功!" if self._api.change_password(self._password) == True else "修改失敗。", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠"] - ], resize_keyboard=True)) - - def login(self, text): - self._status = '正常使用' - self._question = '題外' - self._password = text - bot.sendMessage(self._userid, "登入中...", reply_markup=ReplyKeyboardRemove()) - if self.check_online(self._userid) == True: - self.show_homepage(self._userid) - - def login_failed(self, chat_id, message_id): - self._status = '正常使用' - self._question = '題外' - if chat_id != self._userid: - bot.sendMessage(chat_id, "登入失敗,請先私訊我重新登入 KCOJ", reply_to_message_id=message_id) - bot.sendMessage(self._userid, "哇...登入失敗,讓我們重新開始", reply_markup=ReplyKeyboardRemove()) - self.press_username() - - def connect_failed(self, chat_id, message_id): - self._status = '正常使用' - self._question = '題外' - if chat_id != self._userid: - bot.sendMessage(chat_id, "KCOJ 離線中!請稍後再試", reply_to_message_id=message_id) - else: - bot.sendMessage(self._userid, "KCOJ 離線中!請稍後再試", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "幫助📚"] - ], resize_keyboard=True)) - - def check_online(self, chat_id, message_id=''): - result = self._api.check_online() - if result == None: - self.connect_failed(chat_id, message_id) - return False - else: - if result == False: - self._api.login(self._username, self._password, 2) - result = self._api.check_online() - if result == False: - self.login_failed(chat_id, message_id) - elif result == None: - self.connect_failed(chat_id, message_id) - return result == True - - def logout(self): - self._status = '正常使用' - self._question = '題外' - bot.sendMessage(self._userid, "您現在已經是登出的狀態。", reply_markup=ReplyKeyboardRemove()) - self.press_username() - - def show_homepage(self, chat_id): - self._status = '正常使用' - self._question = '題外' - q_dict = self._api.list_questions() - q_str = '' - for key in q_dict.keys(): - if q_dict[key][1] == '期限未到': - q_str += "📗" + key + " (DL: " + q_dict[key][0] + ")\n [[" + q_dict[key][3] + "]] [[" + q_dict[key][2] + "]]" - q_str += "⚠️" if q_dict[key][2] == '未繳' else "✅" - q_str += " /question_" + key + "\n\n" - bot.sendMessage(chat_id, "💁 " + self._username + " " + NAME + "\n" - "➖➖➖➖➖\n" - "📝可繳交的作業\n\n" + q_str + \ - "➖➖➖➖➖\n" + choice(promote.sentences), - parse_mode='HTML', - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["題庫📝"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True) if chat_id == self._userid else ReplyKeyboardRemove(), - disable_web_page_preview=False) - - def list_questions(self, chat_id): - self._status = '正常使用' - self._question = '題外' - q_dict = self._api.list_questions() - q_str = '' - for key in q_dict.keys(): - q_str += "📗" if q_dict[key][1] == '期限未到' else "📕" - q_str += "" + key + " (DL: " + q_dict[key][0] + ")\n [[" + q_dict[key][3] + "]] [[" + q_dict[key][2] + "]]" - q_str += "⚠️" if q_dict[key][2] == '未繳' else "✅" - q_str += " /question_" + key + "\n\n" - reply = bot.sendMessage(chat_id, "💁 " + self._username + " " + NAME + "\n" - "➖➖➖➖➖\n" - "📝所有作業\n\n" + q_str + \ - "➖➖➖➖➖\n" + choice(promote.sentences), - parse_mode='HTML', - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "更新🔃"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True) if chat_id == self._userid else ReplyKeyboardRemove(), - disable_web_page_preview=False) - bot.sendMessage(chat_id, "點我到題庫頂", reply_to_message_id=reply['message_id']) - - def show_question(self, number, chat_id): - self._status = '查看題目' - self._question = number - if number in external.QUESTION: - ext_q = True - content = external.QUESTION[number] - else: - ext_q = False - content = '```\n' + self._api.show_question(number) + '\n```' - q = self._api.list_questions()[number] - q_str = "💁 *" + self._username + "* [" + NAME + "]\n" - q_str += "➖➖➖➖➖\n" - q_str += "📗" if q[1] == '期限未到' else "📕" - q_str += "*" + number + "* (DL: " + q[0] + ")\n [[[" + q[3] + "]]] [[[" + q[2] + "]]]" - q_str += "⚠️" if q[2] == '未繳' else "✅" - reply = bot.sendMessage(chat_id, q_str + "\n\n" + content, - parse_mode='Markdown', - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "題庫📝"], - ["交作業📮" if q[1] == '期限未到' else '', "看結果☑️" if q[2] == '已繳' else '', "通過者🌐"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True) if chat_id == self._userid else ReplyKeyboardRemove()) - if ext_q == False: - bot.sendMessage(chat_id, "點我到題目頂", reply_to_message_id=reply['message_id']) - - def help(self): - bot.sendMessage(self._userid, "這裡是 Kuo C Online Judge Bot!\n" - "可以簡稱 KCOJ Bot,目前定居於 [" + NAME + "]\n" - "作用是讓大家可以方便的透過我使用郭老程設課的 Online Judge\n" - "➡️[OJ 傳送門](" + URL + ")\n" - "操作很簡單(?)\n\n" - "還是稍微提幾個需要注意的地方:\n" - "1. 📗代表還可以繳交的作業,📕代表已經不能繳交的作業\n" - "2. ⚠️代表還沒有繳交的作業,✅代表已經繳交的作業\n" - "3. 其實在查看題目的畫面就可以用「拖曳」的方式 *上傳作業📮*\n" - "4. *刪除作業⚔️* 的功能被放在 *上傳作業📮* 裡面\n" - "5. 學號與密碼將以「明文」方式儲存\n" - "6. 郭老的 Online Judge 其實也是以「明文」方式儲存您的帳號密碼\n" - "7. 我以我的人格擔保,不會使用您提供的資訊侵害您的權利\n\n" - "本專案採用 *MIT License*\n" - "聯絡我請私訊 @PinLin\n" - "原始碼被託管於 GitHub,如果想要鼓勵我的話可以幫我按個星星> " + self._username + " " + NAME + "\n" - q_str += "➖➖➖➖➖\n" - q_str += "📗" if q[1] == '期限未到' else "📕" - q_str += "" + self._question + " (DL: " + q[0] + ")\n [[" + q[3] + "]] [[" + q[2] + "]]" - q_str += "⚠️" if q[2] == '未繳' else "✅" - bot.sendMessage(self._userid, q_str + "\n\n現在請把你的程式碼讓我看看(請別超過 20 MB)\n" - "可以使用「文字訊息」或是「傳送檔案」的方式\n" - "(注意:可在程式碼前後加上單獨成行的 ``` 避免可能的錯誤。)", parse_mode='HTML', - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["刪除作業⚔️"] if self._api.list_questions()[self._question][2] == '已繳' else [], - ["首頁🏠", "回題目📜"] - ], resize_keyboard=True)) - - def send_answer(self, text, file_id): - self._status = '正常使用' - # define filename - filename = sys.path[0] + '/' + self._username + self._question - if self._api.list_questions()[self._question][3] == 'Python': - filename += '.py' - else: - filename += '.c' - - if text != '': - with open(filename, 'w') as f: - f.write(text) - else: - bot.download_file(file_id, filename) - self._api.delete_answer(self._question) - if self._api.upload_answer(self._question, filename) == True: - bot.sendMessage(self._userid, "上傳成功", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "回題目📜"], - ["看結果☑️"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True)) - else: - bot.sendMessage(self._userid, "上傳失敗", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "回題目📜"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True)) - os.remove(filename) - - def delete_answer(self): - bot.sendMessage(self._userid, "移除成功" if self._api.delete_answer(self._question) == True else "移除失敗", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "回題目📜"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True)) - - def send_failed(self): - self._status = '正常使用' - bot.sendMessage(self._userid, "檔案不能超過 20 MB!上傳失敗", - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "回題目📜"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True)) - - def list_passers(self): - self._status = '正常使用' - q = self._api.list_questions()[self._question] - q_str = "💁 " + self._username + " " + NAME + "\n" - q_str += "➖➖➖➖➖\n" - q_str += "📗" if q[1] == '期限未到' else "📕" - q_str += "" + self._question + " (DL: " + q[0] + ")\n [[" + q[3] + "]] [[" + q[2] + "]]" - q_str += "⚠️" if q[2] == '未繳' else "✅" - q_str += "\n" - for passer in self._api.list_passers(self._question): - q_str += "\n" + passer - reply = bot.sendMessage(self._userid, q_str + "", - parse_mode='HTML', - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "回題目📜"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True)) - bot.sendMessage(self._userid, "點我到名單頂", reply_to_message_id=reply['message_id']) - - def list_results(self): - self._status = '正常使用' - q = self._api.list_questions()[self._question] - q_str = "💁 " + self._username + " " + NAME + "\n" - q_str += "➖➖➖➖➖\n" - q_str += "📗" if q[1] == '期限未到' else "📕" - q_str += "" + self._question + " (DL: " + q[0] + ")\n" - for result in self._api.list_results(self._question, self._username): - q_str += "\n測試編號 " + result[0] + ":" - q_str += "✔️ " if result[1] == '通過測試' else "❌ " - q_str += result[1] - bot.sendMessage(self._userid, q_str, - parse_mode='HTML', - reply_markup=ReplyKeyboardMarkup(keyboard=[ - ["首頁🏠", "回題目📜"], - ["交作業📮" if q[1] == '期限未到' else '', "通過者🌐"], - ["登出🚪", "改密碼💱", "幫助📚"] - ], resize_keyboard=True)) \ No newline at end of file