forked from rDrama/rDrama
1
0
Fork 0
rDrama/files/helpers/stats.py

295 lines
10 KiB
Python
Raw Normal View History

from flask import g
import time
import calendar
import matplotlib.pyplot as plt
from sqlalchemy import *
from files.classes.user import User
from files.classes.submission import Submission
from files.classes.comment import Comment
from files.classes.votes import Vote, CommentVote
from files.classes.marsey import Marsey
from files.classes.award import AwardRelationship
from files.helpers.const import *
def generate_charts_task(site):
2022-09-04 23:15:37 +00:00
chart(kind='daily', site=site)
chart(kind='weekly', site=site)
def chart(kind, site):
now = time.gmtime()
midnight_this_morning = time.struct_time((
now.tm_year, now.tm_mon, now.tm_mday,
0, 0, 0,
now.tm_wday, now.tm_yday, 0))
today_cutoff = calendar.timegm(midnight_this_morning)
2022-08-01 19:37:57 +00:00
if SITE == 'rdrama.net':
time_diff = time.time() - 1619827200
num_of_weeks = int(time_diff / 604800)
chart_width = int(num_of_weeks/1.4)
else:
num_of_weeks = 30
chart_width = 30
if kind == 'daily':
day_cutoffs = [today_cutoff - 86400 * i for i in range(num_of_weeks)][1:]
else:
day_cutoffs = [today_cutoff - 86400 * 7 * i for i in range(num_of_weeks)][1:]
day_cutoffs.insert(0, calendar.timegm(now))
daily_times = [time.strftime('%d/%m', time.gmtime(day_cutoffs[i + 1]))
for i in range(len(day_cutoffs) - 1)][::-1]
daily_signups = [g.db.query(User).filter(
User.created_utc < day_cutoffs[i],
User.created_utc > day_cutoffs[i + 1]).count()
for i in range(len(day_cutoffs) - 1)][::-1]
post_stats = [g.db.query(Submission).filter(
Submission.created_utc < day_cutoffs[i],
Submission.created_utc > day_cutoffs[i + 1],
Submission.is_banned == False).count()
for i in range(len(day_cutoffs) - 1)][::-1]
comment_stats = [g.db.query(Comment).filter(
Comment.created_utc < day_cutoffs[i],
Comment.created_utc > day_cutoffs[i + 1],
Comment.is_banned == False,
Comment.author_id != AUTOJANNY_ID).count()
for i in range(len(day_cutoffs) - 1)][::-1]
plt.rcParams['figure.figsize'] = (chart_width, 20)
2022-08-17 20:30:07 +00:00
signup_chart = plt.subplot2grid((chart_width, 20), (0, 0), rowspan=6, colspan=chart_width)
2022-09-04 23:15:37 +00:00
posts_chart = plt.subplot2grid((chart_width, 20), (10, 0), rowspan=6, colspan=chart_width)
comments_chart = plt.subplot2grid((chart_width, 20), (20, 0), rowspan=6, colspan=chart_width)
signup_chart.grid(), posts_chart.grid(), comments_chart.grid()
2022-09-04 23:15:37 +00:00
signup_chart.plot(daily_times, daily_signups, color='red')
posts_chart.plot(daily_times, post_stats, color='blue')
comments_chart.plot(daily_times, comment_stats, color='purple')
signup_chart.set_ylim(ymin=0)
posts_chart.set_ylim(ymin=0)
comments_chart.set_ylim(ymin=0)
signup_chart.set_ylabel("Signups")
posts_chart.set_ylabel("Posts")
comments_chart.set_ylabel("Comments")
comments_chart.set_xlabel("Time (UTC)")
file = chart_path(kind, site)
2022-10-23 15:46:03 +00:00
plt.savefig(file, bbox_inches='tight')
plt.clf()
return file
def chart_path(kind, site):
return f'/{site}_{kind}.png'
def stats(site=None):
day = int(time.time()) - 86400
week = int(time.time()) - 604800
posters = g.db.query(Submission.author_id).distinct(Submission.author_id).filter(Submission.created_utc > week).all()
commenters = g.db.query(Comment.author_id).distinct(Comment.author_id).filter(Comment.created_utc > week).all()
voters = g.db.query(Vote.user_id).distinct(Vote.user_id).filter(Vote.created_utc > week).all()
commentvoters = g.db.query(CommentVote.user_id).distinct(CommentVote.user_id).filter(CommentVote.created_utc > week).all()
active_users = set(posters) | set(commenters) | set(voters) | set(commentvoters)
2022-11-02 04:32:38 +00:00
t = time.time()
one = g.db.query(Marsey).filter(Marsey.submitter_id==None).count()
print(f'one: {time.time() - t}', flush=True)
t = time.time()
two = g.db.query(User).count()
print(f'two: {time.time() - t}', flush=True)
t = time.time()
three = g.db.query(User).filter_by(is_private=True).count()
print(f'three: {time.time() - t}', flush=True)
t = time.time()
four = g.db.query(User).filter(User.is_banned > 0).count()
print(f'four: {time.time() - t}', flush=True)
t = time.time()
five = g.db.query(User).filter_by(is_activated=True).count()
print(f'five: {time.time() - t}', flush=True)
t = time.time()
six = g.db.query(func.sum(User.coins)).scalar()
print(f'six: {time.time() - t}', flush=True)
t = time.time()
seven = g.db.query(func.sum(User.coins_spent)).scalar()
print(f'seven: {time.time() - t}', flush=True)
t = time.time()
eight = g.db.query(User).filter(User.created_utc > day).count()
print(f'eight: {time.time() - t}', flush=True)
t = time.time()
nine = g.db.query(Submission).count()
print(f'nine: {time.time() - t}', flush=True)
t = time.time()
ten = g.db.query(Submission.author_id).distinct().count()
print(f'ten: {time.time() - t}', flush=True)
t = time.time()
eleven = g.db.query(Submission).filter_by(is_banned=False).filter(Submission.deleted_utc == 0).count()
print(f'eleven: {time.time() - t}', flush=True)
t = time.time()
twelve = g.db.query(Submission).filter_by(is_banned=True).count()
print(f'twelve: {time.time() - t}', flush=True)
t = time.time()
thirteen = g.db.query(Submission).filter(Submission.deleted_utc > 0).count()
print(f'thirteen: {time.time() - t}', flush=True)
t = time.time()
fourteen = g.db.query(Submission).filter(Submission.created_utc > day).count()
print(f'fourteen: {time.time() - t}', flush=True)
t = time.time()
fifteen = g.db.query(Comment).filter(Comment.author_id != AUTOJANNY_ID).count()
print(f'fifteen: {time.time() - t}', flush=True)
t = time.time()
sixteen = g.db.query(Comment.author_id).distinct().count()
print(f'sixteen: {time.time() - t}', flush=True)
t = time.time()
seventeen = g.db.query(Comment).filter_by(is_banned=True).count()
print(f'seventeen: {time.time() - t}', flush=True)
t = time.time()
eighteen = g.db.query(Comment).filter(Comment.deleted_utc > 0).count()
print(f'eighteen: {time.time() - t}', flush=True)
t = time.time()
ninteen = g.db.query(Comment).filter(Comment.created_utc > day, Comment.author_id != AUTOJANNY_ID).count()
print(f'ninteen: {time.time() - t}', flush=True)
t = time.time()
twenty = g.db.query(Vote).count()
print(f'twenty: {time.time() - t}', flush=True)
t = time.time()
twentyone = g.db.query(Vote.user_id).distinct().count()
print(f'twentyone: {time.time() - t}', flush=True)
t = time.time()
twentytwo = g.db.query(CommentVote).count()
print(f'twentytwo: {time.time() - t}', flush=True)
t = time.time()
twentythree = g.db.query(CommentVote.user_id).distinct().count()
print(f'twentythree: {time.time() - t}', flush=True)
t = time.time()
twentyfour = g.db.query(Vote).filter_by(vote_type=1).count() + g.db.query(CommentVote.comment_id).filter_by(vote_type=1).count()
print(f'twentyfour: {time.time() - t}', flush=True)
t = time.time()
twentyfive = g.db.query(Vote).filter_by(vote_type=-1).count() + g.db.query(CommentVote.comment_id).filter_by(vote_type=-1).count()
print(f'twentyfive: {time.time() - t}', flush=True)
t = time.time()
twentysix = g.db.query(AwardRelationship).count()
print(f'twentysix: {time.time() - t}', flush=True)
t = time.time()
twentyseven = g.db.query(AwardRelationship).filter(or_(AwardRelationship.submission_id != None, AwardRelationship.comment_id != None)).count()
print(f'twentyseven: {time.time() - t}', flush=True)
t = time.time()
twentyeight = len(active_users)
print(f'twentyeight: {time.time() - t}', flush=True)
t = time.time()
twentynine = g.db.query(User).filter(User.last_active > week).count()
print(f'twentynine: {time.time() - t}', flush=True)
t = time.time()
thirty = g.db.query(User).filter(User.house.like('Furry%')).count()
print(f'thirty: {time.time() - t}', flush=True)
t = time.time()
thirtyone = g.db.query(User).filter(User.house.like('Femboy%')).count()
print(f'thirtyone: {time.time() - t}', flush=True)
t = time.time()
thirtytwo = g.db.query(User).filter(User.house.like('Vampire%')).count()
print(f'thirtytwo: {time.time() - t}', flush=True)
t = time.time()
thirtythree = g.db.query(User).filter(User.house.like('Racist%')).count()
print(f'thirtythree: {time.time() - t}', flush=True)
t = time.time()
thirtyfour = g.db.query(func.sum(User.truecoins)).filter(User.house.like('Furry%')).scalar(),
print(f'thirtyfour: {time.time() - t}', flush=True)
t = time.time()
thirtyfive = g.db.query(func.sum(User.truecoins)).filter(User.house.like('Femboy%')).scalar()
print(f'thirtyfive: {time.time() - t}', flush=True)
t = time.time()
thirtysix = g.db.query(func.sum(User.truecoins)).filter(User.house.like('Vampire%')).scalar()
print(f'thirtysix: {time.time() - t}', flush=True)
t = time.time()
thirtyseven = g.db.query(func.sum(User.truecoins)).filter(User.house.like('Racist%')).scalar()
print(f'thirtyseven: {time.time() - t}', flush=True)
stats = {
2022-11-02 04:32:38 +00:00
"marseys": one,
"users": two,
"private users": three,
"banned users": four,
"verified email users": five,
"coins in circulation": six,
"total shop sales": seven,
"signups last 24h": eight,
"total posts": nine,
"posting users": ten,
"listed posts": eleven,
"removed posts (by admins)": twelve,
"deleted posts (by author)": thirteen,
"posts last 24h": fourteen,
"total comments": fifteen,
"commenting users": sixteen,
"removed comments (by admins)": seventeen,
"deleted comments (by author)": eighteen,
"comments last_24h": ninteen,
"post votes": twenty,
"post voting users": twentyone,
"comment votes": twentytwo,
"comment voting users": twentythree,
"total upvotes": twentyfour,
"total downvotes": twentyfive,
"total awards": twentysix,
"awards given": twentyseven,
"users who posted, commented, or voted in the past 7 days": twentyeight,
"users online in the past 7 days": twentynine,
}
2022-08-01 19:37:57 +00:00
if SITE_NAME == 'rDrama' or FEATURES['HOUSES']:
stats2 = {
2022-11-02 04:32:38 +00:00
"House furry members": thirty,
"House femboy members": thirtyone,
"House vampire members": thirtytwo,
"House racist members": thirtythree,
"House furry total truescore": thirtyfour,
"House femboy total truescore": thirtyfive,
"House vampire total truescore": thirtysix,
"House racist total truescore": thirtyseven,
}
stats.update(stats2)
return stats