new version

This commit is contained in:
2025-01-18 21:07:14 +01:00
parent 2e99b80ed8
commit f6417c78dd
5 changed files with 354 additions and 80 deletions

View File

@@ -1 +1 @@
2
3

View File

@@ -65,3 +65,244 @@ Session end: 2025-01-08 20:11:28
Session start: 2025-01-08 20:55:07
XP and level updated: 25 XP, Level 2
Session end: 2025-01-08 20:55:36
Session start: 2025-01-08 21:08:29
Session start: 2025-01-08 21:08:29
Session start: 2025-01-08 21:08:29
Session start: 2025-01-08 21:08:30
Session start: 2025-01-08 21:08:30
Session start: 2025-01-08 21:19:58
Session start: 2025-01-08 21:19:58
Session start: 2025-01-08 21:19:58
Session start: 2025-01-08 21:19:58
Session start: 2025-01-08 21:19:59
Session start: 2025-01-08 23:03:13
Session start: 2025-01-08 23:03:14
Session start: 2025-01-08 23:03:14
Session start: 2025-01-08 23:03:15
Session start: 2025-01-08 23:03:15
Session start: 2025-01-09 19:32:07
Session start: 2025-01-09 19:32:08
Session start: 2025-01-09 19:32:08
Session start: 2025-01-09 19:32:23
Session start: 2025-01-09 19:32:23
Session start: 2025-01-09 19:32:23
Session start: 2025-01-09 19:32:24
Session start: 2025-01-09 19:32:24
Session start: 2025-01-09 19:42:58
XP and level updated: 35 XP, Level 2
Session end: 2025-01-09 20:03:12
Session start: 2025-01-10 12:54:39
XP and level updated: 45 XP, Level 2
Session end: 2025-01-10 12:56:40
Session start: 2025-01-10 12:56:44
XP and level updated: 55 XP, Level 2
Session end: 2025-01-10 12:57:08
Session start: 2025-01-10 12:58:33
XP and level updated: 65 XP, Level 2
Session end: 2025-01-10 12:58:47
Session start: 2025-01-10 12:58:58
XP and level updated: 75 XP, Level 2
Session end: 2025-01-10 12:59:20
Session start: 2025-01-10 12:59:22
XP and level updated: 85 XP, Level 2
Session end: 2025-01-10 12:59:44
Session start: 2025-01-10 13:05:23
XP and level updated: 95 XP, Level 2
Session end: 2025-01-10 13:05:37
Session start: 2025-01-10 13:06:37
XP and level updated: 105 XP, Level 2
Session end: 2025-01-10 13:06:52
Session start: 2025-01-10 13:16:09
Session start: 2025-01-10 13:16:09
Session start: 2025-01-10 13:16:09
Session start: 2025-01-10 13:16:09
Session start: 2025-01-10 13:16:10
Session start: 2025-01-14 18:59:04
XP and level updated: 100 XP, Level 2
Session end: 2025-01-14 19:23:41
Session start: 2025-01-15 07:47:49
Session start: 2025-01-15 07:47:49
Session start: 2025-01-15 07:47:50
Session start: 2025-01-15 07:47:50
Session start: 2025-01-15 07:47:51
Session start: 2025-01-15 07:55:49
XP and level updated: 110 XP, Level 2
Session end: 2025-01-15 08:17:28
Session start: 2025-01-15 14:59:38
Session start: 2025-01-15 14:59:38
Session start: 2025-01-15 14:59:38
Session start: 2025-01-15 14:59:39
Session start: 2025-01-15 14:59:46
Session start: 2025-01-15 14:59:46
Session start: 2025-01-15 14:59:46
Session start: 2025-01-15 14:59:47
Session start: 2025-01-15 14:59:47
Session start: 2025-01-15 21:39:12
Session start: 2025-01-15 21:39:13
Session start: 2025-01-15 21:39:13
Session start: 2025-01-15 21:39:13
Session start: 2025-01-15 21:39:18
Session start: 2025-01-15 21:39:18
Session start: 2025-01-15 21:39:19
Session start: 2025-01-15 21:39:19
Session start: 2025-01-15 21:39:20
Session start: 2025-01-17 15:21:48
Session start: 2025-01-17 15:21:48
Session start: 2025-01-17 15:21:48
Session start: 2025-01-17 15:21:49
Session start: 2025-01-17 15:21:52
Session start: 2025-01-17 15:21:53
Session start: 2025-01-17 15:21:53
Session start: 2025-01-17 15:21:53
Session start: 2025-01-17 15:21:53
Session start: 2025-01-17 19:15:35
Session start: 2025-01-17 19:15:36
Session start: 2025-01-17 19:15:36
Session start: 2025-01-17 19:15:36
Session start: 2025-01-17 19:15:42
Session start: 2025-01-17 19:15:42
Session start: 2025-01-17 19:15:42
Session start: 2025-01-17 19:15:42
Session start: 2025-01-17 19:15:42
Session start: 2025-01-17 19:20:19
Session end: 2025-01-17 19:20:25
Session start: 2025-01-17 19:20:35
Session start: 2025-01-17 19:24:39
Session start: 2025-01-17 19:24:49
XP and level updated: 120 XP, Level 2
Session end: 2025-01-17 19:46:00
Session start: 2025-01-17 19:46:11
XP and level updated: 130 XP, Level 2
Session end: 2025-01-17 19:46:24
Session start: 2025-01-17 19:46:34
Session end: 2025-01-17 19:46:38
Session start: 2025-01-17 19:46:48
XP and level updated: 125 XP, Level 2
Session start: 2025-01-18 20:21:53
Session start: 2025-01-18 20:22:03
XP and level updated: 135 XP, Level 2
Session start: 2025-01-18 20:26:51
Session start: 2025-01-18 20:27:18
Session start: 2025-01-18 20:28:48
Session start: 2025-01-18 20:31:24
Session start: 2025-01-18 20:33:13
XP and level updated: 145 XP, Level 2
XP and level updated: 155 XP, Level 2
Session end: 2025-01-18 20:33:50
Session start: 2025-01-18 20:35:58
XP and level updated: 165 XP, Level 2
Session end: 2025-01-18 20:36:18
Session start: 2025-01-18 20:36:20
XP and level updated: 175 XP, Level 2
Session end: 2025-01-18 20:36:35
Session start: 2025-01-18 20:38:28
XP and level updated: 170 XP, Level 2
Session end: 2025-01-18 20:38:47
Session start: 2025-01-18 20:41:32
XP and level updated: 180 XP, Level 2
Session end: 2025-01-18 20:42:35
Session start: 2025-01-18 20:42:41
Session end: 2025-01-18 20:42:49
Session start: 2025-01-18 20:44:43
XP and level updated: 175 XP, Level 2
Session end: 2025-01-18 20:45:05
Session start: 2025-01-18 20:45:09
XP and level updated: 185 XP, Level 2
Session end: 2025-01-18 20:45:22
Session start: 2025-01-18 20:45:58
XP and level updated: 180 XP, Level 2
Session end: 2025-01-18 20:46:12
Session start: 2025-01-18 20:46:15
XP and level updated: 190 XP, Level 2
Session end: 2025-01-18 20:46:28
Session end: 2025-01-18 20:47:18
Session start: 2025-01-18 20:47:29
XP and level updated: 0 XP, Level 3
Session end: 2025-01-18 20:47:46
Session start: 2025-01-18 20:47:52
Session start: 2025-01-18 20:47:56
Session end: 2025-01-18 20:48:06
Session end: 2025-01-18 20:48:09
Session start: 2025-01-18 20:48:19
Session end: 2025-01-18 20:48:25
Session start: 2025-01-18 20:48:35
Session end: 2025-01-18 20:48:51
Session start: 2025-01-18 20:49:01
XP and level updated: 10 XP, Level 3
Session end: 2025-01-18 20:49:13
Session start: 2025-01-18 20:49:23
XP and level updated: 20 XP, Level 3
Session end: 2025-01-18 20:49:30
Session start: 2025-01-18 20:49:37
Session start: 2025-01-18 20:49:40
XP and level updated: 15 XP, Level 3
Session end: 2025-01-18 20:49:53
XP and level updated: 25 XP, Level 3
Session end: 2025-01-18 20:50:03
Session start: 2025-01-18 20:50:03
Session end: 2025-01-18 20:50:07
Session start: 2025-01-18 20:50:17
XP and level updated: 35 XP, Level 3
Session end: 2025-01-18 20:51:43
Session start: 2025-01-18 20:51:53
XP and level updated: 45 XP, Level 3
Session end: 2025-01-18 20:52:04
Session start: 2025-01-18 20:52:14
XP and level updated: 55 XP, Level 3
Session end: 2025-01-18 20:52:23
Session start: 2025-01-18 20:52:33
Session end: 2025-01-18 20:52:37
Session start: 2025-01-18 20:52:47
Session start: 2025-01-18 20:53:03
XP and level updated: 50 XP, Level 3
Session end: 2025-01-18 20:53:17
XP and level updated: 60 XP, Level 3
Session end: 2025-01-18 20:53:39
Session start: 2025-01-18 20:53:49
Session end: 2025-01-18 20:53:55
Session start: 2025-01-18 20:54:05
Session end: 2025-01-18 20:54:43
Session start: 2025-01-18 20:54:53
Session end: 2025-01-18 20:55:04
Session start: 2025-01-18 20:55:15
Session end: 2025-01-18 20:55:27
Session start: 2025-01-18 20:55:37
Session end: 2025-01-18 20:56:02
Session start: 2025-01-18 20:56:13
Session duration: 0 minutes and 3 seconds
Session end: 2025-01-18 20:56:16
Session start: 2025-01-18 20:56:17
Session start: 2025-01-18 20:56:26
Session duration: 0 minutes and 3 seconds
Session end: 2025-01-18 20:56:30
XP and level updated: 70 XP, Level 3
Session start: 2025-01-18 20:56:40
Session duration: 0 minutes and 3 seconds
Session end: 2025-01-18 20:56:44
Session duration: 0 minutes and 26 seconds
Session end: 2025-01-18 20:56:44
Session start: 2025-01-18 20:56:54
XP and level updated: 80 XP, Level 3
Session duration: 0 minutes and 10 seconds
Session end: 2025-01-18 20:57:04
Session start: 2025-01-18 20:57:14
Session start: 2025-01-18 21:00:19
XP and level updated: 90 XP, Level 3
Session duration: 0 minutes and 13 seconds
Session end: 2025-01-18 21:00:33
Session start: 2025-01-18 21:01:07
Session duration: 0 minutes and 4 seconds
Session end: 2025-01-18 21:01:12
Session start: 2025-01-18 21:01:22
XP and level updated: 100 XP, Level 3
Session duration: 0 minutes and 10 seconds
Session end: 2025-01-18 21:01:33
Session start: 2025-01-18 21:01:43
XP and level updated: 95 XP, Level 3
Session duration: 0 minutes and 11 seconds
Session end: 2025-01-18 21:01:54
Session start: 2025-01-18 21:02:04
Session start: 2025-01-18 21:04:01
XP and level updated: 105 XP, Level 3
Session duration: 0 minutes and 12 seconds
Session end: 2025-01-18 21:04:14

