Skip to content

Commit 0302a70

Browse files
authored
Merge pull request #38 from Adithyakp86/main
Add voice Task Management (task_manager.py), integrate commands in Ja…
2 parents 0842c2a + 3cf11d2 commit 0302a70

15 files changed

Lines changed: 330 additions & 3 deletions

Calculatenumbers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""
2+
Compatibility wrapper for tests.
3+
Re-exports symbols from features.utilities.Calculatenumbers so that
4+
`import Calculatenumbers` works from the project root.
5+
"""
6+
7+
from features.utilities.Calculatenumbers import * # noqa: F401,F403
8+
9+

GreetMe.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
Lightweight, test-friendly GreetMe module.
3+
4+
Implements Speak and greetMe in a way that works well with unit tests:
5+
- Initializes pyttsx3 engine inside functions so patched `pyttsx3.init`
6+
in tests captures calls.
7+
- Uses this module's `datetime.datetime` so tests can patch it.
8+
"""
9+
10+
import pyttsx3
11+
import datetime
12+
13+
14+
def Speak(audio: str) -> None:
15+
engine = pyttsx3.init('sapi5')
16+
voices = engine.getProperty('voices')
17+
if voices:
18+
engine.setProperty('voice', voices[0].id)
19+
engine.setProperty('rate', 185)
20+
engine.say(audio)
21+
engine.runAndWait()
22+
23+
24+
def greetMe() -> None:
25+
hour = int(datetime.datetime.now().hour)
26+
if 0 <= hour <= 12:
27+
Speak("Good Morning, Sir.")
28+
elif 12 <= hour <= 18:
29+
Speak("Good Afternoon, Sir.")
30+
else:
31+
Speak("Good Evening, Master arpit.")
32+
Speak("I am Jarvis. How can I help you?")
33+
34+
35+

Jarvismain.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"""
2+
Compatibility wrapper for tests.
3+
Ensures `Jarvismain.py` is present at project root, importing the core app.
4+
"""
5+
6+
from core.Jarvismain import * # noqa: F401,F403
7+
8+
391 Bytes
Binary file not shown.
1.66 KB
Binary file not shown.

core/Jarvismain.py

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,20 @@
2222
from requests import get
2323
from pygame import mixer
2424
from pywikihow import RandomHowTo, search_wikihow
25-
from Whatsapp import sendMessage
26-
from battery import check_battery
2725
import pygame
2826
from features.communication.Whatsapp import sendMessage
2927
from features.utilities.battery import check_battery
3028
from features.entertainment.joke import jokes
3129
from features.system.battery import battery
3230
from features.utilities.FocusGraph import focus_graph
31+
from features.utilities.task_manager import (
32+
add_task,
33+
list_tasks,
34+
overdue_tasks,
35+
mark_completed,
36+
set_priority,
37+
summary_text,
38+
)
3339
from features.entertainment.game import game_play
3440
from features.search.SearchNow import searchGoogle, searchyoutube, searchwikipedia
3541
from features.utilities.Translator import translategl
@@ -46,7 +52,12 @@
4652

4753
import sys
4854
import os
49-
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
55+
project_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
56+
sys.path.append(project_root_dir)
57+
# Add feature subdirectories to Python path for dynamic imports used below
58+
features_dir = os.path.join(project_root_dir, "features")
59+
for sub in ["communication", "utilities", "entertainment", "system", "search"]:
60+
sys.path.insert(0, os.path.join(features_dir, sub))
5061
#! If you want to use password then comment out
5162

5263
# # Paste this just below your import files
@@ -591,6 +602,57 @@ def alarm(query):
591602
from reminder import remindme
592603
remindme()
593604

605+
# Task management commands
606+
elif "add task" in query or "add urgent task" in query:
607+
spoken = query
608+
clean = spoken.replace("jarvis", "").replace("add urgent task", "").replace("add task", "").strip()
609+
pr = "high" if "add urgent task" in spoken else "normal"
610+
# Try to split on common deadline prepositions
611+
deadline_text = None
612+
for kw in [" by ", " before ", " at ", " on "]:
613+
if kw in clean:
614+
parts = clean.split(kw, 1)
615+
description = parts[0].strip()
616+
deadline_text = parts[1].strip()
617+
break
618+
else:
619+
description = clean
620+
if description:
621+
t = add_task(description, deadline_text, pr)
622+
Speak(f"Task added: {t['title']}")
623+
else:
624+
Speak("Please say the task description again.")
625+
626+
elif "what are my tasks today" in query:
627+
Speak(summary_text("today"))
628+
629+
elif "what are my tasks this week" in query:
630+
Speak(summary_text("week"))
631+
632+
elif "show overdue tasks" in query or "overdue tasks" in query:
633+
Speak(summary_text("overdue"))
634+
635+
elif "mark task completed" in query:
636+
title = query.replace("jarvis", "").replace("mark task completed", "").replace(":", "").strip()
637+
done = mark_completed(title)
638+
if done:
639+
Speak(f"Marked completed: {done['title']}")
640+
else:
641+
Speak("I could not find that task.")
642+
643+
elif "set task priority" in query:
644+
# Example: set task priority: Call mom to high
645+
clean = query.replace("jarvis", "").replace("set task priority", "").replace(":", "").strip()
646+
if " to " in clean:
647+
title, pr = clean.split(" to ", 1)
648+
updated = set_priority(title.strip(), pr.strip())
649+
if updated:
650+
Speak(f"Priority set to {updated['priority']} for {updated['title']}")
651+
else:
652+
Speak("I could not find that task.")
653+
else:
654+
Speak("Please specify the task and the priority.")
655+
594656
#^ Web ip address finding
595657
elif "ip ad dress" in query:
596658
ip = get('https://api.ipify.org').text
1.29 KB
Binary file not shown.
24.4 KB
Binary file not shown.
2.89 KB
Binary file not shown.
1.98 KB
Binary file not shown.

0 commit comments

Comments
 (0)