New endpoint admin.sign_up avoids using database at all

This commit is contained in:
spla 2022-08-14 20:13:35 +02:00
pare d32cf1614a
commit bbe91e3121
S'han modificat 2 arxius amb 46 adicions i 582 eliminacions

Veure arxiu

@ -1,160 +0,0 @@
#import getpass
import os
import sys
import psycopg2
from psycopg2 import sql
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
# 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, asking."%file_path)
write_parameter( parameter, 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)
def write_parameter( parameter, file_path ):
if not os.path.exists('config'):
os.makedirs('config')
print("Setting up welcome parameters...")
print("\n")
welcome_db = input("welcome db name: ")
welcome_db_user = input("welcome db user: ")
mastodon_db = input("Mastodon db name: ")
mastodon_db_user = input("Mastodon db user: ")
with open(file_path, "w") as text_file:
print("welcome_db: {}".format(welcome_db), file=text_file)
print("welcome_db_user: {}".format(welcome_db_user), file=text_file)
print("mastodon_db: {}".format(mastodon_db), file=text_file)
print("mastodon_db_user: {}".format(mastodon_db_user), file=text_file)
def create_table(db, db_user, table, sql):
conn = None
try:
conn = psycopg2.connect(database = db, user = db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
print("Creating table.. "+table)
# Create the table in PostgreSQL database
cur.execute(sql)
conn.commit()
print("Table "+table+" created!")
print("\n")
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
###############################################################################
# main
if __name__ == '__main__':
# Load configuration from config file
config_filepath = "config/db_config.txt"
welcome_db = get_parameter("welcome_db", config_filepath)
welcome_db_user = get_parameter("welcome_db_user", config_filepath)
mastodon_db = get_parameter("mastodon_db", config_filepath)
mastodon_db_user = get_parameter("mastodon_db_user", config_filepath)
############################################################
# create database
############################################################
conn = None
try:
conn = psycopg2.connect(dbname='postgres',
user=welcome_db_user, host='',
password='')
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = conn.cursor()
print("Creating database " + welcome_db + ". Please wait...")
cur.execute(sql.SQL("CREATE DATABASE {}").format(
sql.Identifier(welcome_db))
)
print("Database " + welcome_db + " created!")
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
############################################################
try:
conn = None
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
except (Exception, psycopg2.DatabaseError) as error:
print(error)
# Load configuration from config file
os.remove("config/db_config.txt")
print("Exiting. Run db-setup again with right parameters")
sys.exit(0)
finally:
if conn is not None:
conn.close()
print("\n")
print("welcome parameters saved to db-config.txt!")
print("\n")
############################################################
# Create needed tables
############################################################
print("Creating table...")
db = welcome_db
db_user = welcome_db_user
table = "welcome"
sql = "create table "+table+" (datetime timestamptz PRIMARY KEY, users int, users_hour int)"
create_table(db, db_user, table, sql)
############################################################
print("Done!")
print("Now you can run setup.py!")
print("\n")

Veure arxiu

@ -1,21 +1,47 @@
import datetime
from mastodon import Mastodon from mastodon import Mastodon
import time import re
import os import os
import json import time
import sys import sys
import os.path import os.path
import operator
import psycopg2
import pdb
def mastodon(): def get_data(notification):
notification_id = notification.id
if notification.type != 'admin.sign_up':
print(f'dismissing notification {notification_id}')
mastodon.notifications_dismiss(notification_id)
return
account_id = notification.account.id
username = notification.account.acct
toot_text = f'{mastodon_hostname} dona la benvinguda a:\n\n'
toot_text += f'@{username}!\n\n'
toot_text += "Gràcies per escollir-nos!\n"
toot_text += "Ens agradaria que et presentessis una mica. Gràcies de nou!"
mastodon.status_post(toot_text, in_reply_to_id=None, )
print(f'Replied notification {notification_id}')
mastodon.notifications_dismiss(notification_id)
def log_in():
# Load secrets from secrets file # Load secrets from secrets file
secrets_filepath = "secrets/secrets.txt" secrets_filepath = "secrets/secrets.txt"
uc_client_id = get_parameter("uc_client_id", secrets_filepath) uc_client_id = get_parameter("uc_client_id", secrets_filepath)
uc_client_secret = get_parameter("uc_client_secret", secrets_filepath) uc_client_secret = get_parameter("uc_client_secret", secrets_filepath)
uc_access_token = get_parameter("uc_access_token", secrets_filepath) uc_access_token = get_parameter("uc_access_token", secrets_filepath)
# Load configuration from config file # Load configuration from config file
config_filepath = "config/config.txt" config_filepath = "config/config.txt"
@ -23,54 +49,19 @@ def mastodon():
# Initialise Mastodon API # Initialise Mastodon API
mastodon = Mastodon( mastodon = Mastodon(
client_id=uc_client_id, client_id = uc_client_id,
client_secret=uc_client_secret, client_secret = uc_client_secret,
access_token=uc_access_token, access_token = uc_access_token,
api_base_url='https://' + mastodon_hostname, api_base_url = 'https://' + mastodon_hostname,
) )
# Initialise access headers # Initialise access headers
headers = {'Authorization': 'Bearer %s'%uc_access_token} headers={ 'Authorization': 'Bearer %s'%uc_access_token }
return (mastodon, mastodon_hostname) 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)
def get_locale( parameter, welcome_lang):
if welcome_lang not in ['ca','es','en']:
print("lang must be 'ca', 'es' or 'en'")
sys.exit(0)
language_filepath = f"app/locales/{welcome_lang}.txt"
if not os.path.isfile(language_filepath):
print("File %s not found, exiting."%language_filepath)
sys.exit(0)
with open( language_filepath ) as f:
for line in f:
if line.startswith( parameter ):
return line.replace(parameter + ":", "").strip()
print(language_filepath + " Missing parameter %s "%parameter)
sys.exit(0)
def usage():
print('usage: python ' + sys.argv[0] + ' --ca (or --es or --en)')
# Returns the parameter from the specified file
def get_parameter( parameter, file_path ): def get_parameter( parameter, file_path ):
# Check if secrets file exists # Check if secrets file exists
if not os.path.isfile(file_path): if not os.path.isfile(file_path):
print("File %s not found, exiting."%file_path) print("File %s not found, exiting."%file_path)
@ -91,377 +82,10 @@ def get_parameter( parameter, file_path ):
if __name__ == '__main__': if __name__ == '__main__':
# usage modes mastodon, mastodon_hostname = log_in()
if len(sys.argv) == 1: bot_notifications = mastodon.notifications()
usage() for notif in bot_notifications:
elif len(sys.argv) >= 2: get_data(notif)
welcome_lang = ''
if sys.argv[1] == '--ca':
welcome_lang = 'ca'
if sys.argv[1] == '--es':
welcome_lang = 'es'
elif sys.argv[1] == '--en':
welcome_lang = 'en'
if not welcome_lang in ['ca', 'es', 'en']:
print("\nOnly 'ca', 'es' and 'en' languages are supported.\n")
sys.exit(0)
mastodon, mastodon_hostname = mastodon()
mastodon_db, mastodon_db_user, welcome_db, welcome_db_user = db_config()
###############################################################################
# current registered users
###############################################################################
try:
conn = None
conn = psycopg2.connect(database = mastodon_db, user = mastodon_db_user, 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()
###############################################################################
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
users_before = current_id
users_hour = 0
conn = None
try:
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute("SELECT DISTINCT ON (datetime) users FROM welcome WHERE datetime > current_timestamp - INTERVAL '70 minutes' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
users_before = row[0]
cur.close()
users_hour = current_id - users_before
except (Exception, psycopg2.DatabaseError) as error:
print (error)
finally:
if conn is not None:
conn.close()
current_users_str = get_locale("current_users_str", welcome_lang)
users_before_str = get_locale("users_before_str", welcome_lang)
users_hour_str = get_locale("users_hour_str", welcome_lang)
print("-----------------")
print(current_users_str + ': ' + str(current_id))
print(users_before_str + ': ' + str(users_before))
print(users_hour_str + ': ' + str(users_hour))
insert_sql = """INSERT INTO welcome(datetime, users, users_hour)
VALUES(%s,%s,%s) RETURNING datetime;"""
conn = None
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute(insert_sql, (now, current_id, users_hour))
datetime = cur.fetchone()[0]
conn.commit()
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 = ""
users_hourly_change_string = ""
try:
conn = None
conn = psycopg2.connect(database = welcome_db, user = welcome_db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute("SELECT DISTINCT ON (datetime) users, datetime FROM welcome WHERE datetime > current_timestamp - INTERVAL '62 minutes' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
if row[0] == None:
users_last_hour = 0
else:
users_last_hour = row[0]
cur.execute("SELECT DISTINCT ON (datetime) users,datetime FROM welcome WHERE datetime > current_timestamp - INTERVAL '1 day' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
if row[0] == None:
users_last_day = 0
else:
users_last_day = row[0]
cur.execute("SELECT DISTINCT ON (datetime) users,datetime FROM welcome WHERE datetime > current_timestamp - INTERVAL '7 days' ORDER BY datetime asc LIMIT 1")
row = cur.fetchone()
if row[0] == None:
users_last_week = 0
else:
users_last_week = row[0]
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print (error)
finally:
if conn is not None:
conn.close()
#################################################################################
welcome_users = []
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_db, user = mastodon_db_user, 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 suspended_at is null and id in (select account_id from users where approved and not disabled)")
rows = cur.fetchall()
for row in rows:
if row[1] == None:
welcome_users.append(row[0])
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
i = 0
new_users_string = ""
while i < len(welcome_users):
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
new_users_last_hour_str = get_locale("new_users_last_hour_str", welcome_lang)
new_users_last_day_str = get_locale("new_users_last_day_str", welcome_lang)
new_users_last_week_str = get_locale("new_users_last_week_str", welcome_lang)
print("------------------------")
print(new_users_last_hour_str + ': ' + str(hour_inc))
print(new_users_last_day_str + ': ' + str(day_inc))
print(new_users_last_week_str + ': ' + str(week_inc))
###################################################################################
# Hourly change
if hour_inc != 0:
users_hourly_change = current_id - users_last_hour
hourly_users_evolution_str = get_locale("hourly_users_evolution_str", welcome_lang)
in_the_last_hour_str = get_locale("in_the_last_hour_str", welcome_lang)
print(hourly_users_evolution_str + ': %s'%users_hourly_change)
if users_hourly_change > 0:
hourly_change_string = "+" + format(users_hourly_change, ",d") + in_the_last_hour_str + "\n"
# Daily change
if day_inc != 0:
daily_change = current_id - users_last_day
daily_users_evolution_str = get_locale("daily_users_evolution_str", welcome_lang)
in_the_last_day_str = get_locale("in_the_last_day_str", welcome_lang)
print(daily_users_evolution_str + ': %s'%daily_change)
if daily_change > 0:
daily_change_string = "+" + format(daily_change, ",d") + in_the_last_day_str + "\n"
# Weekly change
if week_inc != 0:
weekly_change = current_id - users_last_week
weekly_users_evolution_str = get_locale("weekly_users_evolution_str", welcome_lang)
in_the_last_week_str = get_locale("in_the_last_week_str", welcome_lang)
print(weekly_users_evolution_str + ': %s'%weekly_change)
if weekly_change > 0:
weekly_change_string = "+" + format(weekly_change, ",d") + in_the_last_week_str + "\n"
elif users_hourly_change < 0:
hourly_change_string = format(users_hourly_change, ",d") + in_the_last_hour_str + "\n"
# Daily change
if day_inc != 0:
daily_change = current_id - users_last_day
daily_evolution_str = get_locale("daily_evolution_str", welcome_lang)
print(daily_evolution_str + ': %s'%daily_change)
if daily_change < 0:
daily_change_string = format(daily_change, ",d") + in_the_last_day_str + "\n"
# Weekly change
if week_inc != 0:
weekly_change = current_id - users_last_week
weekly_evolution_str = get_locale("weekly_evolution_str", welcome_lang)
print(weekly_evolution_str + ': %s'%weekly_change)
if weekly_change < 0:
weekly_change_string = format(weekly_change, ",d") + in_the_last_week_str + "\n"
###############################################################################
# TOOT IT!
###############################################################################
if len(welcome_users) > 0:
welcomes_str = get_locale("welcomes_str", welcome_lang)
we_have_str = get_locale("we_have_str", welcome_lang)
users_str = get_locale("users_str", welcome_lang)
toot_text = "\n"
toot_text += mastodon_hostname + ' ' + welcomes_str + ':\n\n'
toot_text += new_users_string + "\n"
toot_text += "\n"
toot_text += "\n\n" + we_have_str + ' ' + str(current_id) + ' ' + users_str + "\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)
print("Done!")