From ecddfe1ef3bfd670d0e9ade59cc93f8bb2d9e57b Mon Sep 17 00:00:00 2001 From: spla Date: Tue, 18 May 2021 19:11:26 +0200 Subject: [PATCH] wip --- welcome.py | 464 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 464 insertions(+) create mode 100644 welcome.py diff --git a/welcome.py b/welcome.py new file mode 100644 index 0000000..7e6000d --- /dev/null +++ b/welcome.py @@ -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!")