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!")