diff --git a/dudlebot.py b/dudlebot.py index 52e5273..a554f4b 100644 --- a/dudlebot.py +++ b/dudlebot.py @@ -4,7 +4,6 @@ import re from dataclasses import dataclass from datetime import datetime, timedelta from enum import Enum -from operator import itemgetter from typing import List, Dict import telegram @@ -153,33 +152,42 @@ class DudleBot: @staticmethod def _best_of_plan(plan): days = [plan.start + timedelta(days=i) for i in range(plan.duration.days)] - results = [0] * plan.duration.days + results = [(0, 0)] * plan.duration.days for entry in plan.entries.values(): for idx, response in enumerate(entry.responses): if response == PlanResponse.YES: - results[idx] += 1 - # elif response == PlanResponse.UNKNOWN: - # results[idx] += 0.01 + results[idx] = (results[idx][0] + 1, results[idx][1]) + elif response == PlanResponse.UNKNOWN: + results[idx] = (results[idx][0], results[idx][1] + 1) + + sorted_days = list(zip(days, results)) + sorted_days.sort(key=lambda dwr: dwr[1][1], reverse=True) # First sort by unknowns + sorted_days.sort(key=lambda dwr: dwr[1][0], reverse=True) # Then sort by positive answers - sorted_days = sorted(zip(days, results), key=itemgetter(1), reverse=True) best_days = [] - last_result, different_results = None, 0 - for day, result in sorted_days: - if result == 0 or (len(best_days) >= 3 and different_results > 1): + for idx, day_with_result in enumerate(sorted_days): + day, result = day_with_result + yes, unknown = result + if yes == 0 or (idx > 3 and different_results > 1): break - best_days.append((day, result)) + best_days.append(day_with_result) if result != last_result: different_results += 1 last_result = result - response = f"Best {len(best_days)} result{'s' if len(best_days) > 1 else ''}:\n\n" - for idx, dayresult in enumerate(best_days): - day, result = dayresult - response += f"{idx + 1}. {day.strftime('%A')} ({result})\n" - return response + if len(best_days) > 0: + response = f"Best {len(best_days)} result{'s' if len(best_days) > 1 else ''}:\n\n" + for idx, day_with_result in enumerate(best_days): + day, result = day_with_result + yes, unknown = result + result_fmt = str(yes) + (f" + {unknown}?" if unknown > 0 else "") + response += f"{idx + 1}. {day.strftime('%A %-d/%-m')} ({result_fmt})\n" + return response + else: + return "There has been no resolution." def start(self): self.logger.info("Starting DudleBot...")