You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

400 lines
11 KiB
Python

2 years ago
#from six.moves import urllib
2 years ago
import datetime
2 years ago
#from subprocess import call
2 years ago
from mastodon import Mastodon
2 years ago
#import time
#import threading
#import csv
2 years ago
import os
import json
2 years ago
#import time
#import signal
2 years ago
import sys
import os.path
import requests
import operator
2 years ago
#import redis
#import calendar
2 years ago
import psycopg2
import pdb
2 years ago
#from decimal import *
#getcontext().prec = 2
2 years ago
2 years ago
def mastodon():
# 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/config.txt"
mastodon_hostname = get_parameter("mastodon_hostname", config_filepath)
# 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}
return (mastodon, mastodon_hostname)
def db_config():
# Load db configuration from config file
config_filepath = "config/db_config.txt"
mastodon_db = get_parameter("mastodon_db", config_filepath)
mastodon_db_user = get_parameter("mastodon_db_user", config_filepath)
welcome_db = get_parameter("welcome_db", config_filepath)
welcome_db_user = get_parameter("welcome_db_user", config_filepath)
return (mastodon_db, mastodon_db_user, welcome_db, welcome_db_user)
2 years ago
# 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)
2 years ago
###############################################################################
# main
2 years ago
2 years ago
if __name__ == '__main__':
2 years ago
2 years ago
mastodon, mastodon_hostname = mastodon()
2 years ago
2 years ago
mastodon_db, mastodon_db_user, welcome_db, welcome_db_user = db_config()
2 years ago
2 years ago
###############################################################################
# current registered users
###############################################################################
2 years ago
2 years ago
try:
2 years ago
2 years ago
conn = None
2 years ago
2 years ago
conn = psycopg2.connect(database = mastodon_db, user = mastodon_db_user, password = "", host = "/var/run/postgresql", port = "5432")
2 years ago
2 years ago
cur = conn.cursor()
2 years ago
2 years ago
cur.execute("SELECT count(*) FROM users WHERE disabled='f' and approved='t'")
2 years ago
2 years ago
row = cur.fetchone()
2 years ago
2 years ago
if row != None:
2 years ago
2 years ago
current_id = row[0]
2 years ago
2 years ago
else:
2 years ago
2 years ago
current_id = 0
2 years ago
2 years ago
cur.close()
2 years ago
2 years ago
except (Exception, psycopg2.DatabaseError) as error:
2 years ago
2 years ago
print (error)
2 years ago
2 years ago
finally:
2 years ago
2 years ago
if conn is not None:
2 years ago
2 years ago
conn.close()
2 years ago
2 years ago
print("Current users: %s "% current_id)
2 years ago
2 years ago
###############################################################################
2 years ago
2 years ago
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2 years ago
2 years ago
users_before = current_id
users_hour = 0
2 years ago
2 years ago
conn = None
2 years ago
2 years ago
try:
2 years ago
2 years ago
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
2 years ago
2 years ago
cur = conn.cursor()
2 years ago
2 years ago
cur.execute("SELECT DISTINCT ON (datetime) users FROM welcome WHERE datetime > current_timestamp - INTERVAL '70 minutes' ORDER BY datetime asc LIMIT 1")
2 years ago
2 years ago
row = cur.fetchone()
2 years ago
2 years ago
users_before = row[0]
2 years ago
2 years ago
cur.close()
2 years ago
2 years ago
users_hour = current_id - users_before
2 years ago
2 years ago
except (Exception, psycopg2.DatabaseError) as error:
2 years ago
2 years ago
print (error)
2 years ago
2 years ago
finally:
2 years ago
2 years ago
if conn is not None:
2 years ago
2 years ago
conn.close()
print("-----------------")
print("current users: "+str(current_id))
print("users before: "+str(users_before))
print("users / hour: "+str(users_hour))
insert_sql = """INSERT INTO welcome(datetime, users, users_hour)
VALUES(%s,%s,%s) RETURNING datetime;"""
2 years ago
conn = None
2 years ago
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
2 years ago
2 years ago
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
2 years ago
2 years ago
cur = conn.cursor()
2 years ago
2 years ago
cur.execute(insert_sql, (now, current_id, users_hour))
2 years ago
2 years ago
datetime = cur.fetchone()[0]
2 years ago
2 years ago
conn.commit()
2 years ago
2 years ago
cur.close()
2 years ago
2 years ago
except (Exception, psycopg2.DatabaseError) as error:
2 years ago
2 years ago
print(error)
2 years ago
2 years ago
finally:
2 years ago
2 years ago
if conn is not None:
2 years ago
2 years ago
conn.close()
2 years ago
2 years ago
###############################################################################
# WORK OUT THE TOOT TEXT
###############################################################################
2 years ago
2 years ago
# Calculate difference in times
2 years ago
2 years ago
hourly_change_string = ""
daily_change_string = ""
weekly_change_string = ""
users_hourly_change_string = ""
2 years ago
2 years ago
try:
2 years ago
2 years ago
conn = None
2 years ago
2 years ago
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
2 years ago
2 years ago
cur = conn.cursor()
2 years ago
2 years ago
cur.execute("SELECT DISTINCT ON (datetime) users, datetime FROM welcome WHERE datetime > current_timestamp - INTERVAL '62 minutes' ORDER BY datetime asc LIMIT 1")
2 years ago
2 years ago
row = cur.fetchone()
2 years ago
2 years ago
if row[0] == None:
2 years ago
2 years ago
users_last_hour = 0
2 years ago
2 years ago
else:
2 years ago
2 years ago
users_last_hour = row[0]
2 years ago
2 years ago
cur.execute("SELECT DISTINCT ON (datetime) users,datetime FROM welcome WHERE datetime > current_timestamp - INTERVAL '1 day' ORDER BY datetime asc LIMIT 1")
2 years ago
2 years ago
row = cur.fetchone()
2 years ago
2 years ago
if row[0] == None:
2 years ago
2 years ago
users_last_day = 0
2 years ago
2 years ago
else:
2 years ago
2 years ago
users_last_day = row[0]
2 years ago
2 years ago
cur.execute("SELECT DISTINCT ON (datetime) users,datetime FROM welcome WHERE datetime > current_timestamp - INTERVAL '7 days' ORDER BY datetime asc LIMIT 1")
2 years ago
2 years ago
row = cur.fetchone()
2 years ago
2 years ago
if row[0] == None:
2 years ago
2 years ago
users_last_week = 0
else:
2 years ago
2 years ago
users_last_week = row[0]
2 years ago
2 years ago
cur.close()
2 years ago
2 years ago
except (Exception, psycopg2.DatabaseError) as error:
2 years ago
2 years ago
print (error)
2 years ago
2 years ago
finally:
2 years ago
2 years ago
if conn is not None:
2 years ago
2 years ago
conn.close()
2 years ago
2 years ago
#################################################################################
2 years ago
2 years ago
welcome_users = []
2 years ago
2 years ago
if time.localtime().tm_isdst == 0:
2 years ago
2 years ago
interval_time = '60 minutes'
2 years ago
2 years ago
elif time.localtime().tm_isdst == 1:
2 years ago
2 years ago
interval_time = '120 minutes'
2 years ago
2 years ago
conn = None
2 years ago
2 years ago
try:
2 years ago
2 years ago
conn = psycopg2.connect(database = mastodon_db, user = mastodon_db_user, password = "", host = "/var/run/postgresql", port = "5432")
2 years ago
2 years ago
cur = conn.cursor()
2 years ago
2 years ago
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)")
2 years ago
2 years ago
rows = cur.fetchall()
2 years ago
2 years ago
for row in rows:
2 years ago
2 years ago
if row[1] == None:
2 years ago
2 years ago
welcome_users.append(row[0])
2 years ago
2 years ago
cur.close()
2 years ago
2 years ago
except (Exception, psycopg2.DatabaseError) as error:
2 years ago
2 years ago
print(error)
2 years ago
2 years ago
finally:
2 years ago
2 years ago
if conn is not None:
2 years ago
2 years ago
conn.close()
2 years ago
2 years ago
i = 0
2 years ago
2 years ago
new_users_string = ""
2 years ago
2 years ago
while i < len(welcome_users):
2 years ago
2 years ago
new_users_string = new_users_string+"@"+welcome_users[i]
i += 1
if i < len(welcome_users):
new_users_string = new_users_string+", "
#########################################################################################################
hour_inc = current_id - users_last_hour
day_inc = current_id - users_last_day
week_inc = current_id - users_last_week
print("------------------------")
print("new users last hour: "+str(hour_inc))
print("new users last day: "+str(day_inc))
print("new users last week: "+str(week_inc))
###################################################################################
# Hourly change
if hour_inc != 0:
users_hourly_change = current_id - users_last_hour
print("Hourly users evolution: %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 day_inc != 0:
daily_change = current_id - users_last_day
print("Daily users evolution: %s"%daily_change)
if daily_change > 0:
daily_change_string = "+" + format(daily_change, ",d") + " in the last day\n"
# Weekly change
if week_inc != 0:
weekly_change = current_id - users_last_week
print("Weekly users evolution: %s"%weekly_change)
if weekly_change > 0:
weekly_change_string = "+" + format(weekly_change, ",d") + " in the last week\n"
elif users_hourly_change < 0:
hourly_change_string = format(users_hourly_change, ",d") + " in the last hour\n"
# Daily change
if day_inc != 0:
daily_change = current_id - users_last_day
print("Daily evolution: %s"%daily_change)
if daily_change < 0:
daily_change_string = format(daily_change, ",d") + " in the last day\n"
# Weekly change
if week_inc != 0:
weekly_change = current_id - users_last_week
print("Weekly evolution: %s"%weekly_change)
if weekly_change < 0:
weekly_change_string = format(weekly_change, ",d") + " in the last week\n"
###############################################################################
# TOOT IT!
###############################################################################
if len(welcome_users) > 0:
toot_text = "\n"
toot_text += mastodon_hostname + " welcomes:" + "\n\n"
toot_text += new_users_string + "\n"
toot_text += "\n"
toot_text += "\n\nWe have " + str(current_id) + " users\n\n"
toot_text += hourly_change_string
toot_text += daily_change_string
toot_text += weekly_change_string
toot_text += "\n"
print("Tooting...")
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)
2 years ago
2 years ago
print("Done!")