mirror of
				https://gitlab.com/questable/questable_bot
				synced 2025-10-26 09:50:04 +01:00 
			
		
		
		
	Compare commits
	
		
			31 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a23f1499ec | |||
| 3b134ae5f2 | |||
| 697738945f | |||
| 021467817b | |||
| 99c1795b93 | |||
| 05d22a0ce8 | |||
| 4d610c5bff | |||
| cf05499e43 | |||
| 85c7add252 | |||
| 333b772d41 | |||
| 5b19524876 | |||
| 4609711624 | |||
| 28c33ee976 | |||
| 7c99523cf1 | |||
| aa0b388126 | |||
| 2a5ae51d71 | |||
| b3093fa1a4 | |||
| 2315b05f2c | |||
| 1239cd08cc | |||
| 6d67f05093 | |||
| b04ca65270 | |||
| 4737f023e9 | |||
| f5f81f5a93 | |||
| 9261247115 | |||
| 6e55bae42c | |||
| 095e7791d3 | |||
| 030276a23f | |||
| 0fdabeabda | |||
| cef59c494e | |||
| 38cffcf8b7 | |||
| e78fa9caa1 | 
							
								
								
									
										259
									
								
								bot.py
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										259
									
								
								bot.py
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -9,6 +9,8 @@ from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, \ | |||||||
|         RegexHandler |         RegexHandler | ||||||
| import signal | import signal | ||||||
| import sys | import sys | ||||||
|  | import re | ||||||
|  | import button_groups | ||||||
|  |  | ||||||
| try: | try: | ||||||
|     import config |     import config | ||||||
| @@ -20,17 +22,22 @@ logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - \ | |||||||
|                     %(message)s', level=logging.INFO) |                     %(message)s', level=logging.INFO) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def escape_html(message): | ||||||
|  |     return re.sub("<", "<", | ||||||
|  |                   re.sub("&", "&", message)) | ||||||
|  |  | ||||||
|  |  | ||||||
| def start(bot, update): | def start(bot, update): | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     name = str(update.message.from_user.first_name) |     if update.message.chat.type == "private": | ||||||
|     if update.message.from_user.last_name: |         name = str(update.message.from_user.first_name) | ||||||
|         name += " " + str(update.message.from_user.last_name) |         if update.message.from_user.last_name: | ||||||
|  |             name += " " + str(update.message.from_user.last_name) | ||||||
|  |     else: | ||||||
|  |         name = update.message.chat.title | ||||||
|     text = f"Hello {name}!\n" + \ |     text = f"Hello {name}!\n" + \ | ||||||
|         "Welcome to Questable. To get started, check /help." |         "Welcome to Questable. To get started, check /help." | ||||||
|     custom_keyboard = [ |     custom_keyboard = button_groups.main | ||||||
|             ['❇️ Add Quest', '📯 Add Side Quest'], |  | ||||||
|             ['📜 List Quests', '📃 List Side Quests'] |  | ||||||
|             ] |  | ||||||
|     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) |     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) | ||||||
|  |  | ||||||
| @@ -61,7 +68,10 @@ def add_quest(bot, update, player, type="quest"): | |||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     text = ("What shall the name of " + |     text = ("What shall the name of " + | ||||||
|             {"quest": "Quest", "side_quest": "Side Quest"}[type] + " be?") |             {"quest": "Quest", "side_quest": "Side Quest"}[type] + " be?") | ||||||
|     reply_markup = telegram.ReplyKeyboardRemove() |     if update.message.chat.type == "private": | ||||||
|  |         reply_markup = telegram.ReplyKeyboardRemove() | ||||||
|  |     else: | ||||||
|  |         reply_markup = telegram.ForceReply() | ||||||
|     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) |     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -80,7 +90,7 @@ def add_name(bot, update, player, type, qid): | |||||||
|  |  | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     text = "How difficult is it?" |     text = "How difficult is it?" | ||||||
|     custom_keyboard = [["📙 Low", "📘 Medium", "📗 High"]] |     custom_keyboard = button_groups.difficulty | ||||||
|     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) |     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) | ||||||
|  |  | ||||||
| @@ -111,7 +121,7 @@ def add_diff(bot, update, player, type, qid): | |||||||
|     x.update_db() |     x.update_db() | ||||||
|  |  | ||||||
|     text = "How important is it?" |     text = "How important is it?" | ||||||
|     custom_keyboard = [["🔹 Low", "🔸 Medium", "🔺 High"]] |     custom_keyboard = button_groups.importance | ||||||
|     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) |     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup) | ||||||
|  |  | ||||||
| @@ -147,9 +157,13 @@ def add_imp(bot, update, player, type, qid): | |||||||
|  |  | ||||||
|  |  | ||||||
| def send_status(bot, update, player, prefix=""): | def send_status(bot, update, player, prefix=""): | ||||||
|     name = str(update.message.from_user.first_name) |     if update.message.chat.type == "private": | ||||||
|     if update.message.from_user.last_name: |         name = str(update.message.from_user.first_name) | ||||||
|         name += " " + str(update.message.from_user.last_name) |         if update.message.from_user.last_name: | ||||||
|  |             name += " " + str(update.message.from_user.last_name) | ||||||
|  |     else: | ||||||
|  |         name = update.message.chat.title | ||||||
|  |     name = escape_html(name) | ||||||
|     points = player.get_points() |     points = player.get_points() | ||||||
|     total_quests = len(player.get_quests(None)) |     total_quests = len(player.get_quests(None)) | ||||||
|     completed_quests = len(player.get_quests(1)) |     completed_quests = len(player.get_quests(1)) | ||||||
| @@ -162,10 +176,7 @@ def send_status(bot, update, player, prefix=""): | |||||||
|             f'<b>💠 Side Quests:</b> {completed_side_quests}/' |             f'<b>💠 Side Quests:</b> {completed_side_quests}/' | ||||||
|             f'{total_side_quests}\n') |             f'{total_side_quests}\n') | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     custom_keyboard = [ |     custom_keyboard = button_groups.main | ||||||
|             ['❇️ Add Quest', '📯 Add Side Quest'], |  | ||||||
|             ['📜 List Quests', '📃 List Side Quests'] |  | ||||||
|             ] |  | ||||||
|     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup, |     bot.send_message(chat_id=chat_id, text=text, reply_markup=reply_markup, | ||||||
|                      parse_mode="HTML") |                      parse_mode="HTML") | ||||||
| @@ -192,17 +203,22 @@ def list_quests(bot, update, player, type): | |||||||
|     else: |     else: | ||||||
|         text = ("<b>" + {"quest": "📖", "side_quest": "📒"}[type] + |         text = ("<b>" + {"quest": "📖", "side_quest": "📒"}[type] + | ||||||
|                 " List of " + {"quest": "Quests", "side_quest": |                 " List of " + {"quest": "Quests", "side_quest": | ||||||
|                                "Side Quests"}[type] + "</b>\n") |                                "Side Quests"}[type] + "</b>") | ||||||
|     x.sort(key=lambda i: (i.imp, -i.QID), reverse=True) |     x.sort(key=lambda i: (i.imp, -i.QID), reverse=True) | ||||||
|     if type == "quest": |     imp = 3 | ||||||
|         for i in x: |     for i in x: | ||||||
|  |         if i.imp <= imp: | ||||||
|  |             text += "\n\n<b>📌 " + ["Low", "Medium", "High"][i.imp-1] | ||||||
|  |             text += "</b>" | ||||||
|  |             imp = i.imp - 1 | ||||||
|  |         if type == "quest": | ||||||
|             text += f"\n/Q_{i.QID} {i.name}" |             text += f"\n/Q_{i.QID} {i.name}" | ||||||
|     else: |         else: | ||||||
|         for i in x: |  | ||||||
|             text += f"\n/SQ_{i.QID} {i.name}" |             text += f"\n/SQ_{i.QID} {i.name}" | ||||||
|  |  | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     bot.send_message(chat_id=chat_id, text=text, parse_mode="HTML") |     bot.send_message(chat_id=chat_id, text=text, parse_mode="HTML", | ||||||
|  |                      disable_web_page_preview=True) | ||||||
|  |  | ||||||
|  |  | ||||||
| def quest(bot, update, player, qid, type): | def quest(bot, update, player, qid, type): | ||||||
| @@ -232,13 +248,7 @@ def quest(bot, update, player, qid, type): | |||||||
|     elif x.state == 0: |     elif x.state == 0: | ||||||
|         state = {"quest": "eq", "side_quest": "esq"}[type] |         state = {"quest": "eq", "side_quest": "esq"}[type] | ||||||
|         player.set_state(state, qid) |         player.set_state(state, qid) | ||||||
|         custom_keyboard = [ |         custom_keyboard = button_groups.quests(type) | ||||||
|                 ["✅ Mark as done"], |  | ||||||
|                 ["📝 Edit Name", "⚠️ Change Priority"], |  | ||||||
|                 ["📚 Change Difficulty", "🗑 Delete " + |  | ||||||
|                     {"quest": "Quest", "side_quest": "Side Quest"}[type]], |  | ||||||
|                 ["⬅️ Back"]] |  | ||||||
|  |  | ||||||
|     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     bot.send_message(chat_id=chat_id, text=text, parse_mode="HTML", |     bot.send_message(chat_id=chat_id, text=text, parse_mode="HTML", | ||||||
| @@ -246,7 +256,7 @@ def quest(bot, update, player, qid, type): | |||||||
|  |  | ||||||
|  |  | ||||||
| def quest_handling(bot, update, db): | def quest_handling(bot, update, db): | ||||||
|     text = update.message.text.lower().split("_") |     text = update.message.text.lower().split("@")[0].split("_") | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     player = questable.player(db, chat_id) |     player = questable.player(db, chat_id) | ||||||
|     drop_state(bot, update, player) |     drop_state(bot, update, player) | ||||||
| @@ -273,10 +283,7 @@ def mark_as_done(bot, update, player, qid, type): | |||||||
|     player.set_state('none', 0) |     player.set_state('none', 0) | ||||||
|     send_status(bot, update, player, f"<b>🌟 Earned {points} XP</b>\n\n") |     send_status(bot, update, player, f"<b>🌟 Earned {points} XP</b>\n\n") | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     custom_keyboard = [ |     custom_keyboard = button_groups.main | ||||||
|             ['❇️ Add Quest', '📯 Add Side Quest'], |  | ||||||
|             ['📜 List Quests', '📃 List Side Quests'] |  | ||||||
|             ] |  | ||||||
|     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|     bot.send_animation(chat_id=chat_id, animation=random.choice(config.gifs), |     bot.send_animation(chat_id=chat_id, animation=random.choice(config.gifs), | ||||||
|                        reply_markup=reply_markup) |                        reply_markup=reply_markup) | ||||||
| @@ -350,16 +357,15 @@ def drop_state(bot, update, player): | |||||||
|         x = questable.get_side_quest(player.DB, player.CHAT_ID, state["extra"]) |         x = questable.get_side_quest(player.DB, player.CHAT_ID, state["extra"]) | ||||||
|         x.delete_from_db() |         x.delete_from_db() | ||||||
|         player.set_state('none', 0) |         player.set_state('none', 0) | ||||||
|  |     else: | ||||||
|  |         player.set_state('none', 0) | ||||||
|  |  | ||||||
|  |  | ||||||
| def help_command(bot, update, db): | def help_command(bot, update, db): | ||||||
|     player = questable.player(db, update.message.chat_id) |     player = questable.player(db, update.message.chat_id) | ||||||
|     drop_state(bot, update, player) |     drop_state(bot, update, player) | ||||||
|     chat_id = update.message.chat_id |     chat_id = update.message.chat_id | ||||||
|     custom_keyboard = [ |     custom_keyboard = button_groups.main | ||||||
|             ['❇️ Add Quest', '📯 Add Side Quest'], |  | ||||||
|             ['📜 List Quests', '📃 List Side Quests'] |  | ||||||
|             ] |  | ||||||
|     text = ("*Questable Bot*\n\nQuestable is an RPG-like bot for maintaining " |     text = ("*Questable Bot*\n\nQuestable is an RPG-like bot for maintaining " | ||||||
|             "events in real life. _Main Tasks_ are _Quests_ while _other " |             "events in real life. _Main Tasks_ are _Quests_ while _other " | ||||||
|             "tasks_ are _Side Quests._ You can use the bot to maintain a " |             "tasks_ are _Side Quests._ You can use the bot to maintain a " | ||||||
| @@ -367,7 +373,7 @@ def help_command(bot, update, db): | |||||||
|             "Quests you get XP based on how difficult and important the " |             "Quests you get XP based on how difficult and important the " | ||||||
|             "Quest/Side Quest was. Quests/Side Quests can be added and " |             "Quest/Side Quest was. Quests/Side Quests can be added and " | ||||||
|             "modified later.\n\n To get more help check " |             "modified later.\n\n To get more help check " | ||||||
|             "[Extended Help](https://webionite.com/questable/) or " |             "[Extended Help](https://questable.webionite.com/help/) or " | ||||||
|             "[this video](https://t.me/quadnite/25). In case, of " |             "[this video](https://t.me/quadnite/25). In case, of " | ||||||
|             "bugs/feedback/more help, contact @ceda\\_ei or join the " |             "bugs/feedback/more help, contact @ceda\\_ei or join the " | ||||||
|             "[group](https://t.me/questable).") |             "[group](https://t.me/questable).") | ||||||
| @@ -376,6 +382,70 @@ def help_command(bot, update, db): | |||||||
|                      reply_markup=reply_markup) |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def rate_command(bot, update, db): | ||||||
|  |     player = questable.player(db, update.message.chat_id) | ||||||
|  |     drop_state(bot, update, player) | ||||||
|  |     chat_id = update.message.chat_id | ||||||
|  |     custom_keyboard = button_groups.main | ||||||
|  |     text = ("[Vote for us on Telegram Directory!](https://t.me/tgdrbot?" | ||||||
|  |             "start=questable_bot)\n\n" | ||||||
|  |             "Telegram Directory is a website that helps you discover top " | ||||||
|  |             "telegram channels, bots and groups.") | ||||||
|  |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|  |     bot.send_message(chat_id=chat_id, text=text, parse_mode="Markdown", | ||||||
|  |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def tokens(bot, update): | ||||||
|  |     custom_keyboard = button_groups.tokens | ||||||
|  |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|  |     reply_text = ("Tokens are used to authenticate external " | ||||||
|  |                   "applications. This only provides access to " | ||||||
|  |                   "Questable data.") | ||||||
|  |     bot.send_message(chat_id=update.message.chat_id, text=reply_text, | ||||||
|  |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def add_token(bot, update, player): | ||||||
|  |     custom_keyboard = button_groups.main | ||||||
|  |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|  |     if len(player.get_tokens()) < 3: | ||||||
|  |         reply_text = player.add_token() | ||||||
|  |     else: | ||||||
|  |         reply_text = "Maximum number of tokens reached." | ||||||
|  |     bot.send_message(chat_id=player.CHAT_ID, text=reply_text, | ||||||
|  |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def delete_token(bot, update, player): | ||||||
|  |     tokens = player.get_tokens() | ||||||
|  |     custom_keyboard = list(map(lambda x: [x], tokens)) | ||||||
|  |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|  |     reply_text = "Choose token to remove." | ||||||
|  |     player.set_state("rt") | ||||||
|  |     bot.send_message(chat_id=update.message.chat_id, text=reply_text, | ||||||
|  |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def delete_token_rt(bot, update, player): | ||||||
|  |     player.delete_token(update.message.text.lower()) | ||||||
|  |     custom_keyboard = button_groups.main | ||||||
|  |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|  |     reply_text = "Token has been removed." | ||||||
|  |     player.set_state("none") | ||||||
|  |     bot.send_message(chat_id=player.CHAT_ID, text=reply_text, | ||||||
|  |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def list_tokens(bot, update, player): | ||||||
|  |     custom_keyboard = button_groups.main | ||||||
|  |     reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|  |     reply_text = "📋 List of tokens\n\n" | ||||||
|  |     reply_text += "\n".join(player.get_tokens()) | ||||||
|  |     bot.send_message(chat_id=update.message.chat_id, text=reply_text, | ||||||
|  |                      reply_markup=reply_markup) | ||||||
|  |  | ||||||
|  |  | ||||||
| def message_handling(bot, update, db): | def message_handling(bot, update, db): | ||||||
|     text = update.message.text.lower() |     text = update.message.text.lower() | ||||||
|     player = questable.player(db, update.message.chat_id) |     player = questable.player(db, update.message.chat_id) | ||||||
| @@ -393,6 +463,7 @@ def message_handling(bot, update, db): | |||||||
|     # eqn / esqn: Edit Quest / Side Quest Name |     # eqn / esqn: Edit Quest / Side Quest Name | ||||||
|     # eqi / esqi: Edit Quest / Side Quest Importance |     # eqi / esqi: Edit Quest / Side Quest Importance | ||||||
|     # eqd / esqd: Edit Quest / Side Quest Difficulty |     # eqd / esqd: Edit Quest / Side Quest Difficulty | ||||||
|  |     # rt: Remove token | ||||||
|  |  | ||||||
|     if state["state"] == "none": |     if state["state"] == "none": | ||||||
|         if text == "add quest" or text == "❇️ add quest": |         if text == "add quest" or text == "❇️ add quest": | ||||||
| @@ -403,9 +474,20 @@ def message_handling(bot, update, db): | |||||||
|             list_quests(bot, update, player, "quest") |             list_quests(bot, update, player, "quest") | ||||||
|         elif text == "list side quests" or text == "📃 list side quests": |         elif text == "list side quests" or text == "📃 list side quests": | ||||||
|             list_quests(bot, update, player, "side_quest") |             list_quests(bot, update, player, "side_quest") | ||||||
|  |         elif text == "tokens" or text == "🔑 tokens": | ||||||
|  |             tokens(bot, update) | ||||||
|  |         elif text == "list tokens" or text == "📋 list tokens": | ||||||
|  |             list_tokens(bot, update, player) | ||||||
|  |  | ||||||
|  |         elif text == "generate token" or text == "🔑 generate token": | ||||||
|  |             add_token(bot, update, player) | ||||||
|  |  | ||||||
|  |         elif text == "delete token" or text == "🧹 delete token": | ||||||
|  |             delete_token(bot, update, player) | ||||||
|  |  | ||||||
|         else: |         else: | ||||||
|             drop_state(bot, update, player) |             if update.message.chat.type == "private": | ||||||
|             send_status(bot, update, player) |                 send_status(bot, update, player) | ||||||
|  |  | ||||||
|     elif state["state"] == "aq": |     elif state["state"] == "aq": | ||||||
|         add_name(bot, update, player, "quest", state["extra"]) |         add_name(bot, update, player, "quest", state["extra"]) | ||||||
| @@ -440,14 +522,14 @@ def message_handling(bot, update, db): | |||||||
|         elif text == "change priority" or text == "⚠️ change priority": |         elif text == "change priority" or text == "⚠️ change priority": | ||||||
|             player.set_state('eqi', state["extra"]) |             player.set_state('eqi', state["extra"]) | ||||||
|             text = "How important is it?" |             text = "How important is it?" | ||||||
|             custom_keyboard = [["🔹 Low", "🔸 Medium", "🔺 High"]] |             custom_keyboard = button_groups.importance | ||||||
|             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|             bot.send_message(chat_id=player.CHAT_ID, text=text, |             bot.send_message(chat_id=player.CHAT_ID, text=text, | ||||||
|                              reply_markup=reply_markup) |                              reply_markup=reply_markup) | ||||||
|         elif text == "change difficulty" or text == "📚 change difficulty": |         elif text == "change difficulty" or text == "📚 change difficulty": | ||||||
|             player.set_state('eqd', state["extra"]) |             player.set_state('eqd', state["extra"]) | ||||||
|             text = "How difficult is it?" |             text = "How difficult is it?" | ||||||
|             custom_keyboard = [["📙 Low", "📘 Medium", "📗 High"]] |             custom_keyboard = button_groups.difficulty | ||||||
|             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|             bot.send_message(chat_id=player.CHAT_ID, text=text, |             bot.send_message(chat_id=player.CHAT_ID, text=text, | ||||||
|                              reply_markup=reply_markup) |                              reply_markup=reply_markup) | ||||||
| @@ -458,8 +540,9 @@ def message_handling(bot, update, db): | |||||||
|             prefix = f"<b>Quest {quest.name} has been deleted</b>\n\n" |             prefix = f"<b>Quest {quest.name} has been deleted</b>\n\n" | ||||||
|             send_status(bot, update, player, prefix=prefix) |             send_status(bot, update, player, prefix=prefix) | ||||||
|         else: |         else: | ||||||
|             drop_state(bot, update, player) |             if update.message.chat.type == "private": | ||||||
|             send_status(bot, update, player) |                 drop_state(bot, update, player) | ||||||
|  |                 send_status(bot, update, player) | ||||||
|  |  | ||||||
|     elif state["state"] == "esq": |     elif state["state"] == "esq": | ||||||
|         if text == "back" or text == "⬅️ back": |         if text == "back" or text == "⬅️ back": | ||||||
| @@ -476,30 +559,32 @@ def message_handling(bot, update, db): | |||||||
|         elif text == "change priority" or text == "⚠️ change priority": |         elif text == "change priority" or text == "⚠️ change priority": | ||||||
|             player.set_state('esqi', state["extra"]) |             player.set_state('esqi', state["extra"]) | ||||||
|             text = "How important is it?" |             text = "How important is it?" | ||||||
|             custom_keyboard = [["🔹 Low", "🔸 Medium", "🔺 High"]] |             custom_keyboard = button_groups.importance | ||||||
|             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|             bot.send_message(chat_id=player.CHAT_ID, text=text, |             bot.send_message(chat_id=player.CHAT_ID, text=text, | ||||||
|                              reply_markup=reply_markup) |                              reply_markup=reply_markup) | ||||||
|         elif text == "change difficulty" or text == "📚 change difficulty": |         elif text == "change difficulty" or text == "📚 change difficulty": | ||||||
|             player.set_state('esqd', state["extra"]) |             player.set_state('esqd', state["extra"]) | ||||||
|             text = "How difficult is it?" |             text = "How difficult is it?" | ||||||
|             custom_keyboard = [["📙 Low", "📘 Medium", "📗 High"]] |             custom_keyboard = button_groups.difficulty | ||||||
|             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) |             reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard) | ||||||
|             bot.send_message(chat_id=player.CHAT_ID, text=text, |             bot.send_message(chat_id=player.CHAT_ID, text=text, | ||||||
|                              reply_markup=reply_markup) |                              reply_markup=reply_markup) | ||||||
|         elif text == "delete quest" or text == "🗑 delete quest": |         elif text == "delete side quest" or text == "🗑 delete side quest": | ||||||
|             sq = questable.get_side_quest(db, player.CHAT_ID, state["extra"]) |             sq = questable.get_side_quest(db, player.CHAT_ID, state["extra"]) | ||||||
|             sq.delete_from_db() |             sq.delete_from_db() | ||||||
|             drop_state(bot, update, player) |             drop_state(bot, update, player) | ||||||
|             prefix = f"<b>Side Quest {sq.name} has been deleted</b>\n\n" |             prefix = f"<b>Side Quest {sq.name} has been deleted</b>\n\n" | ||||||
|             send_status(bot, update, player, prefix=prefix) |             send_status(bot, update, player, prefix=prefix) | ||||||
|         else: |         else: | ||||||
|             drop_state(bot, update, player) |             if update.message.chat.type == "private": | ||||||
|             send_status(bot, update, player) |                 drop_state(bot, update, player) | ||||||
|  |                 send_status(bot, update, player) | ||||||
|  |  | ||||||
|     elif state["state"] == "bo": |     elif state["state"] == "bo": | ||||||
|         player.set_state('none', 0) |         if text == "back" or update.message.chat.type == "private": | ||||||
|         send_status(bot, update, player) |             player.set_state('none', 0) | ||||||
|  |             send_status(bot, update, player) | ||||||
|  |  | ||||||
|     elif state["state"] == "eqn": |     elif state["state"] == "eqn": | ||||||
|         edit_quest(bot, update, player, state["extra"], "name", "quest") |         edit_quest(bot, update, player, state["extra"], "name", "quest") | ||||||
| @@ -519,9 +604,12 @@ def message_handling(bot, update, db): | |||||||
|     elif state["state"] == "esqd": |     elif state["state"] == "esqd": | ||||||
|         edit_quest(bot, update, player, state["extra"], "diff", "side_quest") |         edit_quest(bot, update, player, state["extra"], "diff", "side_quest") | ||||||
|  |  | ||||||
|  |     elif state["state"] == "rt": | ||||||
|  |         delete_token_rt(bot, update, player) | ||||||
|     else: |     else: | ||||||
|         drop_state(bot, update, player) |         if update.message.chat.type == "private": | ||||||
|         send_status(bot, update, player) |             drop_state(bot, update, player) | ||||||
|  |             send_status(bot, update, player) | ||||||
|  |  | ||||||
|  |  | ||||||
| def sigterm_handler(signal, frame, db): | def sigterm_handler(signal, frame, db): | ||||||
| @@ -529,55 +617,32 @@ def sigterm_handler(signal, frame, db): | |||||||
|     sys.exit(0) |     sys.exit(0) | ||||||
|  |  | ||||||
|  |  | ||||||
| db = sqlite3.connect("questable.db", check_same_thread=False) |  | ||||||
| cursor = db.cursor() |  | ||||||
| signal.signal(signal.SIGTERM, lambda x, y: sigterm_handler(x, y, db)) | signal.signal(signal.SIGTERM, lambda x, y: sigterm_handler(x, y, db)) | ||||||
|  |  | ||||||
| # Set up tables | # Set up database and tables | ||||||
| queries = [ | db = sqlite3.connect("questable.db", check_same_thread=False) | ||||||
|        ("CREATE TABLE IF NOT EXISTS quests(chat_id int NOT NULL, qid int NOT" | cursor = db.cursor() | ||||||
|            " NULL, name varchar(255), difficulty int, importance int, " | with open('schema.sql') as f: | ||||||
|            "state int DEFAULT 0, UNIQUE(chat_id, qid));"), |     cursor.executescript(f.read()) | ||||||
|  |  | ||||||
|        ("CREATE TABLE IF NOT EXISTS side_quests(chat_id int NOT NULL, qid int " |  | ||||||
|            "NOT NULL, name varchar(255), difficulty int, importance int, " |  | ||||||
|            "state int DEFAULT 0, UNIQUE(chat_id, qid));"), |  | ||||||
|  |  | ||||||
|        ("CREATE TABLE IF NOT EXISTS points(chat_id int PRIMARY KEY, points " |  | ||||||
|            "int);"), |  | ||||||
|  |  | ||||||
|        ("CREATE TABLE IF NOT EXISTS state(chat_id int PRIMARY KEY, state " |  | ||||||
|            "varchar(10), extra varchar(10));"), |  | ||||||
|         ] |  | ||||||
| for query in queries: |  | ||||||
|     cursor.execute(query) |  | ||||||
| db.commit() | db.commit() | ||||||
|  |  | ||||||
| updater = Updater(token=config.api_key) | updater = Updater(token=config.api_key) | ||||||
| dispatcher = updater.dispatcher | dispatcher = updater.dispatcher | ||||||
|  |  | ||||||
| start_handler = CommandHandler('start', start) | dispatcher.add_handler(CommandHandler('start', start)) | ||||||
| dispatcher.add_handler(start_handler) | dispatcher.add_handler(CommandHandler('me', lambda x, y: me_handler(x, y, db))) | ||||||
|  | dispatcher.add_handler(CommandHandler('rate', lambda x, y: | ||||||
| me = CommandHandler('me', lambda x, y: me_handler(x, y, db)) |                                       rate_command(x, y, db))) | ||||||
| dispatcher.add_handler(me) | dispatcher.add_handler(CommandHandler('cancel', lambda x, y: me_handler(x, y, | ||||||
|  |                                                                         db))) | ||||||
| cancel = CommandHandler('cancel', lambda x, y: me_handler(x, y, db)) | dispatcher.add_handler(CommandHandler('help', lambda x, y: help_command(x, y, | ||||||
| dispatcher.add_handler(cancel) |                                                                         db))) | ||||||
|  | dispatcher.add_handler(MessageHandler(Filters.text, lambda x, y: | ||||||
| help_h = CommandHandler('help', lambda x, y: help_command(x, y, db)) |                                       message_handling(x, y, db))) | ||||||
| dispatcher.add_handler(help_h) | dispatcher.add_handler(RegexHandler(r"/[Ss]?[Qq]_\d+", lambda x, y: | ||||||
|  |                                     quest_handling(x, y, db))) | ||||||
| handler = MessageHandler(Filters.text, lambda x, y: message_handling(x, y, db)) | dispatcher.add_handler(MessageHandler(Filters.command, lambda x, y: | ||||||
| dispatcher.add_handler(handler) |                                       message_handling(x, y, db))) | ||||||
|  |  | ||||||
| quest_handler = RegexHandler(r"/[Ss]?[Qq]_\d+", lambda x, y: |  | ||||||
|                              quest_handling(x, y, db)) |  | ||||||
| dispatcher.add_handler(quest_handler) |  | ||||||
|  |  | ||||||
| unknown = MessageHandler(Filters.command, lambda x, y: message_handling(x, y, |  | ||||||
|                                                                         db)) |  | ||||||
| dispatcher.add_handler(unknown) |  | ||||||
|  |  | ||||||
| if config.update_method == "polling": | if config.update_method == "polling": | ||||||
|     updater.start_polling() |     updater.start_polling() | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								button_groups.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								button_groups.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | main = [ | ||||||
|  |         ['❇️ Add Quest', '📯 Add Side Quest'], | ||||||
|  |         ['📜 List Quests', '📃 List Side Quests'], | ||||||
|  |         ['🏅 Player Status', '🔑 Tokens'] | ||||||
|  |         ] | ||||||
|  |  | ||||||
|  | importance = [["🔹 Low", "🔸 Medium", "🔺 High"]] | ||||||
|  | difficulty = [["📙 Low", "📘 Medium", "📗 High"]] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def quests(cat): | ||||||
|  |     return [ | ||||||
|  |             ["✅ Mark as done"], | ||||||
|  |             ["📝 Edit Name", "⚠️ Change Priority"], | ||||||
|  |             ["📚 Change Difficulty", "🗑 Delete " + | ||||||
|  |                 {"quest": "Quest", "side_quest": "Side Quest"}[cat]], | ||||||
|  |             ["⬅️ Back"]] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | tokens = [ | ||||||
|  |         ["📋 List tokens"], | ||||||
|  |         ["🔑 Generate token", "🧹 Delete token"] | ||||||
|  |         ] | ||||||
							
								
								
									
										4
									
								
								errors.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								errors.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | _400 = {"error": "insufficient parameters"} | ||||||
|  | _400_bv = {"error": "bad values"} | ||||||
|  | _401 = {"error": "invalid token"} | ||||||
|  | _404 = {"error": "The quest/side quest doesn't exist"} | ||||||
							
								
								
									
										60
									
								
								questable.py
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								questable.py
									
									
									
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
|  | import uuid | ||||||
|  |  | ||||||
|  |  | ||||||
| class base_quest(): | class base_quest(): | ||||||
|     TABLE = None |     TABLE = None | ||||||
|  |  | ||||||
| @@ -41,6 +44,9 @@ class base_quest(): | |||||||
|         cursor.execute(query, (self.CHAT_ID, self.QID)) |         cursor.execute(query, (self.CHAT_ID, self.QID)) | ||||||
|         self.DB.commit() |         self.DB.commit() | ||||||
|  |  | ||||||
|  |     def __str__(self): | ||||||
|  |         return f"{self.QID}: {self.name}" | ||||||
|  |  | ||||||
|  |  | ||||||
| class quest(base_quest): | class quest(base_quest): | ||||||
|     TABLE = "quests" |     TABLE = "quests" | ||||||
| @@ -150,3 +156,57 @@ class player(): | |||||||
|             q = side_quest(self.DB, *row) |             q = side_quest(self.DB, *row) | ||||||
|             quests.append(q) |             quests.append(q) | ||||||
|         return quests |         return quests | ||||||
|  |  | ||||||
|  |     def get_quest(self, qid): | ||||||
|  |         cursor = self.DB.cursor() | ||||||
|  |         query = ('SELECT chat_id, qid, name, importance, difficulty, ' | ||||||
|  |                  'state FROM quests WHERE chat_id = ? AND qid = ?') | ||||||
|  |         cursor.execute(query, (self.CHAT_ID, qid)) | ||||||
|  |         row = cursor.fetchone() | ||||||
|  |         if row is None: | ||||||
|  |             return False | ||||||
|  |         else: | ||||||
|  |             return quest(self.DB, *row) | ||||||
|  |  | ||||||
|  |     def get_side_quest(self, qid): | ||||||
|  |         cursor = self.DB.cursor() | ||||||
|  |         query = ('SELECT chat_id, qid, name, importance, difficulty, ' | ||||||
|  |                  'state FROM side_quests WHERE chat_id = ? AND qid = ?') | ||||||
|  |         cursor.execute(query, (self.CHAT_ID, qid)) | ||||||
|  |         row = cursor.fetchone() | ||||||
|  |         if row is None: | ||||||
|  |             return False | ||||||
|  |         else: | ||||||
|  |             return side_quest(self.DB, *row) | ||||||
|  |  | ||||||
|  |     def get_tokens(self): | ||||||
|  |         cursor = self.DB.cursor() | ||||||
|  |         query = ('SELECT token FROM tokens WHERE chat_id=?') | ||||||
|  |         cursor.execute(query, (self.CHAT_ID,)) | ||||||
|  |         tokens = list(map(lambda x: x[0], cursor)) | ||||||
|  |         return tokens | ||||||
|  |  | ||||||
|  |     def add_token(self): | ||||||
|  |         cursor = self.DB.cursor() | ||||||
|  |         token = str(uuid.uuid4()) | ||||||
|  |         query = ('INSERT INTO tokens(chat_id, token) values(?, ?)') | ||||||
|  |         cursor.execute(query, (self.CHAT_ID, token)) | ||||||
|  |         self.DB.commit() | ||||||
|  |         return token | ||||||
|  |  | ||||||
|  |     def delete_token(self, token): | ||||||
|  |         cursor = self.DB.cursor() | ||||||
|  |         query = ('DELETE FROM tokens WHERE chat_id = ? AND token = ?') | ||||||
|  |         cursor.execute(query, (self.CHAT_ID, token)) | ||||||
|  |         self.DB.commit() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_player_from_token(db, token): | ||||||
|  |     cursor = db.cursor() | ||||||
|  |     query = "SELECT chat_id FROM tokens WHERE token=?" | ||||||
|  |     cursor.execute(query, (token,)) | ||||||
|  |     chat_id = cursor.fetchone() | ||||||
|  |     if chat_id is None: | ||||||
|  |         return False | ||||||
|  |     else: | ||||||
|  |         return player(db, chat_id[0]) | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								schema.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								schema.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | CREATE TABLE IF NOT EXISTS quests(chat_id int NOT NULL, qid int NOT NULL, name varchar(255), difficulty int, importance int, state int DEFAULT 0, UNIQUE(chat_id, qid)); | ||||||
|  | CREATE TABLE IF NOT EXISTS side_quests(chat_id int NOT NULL, qid int NOT NULL, name varchar(255), difficulty int, importance int, state int DEFAULT 0, UNIQUE(chat_id, qid)); | ||||||
|  | CREATE TABLE IF NOT EXISTS points(chat_id int PRIMARY KEY, points int); | ||||||
|  | CREATE TABLE IF NOT EXISTS state(chat_id int PRIMARY KEY, state varchar(10), extra varchar(10)); | ||||||
|  | CREATE TABLE IF NOT EXISTS tokens(chat_id int, token varchar(36) PRIMARY KEY); | ||||||
							
								
								
									
										371
									
								
								server.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										371
									
								
								server.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,371 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  |  | ||||||
|  | import questable | ||||||
|  | import sqlite3 | ||||||
|  | import errors | ||||||
|  | from flask import Flask, jsonify, request, redirect | ||||||
|  |  | ||||||
|  | app = Flask(__name__) | ||||||
|  | db = sqlite3.connect("questable.db", check_same_thread=False) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Returns the player object if valid token | ||||||
|  | def get_player(db): | ||||||
|  |     try: | ||||||
|  |         token = request.values['token'] | ||||||
|  |     except (AttributeError): | ||||||
|  |         return False | ||||||
|  |     except (KeyError): | ||||||
|  |         return False | ||||||
|  |     return questable.get_player_from_token(db, token) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /auth. | ||||||
|  | def auth(db): | ||||||
|  |     if get_player(db) is False: | ||||||
|  |         return jsonify({"success": False}) | ||||||
|  |     else: | ||||||
|  |         return jsonify({"success": True}) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/auth', '/auth', lambda: auth(db), methods=['GET']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /player | ||||||
|  | def player(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     noq = len(player.get_quests(None)) | ||||||
|  |     nosq = len(player.get_side_quests(None)) | ||||||
|  |     return jsonify({ | ||||||
|  |             "xp": player.get_points(), | ||||||
|  |             "quests_completed": noq - len(player.get_quests()), | ||||||
|  |             "total_quests": noq, | ||||||
|  |             "side_quests_completed": nosq - len(player.get_side_quests()), | ||||||
|  |             "total_side_quests": nosq, | ||||||
|  |             }) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/player', '/player', lambda: player(db), methods=['GET']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def dictify_quest(quest): | ||||||
|  |     return { | ||||||
|  |             "id": quest.QID, | ||||||
|  |             "name": quest.name, | ||||||
|  |             "difficulty": quest.diff, | ||||||
|  |             "priority": quest.imp, | ||||||
|  |             "state": [False, True][quest.state] | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /get_quests | ||||||
|  | def get_quests(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     quests = list(map(dictify_quest, player.get_quests())) | ||||||
|  |     return jsonify(quests) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/get_quests', '/get_quests', lambda: get_quests(db), | ||||||
|  |                  methods=['GET']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /get_side_quests | ||||||
|  | def get_side_quests(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     side_quests = list(map(dictify_quest, player.get_side_quests())) | ||||||
|  |     return jsonify(side_quests) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/get_side_quests', '/get_side_quests', | ||||||
|  |                  lambda: get_side_quests(db), methods=['GET']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /get_quest | ||||||
|  | def get_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     try: | ||||||
|  |         qid = request.values['id'] | ||||||
|  |     except(KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |  | ||||||
|  |     quest = player.get_quest(qid) | ||||||
|  |     if quest is False: | ||||||
|  |         return jsonify(errors._404), 404 | ||||||
|  |  | ||||||
|  |     return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/get_quest', '/get_quest', lambda: get_quest(db), | ||||||
|  |                  methods=['GET']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /get_side_quest | ||||||
|  | def get_side_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     try: | ||||||
|  |         qid = request.values['id'] | ||||||
|  |     except(KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |  | ||||||
|  |     side_quest = player.get_side_quest(qid) | ||||||
|  |  | ||||||
|  |     if side_quest is False: | ||||||
|  |         return jsonify(errors._404), 404 | ||||||
|  |  | ||||||
|  |     return jsonify(dictify_quest(side_quest)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/get_side_quest', '/get_side_quest', | ||||||
|  |                  lambda: get_side_quest(db), methods=['GET']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /add_quest | ||||||
|  | def add_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |  | ||||||
|  |     x = player.get_quests(None) | ||||||
|  |     if len(x) == 0: | ||||||
|  |         qid = 1 | ||||||
|  |     else: | ||||||
|  |         x.sort(key=lambda i: i.QID, reverse=True) | ||||||
|  |         qid = x[0].QID + 1 | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         name = request.values['name'] | ||||||
|  |         imp = int(request.values['priority']) | ||||||
|  |         diff = int(request.values['difficulty']) | ||||||
|  |     except (KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |     except (ValueError): | ||||||
|  |         return jsonify(errors._400_bv), 400 | ||||||
|  |  | ||||||
|  |     if imp not in [1, 2, 3] or diff not in [1, 2, 3]: | ||||||
|  |         return jsonify(errors._400_bv), 400 | ||||||
|  |  | ||||||
|  |     quest = questable.add_quest(db, player.CHAT_ID, qid, name, imp, diff, 0) | ||||||
|  |     return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/add_quest', '/add_quest', lambda: add_quest(db), | ||||||
|  |                  methods=['POST']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /add_side_quest | ||||||
|  | def add_side_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |  | ||||||
|  |     x = player.get_side_quests(None) | ||||||
|  |     if len(x) == 0: | ||||||
|  |         qid = 1 | ||||||
|  |     else: | ||||||
|  |         x.sort(key=lambda i: i.QID, reverse=True) | ||||||
|  |         qid = x[0].QID + 1 | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         name = request.values['name'] | ||||||
|  |         imp = int(request.values['priority']) | ||||||
|  |         diff = int(request.values['difficulty']) | ||||||
|  |     except (KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |     except (ValueError): | ||||||
|  |         return jsonify(errors._400_bv), 400 | ||||||
|  |  | ||||||
|  |     if imp not in [1, 2, 3] or diff not in [1, 2, 3]: | ||||||
|  |         return jsonify(errors._400_bv), 400 | ||||||
|  |  | ||||||
|  |     quest = questable.add_side_quest(db, player.CHAT_ID, qid, name, imp, | ||||||
|  |                                      diff, 0) | ||||||
|  |     return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/add_side_quest', '/add_side_quest', | ||||||
|  |                  lambda: add_side_quest(db), methods=['POST']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /update_quest | ||||||
|  | def update_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     try: | ||||||
|  |         qid = request.values['id'] | ||||||
|  |     except(KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |  | ||||||
|  |     available_keys = [i for i in ['name', 'difficulty', 'priority', 'state'] | ||||||
|  |                       if i in request.values.keys()] | ||||||
|  |     if len(available_keys) == 0: | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |     quest = questable.get_quest(db, player.CHAT_ID, qid) | ||||||
|  |  | ||||||
|  |     if quest is False: | ||||||
|  |         return jsonify(errors._404), 404 | ||||||
|  |  | ||||||
|  |     if quest.state == 1: | ||||||
|  |         return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |     for i in available_keys: | ||||||
|  |         try: | ||||||
|  |             if i == "name": | ||||||
|  |                 quest.name = request.values["name"] | ||||||
|  |             elif i == "difficulty": | ||||||
|  |                 diff = int(request.values["difficulty"]) | ||||||
|  |                 if diff in [1, 2, 3]: | ||||||
|  |                     quest.diff = diff | ||||||
|  |                 else: | ||||||
|  |                     return jsonify(errors._400_bv), 400 | ||||||
|  |             elif i == "priority": | ||||||
|  |                 imp = int(request.values["priority"]) | ||||||
|  |                 if imp in [1, 2, 3]: | ||||||
|  |                     quest.imp = imp | ||||||
|  |                 else: | ||||||
|  |                     return jsonify(errors._400_bv), 400 | ||||||
|  |             elif i == "state": | ||||||
|  |                 state = bool(request.values["state"]) | ||||||
|  |                 if state is True: | ||||||
|  |                     quest.state = 1 | ||||||
|  |                 else: | ||||||
|  |                     return jsonify(errors._400_bv), 400 | ||||||
|  |         except (ValueError): | ||||||
|  |             return jsonify(errors._400_bv), 400 | ||||||
|  |  | ||||||
|  |     if quest.state == 1: | ||||||
|  |         points = 55 + 10*quest.imp + 15*quest.diff | ||||||
|  |         player.add_points(points) | ||||||
|  |  | ||||||
|  |     quest.update_db() | ||||||
|  |     return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/update_quest', '/update_quest', lambda: update_quest(db), | ||||||
|  |                  methods=['POST']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /update_side_quest | ||||||
|  | def update_side_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     try: | ||||||
|  |         qid = request.values['id'] | ||||||
|  |     except(KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |  | ||||||
|  |     available_keys = [i for i in ['name', 'difficulty', 'priority', 'state'] | ||||||
|  |                       if i in request.values.keys()] | ||||||
|  |     if len(available_keys) == 0: | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |     quest = questable.get_side_quest(db, player.CHAT_ID, qid) | ||||||
|  |  | ||||||
|  |     if quest is False: | ||||||
|  |         return jsonify(errors._404), 404 | ||||||
|  |  | ||||||
|  |     if quest.state == 1: | ||||||
|  |         return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |     for i in available_keys: | ||||||
|  |         try: | ||||||
|  |             if i == "name": | ||||||
|  |                 quest.name = request.values["name"] | ||||||
|  |             elif i == "difficulty": | ||||||
|  |                 diff = int(request.values["difficulty"]) | ||||||
|  |                 if diff in [1, 2, 3]: | ||||||
|  |                     quest.diff = diff | ||||||
|  |                 else: | ||||||
|  |                     return jsonify(errors._400_bv), 400 | ||||||
|  |             elif i == "priority": | ||||||
|  |                 imp = int(request.values["priority"]) | ||||||
|  |                 if imp in [1, 2, 3]: | ||||||
|  |                     quest.imp = imp | ||||||
|  |                 else: | ||||||
|  |                     return jsonify(errors._400_bv), 400 | ||||||
|  |             elif i == "state": | ||||||
|  |                 state = bool(request.values["state"]) | ||||||
|  |                 if state is True: | ||||||
|  |                     quest.state = 1 | ||||||
|  |                 else: | ||||||
|  |                     return jsonify(errors._400_bv), 400 | ||||||
|  |         except (ValueError): | ||||||
|  |             return jsonify(errors._400_bv), 400 | ||||||
|  |  | ||||||
|  |     if quest.state == 1: | ||||||
|  |         points = 10*quest.imp + 15*quest.diff | ||||||
|  |         player.add_points(points) | ||||||
|  |  | ||||||
|  |     quest.update_db() | ||||||
|  |     return jsonify(dictify_quest(quest)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/update_side_quest', '/update_side_quest', | ||||||
|  |                  lambda: update_side_quest(db), methods=['POST']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /delete_quest | ||||||
|  | def delete_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     try: | ||||||
|  |         qid = request.values['id'] | ||||||
|  |     except(KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         quest = questable.get_quest(db, player.CHAT_ID, qid) | ||||||
|  |     except Exception: | ||||||
|  |         return jsonify(errors._404), 404 | ||||||
|  |  | ||||||
|  |     if quest.state == 1: | ||||||
|  |         return jsonify({"success": False}) | ||||||
|  |  | ||||||
|  |     quest.delete_from_db() | ||||||
|  |     return jsonify({"success": True}) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/delete_quest', '/delete_quest', | ||||||
|  |                  lambda: delete_quest(db), methods=['DELETE']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # /delete_side_quest | ||||||
|  | def delete_side_quest(db): | ||||||
|  |     player = get_player(db) | ||||||
|  |     if player is False: | ||||||
|  |         return jsonify(errors._401), 401 | ||||||
|  |     try: | ||||||
|  |         qid = request.values['id'] | ||||||
|  |     except(KeyError): | ||||||
|  |         return jsonify(errors._400), 400 | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         side_quest = questable.get_side_quest(db, player.CHAT_ID, qid) | ||||||
|  |     except Exception: | ||||||
|  |         return jsonify(errors._404), 404 | ||||||
|  |  | ||||||
|  |     if side_quest.state == 1: | ||||||
|  |         return jsonify({"success": False}) | ||||||
|  |  | ||||||
|  |     side_quest.delete_from_db() | ||||||
|  |     return jsonify({"success": True}) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.add_url_rule('/delete_side_quest', '/delete_side_quest', | ||||||
|  |                  lambda: delete_side_quest(db), methods=['DELETE']) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @app.route('/') | ||||||
|  | def redirect_to_docs(): | ||||||
|  |     return redirect("https://questable.webionite.com/api", code=301) | ||||||
		Reference in New Issue
	
	Block a user