Skip to content

Commit c28188f

Browse files
committed
add rescuetime stuff
1 parent b420e44 commit c28188f

File tree

7 files changed

+115
-2
lines changed

7 files changed

+115
-2
lines changed

.env_example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
BASE_DIR=/home/username/GIT/mm2/
1+
BASE_DIR=/home/username/GIT/mm2/
2+
AG_RESCUETIME_API_KEY=key

app.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ def read_random_quote():
5959
return data
6060
return {"error": "Data not found"}
6161

62+
def read_rescuetime_data():
63+
file_path = os.path.join(base_dir, "data/rescuetime_data.json")
64+
if os.path.exists(file_path):
65+
with open(file_path, "r") as file:
66+
data = json.load(file)
67+
return data
68+
return {"error": "Data not found or invalid format"}
6269

6370
# SocketIO Event Handlers (BACKEND, SERVER)
6471
# Listening for incoming connections such as `request_from_client_to_server_for_stock_data`
@@ -74,6 +81,7 @@ def event_handler_connect():
7481
emit('response_from_server_to_client_with_stock_data', read_stock_data())
7582
emit('response_from_server_to_client_with_cvbankas_data', read_cvbankas_data())
7683
emit('response_from_server_to_client_with_sensor_data', read_sensor_data())
84+
emit('response_from_server_to_client_with_rescuetime_data', read_rescuetime_data())
7785

7886
@socketio.on('request_from_client_to_server_for_stock_data')
7987
def event_handler_stock():
@@ -95,6 +103,10 @@ def event_handler_system_info():
95103
def event_handler_random_quote():
96104
emit('response_from_server_to_client_with_quote_data', read_random_quote())
97105

106+
@socketio.on('request_from_client_to_server_for_rescuetime_data')
107+
def event_handler_rescuetime():
108+
emit('response_from_server_to_client_with_rescuetime_data', read_rescuetime_data())
109+
98110
@app.route("/")
99111
def home():
100112
return render_template("index.html")

cron.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
# Run every day at 01:00 AM
2424
0 1 * * * /home/arvypi/venvs/venv-mm2/bin/python /home/arvypi/GIT/mm2/fetches/random_quote.py
2525

26+
# Run every day at 02:00 AM
27+
0 2 * * * /home/arvypi/venvs/venv-mm2/bin/python /home/arvypi/GIT/mm2/fetches/rescuetime.py
28+
2629
# Run every minute from 5:00 AM to 6:59 AM
2730
* 5-6 * * * /home/arvypi/venvs/venv-mm2/bin/python /home/arvypi/GIT/mm2/fetches/invest_fetch_stock_data.py
2831
* 5-6 * * * /home/arvypi/venvs/venv-mm2/bin/python /home/arvypi/GIT/mm2/fetches/cvbankas.py

fetches/rescuetime.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import requests
2+
import os
3+
import sys
4+
import json
5+
from datetime import datetime, timedelta
6+
from dotenv import load_dotenv
7+
8+
# Load environment variables
9+
load_dotenv()
10+
11+
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
12+
13+
from log_config import logger
14+
15+
# Your RescueTime API keys
16+
api_key_ag = os.getenv("AG_RESCUETIME_API_KEY")
17+
18+
# Pick yesterday's date
19+
yesterday_full = datetime.now() - timedelta(days=1)
20+
yesterday_formatted = yesterday_full.strftime("%Y-%m-%d")
21+
22+
def fetch_for_user(api_key, yesterday_formatted):
23+
# Define the API endpoint URL
24+
api_url = f"https://www.rescuetime.com/anapi/daily_summary_feed?key={api_key}"
25+
26+
# Make the API request
27+
response = requests.get(api_url)
28+
29+
if response.status_code == 200:
30+
data = response.json()
31+
32+
# Filter the data for the specific date
33+
filtered_data = [entry for entry in data if entry['date'] == yesterday_formatted]
34+
35+
if filtered_data:
36+
return filtered_data[0]
37+
else:
38+
logger.warning(f"No data found for {yesterday_formatted}")
39+
return None
40+
else:
41+
logger.error(f"Failed to retrieve data. Status code: {response.status_code}")
42+
return None
43+
44+
def save_rescuetime_data(data):
45+
data_to_save = {
46+
"fetch_date": datetime.now().strftime("%Y-%m-%d %H:%M"),
47+
"rescuetime_data": data
48+
}
49+
50+
base_dir = os.getenv("BASE_DIR")
51+
file_path = os.path.join(base_dir, "data/rescuetime_data.json")
52+
53+
os.makedirs(os.path.dirname(file_path), exist_ok=True)
54+
55+
try:
56+
with open(file_path, 'w', encoding='utf-8') as f:
57+
json.dump(data_to_save, f, ensure_ascii=False, indent=4)
58+
logger.info(f"RescueTime data successfully saved to {file_path}")
59+
except IOError as e:
60+
logger.error(f"Failed to save RescueTime data to {file_path}: {e}")
61+
62+
def main():
63+
ag_data = fetch_for_user(api_key_ag, yesterday_formatted)
64+
65+
combined_data = {
66+
"ag": ag_data,
67+
}
68+
69+
save_rescuetime_data(combined_data)
70+
71+
if __name__ == "__main__":
72+
main()