View File

@@ -1 +1 @@
0
109

View File

@@ -1 +1 @@
25
105

187
main.py
View File

@@ -4,93 +4,135 @@ import psutil
import tkinter as tk
from tkinter import messagebox
import random
import sys
import subprocess
# Utility functions
def initialize_assets(assets_dir, xp_file, level_file, session_log, total_time_file, questions_file):
if not os.path.exists(assets_dir):
os.makedirs(assets_dir)
if not os.path.exists(xp_file):
with open(xp_file, 'w') as f:
f.write('0')
if not os.path.exists(level_file):
with open(level_file, 'w') as f:
f.write('1')
if not os.path.exists(session_log):
open(session_log, 'w').close()
if not os.path.exists(total_time_file):
with open(total_time_file, 'w') as f:
f.write('0')
if not os.path.exists(questions_file):
raise FileNotFoundError(f"Questions file not found: {questions_file}")
# Constants
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
ASSETS_DIR = os.path.join(SCRIPT_DIR, 'assets')
XP_FILE = os.path.join(ASSETS_DIR, 'xp.txt')
LEVEL_FILE = os.path.join(ASSETS_DIR, 'level.txt')
SESSION_LOG = os.path.join(ASSETS_DIR, 'session.log')
QUESTIONS_FILE = os.path.join(ASSETS_DIR, 'questions.txt')
TOTAL_TIME_FILE = os.path.join(ASSETS_DIR, 'total_time.txt')
URL = "https://rol.redhat.com"
TIMER_MINUTES = 20
def log_session(session_log, status):
with open(session_log, 'a') as f:
# Utility Functions
def initialize_assets():
"""Ensure all necessary files and directories exist."""
os.makedirs(ASSETS_DIR, exist_ok=True)
for file_path, default_content in [
(XP_FILE, '0'),
(LEVEL_FILE, '1'),
(SESSION_LOG, ''),
(TOTAL_TIME_FILE, '0'),
]:
if not os.path.exists(file_path):
with open(file_path, 'w') as f:
f.write(default_content)
if not os.path.exists(QUESTIONS_FILE):
raise FileNotFoundError(f"Questions file not found: {QUESTIONS_FILE}")
def log_session(status):
"""Log session start or end with a timestamp."""
with open(SESSION_LOG, 'a') as f:
f.write(f"Session {status}: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
def display_summary(total_time_file, xp_file, level_file):
with open(total_time_file, 'r') as f:
total_time = int(f.read().strip())
with open(xp_file, 'r') as f:
xp = int(f.read().strip())
with open(level_file, 'r') as f:
level = int(f.read().strip())
hours, minutes = divmod(total_time, 60)
def display_summary():
"""Display a summary of total time, XP, and level."""
try:
with open(TOTAL_TIME_FILE, 'r') as f:
total_time = int(f.read().strip() or 0) # Handle empty file case
except FileNotFoundError:
total_time = 0
try:
with open(XP_FILE, 'r') as f:
xp = int(f.read().strip() or 0)
except FileNotFoundError:
xp = 0
try:
with open(LEVEL_FILE, 'r') as f:
level = int(f.read().strip() or 1)
except FileNotFoundError:
level = 1
hours, remainder = divmod(total_time, 3600)
minutes, seconds = divmod(remainder, 60)
print(f"Welcome to the RHEL Learning Script!")
print(f"Total session time: {hours} hours, {minutes} minutes, and {seconds} seconds.") # Ensure correct output
print(f"Current Level: {level}")
print(f"Current XP: {xp}")
print()
return total_time, xp, level
def kill_steam():
for proc in psutil.process_iter():
try:
if 'steam' in proc.name().lower():
proc.kill()
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
"""Kill Steam only before the session starts."""
for proc in psutil.process_iter(['name']):
if proc.info['name'] and "steam" in proc.info['name'].lower():
print("Stopping Steam...")
proc.kill()
def update_xp(correct):
"""Update XP and level based on whether the question was answered correctly."""
with open(XP_FILE, 'r') as f:
xp = int(f.read().strip() or 0)
with open(LEVEL_FILE, 'r') as f:
level = int(f.read().strip() or 1)
def update_xp(xp_file, level_file, session_log, correct):
with open(xp_file, 'r') as f:
xp = int(f.read().strip())
with open(level_file, 'r') as f:
level = int(f.read().strip())
if correct:
new_xp = xp + 10
xp += 10
else:
new_xp = max(0, xp - 5) # Ensure XP doesn't go below 0
if new_xp >= level * 100:
xp = max(0, xp - 5) # Ensure XP doesn't go below 0
if xp >= level * 100:
level += 1
new_xp -= (level - 1) * 100
xp -= (level - 1) * 100
messagebox.showinfo("LEVEL UP!", f"LEVEL UP! You are now Level {level}!")
with open(xp_file, 'w') as f:
f.write(str(new_xp))
with open(level_file, 'w') as f:
with open(XP_FILE, 'w') as f:
f.write(str(xp))
with open(LEVEL_FILE, 'w') as f:
f.write(str(level))
with open(session_log, 'a') as f:
f.write(f"XP and level updated: {new_xp} XP, Level {level}\n")
return new_xp, level
with open(SESSION_LOG, 'a') as f:
f.write(f"XP and level updated: {xp} XP, Level {level}\n")
return xp, level
def show_timer(minutes, questions_file, session_log, total_time, xp, level):
def update_timer():
nonlocal seconds_left
nonlocal seconds_left, elapsed_time
if seconds_left > 0:
seconds_left -= 1
elapsed_time += 1
hours, remainder = divmod(seconds_left, 3600)
minutes, seconds = divmod(remainder, 60)
timer_label.config(text=f"Time left: {hours:02}:{minutes:02}:{seconds:02}")
root.after(1000, update_timer)
else:
messagebox.showinfo("Time's up!", "The session has ended.")
with open(session_log, 'a') as f:
f.write(f"Session duration: {minutes} minutes\n")
root.destroy()
end_session()
def end_session():
with open(session_log, 'a') as f:
f.write(f"Session duration: {elapsed_time // 60} minutes and {elapsed_time % 60} seconds\n")
with open(TOTAL_TIME_FILE, 'w') as f:
f.write(str(total_time + elapsed_time))
root.destroy()
def on_closing():
end_session()
def check_answer():
selected_answer = answer_var.get()
if selected_answer == correct_answer:
messagebox.showinfo("Correct!", "You selected the correct answer.")
new_xp, new_level = update_xp(XP_FILE, LEVEL_FILE, SESSION_LOG, correct=True)
new_xp, new_level = update_xp(True)
else:
messagebox.showinfo("Incorrect", "You selected the wrong answer.")
new_xp, new_level = update_xp(XP_FILE, LEVEL_FILE, SESSION_LOG, correct=False)
new_xp, new_level = update_xp(False)
for button in radio_buttons:
button.config(state=tk.DISABLED)
xp_label.config(text=f"XP: {new_xp}")
@@ -102,8 +144,10 @@ def show_timer(minutes, questions_file, session_log, total_time, xp, level):
root = tk.Tk()
root.title("RHEL Learning Timer")
root.protocol("WM_DELETE_WINDOW", on_closing)
seconds_left = minutes * 60
elapsed_time = 0
timer_label = tk.Label(root, text=f"Time left: {minutes:02}:00:00", font=("Helvetica", 16))
timer_label.pack(pady=20)
@@ -114,7 +158,7 @@ def show_timer(minutes, questions_file, session_log, total_time, xp, level):
level_label = tk.Label(root, text=f"Level: {level}", font=("Helvetica", 14))
level_label.pack(pady=5)
total_time_label = tk.Label(root, text=f"Total session time: {total_time // 60} hours and {total_time % 60} minutes", font=("Helvetica", 14))
total_time_label = tk.Label(root, text=f"Total session time: {total_time // 3600} hours, {(total_time % 3600) // 60} minutes, and {total_time % 60} seconds", font=("Helvetica", 14))
total_time_label.pack(pady=5)
with open(questions_file, 'r') as f:
@@ -154,38 +198,27 @@ def open_firefox(url):
else:
print("No graphical environment detected. Skipping browser opening.")
# Constants
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
ASSETS_DIR = os.path.join(SCRIPT_DIR, 'assets')
XP_FILE = os.path.join(ASSETS_DIR, 'xp.txt')
LEVEL_FILE = os.path.join(ASSETS_DIR, 'level.txt')
SESSION_LOG = os.path.join(ASSETS_DIR, 'session.log')
QUESTIONS_FILE = os.path.join(ASSETS_DIR, 'questions.txt')
TOTAL_TIME_FILE = os.path.join(ASSETS_DIR, 'total_time.txt')
URL = "https://rol.redhat.com"
TIMER_MINUTES = 20
def main():
# Initialize assets
initialize_assets(ASSETS_DIR, XP_FILE, LEVEL_FILE, SESSION_LOG, TOTAL_TIME_FILE, QUESTIONS_FILE)
initialize_assets()
# Log session start
log_session(SESSION_LOG, "start")
log_session("start")
# Display session summary
total_time, xp, level = display_summary(TOTAL_TIME_FILE, XP_FILE, LEVEL_FILE)
total_time, xp, level = display_summary()
# Open Firefox to the specified URL
# Stop Steam before session
kill_steam()
# Open Firefox with RHEL Learning
open_firefox(URL)
# Start session
show_timer(TIMER_MINUTES, QUESTIONS_FILE, SESSION_LOG, total_time, xp, level)
# Log session end
log_session(SESSION_LOG, "end")
log_session("end")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "kill_steam":
kill_steam()
else:
main()
main()