From 156272b88c4752bfc5b4a5c736d5a4ad4b044ec0 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 08:24:30 -0500 Subject: [PATCH 01/28] Begin separating ToDo functions from __main__ --- executive-function-bot.py | 79 ++++++++++++++++++++++++++++++++ todobot.py => feeling-tracker.py | 0 todo_list.py | 6 +++ 3 files changed, 85 insertions(+) create mode 100644 executive-function-bot.py rename todobot.py => feeling-tracker.py (100%) create mode 100644 todo_list.py diff --git a/executive-function-bot.py b/executive-function-bot.py new file mode 100644 index 0000000..dfd3f49 --- /dev/null +++ b/executive-function-bot.py @@ -0,0 +1,79 @@ +import time +import json +import requests +import urllib + +from CREDENTIALS import * +from dbhelper import DBHelper +import todo_list as todo + +db = DBHelper() +URL = "https://api.telegram.org/bot{}/".format(TOKEN) + +def get_url(url): + response = requests.get(url) + content = response.content.decode("utf8") + return content + +def get_json_from_url(url): + content = get_url(url) + js = json.loads(content) + return js + +def get_updates(offset=None): + url = URL + "getUpdates?timeout=100" + if offset: + url += "&offset={}".format(offset) + js = get_json_from_url(url) + return js + +def get_last_update_id(updates): + update_ids = [] + for update in updates["result"]: + update_ids.append(int(update["update_id"])) + return max(update_ids) + +def send_message(text, chat_id, reply_markup=None): + text = urllib.quote_plus(text) + url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id) + if reply_markup: + url += "&reply_markup={}".format(reply_markup) + get_url(url) + +# Break this up and Abstract pieces of it to To Do class +def handle_updates(updates): + for update in updates["result"]: + text = update["message"]["text"] + chat = update["message"]["chat"]["id"] + items = db.get_items(chat) + if text == "/done": + keyboard = todo.build_keyboard(items) + send_message("Select an item to mark complete", chat, keyboard) + elif text == "/start": + send_message("Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. Tell me things that you want to do and use /done to mark them complete", chat) + elif text.startswith("/"): + continue + elif text in items: + db.delete_item(text, chat) + items = db.get_items(chat) + message = "\n".join(items) + send_message(message, chat) + else: + db.add_item(text, chat) + items = db.get_items(chat) + message = "\n".join(items) + send_message(message, chat) + +def main(): + db.setup() + last_update_id = None + while True: + updates = get_updates(last_update_id) + if len(updates["result"]) > 0: + last_update_id = get_last_update_id(updates) + 1 + handle_updates(updates) + time.sleep(0.5) + +if __name__ == '__main__': + main() +send_message(text, chat) diff --git a/todobot.py b/feeling-tracker.py similarity index 100% rename from todobot.py rename to feeling-tracker.py diff --git a/todo_list.py b/todo_list.py new file mode 100644 index 0000000..f94cab8 --- /dev/null +++ b/todo_list.py @@ -0,0 +1,6 @@ +import json + +def build_keyboard(items): + keyboard = [[item] for item in items] + reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} + return json.dumps(reply_markup) From 192097fdd94aa2ab958e80f78af59bbc39be614b Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 08:32:05 -0500 Subject: [PATCH 02/28] Rearranged update handling --- executive-function-bot.py | 10 +++-- feeling-tracker.py | 82 --------------------------------------- feeling_tracker.py | 0 3 files changed, 7 insertions(+), 85 deletions(-) delete mode 100644 feeling-tracker.py create mode 100644 feeling_tracker.py diff --git a/executive-function-bot.py b/executive-function-bot.py index dfd3f49..cc7267c 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -46,11 +46,15 @@ def handle_updates(updates): text = update["message"]["text"] chat = update["message"]["chat"]["id"] items = db.get_items(chat) - if text == "/done": + if text == "/start": + start_message = """Welcome to the Executive Function Bot. I'm here to + help you get things done. For now, I operate as a traditional To Do list. + Tell me things that you want to do and use /done to mark them complete. + """ + send_message(start_message, chat) + elif text == "/done": keyboard = todo.build_keyboard(items) send_message("Select an item to mark complete", chat, keyboard) - elif text == "/start": - send_message("Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. Tell me things that you want to do and use /done to mark them complete", chat) elif text.startswith("/"): continue elif text in items: diff --git a/feeling-tracker.py b/feeling-tracker.py deleted file mode 100644 index fac6461..0000000 --- a/feeling-tracker.py +++ /dev/null @@ -1,82 +0,0 @@ -import time -import json -import requests -import urllib - -from CREDENTIALS import * -from dbhelper import DBHelper - -db = DBHelper() -URL = "https://api.telegram.org/bot{}/".format(TOKEN) - -def get_url(url): - response = requests.get(url) - content = response.content.decode("utf8") - return content - -def get_json_from_url(url): - content = get_url(url) - js = json.loads(content) - return js - -def get_updates(offset=None): - url = URL + "getUpdates?timeout=100" - if offset: - url += "&offset={}".format(offset) - js = get_json_from_url(url) - return js - -def get_last_update_id(updates): - update_ids = [] - for update in updates["result"]: - update_ids.append(int(update["update_id"])) - return max(update_ids) - -def build_keyboard(items): - keyboard = [[item] for item in items] - reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} - return json.dumps(reply_markup) - -def send_message(text, chat_id, reply_markup=None): - text = urllib.quote_plus(text) - url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id) - if reply_markup: - url += "&reply_markup={}".format(reply_markup) - get_url(url) - -def handle_updates(updates): - for update in updates["result"]: - text = update["message"]["text"] - chat = update["message"]["chat"]["id"] - items = db.get_items(chat) - if text == "/done": - keyboard = build_keyboard(items) - send_message("Select an item to mark complete", chat, keyboard) - elif text == "/start": - send_message("Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. Tell me things that you want to do and use /done to mark them complete", chat) - elif text.startswith("/"): - continue - elif text in items: - db.delete_item(text, chat) - items = db.get_items(chat) - message = "\n".join(items) - send_message(message, chat) - else: - db.add_item(text, chat) - items = db.get_items(chat) - message = "\n".join(items) - send_message(message, chat) - -def main(): - db.setup() - last_update_id = None - while True: - updates = get_updates(last_update_id) - if len(updates["result"]) > 0: - last_update_id = get_last_update_id(updates) + 1 - handle_updates(updates) - time.sleep(0.5) - -if __name__ == '__main__': - main() -send_message(text, chat) diff --git a/feeling_tracker.py b/feeling_tracker.py new file mode 100644 index 0000000..e69de29 From 46b164a866dc44ade2f20142f5f32a318c486b80 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 09:05:23 -0500 Subject: [PATCH 03/28] Abstract out `get_item_list` function --- executive-function-bot.py | 15 ++++++++------- todo_list.py | 8 ++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index cc7267c..3b91b48 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -52,21 +52,22 @@ def handle_updates(updates): Tell me things that you want to do and use /done to mark them complete. """ send_message(start_message, chat) - elif text == "/done": + elif text == "/addtodo": + send_message("What do you need to do?", chat) + # START TODOADD LISTENER + elif text == "/finishtodo": keyboard = todo.build_keyboard(items) send_message("Select an item to mark complete", chat, keyboard) + # START TODOREMOVE LISTENER elif text.startswith("/"): continue + # Remove Items by chat elif text in items: db.delete_item(text, chat) - items = db.get_items(chat) - message = "\n".join(items) - send_message(message, chat) + send_message(todo.get_item_list(chat), chat) else: db.add_item(text, chat) - items = db.get_items(chat) - message = "\n".join(items) - send_message(message, chat) + send_message(todo.get_item_list(chat), chat) def main(): db.setup() diff --git a/todo_list.py b/todo_list.py index f94cab8..dd523fd 100644 --- a/todo_list.py +++ b/todo_list.py @@ -1,6 +1,14 @@ import json +from dbhelper import DBHelper + +db = DBHelper() + def build_keyboard(items): keyboard = [[item] for item in items] reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} return json.dumps(reply_markup) + +def get_item_list(owner): + items = db.get_items(owner) + return "\n".join(items) From cdfd22f89083934f5135027c3803375f230a0aa8 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 10:09:41 -0500 Subject: [PATCH 04/28] Add listener --- executive-function-bot.py | 24 ++++++++++++++---------- todo_list.py | 6 ++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index 3b91b48..1c79556 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -40,12 +40,12 @@ def send_message(text, chat_id, reply_markup=None): url += "&reply_markup={}".format(reply_markup) get_url(url) -# Break this up and Abstract pieces of it to To Do class -def handle_updates(updates): +def handle_updates(updates, listener): for update in updates["result"]: text = update["message"]["text"] chat = update["message"]["chat"]["id"] items = db.get_items(chat) + print listener if text == "/start": start_message = """Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. @@ -54,29 +54,33 @@ def handle_updates(updates): send_message(start_message, chat) elif text == "/addtodo": send_message("What do you need to do?", chat) - # START TODOADD LISTENER + return "addtodo" elif text == "/finishtodo": keyboard = todo.build_keyboard(items) send_message("Select an item to mark complete", chat, keyboard) - # START TODOREMOVE LISTENER + return "removetodo" + elif text == "end": + return None elif text.startswith("/"): continue - # Remove Items by chat - elif text in items: - db.delete_item(text, chat) + elif text in items and listener == "removetodo": + todo.remove_item_from_list(text, chat) send_message(todo.get_item_list(chat), chat) - else: - db.add_item(text, chat) + elif listener == "addtodo": + todo.add_item_to_list(text, chat) send_message(todo.get_item_list(chat), chat) + else: + continue def main(): db.setup() last_update_id = None + listener = None while True: updates = get_updates(last_update_id) if len(updates["result"]) > 0: last_update_id = get_last_update_id(updates) + 1 - handle_updates(updates) + listener = handle_updates(updates, listener) time.sleep(0.5) if __name__ == '__main__': diff --git a/todo_list.py b/todo_list.py index dd523fd..11a9afd 100644 --- a/todo_list.py +++ b/todo_list.py @@ -12,3 +12,9 @@ def build_keyboard(items): def get_item_list(owner): items = db.get_items(owner) return "\n".join(items) + +def add_item_to_list(item, owner): + db.add_item(item, owner) + +def remove_item_from_list(item, owner): + db.delete_item(item, owner) From 58b2f10bffc7ff3a09535750cf3411c6ebf0193a Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 11:08:22 -0500 Subject: [PATCH 05/28] Set up basic config prompts --- executive-function-bot.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index 1c79556..de0843a 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -59,16 +59,25 @@ def handle_updates(updates, listener): keyboard = todo.build_keyboard(items) send_message("Select an item to mark complete", chat, keyboard) return "removetodo" - elif text == "end": - return None - elif text.startswith("/"): - continue elif text in items and listener == "removetodo": todo.remove_item_from_list(text, chat) send_message(todo.get_item_list(chat), chat) elif listener == "addtodo": todo.add_item_to_list(text, chat) send_message(todo.get_item_list(chat), chat) + elif text == "/starttrackingfeelings": + send_message("Feeling Tracking Enabled", chat) + send_message("How often would you like to talk about your feelings?", chat) + return "configfeelingtrackingfrequency" + elif listener == "configfeelingtrackingfrequency": + send_message("Do you have a preference of when you want to talk about your feelings?", chat) + return "configfeelingtrackingtime" + elif listener == "configfeelingtrackingtime": + send_message("Thanks for letting me know!", chat) + elif text == "end": + return None + elif text.startswith("/"): + continue else: continue From c6a14af97575f045715b99fe89d0f49dc2164cbc Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 13:13:17 -0500 Subject: [PATCH 06/28] Add basic schedule handler --- executive-function-bot.py | 4 +++- feeling_tracker.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index de0843a..f41896f 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -1,11 +1,13 @@ import time import json import requests +import schedule import urllib from CREDENTIALS import * from dbhelper import DBHelper import todo_list as todo +import feeling_tracker as ft db = DBHelper() URL = "https://api.telegram.org/bot{}/".format(TOKEN) @@ -45,7 +47,6 @@ def handle_updates(updates, listener): text = update["message"]["text"] chat = update["message"]["chat"]["id"] items = db.get_items(chat) - print listener if text == "/start": start_message = """Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. @@ -90,6 +91,7 @@ def main(): if len(updates["result"]) > 0: last_update_id = get_last_update_id(updates) + 1 listener = handle_updates(updates, listener) + schedule.run_pending() time.sleep(0.5) if __name__ == '__main__': diff --git a/feeling_tracker.py b/feeling_tracker.py index e69de29..3b2dc32 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -0,0 +1,2 @@ +import datetime +import schedule From 7302bc402fd61023e5cda72c932b9be69dcba4e5 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 13:20:09 -0500 Subject: [PATCH 07/28] Outlining the next sections --- executive-function-bot.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/executive-function-bot.py b/executive-function-bot.py index f41896f..b48812f 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -69,11 +69,15 @@ def handle_updates(updates, listener): elif text == "/starttrackingfeelings": send_message("Feeling Tracking Enabled", chat) send_message("How often would you like to talk about your feelings?", chat) + # Send keyboard here "Daily", "A few times a day", "Hourly" return "configfeelingtrackingfrequency" elif listener == "configfeelingtrackingfrequency": + # Record frequency response in database send_message("Do you have a preference of when you want to talk about your feelings?", chat) + # Send keyboard here "Morning", "Afternoon", "Evening", "Throughout the day" return "configfeelingtrackingtime" elif listener == "configfeelingtrackingtime": + # Record time preference in database send_message("Thanks for letting me know!", chat) elif text == "end": return None From 2ec8f5b4469e9ff33a50f5c040b7064b4fb1dd02 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 16:56:58 -0500 Subject: [PATCH 08/28] Move keyboard function back into main file --- executive-function-bot.py | 11 ++++++++--- todo_list.py | 5 ----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index b48812f..d9a3628 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -42,11 +42,16 @@ def send_message(text, chat_id, reply_markup=None): url += "&reply_markup={}".format(reply_markup) get_url(url) +def build_keyboard(items): + keyboard = [[item] for item in items] + reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} + return json.dumps(reply_markup) + def handle_updates(updates, listener): for update in updates["result"]: text = update["message"]["text"] chat = update["message"]["chat"]["id"] - items = db.get_items(chat) + todoitems = db.get_items(chat) if text == "/start": start_message = """Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. @@ -57,10 +62,10 @@ def handle_updates(updates, listener): send_message("What do you need to do?", chat) return "addtodo" elif text == "/finishtodo": - keyboard = todo.build_keyboard(items) + keyboard = build_keyboard(todoitems) send_message("Select an item to mark complete", chat, keyboard) return "removetodo" - elif text in items and listener == "removetodo": + elif text in todoitems and listener == "removetodo": todo.remove_item_from_list(text, chat) send_message(todo.get_item_list(chat), chat) elif listener == "addtodo": diff --git a/todo_list.py b/todo_list.py index 11a9afd..80d9188 100644 --- a/todo_list.py +++ b/todo_list.py @@ -4,11 +4,6 @@ db = DBHelper() -def build_keyboard(items): - keyboard = [[item] for item in items] - reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} - return json.dumps(reply_markup) - def get_item_list(owner): items = db.get_items(owner) return "\n".join(items) From dbe603ed217efc031604b42e9d7a37612411c666 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 19:55:59 -0500 Subject: [PATCH 09/28] Add keyboards for config responses --- executive-function-bot.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index d9a3628..ac2c9d9 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -73,13 +73,15 @@ def handle_updates(updates, listener): send_message(todo.get_item_list(chat), chat) elif text == "/starttrackingfeelings": send_message("Feeling Tracking Enabled", chat) - send_message("How often would you like to talk about your feelings?", chat) - # Send keyboard here "Daily", "A few times a day", "Hourly" + options = ["Daily", "A few times a day", "Hourly"] + keyboard = build_keyboard(options) + send_message("How often would you like to talk about your feelings?", chat, keyboard) return "configfeelingtrackingfrequency" elif listener == "configfeelingtrackingfrequency": # Record frequency response in database - send_message("Do you have a preference of when you want to talk about your feelings?", chat) - # Send keyboard here "Morning", "Afternoon", "Evening", "Throughout the day" + options = ["Morning", "Afternoon", "Evening", "Throughout the day"] + keyboard = build_keyboard(options) + send_message("Do you have a preference of when you want to talk about your feelings?", chat, keyboard) return "configfeelingtrackingtime" elif listener == "configfeelingtrackingtime": # Record time preference in database From 192112446f40a61691683973952004abad3c04c7 Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 20:25:44 -0500 Subject: [PATCH 10/28] First attempt at creating database tables for FT --- dbhelper.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/dbhelper.py b/dbhelper.py index ffaf3b3..fdf709d 100644 --- a/dbhelper.py +++ b/dbhelper.py @@ -1,17 +1,20 @@ import sqlite3 class DBHelper: - def __init__(self, dbname="todo.sqlite"): + def __init__(self, dbname="efb.sqlite"): self.dbname = dbname self.conn = sqlite3.connect(dbname) def setup(self): - tblstmt = "CREATE TABLE IF NOT EXISTS items (description text, owner text)" - itemidx = "CREATE INDEX IF NOT EXISTS itemIndex ON items (description ASC)" - ownidx = "CREATE INDEX IF NOT EXISTS ownIndex ON items (owner ASC)" - self.conn.execute(tblstmt) - self.conn.execute(itemidx) - self.conn.execute(ownidx) + create_item_table = "CREATE TABLE IF NOT EXISTS items (description text, owner text)" + create_item_index = "CREATE INDEX IF NOT EXISTS itemIndex ON items (description ASC)" + create_owner_index = "CREATE INDEX IF NOT EXISTS ownIndex ON items (owner ASC)" + create_feelings_table = "CREATE TABLE IF NOT EXISTS feelings (created_at datetime, owner text, rating integer, description text)" + creat_feelings_config = "CREATE TABLE IF NOT EXISTS feelingsConfig (owner text, frequency text, time_pref text)" + self.conn.execute(create_item_table) + self.conn.execute(create_item_index) + self.conn.execute(create_owner_index) + self.conn.execute(create_feelings_table) self.conn.commit() def add_item(self, item_text, owner): @@ -30,3 +33,18 @@ def get_items(self, owner): stmt = "SELECT description FROM items WHERE owner = (?)" args = (owner, ) return [x[0] for x in self.conn.execute(stmt, args)] + + def add_feeling_report(self, created_at, owner, rating, description=None): + stmt = "INSERT INTO feelings (created_at, owner, rating, description) VALUES (?, ?, ?, ?)" + args = (created_at, owner, rating, description) + self.conn.execute(stmt, args) + self.conn.commit() + + def get_feeling_report(self, owner): + stmt = "SELECT rating FROM feelings WHERE owner = (?)" + + def set_feelings_config(self, owner, frequency, time_pref): + stmt = "INSERT INTO feelingsConfig (owner, frequency, time_pref) VALUES (?, ?)" + args = (owner, frequency, time_pref) + self.conn.execute(stmt, args) + self.conn.commit() From 238b5881b5975c736cbc57e3f3257a211d9e442e Mon Sep 17 00:00:00 2001 From: Pat East Date: Tue, 3 Apr 2018 21:28:38 -0500 Subject: [PATCH 11/28] Add basic functions for FT config settings --- dbhelper.py | 20 ++++++++++++++++---- executive-function-bot.py | 6 ++++-- feeling_tracker.py | 13 +++++++++++++ todo_list.py | 2 -- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/dbhelper.py b/dbhelper.py index fdf709d..bf64326 100644 --- a/dbhelper.py +++ b/dbhelper.py @@ -10,11 +10,12 @@ def setup(self): create_item_index = "CREATE INDEX IF NOT EXISTS itemIndex ON items (description ASC)" create_owner_index = "CREATE INDEX IF NOT EXISTS ownIndex ON items (owner ASC)" create_feelings_table = "CREATE TABLE IF NOT EXISTS feelings (created_at datetime, owner text, rating integer, description text)" - creat_feelings_config = "CREATE TABLE IF NOT EXISTS feelingsConfig (owner text, frequency text, time_pref text)" + create_feelings_config = "CREATE TABLE IF NOT EXISTS feelingsConfig (owner text PRIMARY KEY, frequency text, time_pref text)" self.conn.execute(create_item_table) self.conn.execute(create_item_index) self.conn.execute(create_owner_index) self.conn.execute(create_feelings_table) + self.conn.execute(create_feelings_config) self.conn.commit() def add_item(self, item_text, owner): @@ -43,8 +44,19 @@ def add_feeling_report(self, created_at, owner, rating, description=None): def get_feeling_report(self, owner): stmt = "SELECT rating FROM feelings WHERE owner = (?)" - def set_feelings_config(self, owner, frequency, time_pref): - stmt = "INSERT INTO feelingsConfig (owner, frequency, time_pref) VALUES (?, ?)" - args = (owner, frequency, time_pref) + def set_feelings_config_frequency(self, owner, frequency): + stmt = "INSERT OR REPLACE INTO feelingsConfig (owner, frequency) VALUES (?, ?)" + args = (owner, frequency) self.conn.execute(stmt, args) self.conn.commit() + + def set_feelings_config_time_pref(self, owner, time_pref): + stmt = "UPDATE feelingsConfig SET time_pref = (?) WHERE owner = (?)" + args = (time_pref, owner) + self.conn.execute(stmt, args) + self.conn.commit() + + def get_feelings_config(self, owner): + stmt = "SELECT frequency FROM feelingsConfig WHERE owner = (?)" + args = (owner, ) + return [x[0] for x in self.conn.execute(stmt, args)] diff --git a/executive-function-bot.py b/executive-function-bot.py index ac2c9d9..cfe2de0 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -78,14 +78,16 @@ def handle_updates(updates, listener): send_message("How often would you like to talk about your feelings?", chat, keyboard) return "configfeelingtrackingfrequency" elif listener == "configfeelingtrackingfrequency": - # Record frequency response in database + ft.set_frequency(chat, text) options = ["Morning", "Afternoon", "Evening", "Throughout the day"] keyboard = build_keyboard(options) send_message("Do you have a preference of when you want to talk about your feelings?", chat, keyboard) return "configfeelingtrackingtime" elif listener == "configfeelingtrackingtime": - # Record time preference in database + ft.set_time_pref(chat, text) send_message("Thanks for letting me know!", chat) + elif text == "/debug": + ft.debug(chat) elif text == "end": return None elif text.startswith("/"): diff --git a/feeling_tracker.py b/feeling_tracker.py index 3b2dc32..808e3b0 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -1,2 +1,15 @@ import datetime import schedule + +from dbhelper import DBHelper + +db = DBHelper() + +def set_frequency(owner, frequency): + db.set_feelings_config_frequency(owner, frequency) + +def set_time_pref(owner, time_pref): + db.set_feelings_config_time_pref(owner, time_pref) + +def debug(owner): + print db.get_feelings_config(owner) diff --git a/todo_list.py b/todo_list.py index 80d9188..dee6dfa 100644 --- a/todo_list.py +++ b/todo_list.py @@ -1,5 +1,3 @@ -import json - from dbhelper import DBHelper db = DBHelper() From 9fa08c8c93e691eb57144d7fc97956a95ea74f90 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 09:20:07 -0500 Subject: [PATCH 12/28] Refactor away from huge function --- dbhelper.py | 4 +-- executive-function-bot.py | 52 ++++++++++++++++++++++----------------- feeling_tracker.py | 4 ++- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/dbhelper.py b/dbhelper.py index bf64326..2ecbd02 100644 --- a/dbhelper.py +++ b/dbhelper.py @@ -57,6 +57,6 @@ def set_feelings_config_time_pref(self, owner, time_pref): self.conn.commit() def get_feelings_config(self, owner): - stmt = "SELECT frequency FROM feelingsConfig WHERE owner = (?)" + stmt = "SELECT frequency, time_pref FROM feelingsConfig WHERE owner = (?)" args = (owner, ) - return [x[0] for x in self.conn.execute(stmt, args)] + return [x for x in self.conn.execute(stmt, args)] diff --git a/executive-function-bot.py b/executive-function-bot.py index cfe2de0..6804a6b 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -47,36 +47,46 @@ def build_keyboard(items): reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} return json.dumps(reply_markup) +def command_handler(text, chat_id): + todoitems = db.get_items(chat_id) + if text == "/start": + start_message = """Welcome to the Executive Function Bot. I'm here to + help you get things done. For now, I operate as a traditional To Do list. + Tell me things that you want to do and use /done to mark them complete. + """ + send_message(start_message, chat_id) + elif text == "/addtodo": + send_message("What do you need to do?", chat_id) + return "addtodo" + elif text == "/finishtodo": + keyboard = build_keyboard(todoitems) + send_message("Select an item to mark complete", chat_id, keyboard) + return "removetodo" + elif text == "/starttrackingfeelings": + send_message("Feeling Tracking Enabled", chat_id) + options = ["Daily", "A few times a day", "Hourly"] + keyboard = build_keyboard(options) + send_message("How often would you like to talk about your feelings?", chat_id, keyboard) + return "configfeelingtrackingfrequency" + elif text == "/debug": + ft.debug(chat_id) + else: + send_message("I'm sorry, I don't know that command. Use /help for a list of commands.", chat_id) + def handle_updates(updates, listener): for update in updates["result"]: text = update["message"]["text"] chat = update["message"]["chat"]["id"] todoitems = db.get_items(chat) - if text == "/start": - start_message = """Welcome to the Executive Function Bot. I'm here to - help you get things done. For now, I operate as a traditional To Do list. - Tell me things that you want to do and use /done to mark them complete. - """ - send_message(start_message, chat) - elif text == "/addtodo": - send_message("What do you need to do?", chat) - return "addtodo" - elif text == "/finishtodo": - keyboard = build_keyboard(todoitems) - send_message("Select an item to mark complete", chat, keyboard) - return "removetodo" + + if text.startswith("/"): + return command_handler(text, chat) elif text in todoitems and listener == "removetodo": todo.remove_item_from_list(text, chat) send_message(todo.get_item_list(chat), chat) elif listener == "addtodo": todo.add_item_to_list(text, chat) send_message(todo.get_item_list(chat), chat) - elif text == "/starttrackingfeelings": - send_message("Feeling Tracking Enabled", chat) - options = ["Daily", "A few times a day", "Hourly"] - keyboard = build_keyboard(options) - send_message("How often would you like to talk about your feelings?", chat, keyboard) - return "configfeelingtrackingfrequency" elif listener == "configfeelingtrackingfrequency": ft.set_frequency(chat, text) options = ["Morning", "Afternoon", "Evening", "Throughout the day"] @@ -86,12 +96,8 @@ def handle_updates(updates, listener): elif listener == "configfeelingtrackingtime": ft.set_time_pref(chat, text) send_message("Thanks for letting me know!", chat) - elif text == "/debug": - ft.debug(chat) elif text == "end": return None - elif text.startswith("/"): - continue else: continue diff --git a/feeling_tracker.py b/feeling_tracker.py index 808e3b0..f8820cb 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -12,4 +12,6 @@ def set_time_pref(owner, time_pref): db.set_feelings_config_time_pref(owner, time_pref) def debug(owner): - print db.get_feelings_config(owner) + config = db.get_feelings_config(owner) + for setting in config[0]: + print setting From 8f4e63ac8145a87cca3053f23d72dfd3a0df3cb1 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 10:11:07 -0500 Subject: [PATCH 13/28] Build listener handler --- executive-function-bot.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index 6804a6b..8f22f50 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -73,29 +73,35 @@ def command_handler(text, chat_id): else: send_message("I'm sorry, I don't know that command. Use /help for a list of commands.", chat_id) +def listener_handler(listener, text, chat_id): + if listener == "removetodo": + todo.remove_item_from_list(text, chat_id) + send_message(todo.get_item_list(chat), chat_id) + elif listener == "addtodo": + todo.add_item_to_list(text, chat) + send_message(todo.get_item_list(chat), chat) + elif listener == "configfeelingtrackingfrequency": + ft.set_frequency(chat, text) + options = ["Morning", "Afternoon", "Evening", "Throughout the day"] + keyboard = build_keyboard(options) + send_message("Do you have a preference of when you want to talk about your feelings?", chat, keyboard) + return "configfeelingtrackingtime" + elif listener == "configfeelingtrackingtime": + ft.set_time_pref(chat, text) + send_message("Thanks for letting me know!", chat) + else: + print listener + continue + def handle_updates(updates, listener): for update in updates["result"]: text = update["message"]["text"] chat = update["message"]["chat"]["id"] - todoitems = db.get_items(chat) if text.startswith("/"): return command_handler(text, chat) - elif text in todoitems and listener == "removetodo": - todo.remove_item_from_list(text, chat) - send_message(todo.get_item_list(chat), chat) - elif listener == "addtodo": - todo.add_item_to_list(text, chat) - send_message(todo.get_item_list(chat), chat) - elif listener == "configfeelingtrackingfrequency": - ft.set_frequency(chat, text) - options = ["Morning", "Afternoon", "Evening", "Throughout the day"] - keyboard = build_keyboard(options) - send_message("Do you have a preference of when you want to talk about your feelings?", chat, keyboard) - return "configfeelingtrackingtime" - elif listener == "configfeelingtrackingtime": - ft.set_time_pref(chat, text) - send_message("Thanks for letting me know!", chat) + elif listener is not None: + return listener_handler(listener, text, chat) elif text == "end": return None else: From 5e4ae4e4161b7233230d26b11754538e260f8f9d Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 14:43:05 -0500 Subject: [PATCH 14/28] Move many chat functions to separate helper --- chat_helper.py | 37 ++++++++++++++++++ executive-function-bot.py | 80 ++++++++++----------------------------- todo_list.py | 20 ++++++++++ 3 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 chat_helper.py diff --git a/chat_helper.py b/chat_helper.py new file mode 100644 index 0000000..9027a97 --- /dev/null +++ b/chat_helper.py @@ -0,0 +1,37 @@ +import json +import requests +import urllib + +from CREDENTIALS import * + +URL = "https://api.telegram.org/bot{}/".format(TOKEN) + +def get_url(url): + response = requests.get(url) + content = response.content.decode("utf8") + return content + +def get_json_from_url(url): + content = get_url(url) + js = json.loads(content) + return js + +def get_updates(offset=None): + url = URL + "getUpdates?timeout=100" + if offset: + url += "&offset={}".format(offset) + js = get_json_from_url(url) + return js + +def get_last_update_id(updates): + update_ids = [] + for update in updates["result"]: + update_ids.append(int(update["update_id"])) + return max(update_ids) + +def send_message(text, chat_id, reply_markup=None): + text = urllib.quote_plus(text) + url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id) + if reply_markup: + url += "&reply_markup={}".format(reply_markup) + get_url(url) diff --git a/executive-function-bot.py b/executive-function-bot.py index 8f22f50..46fb683 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -1,46 +1,13 @@ import time import json -import requests import schedule -import urllib -from CREDENTIALS import * +import chat_helper from dbhelper import DBHelper import todo_list as todo import feeling_tracker as ft db = DBHelper() -URL = "https://api.telegram.org/bot{}/".format(TOKEN) - -def get_url(url): - response = requests.get(url) - content = response.content.decode("utf8") - return content - -def get_json_from_url(url): - content = get_url(url) - js = json.loads(content) - return js - -def get_updates(offset=None): - url = URL + "getUpdates?timeout=100" - if offset: - url += "&offset={}".format(offset) - js = get_json_from_url(url) - return js - -def get_last_update_id(updates): - update_ids = [] - for update in updates["result"]: - update_ids.append(int(update["update_id"])) - return max(update_ids) - -def send_message(text, chat_id, reply_markup=None): - text = urllib.quote_plus(text) - url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id) - if reply_markup: - url += "&reply_markup={}".format(reply_markup) - get_url(url) def build_keyboard(items): keyboard = [[item] for item in items] @@ -48,50 +15,40 @@ def build_keyboard(items): return json.dumps(reply_markup) def command_handler(text, chat_id): - todoitems = db.get_items(chat_id) if text == "/start": start_message = """Welcome to the Executive Function Bot. I'm here to help you get things done. For now, I operate as a traditional To Do list. Tell me things that you want to do and use /done to mark them complete. """ - send_message(start_message, chat_id) - elif text == "/addtodo": - send_message("What do you need to do?", chat_id) - return "addtodo" - elif text == "/finishtodo": - keyboard = build_keyboard(todoitems) - send_message("Select an item to mark complete", chat_id, keyboard) - return "removetodo" - elif text == "/starttrackingfeelings": - send_message("Feeling Tracking Enabled", chat_id) + chat_helper.send_message(start_message, chat_id) + elif text.startswith("/todo"): + print "DEBUG: update is a command in the todo function" + return todo.command_handler(text, chat_id) + elif text == "/feelingtrackerstart": + chat_helper.send_message("Feeling Tracking Enabled", chat_id) options = ["Daily", "A few times a day", "Hourly"] keyboard = build_keyboard(options) - send_message("How often would you like to talk about your feelings?", chat_id, keyboard) + chat_helper.send_message("How often would you like to talk about your feelings?", chat_id, keyboard) return "configfeelingtrackingfrequency" elif text == "/debug": ft.debug(chat_id) else: - send_message("I'm sorry, I don't know that command. Use /help for a list of commands.", chat_id) + chat_helper.send_message("I'm sorry, I don't know that command. Use /help for a list of commands.", chat_id) def listener_handler(listener, text, chat_id): - if listener == "removetodo": - todo.remove_item_from_list(text, chat_id) - send_message(todo.get_item_list(chat), chat_id) - elif listener == "addtodo": - todo.add_item_to_list(text, chat) - send_message(todo.get_item_list(chat), chat) + if listener.startswith("todo"): + chat_helper.send_message(todo.listener_handler(text, chat_id), chat_id) elif listener == "configfeelingtrackingfrequency": - ft.set_frequency(chat, text) + ft.set_frequency(chat_id, text) options = ["Morning", "Afternoon", "Evening", "Throughout the day"] keyboard = build_keyboard(options) - send_message("Do you have a preference of when you want to talk about your feelings?", chat, keyboard) + chat_helper.send_message("Do you have a preference of when you want to talk about your feelings?", chat_id, keyboard) return "configfeelingtrackingtime" elif listener == "configfeelingtrackingtime": - ft.set_time_pref(chat, text) - send_message("Thanks for letting me know!", chat) + ft.set_time_pref(chat_id, text) + chat_helper.send_message("Thanks for letting me know!", chat_id) else: print listener - continue def handle_updates(updates, listener): for update in updates["result"]: @@ -99,6 +56,7 @@ def handle_updates(updates, listener): chat = update["message"]["chat"]["id"] if text.startswith("/"): + print "DEBUG: update is a command" return command_handler(text, chat) elif listener is not None: return listener_handler(listener, text, chat) @@ -112,13 +70,13 @@ def main(): last_update_id = None listener = None while True: - updates = get_updates(last_update_id) + updates = chat_helper.get_updates(last_update_id) if len(updates["result"]) > 0: - last_update_id = get_last_update_id(updates) + 1 + last_update_id = chat_helper.get_last_update_id(updates) + 1 listener = handle_updates(updates, listener) schedule.run_pending() time.sleep(0.5) if __name__ == '__main__': main() -send_message(text, chat) +chat_helper.send_message(text, chat) diff --git a/todo_list.py b/todo_list.py index dee6dfa..c124204 100644 --- a/todo_list.py +++ b/todo_list.py @@ -1,3 +1,5 @@ +import chat_helper + from dbhelper import DBHelper db = DBHelper() @@ -11,3 +13,21 @@ def add_item_to_list(item, owner): def remove_item_from_list(item, owner): db.delete_item(item, owner) + +def command_handler(text, chat_id): + todoitems = db.get_items(chat_id) + if text == "/todoadditem": + chat_helper.send_message("What do you need to do?", chat_id) + return "addtodo" + elif text == "/todoremoveitem": + keyboard = build_keyboard(todoitems) + chat_helper.send_message("Select an item to mark complete", chat_id, keyboard) + return "removetodo" + +def listener_handler(text, chat_id): + if listener == "todoremove": + todo.remove_item_from_list(text, chat_id) + return todo.get_item_list(chat_id) + elif listener == "todoadd": + todo.add_item_to_list(text, chat_id) + return todo.get_item_list(chat_id) From 42db2b9addd22f33a3638c5c71743a5d4a173292 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 14:52:05 -0500 Subject: [PATCH 15/28] Moving build_keyboard to chat_helper as well --- chat_helper.py | 5 +++++ executive-function-bot.py | 11 +++-------- todo_list.py | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/chat_helper.py b/chat_helper.py index 9027a97..6a703e4 100644 --- a/chat_helper.py +++ b/chat_helper.py @@ -29,6 +29,11 @@ def get_last_update_id(updates): update_ids.append(int(update["update_id"])) return max(update_ids) +def build_keyboard(items): + keyboard = [[item] for item in items] + reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} + return json.dumps(reply_markup) + def send_message(text, chat_id, reply_markup=None): text = urllib.quote_plus(text) url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id) diff --git a/executive-function-bot.py b/executive-function-bot.py index 46fb683..a926d18 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -9,11 +9,6 @@ db = DBHelper() -def build_keyboard(items): - keyboard = [[item] for item in items] - reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} - return json.dumps(reply_markup) - def command_handler(text, chat_id): if text == "/start": start_message = """Welcome to the Executive Function Bot. I'm here to @@ -27,7 +22,7 @@ def command_handler(text, chat_id): elif text == "/feelingtrackerstart": chat_helper.send_message("Feeling Tracking Enabled", chat_id) options = ["Daily", "A few times a day", "Hourly"] - keyboard = build_keyboard(options) + keyboard = chat_helper.build_keyboard(options) chat_helper.send_message("How often would you like to talk about your feelings?", chat_id, keyboard) return "configfeelingtrackingfrequency" elif text == "/debug": @@ -37,11 +32,11 @@ def command_handler(text, chat_id): def listener_handler(listener, text, chat_id): if listener.startswith("todo"): - chat_helper.send_message(todo.listener_handler(text, chat_id), chat_id) + chat_helper.send_message(todo.listener_handler(listener, text, chat_id), chat_id) elif listener == "configfeelingtrackingfrequency": ft.set_frequency(chat_id, text) options = ["Morning", "Afternoon", "Evening", "Throughout the day"] - keyboard = build_keyboard(options) + keyboard = chat_helper.build_keyboard(options) chat_helper.send_message("Do you have a preference of when you want to talk about your feelings?", chat_id, keyboard) return "configfeelingtrackingtime" elif listener == "configfeelingtrackingtime": diff --git a/todo_list.py b/todo_list.py index c124204..cf979b8 100644 --- a/todo_list.py +++ b/todo_list.py @@ -18,16 +18,16 @@ def command_handler(text, chat_id): todoitems = db.get_items(chat_id) if text == "/todoadditem": chat_helper.send_message("What do you need to do?", chat_id) - return "addtodo" + return "todoadd" elif text == "/todoremoveitem": - keyboard = build_keyboard(todoitems) + keyboard = chat_helper.build_keyboard(todoitems) chat_helper.send_message("Select an item to mark complete", chat_id, keyboard) - return "removetodo" + return "todoremove" -def listener_handler(text, chat_id): +def listener_handler(listener, text, chat_id): if listener == "todoremove": - todo.remove_item_from_list(text, chat_id) - return todo.get_item_list(chat_id) + remove_item_from_list(text, chat_id) + return get_item_list(chat_id) elif listener == "todoadd": - todo.add_item_to_list(text, chat_id) - return todo.get_item_list(chat_id) + add_item_to_list(text, chat_id) + return get_item_list(chat_id) From 1bc663300080ee1f2932a9ed69e39e9649af9481 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 14:59:54 -0500 Subject: [PATCH 16/28] Create Feeling Tracker command_handler --- executive-function-bot.py | 9 +++------ feeling_tracker.py | 9 +++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index a926d18..8d9f141 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -19,12 +19,9 @@ def command_handler(text, chat_id): elif text.startswith("/todo"): print "DEBUG: update is a command in the todo function" return todo.command_handler(text, chat_id) - elif text == "/feelingtrackerstart": - chat_helper.send_message("Feeling Tracking Enabled", chat_id) - options = ["Daily", "A few times a day", "Hourly"] - keyboard = chat_helper.build_keyboard(options) - chat_helper.send_message("How often would you like to talk about your feelings?", chat_id, keyboard) - return "configfeelingtrackingfrequency" + elif text.startswith("/feelingtracker"): + print "DEBUG: update is a command in the todo function" + return ft.command_handler(text, chat_id) elif text == "/debug": ft.debug(chat_id) else: diff --git a/feeling_tracker.py b/feeling_tracker.py index f8820cb..d1d3c8a 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -1,6 +1,7 @@ import datetime import schedule +import chat_helper from dbhelper import DBHelper db = DBHelper() @@ -15,3 +16,11 @@ def debug(owner): config = db.get_feelings_config(owner) for setting in config[0]: print setting + +def command_handler(text, chat_id): + if text == "/feelingtrackerstart": + chat_helper.send_message("Feeling Tracking Enabled", chat_id) + options = ["Daily", "A few times a day", "Hourly"] + keyboard = chat_helper.build_keyboard(options) + chat_helper.send_message("How often would you like to talk about your feelings?", chat_id, keyboard) + return "configfeelingtrackingfrequency" From 8315607ef1ecb73b7306f9c50880224e5c2e65c1 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 15:08:01 -0500 Subject: [PATCH 17/28] Create listener_handler for feelings --- executive-function-bot.py | 11 ++--------- feeling_tracker.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index 8d9f141..25a3821 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -30,15 +30,8 @@ def command_handler(text, chat_id): def listener_handler(listener, text, chat_id): if listener.startswith("todo"): chat_helper.send_message(todo.listener_handler(listener, text, chat_id), chat_id) - elif listener == "configfeelingtrackingfrequency": - ft.set_frequency(chat_id, text) - options = ["Morning", "Afternoon", "Evening", "Throughout the day"] - keyboard = chat_helper.build_keyboard(options) - chat_helper.send_message("Do you have a preference of when you want to talk about your feelings?", chat_id, keyboard) - return "configfeelingtrackingtime" - elif listener == "configfeelingtrackingtime": - ft.set_time_pref(chat_id, text) - chat_helper.send_message("Thanks for letting me know!", chat_id) + elif listener.startswith("feelingtracker"): + return ft.listener_handler(listener, text, chat_id) else: print listener diff --git a/feeling_tracker.py b/feeling_tracker.py index d1d3c8a..5b2a4c7 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -23,4 +23,15 @@ def command_handler(text, chat_id): options = ["Daily", "A few times a day", "Hourly"] keyboard = chat_helper.build_keyboard(options) chat_helper.send_message("How often would you like to talk about your feelings?", chat_id, keyboard) - return "configfeelingtrackingfrequency" + return "feelingtrackerconfigfrequency" + +def listener_handler(listener, text, chat_id): + if listener == "feelingtrackerconfigfrequency": + set_frequency(chat_id, text) + options = ["Morning", "Afternoon", "Evening", "Throughout the day"] + keyboard = chat_helper.build_keyboard(options) + chat_helper.send_message("Do you have a preference of when you want to talk about your feelings?", chat_id, keyboard) + return "feelingtrackerconfigtime" + elif listener == "feelingtrackerconfigtime": + set_time_pref(chat_id, text) + chat_helper.send_message("Thanks for letting me know!", chat_id) From cba87bbef7da086d16a49a460519326f656f350a Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 15:08:57 -0500 Subject: [PATCH 18/28] Remove DEBUG statements --- executive-function-bot.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index 25a3821..97334c5 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -17,10 +17,8 @@ def command_handler(text, chat_id): """ chat_helper.send_message(start_message, chat_id) elif text.startswith("/todo"): - print "DEBUG: update is a command in the todo function" return todo.command_handler(text, chat_id) elif text.startswith("/feelingtracker"): - print "DEBUG: update is a command in the todo function" return ft.command_handler(text, chat_id) elif text == "/debug": ft.debug(chat_id) @@ -33,7 +31,7 @@ def listener_handler(listener, text, chat_id): elif listener.startswith("feelingtracker"): return ft.listener_handler(listener, text, chat_id) else: - print listener + continue def handle_updates(updates, listener): for update in updates["result"]: From 5f8c8c04f66e776f724f5c987e1ae336947a7428 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 15:35:26 -0500 Subject: [PATCH 19/28] Forgot to save --- executive-function-bot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index 97334c5..ebbfe0f 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -39,7 +39,6 @@ def handle_updates(updates, listener): chat = update["message"]["chat"]["id"] if text.startswith("/"): - print "DEBUG: update is a command" return command_handler(text, chat) elif listener is not None: return listener_handler(listener, text, chat) From 0383982a474ae55ae0aeb510152e68552ed239dd Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 15:52:36 -0500 Subject: [PATCH 20/28] Fix continue syntax error --- executive-function-bot.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/executive-function-bot.py b/executive-function-bot.py index ebbfe0f..f1924a6 100644 --- a/executive-function-bot.py +++ b/executive-function-bot.py @@ -30,8 +30,6 @@ def listener_handler(listener, text, chat_id): chat_helper.send_message(todo.listener_handler(listener, text, chat_id), chat_id) elif listener.startswith("feelingtracker"): return ft.listener_handler(listener, text, chat_id) - else: - continue def handle_updates(updates, listener): for update in updates["result"]: From f8a78960cedc936f84418f07d5f6bb8d76df112c Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 16:15:36 -0500 Subject: [PATCH 21/28] Add a basic debug scheduler to see how it works --- feeling_tracker.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/feeling_tracker.py b/feeling_tracker.py index 5b2a4c7..1ef32f7 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -12,10 +12,20 @@ def set_frequency(owner, frequency): def set_time_pref(owner, time_pref): db.set_feelings_config_time_pref(owner, time_pref) -def debug(owner): +def prompt_user(owner): + options = [["1", "2", "3", "4","5"]] + keyboard = chat_helper.build_keyboard(options) + chat_helper.send_message("How are you feeling?", owner) + +def initialize_schedule(owner): config = db.get_feelings_config(owner) - for setting in config[0]: - print setting + # config[0] is frequency + # config[1] is time pref + schedule.every(1).minutes.do(prompt_user, owner) + +def debug(owner): + initialize_schedule(owner) + print schedule.jobs def command_handler(text, chat_id): if text == "/feelingtrackerstart": From 57e2fb71984113d178bb0e3b143ce8ef2d8f617e Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 16:35:56 -0500 Subject: [PATCH 22/28] Pull out frequency from config and use it to set schedule --- feeling_tracker.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/feeling_tracker.py b/feeling_tracker.py index 1ef32f7..c10f593 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -19,9 +19,10 @@ def prompt_user(owner): def initialize_schedule(owner): config = db.get_feelings_config(owner) - # config[0] is frequency - # config[1] is time pref - schedule.every(1).minutes.do(prompt_user, owner) + frequency = {"Daily" : 24, "A few times a day" : 4, "Hourly" : 1 } + # config[0][0] is frequency + # config[0][1] is time pref + schedule.every(frequency[config[0][0]]).hours.do(prompt_user, owner) def debug(owner): initialize_schedule(owner) From 8e6090041de525d24d483aa483dedff80b9d0c81 Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 16:52:59 -0500 Subject: [PATCH 23/28] Add basic keyboard for user prompt --- feeling_tracker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeling_tracker.py b/feeling_tracker.py index c10f593..74976b8 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -13,9 +13,9 @@ def set_time_pref(owner, time_pref): db.set_feelings_config_time_pref(owner, time_pref) def prompt_user(owner): - options = [["1", "2", "3", "4","5"]] + options = ["1", "2", "3", "4","5"] keyboard = chat_helper.build_keyboard(options) - chat_helper.send_message("How are you feeling?", owner) + chat_helper.send_message("How are you feeling?", owner, keyboard) def initialize_schedule(owner): config = db.get_feelings_config(owner) From 03fba27004ef65dcf34ad3ab2dc4517b8fc4880c Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 17:09:24 -0500 Subject: [PATCH 24/28] Initialize schedule for user after setting preferences --- feeling_tracker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feeling_tracker.py b/feeling_tracker.py index 74976b8..0471c89 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -45,4 +45,5 @@ def listener_handler(listener, text, chat_id): return "feelingtrackerconfigtime" elif listener == "feelingtrackerconfigtime": set_time_pref(chat_id, text) - chat_helper.send_message("Thanks for letting me know!", chat_id) + initialize_schedule(owner) + chat_helper.send_message("Thanks for letting me know! I'll be in touch!", chat_id) From 64ebcff76577b3fea383f8bf6cdb73317fc3f7ab Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 17:37:41 -0500 Subject: [PATCH 25/28] Scaffolding listener for recording feelings --- feeling_tracker.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/feeling_tracker.py b/feeling_tracker.py index 0471c89..ece18cd 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -16,6 +16,7 @@ def prompt_user(owner): options = ["1", "2", "3", "4","5"] keyboard = chat_helper.build_keyboard(options) chat_helper.send_message("How are you feeling?", owner, keyboard) + # Set listener to record the feeling rating def initialize_schedule(owner): config = db.get_feelings_config(owner) @@ -47,3 +48,13 @@ def listener_handler(listener, text, chat_id): set_time_pref(chat_id, text) initialize_schedule(owner) chat_helper.send_message("Thanks for letting me know! I'll be in touch!", chat_id) + elif listener == "feelingtrackerrating": + # Add rating to database with timestamp + chat_helper.send_message("Would you like to tell me about it?", chat_id) + # Send keyboard options for "yes", "no"? + # If yes, continue to record feelings + return "feelingtrackerdescription" + # If no, say "Not a problem. Have a great day!" and quit + elif listener == "feelingtrackerdescription": + # Add description to database with timestamp + chat_helper.send_message("Thanks for talking to me about it. Is there anything else you want to say?", chat_id) From d735265b53d481d5c7093e70fb1af4e47730340f Mon Sep 17 00:00:00 2001 From: Pat East Date: Wed, 4 Apr 2018 17:49:00 -0500 Subject: [PATCH 26/28] Fix reference error --- feeling_tracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeling_tracker.py b/feeling_tracker.py index ece18cd..3885a80 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -46,7 +46,7 @@ def listener_handler(listener, text, chat_id): return "feelingtrackerconfigtime" elif listener == "feelingtrackerconfigtime": set_time_pref(chat_id, text) - initialize_schedule(owner) + initialize_schedule(chat_id) chat_helper.send_message("Thanks for letting me know! I'll be in touch!", chat_id) elif listener == "feelingtrackerrating": # Add rating to database with timestamp From 3a33f98cfe9503c97a31a7a579a0d337c59aa187 Mon Sep 17 00:00:00 2001 From: Pat East Date: Thu, 5 Apr 2018 23:31:06 -0500 Subject: [PATCH 27/28] Build horizontal keyboard --- chat_helper.py | 5 +++++ feeling_tracker.py | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/chat_helper.py b/chat_helper.py index 6a703e4..84308ed 100644 --- a/chat_helper.py +++ b/chat_helper.py @@ -34,6 +34,11 @@ def build_keyboard(items): reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} return json.dumps(reply_markup) +def build_hoz_keyboard(items): + keyboard = [[item for item in items]] + reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} + return json.dumps(reply_markup) + def send_message(text, chat_id, reply_markup=None): text = urllib.quote_plus(text) url = URL + "sendMessage?text={}&chat_id={}&parse_mode=Markdown".format(text, chat_id) diff --git a/feeling_tracker.py b/feeling_tracker.py index 3885a80..933aac9 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -14,7 +14,7 @@ def set_time_pref(owner, time_pref): def prompt_user(owner): options = ["1", "2", "3", "4","5"] - keyboard = chat_helper.build_keyboard(options) + keyboard = chat_helper.build_hoz_keyboard(options) chat_helper.send_message("How are you feeling?", owner, keyboard) # Set listener to record the feeling rating @@ -27,6 +27,7 @@ def initialize_schedule(owner): def debug(owner): initialize_schedule(owner) + prompt_user(owner) print schedule.jobs def command_handler(text, chat_id): From dc89b8c03796fdfb91c1d0879e3b03b985f2883c Mon Sep 17 00:00:00 2001 From: Pat East Date: Fri, 6 Apr 2018 07:48:45 -0500 Subject: [PATCH 28/28] Consolidate keyboard building functions --- chat_helper.py | 12 +++++------- feeling_tracker.py | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/chat_helper.py b/chat_helper.py index 84308ed..bc63ac7 100644 --- a/chat_helper.py +++ b/chat_helper.py @@ -29,13 +29,11 @@ def get_last_update_id(updates): update_ids.append(int(update["update_id"])) return max(update_ids) -def build_keyboard(items): - keyboard = [[item] for item in items] - reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} - return json.dumps(reply_markup) - -def build_hoz_keyboard(items): - keyboard = [[item for item in items]] +def build_keyboard(items, style="vert"): + if style == "vert": + keyboard = [[item] for item in items] + else: + keyboard = [[item for item in items]] reply_markup = {"keyboard":keyboard, "one_time_keyboard": True} return json.dumps(reply_markup) diff --git a/feeling_tracker.py b/feeling_tracker.py index 933aac9..61ce3dc 100644 --- a/feeling_tracker.py +++ b/feeling_tracker.py @@ -14,7 +14,7 @@ def set_time_pref(owner, time_pref): def prompt_user(owner): options = ["1", "2", "3", "4","5"] - keyboard = chat_helper.build_hoz_keyboard(options) + keyboard = chat_helper.build_keyboard(options, "hoz") chat_helper.send_message("How are you feeling?", owner, keyboard) # Set listener to record the feeling rating