static/js/domUpdates.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,19 @@ export function updateRandomQuote(data) {
139139
quoteDiv.textContent = `${data.quote.content} - ${data.quote.author}`;
140140
}
141141
}
142+
143+
export function updateRescueTimeData(data) {
144+
const rescueTimeDiv = document.getElementById('rescuetime_data');
145+
if (rescueTimeDiv && data.rescuetime_data && data.rescuetime_data.ag) {
146+
const agData = data.rescuetime_data.ag;
147+
rescueTimeDiv.innerHTML = `
148+
<span>Arvy's RescueTime for ${agData.date}:</span><br>
149+
<span>Productive: ${agData.all_productive_duration_formatted}</span><br>
150+
<span>Distracting: ${agData.all_distracting_duration_formatted}</span><br>
151+
<span>Total Time: ${agData.total_duration_formatted}</span><br>
152+
<span class="timestamp">Updated: ${data.fetch_date}</span>
153+
`;
154+
} else {
155+
rescueTimeDiv.innerHTML = '<span>RescueTime data not available</span>';
156+
}
157+
}

static/js/main.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* and schedules periodic updates for various components of the application.
66
*/
77

8-
import { updateStockData, updateTextColors, updateSensorData, updateCvbankasData, updateCurrentTime, updateSystemInfo, updateRandomQuote } from './domUpdates.js';
8+
import { updateStockData, updateTextColors, updateSensorData, updateCvbankasData, updateCurrentTime, updateSystemInfo, updateRandomQuote, updateRescueTimeData } from './domUpdates.js';
99

1010

1111
// Schedule periodic update requests
@@ -31,6 +31,10 @@ setInterval(() => {
3131
socket.emit('request_from_client_to_server_for_random_quote_data');
3232
}, 3600000); //1 hour
3333

34+
setInterval(() => {
35+
socket.emit('request_from_client_to_server_for_rescuetime_data');
36+
}, 36000000); // 10 hours
37+
3438
setInterval(updateCurrentTime, 1000);
3539

3640

@@ -50,6 +54,7 @@ socket.on('connect', () => {
5054
socket.emit('request_from_client_to_server_for_stock_data');
5155
socket.emit('request_from_client_to_server_for_system_info_data');
5256
socket.emit('request_from_client_to_server_for_random_quote_data');
57+
socket.emit('request_from_client_to_server_for_rescuetime_data');
5358
updateCurrentTime();
5459
});
5560

@@ -77,3 +82,6 @@ socket.on('response_from_server_to_client_with_quote_data', (data) => {
7782
updateRandomQuote(data);
7883
});
7984

85+
socket.on('response_from_server_to_client_with_rescuetime_data', (data) => {
86+
updateRescueTimeData(data);
87+
});

templates/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
<div class="column column-2">
3131
<div class="row" id="current-time"></div>
3232
<div class="row" id="sensor_data"></div>
33+
<div class="row" id="rescuetime_data"></div>
3334
<div id="cvbankas_jobs" class="row"></div>
3435
</div>
3536
</div>

0 commit comments

Comments
 (0)