This commit is contained in:
spla 2021-05-18 19:11:26 +02:00
commit ecddfe1ef3

464
welcome.py Normal file
View file

@ -0,0 +1,464 @@
from six.moves import urllib
import datetime
from subprocess import call
from mastodon import Mastodon
import time
import threading
import csv
import os
import json
import time
import signal
import sys
import os.path
import requests
import operator
import redis
import calendar
import psycopg2
import pdb
from decimal import *
getcontext().prec = 2
###############################################################################
# INITIALISATION
###############################################################################
# Returns the parameter from the specified file
def get_parameter( parameter, file_path ):
# Check if secrets file exists
if not os.path.isfile(file_path):
print("File %s not found, exiting."%file_path)
sys.exit(0)
# Find parameter in file
with open( file_path ) as f:
for line in f:
if line.startswith( parameter ):
return line.replace(parameter + ":", "").strip()
# Cannot find parameter, exit
print(file_path + " Missing parameter %s "%parameter)
sys.exit(0)
# Load secrets from secrets file
secrets_filepath = "secrets/secrets.txt"
uc_client_id = get_parameter("uc_client_id", secrets_filepath)
uc_client_secret = get_parameter("uc_client_secret", secrets_filepath)
uc_access_token = get_parameter("uc_access_token", secrets_filepath)
# Load configuration from config file
config_filepath = "config.txt"
mastodon_hostname = get_parameter("mastodon_hostname", config_filepath) # E.g., mastodon.social
# Initialise Mastodon API
mastodon = Mastodon(
client_id = uc_client_id,
client_secret = uc_client_secret,
access_token = uc_access_token,
api_base_url = 'https://' + mastodon_hostname,
)
# Initialise access headers
headers={ 'Authorization': 'Bearer %s'%uc_access_token }
###############################################################################
# current registered users
###############################################################################
try:
conn = None
conn = psycopg2.connect(database = "mastodon_production", user = "mastodon", password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute("SELECT count(*) FROM users WHERE disabled='f' and approved='t'")
row = cur.fetchone()
if row != None:
current_id = row[0]
else:
current_id = 0
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print (error)
finally:
if conn is not None:
conn.close()
print("Número d'usuaris: %s "% current_id)
###############################################################################
ara = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
###############################################################################
# Redis 25/10/18 connectar amb Redis per a obtenir l'activitat setmanal
###############################################################################
redis_host = "localhost"
redis_port = 6379
redis_password = ""
setmana_actual = str(datetime.datetime.now().isocalendar()[1])
r = redis.StrictRedis(host=redis_host, port=redis_port, password=redis_password, decode_responses=True)
# Interaccions setmana actual
interaccions = r.get("activity:interactions:"+setmana_actual)
if interaccions == None:
interaccions = 0
print("Interaccions d'aquesta setmana: %s "% interaccions)
actius = r.pfcount("activity:logins:"+setmana_actual)
print("Usuaris actius aquesta setmana: %s "% actius)
###############################################################################
# Connectar amb la bbdd Postgres per obtenir la darrera fila i els seus usuaris
###############################################################################
usuaris_abans = current_id
toots_abans = num_toots
instancies_abans = num_instances
usuarishora = 0
tootshora = 0
instancieshora = 0
toots_inici_setmana = num_toots
inc_disc_space_hour = 0
toots_actius = 0.00
conn = None
try:
conn = psycopg2.connect(database = "pggrafana", user = "mastodon", password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute("SELECT DISTINCT ON (datetime) usuaris,toots,instancies,datetime,used_disk_space FROM grafana WHERE datetime > current_timestamp - INTERVAL '70 minutes' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
usuaris_abans = row[0]
toots_abans = row[1]
instancies_abans = row[2]
disc_space_before = row[4]
# quants toots en l'inici de la setmana
cur.execute("SELECT DISTINCT ON (datetime) toots, datetime FROM grafana WHERE datetime > date_trunc('week', now()::timestamp) ORDER by datetime asc LIMIT 1")
row = cur.fetchone()
if row == None:
toots_inici_setmana = num_toots
else:
toots_inici_setmana = row[0]
cur.close()
usuarishora = current_id - usuaris_abans
tootshora = num_toots - toots_abans
instancieshora = num_instances - instancies_abans
inc_disc_space_hour = db_disk_space - disc_space_before
except (Exception, psycopg2.DatabaseError) as error:
print (error)
finally:
if conn is not None:
conn.close()
if toots_inici_setmana == num_toots:
toots_actius = 0.00
elif actius == 0:
toots_actius = 0.00
else:
toots_actius = round((num_toots-toots_inici_setmana)/actius, 2)
print("-----------------")
print("current_id: "+str(current_id))
print("usuaris abans: "+str(usuaris_abans))
print("usuaris hora: "+str(usuarishora))
print("-----------------")
print("toots: "+str(num_toots))
print("toots abans: "+str(toots_abans))
print("toots x hora: "+str(tootshora))
print("-----------------")
print("instancies: "+str(num_instances))
print("instancies abans: "+str(instancies_abans))
print("instancies x hora: "+str(instancieshora))
print("-----------------")
print("toots aquesta setmana:"+str(num_toots-toots_inici_setmana))
print("usuaris actius:"+str(actius))
print("toots x actius: "+str(toots_actius))
print("------------------------")
print(" spla @ 2018 - 2020 ")
print("------------------------")
######################################################################################################################################
# Connectar amb la bbdd Postgres pggrafana per guardar les variables per grafana
inserta_linia = """INSERT INTO grafana(datetime, usuaris, usuarishora, toots, tootshora, tootsusuari, interaccions, actius, actius30, instancies, instancieshora, tootsactius,
used_disk_space, disc_space_hour)
VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) RETURNING datetime;"""
conn = None
ara = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
conn = psycopg2.connect(database = "pggrafana", user = "mastodon", password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
# executem INSERT
cur.execute(inserta_linia, (ara, current_id, usuarishora, num_toots, tootshora, toots_per_usuari, interaccions, actius, actius30, num_instances, instancieshora, toots_actius, db_disk_space, inc_disc_space_hour))
# obté l'id
datetime = cur.fetchone()[0]
# salvar els canvis en la base de dades
conn.commit()
# i tancar la connexió amb la base de dades
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
###############################################################################
# WORK OUT THE TOOT TEXT
###############################################################################
# Calculate difference in times
hourly_change_string = ""
daily_change_string = ""
weekly_change_string = ""
# canvi horari usuaris 19/05/18
users_hourly_change_string = ""
#######################################################################################################################
# Connectar amb la bbdd Postgres per obtenir increment usuaris en la darrera hora, el darrer dia i en la darrera setmana
########################################################################################################################
try:
conn = None
conn = psycopg2.connect(database = "pggrafana", user = "mastodon", password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute("SELECT DISTINCT ON (datetime) usuaris,datetime FROM grafana WHERE datetime > current_timestamp - INTERVAL '62 minutes' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
if row[0] == None:
usuaris_fa_una_hora = 0
else:
usuaris_fa_una_hora = row[0]
cur.execute("SELECT DISTINCT ON (datetime) usuaris,datetime FROM grafana WHERE datetime > current_timestamp - INTERVAL '1 day' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
if row[0] == None:
usuaris_fa_un_dia = 0
else:
usuaris_fa_un_dia = row[0]
cur.execute("SELECT DISTINCT ON (datetime) usuaris,datetime FROM grafana WHERE datetime > current_timestamp - INTERVAL '7 days' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
if row[0] == None:
usuaris_fa_una_setmana = 0
else:
usuaris_fa_una_setmana = row[0]
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print (error)
finally:
if conn is not None:
conn.close()
#################################################################################
saludar_usuaris = []
if time.localtime().tm_isdst == 0:
interval_time = '60 minutes'
elif time.localtime().tm_isdst == 1:
interval_time = '120 minutes'
conn = None
try:
conn = psycopg2.connect(database = "mastodon_production", user = "mastodon", password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute("select username, domain from accounts where (created_at + interval '" + interval_time + "' > (now() - interval '1 hour')) and domain is null and id in (select account_id from users where approved and not disabled)")
#cur.execute("select username, domain from accounts where id in (select account_id from follows where (created_at + interval '" + interval_time + "' > (now() - interval '60 minutes')) and target_account_id = '1')")
rows = cur.fetchall()
for row in rows:
if row[1] == None:
saludar_usuaris.append(row[0]) ## guarda els username dels usuaris en l'array saludar_usuaris
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
i = 0
cadena_nous = ""
while i < len(saludar_usuaris):
cadena_nous = cadena_nous+"@"+saludar_usuaris[i]
i += 1
if i < len(saludar_usuaris):
cadena_nous = cadena_nous+", "
#########################################################################################################
inc_hora = current_id - usuaris_fa_una_hora
inc_dia = current_id - usuaris_fa_un_dia
inc_setmana = current_id - usuaris_fa_una_setmana
print("------------------------")
print("increment usuaris hora: "+str(inc_hora))
print("increment usuaris dia: "+str(inc_dia))
print("increment usuaris setmana: "+str(inc_setmana))
print("------------------------")
print(" spla @ 2018 - 2021 ")
print("------------------------")
###################################################################################
# Hourly change
if inc_hora != 0:
users_hourly_change = current_id - usuaris_fa_una_hora
print("Evolució horaria usuaris: %s"%users_hourly_change)
if users_hourly_change > 0:
hourly_change_string = "+" + format(users_hourly_change, ",d") + " en la darrera hora\n"
# Daily change
if inc_dia != 0:
daily_change = current_id - usuaris_fa_un_dia
print("Evolució diaria: %s"%daily_change)
if daily_change > 0:
daily_change_string = "+" + format(daily_change, ",d") + " en el darrer dia\n"
# Weekly change
if inc_setmana != 0:
weekly_change = current_id - usuaris_fa_una_setmana
print("Evolució setmanal: %s"%weekly_change)
if weekly_change > 0:
weekly_change_string = "+" + format(weekly_change, ",d") + " en la darrera setmana\n"
elif users_hourly_change < 0:
hourly_change_string = format(users_hourly_change, ",d") + " en la darrera hora\n"
# Daily change
if inc_dia != 0:
daily_change = current_id - usuaris_fa_un_dia
print("Evolució diaria: %s"%daily_change)
if daily_change < 0:
daily_change_string = format(daily_change, ",d") + " en el darrer dia\n"
# Weekly change
if inc_setmana != 0:
weekly_change = current_id - usuaris_fa_una_setmana
print("Evolució setmanal: %s"%weekly_change)
if weekly_change < 0:
weekly_change_string = format(weekly_change, ",d") + " en la darrera setmana\n"
###############################################################################
# TOOT IT!
###############################################################################
if len(saludar_usuaris) > 0:
toot_text = "\n"
toot_text += "mastodont.cat dona la benvinguda a:" + "\n\n"
toot_text += cadena_nous + "\n"
toot_text += "\n"
toot_text += " :mastodon: :senyera: :brindis: " + "\n"
toot_text += "\n"
#toot_text += "Toots publicats: %s "% num_toots + "\n"
#toot_text += "Toots per usuari: %s "% toots_per_usuari + "\n"
#toot_text += "Activitat setmana actual" + "\n"
#toot_text += "Interaccions: %s "% interaccions + "\n"
##toot_text += "Usuaris actius: %s "% actius + "\n"
#toot_text += "Instàncies connectades: %s "% num_instances + "\n"
toot_text += "\najuda: https://ajuda.mastodont.cat"
toot_text += "\n\nJa som " + str(current_id) + " usuaris\n\n"
toot_text += hourly_change_string
toot_text += daily_change_string
toot_text += weekly_change_string
toot_text += "\n\nMés #estadístiques gràfiques a: https://grafana.mastodont.cat/d/imEDcXfmk/mastodont-cat?orgId=1&kiosk" + "\n"
print("Tootejant...")
print(toot_text)
if len(toot_text) < 500:
mastodon.status_post(toot_text, in_reply_to_id=None, )
else:
toot_text1, toot_text2 = toot_text[:int(len(toot_text)/2)], toot_text[int(len(toot_text)/2):]
toot_id = mastodon.status_post(toot_text1, in_reply_to_id=None,)
mastodon.status_post(toot_text2, in_reply_to_id=toot_id,)
print(toot_text1)
print(toot_text2)
print("Tootejat amb èxit!")