ironGym/worker/main.py
2025-08-04 06:24:13 +00:00

240 lines
9.4 KiB
Python

import schedule
import time
from datetime import timedelta
import datetime
from dotenv import load_dotenv # load env variables
import pymongo # for connecting to the db
import os
class MAIN():
def __init__(self):
load_dotenv()
self.db_client : {} = pymongo.MongoClient(os.getenv("DB_URI"))
self.log_dir : str = 'logs'
self.log_file : str = 'scheduler.log'
self.db_name = "Infinity"
# statistics
def save_this_week_overview_into_this_month(self):
db = self.db_client[self.db_name]
collection = db["statistics"]
query , projection = {} , {"listsTracking.thisWeek" : 1}
docs = collection.find(query , projection)
# Get the current date
current_date = datetime.date.today()
day = current_date.day
current_week_number = (day - 1) // 7 + 1
# each doc is related to specific user
for doc in docs:
year , month , week , days = doc["listsTracking"]["thisWeek"]["year"] , doc["listsTracking"]["thisWeek"]["month"], doc["listsTracking"]["thisWeek"]["week"], doc["listsTracking"]["thisWeek"]["days"]
this_month_exist = collection.find_one({"listsTracking.months.year": year , "listsTracking.months.month" : month})
# push the week to the related month
if not this_month_exist:
month_obj = {
"year": year,
"month": month,
"weeks": []
}
collection.update_one({} ,
{
"$push": {
"listsTracking.months": month_obj
}
}
)
week_obj = {
"week": week,
"days": days,
}
collection.update_one({"listsTracking.months.month": month} ,
{
"$push": {
"listsTracking.months.$.weeks": week_obj
}
}
)
else : # the month exist & at least contain one week
week_obj = {
"week": week,
"days": days,
}
collection.update_one({"listsTracking.months.month": month} ,
{
"$push": {
"listsTracking.months.$.weeks": week_obj
}
}
)
# reset the thisWeek data
collection.update_one({} , {
"$set" : {
"listsTracking.thisWeek": {
"year": year,
"month": datetime.datetime.today().month - 1,
"week": current_week_number,
"days" : {
"sat": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
},
"sun": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
},
"mon": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
},
"tue": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
},
"wed": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
},
"thu": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
},
"fri": {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
}
}
}
}
})
# save to the log file
log_line = '----------------------------------------' + '\n' + 'The week ' + str(week) + ' has been saved into the month ' + str(month) + '\n' + '----------------------------------------' + '\n'
with open(self.log_dir+'/'+self.log_file , 'a') as f:
f.write(log_line)
def save_this_month_overview_into_this_year(self):
current_month = datetime.datetime.now().month
db = self.db_client[self.db_name]
collection = db["statistics"]
query , projection = {"listsTracking.months.month" : current_month} , {"listsTracking.months.$" : 1}
docs = collection.find(query , projection)
for doc in docs:
year , month , weeks = doc['listsTracking']['months'][0]['year'] , doc['listsTracking']['months'][0]['month'] , doc['listsTracking']['months'][0]['weeks']
year_doc = collection.find_one({'listsTracking.years.year': year})
if not year_doc:
collection.update_one({} , {
'$push': {
'listsTracking.years': {
'year': year,
'months': []
}
}
})
collection.update_one({'listsTracking.years.year': year} , {
'$push': {
'listsTracking.years.$.months': doc['listsTracking']['months'][0]
}
})
elif year_doc:
collection.update_one({'listsTracking.years.year': year} , {
'$push': {
'listsTracking.years.$.months': doc['listsTracking']['months'][0]
}
})
# save to the log file
log_line = '----------------------------------------' + '\n' + 'The month ' + str(month) + ' has been saved into the year ' + str(year) + '\n' + '----------------------------------------' + '\n'
with open(self.log_dir+'/'+self.log_file , 'a') as f:
f.write(log_line)
def save_this_day_members_overview(self):
days_arr = ['sun','mon','tue','wed','thu','fri','sat']
# set the coll
db = self.db_client[self.db_name]
members_coll = db["members"]
statistics_coll = db["statistics"]
# get all members
members_doc = list(members_coll.find({}))
# generate the report
report = {
'totalMembers': 0,
'totalActiveSubs': 0,
'totalUnActiveSubs': 0,
'totalMansMembers': 0,
'totalGirlsMembers': 0,
}
print(members_doc , "members_doc")
# total members
report["totalMembers"] = len(members_doc)
# totalActiveSubs totalUnActiveSubs totalMansMembers totalGirlsMembers
activeSubs = 0
totalMans = 0
for doc in members_doc:
if doc["active"]:
activeSubs = activeSubs + 1
if doc["gendre"] == 'm':
totalMans = totalMans + 1
report["totalActiveSubs"] = activeSubs
report["totalUnActiveSubs"] = len(members_doc) - activeSubs
report["totalMansMembers"] = totalMans
report["totalGirlsMembers"] = len(members_doc) - totalMans
# save the report
statistics_coll.update_one({} , {
'$set': {
'listsTracking.thisWeek.days.{}'.format(days_arr[int(datetime.datetime.today().strftime('%w'))]) : report
}
})
def core(self):
schedule.every().saturday.at("23:59").do(self.save_this_week_overview_into_this_month)
schedule.every().day.at("01:00").do(self.save_this_day_members_overview)
# Check if today is the last day of the month
now = datetime.datetime.now()
last_day_of_month = (now + timedelta(days=32 - now.day)).replace(day=1) - timedelta(days=1)
if now == last_day_of_month:
self.save_this_month_overview_into_this_year()
if __name__ == '__main__':
main = MAIN()
main.core()
# Run the scheduled tasks in a loop
while True:
schedule.run_pending()
time.sleep(10)