Skip to content

Commit

Permalink
Merge pull request #2 from Arxari/users
Browse files Browse the repository at this point in the history
User accounts
  • Loading branch information
Arxari authored Sep 6, 2024
2 parents bb8468b + c739684 commit 8705502
Showing 1 changed file with 56 additions and 10 deletions.
66 changes: 56 additions & 10 deletions webui.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
import threading
import time
import requests
import logging

app = Flask(__name__)

app.secret_key = 'arxdeari'

USER_DIR = os.path.join(os.path.dirname(__file__), 'users')

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

user_alarm_threads = {}

def load_user_config(username):
"""Loads saved alarms for the user from their config.txt file."""
alarms = {}
Expand All @@ -24,6 +27,7 @@ def load_user_config(username):
intensity = int(config[section]['intensity'])
duration = int(config[section]['duration'])
alarms[section] = (alarm_time, intensity, duration)
logging.debug(f"Loaded alarms for user {username}: {alarms}")
return alarms

def save_alarm_to_user_config(username, alarm_name, alarm_time, intensity, duration):
Expand All @@ -41,6 +45,7 @@ def save_alarm_to_user_config(username, alarm_name, alarm_time, intensity, durat

with open(user_config_file, 'w') as configfile:
config.write(configfile)
logging.debug(f"Saved alarm for user {username}: {alarm_name} at {alarm_time}")

def load_user_env(username):
"""Loads the API key and Shock ID from the user's .env file."""
Expand All @@ -50,7 +55,9 @@ def load_user_env(username):
config.read(user_env_file)
api_key = config['DEFAULT'].get('SHOCK_API_KEY')
shock_id = config['DEFAULT'].get('SHOCK_ID')
logging.debug(f"Loaded env for user {username}: API Key: {'*' * len(api_key)}, Shock ID: {shock_id}")
return api_key, shock_id
logging.warning(f"No .env file found for user {username}")
return None, None

def save_user_env(username, api_key, shock_id):
Expand All @@ -63,6 +70,7 @@ def save_user_env(username, api_key, shock_id):
}
with open(user_env_file, 'w') as configfile:
config.write(configfile)
logging.debug(f"Saved env for user {username}: API Key: {'*' * len(api_key)}, Shock ID: {shock_id}")

def trigger_shock(api_key, shock_id, intensity, duration):
"""Sends a shock command to the OpenShock API."""
Expand All @@ -84,22 +92,50 @@ def trigger_shock(api_key, shock_id, intensity, duration):
'customName': 'OpenShockClock'
}

response = requests.post(url=url, headers=headers, json=payload)
try:
response = requests.post(url=url, headers=headers, json=payload)
response.raise_for_status()
logging.info(f"Shock triggered successfully: Intensity {intensity}, Duration {duration}")
except requests.RequestException as e:
logging.error(f"Failed to send shock. Error: {str(e)}")

if response.status_code != 200:
print(f"Failed to send shock. Response: {response.content}")

def update_alarms(username, alarms, api_key, shock_id):
def update_alarms(username):
"""Updates the alarms for the next day and checks if they need to be triggered."""
logging.info(f"Starting alarm update thread for user {username}")
while True:
alarms = load_user_config(username)
api_key, shock_id = load_user_env(username)

if not api_key or not shock_id:
logging.warning(f"Missing API key or Shock ID for user {username}")
time.sleep(60)
continue

now = datetime.now()
for name, (alarm_time, intensity, duration) in list(alarms.items()):
if now >= alarm_time:
logging.info(f"Triggering alarm {name} for user {username}")
trigger_shock(api_key, shock_id, intensity, duration)
alarms[name] = (alarm_time + timedelta(days=1), intensity, duration)
save_alarm_to_user_config(username, name, alarms[name][0], intensity, duration)

next_alarm_time = alarm_time + timedelta(days=1)
alarms[name] = (next_alarm_time, intensity, duration)
save_alarm_to_user_config(username, name, next_alarm_time, intensity, duration)
logging.info(f"Updated alarm {name} for user {username} to next day: {next_alarm_time}")

time.sleep(60)

def start_user_alarm_thread(username):
"""Starts a thread to handle alarms for a specific user."""
if username in user_alarm_threads and user_alarm_threads[username].is_alive():
logging.info(f"Alarm thread for user {username} is already running")
return

thread = threading.Thread(target=update_alarms, args=(username,))
thread.daemon = True
thread.start()
user_alarm_threads[username] = thread
logging.info(f"Started alarm thread for user {username}")

@app.route('/')
def index():
if 'username' not in session:
Expand Down Expand Up @@ -130,6 +166,9 @@ def add_alarm():
if alarm_time < datetime.now():
alarm_time += timedelta(days=1)
save_alarm_to_user_config(username, name, alarm_time, intensity, duration)

start_user_alarm_thread(username)

return redirect(url_for('index'))
return render_template('add_alarm.html')

Expand All @@ -144,6 +183,9 @@ def setup():
api_key = request.form['api_key']
shock_id = request.form['shock_id']
save_user_env(username, api_key, shock_id)

start_user_alarm_thread(username)

return redirect(url_for('index'))
else:
api_key, shock_id = load_user_env(username)
Expand Down Expand Up @@ -181,6 +223,7 @@ def login():

if username in users and users[username] == password:
session['username'] = username
start_user_alarm_thread(username)
return redirect(url_for('index'))
else:
flash('Invalid username or password.')
Expand All @@ -189,7 +232,10 @@ def login():

@app.route('/logout')
def logout():
session.pop('username', None)
username = session.pop('username', None)
if username in user_alarm_threads:
del user_alarm_threads[username]
logging.info(f"Removed alarm thread for user {username}")
return redirect(url_for('login'))

if __name__ == '__main__':
Expand Down

0 comments on commit 8705502

Please sign in to comment.