Procés d'alta en dos passos

This commit is contained in:
spla 2022-12-02 17:46:07 +01:00
pare 9fe7b356da
commit 4ad008cd03
S'han modificat 4 arxius amb 136 adicions i 24 eliminacions

Veure arxiu

@ -1,6 +1,19 @@
# Corpus # Corpus
Aquest bot desa els missatges públics dels usuaris d'un servidor Mastodon que si donin d'alta. En qualsevol moment poden donar-se de baixa. Aquest bot desa els missatges públics dels usuaris d'un servidor Mastodon que s´hi donin d'alta. En qualsevol moment poden donar-se de baixa.
Al demanar l'alta en aquest bot, s'accepta cedir tots els tuts públics que s'escriguin, amb llicència CC0. Al fer-ho, es permet alimentar, amb frases en català, projectes lingüístics com per exemple Common Voice.
Al demanar l'alta en aquest bot, es pregunta a l'usuari confirmació de majoria d'edat, si accepta cedir a aquest projecte Corpus tots els seus tuts públics sota llicència CC0 i sí els tuts que escrigui no seran copies dels escrits per algú altre.
Al confirmar-ho tot, l'usuari permet alimentar amb frases escrites en català projectes lingüístics com per exemple Common Voice.
### Com donar-se d'alta o de baixa
Demanar-ho al bot, mencionant-lo:
@bot alta
@bot baixa
Tots els usuaris donats d'alta poden esborrar quan ho desitgin tots els missatges que el bot tingui desats:
@bot esborra
### Dependències ### Dependències
@ -18,14 +31,4 @@ Dins del entorn virtual Python:
3. Configurar cron per a que executi `python corpus.py` cada minut. 3. Configurar cron per a que executi `python corpus.py` cada minut.
### Com donar-se d'alta o de baixa
Demanar-ho al bot, mencionant-lo:
@bot alta
@bot baixa
També es poden esborrar tots els missatges que el bot tingui d'un usuari concret. Només cal fer:
@bot esborra

Veure arxiu

@ -48,13 +48,45 @@ if __name__ == '__main__':
if mention.question == 'alta': if mention.question == 'alta':
found_it = db.check_user(mention.acct) found_it, pending = db.check_user(mention.acct)
if not found_it: if not found_it:
is_added = db.add_user(mention.acct) post = f"@{mention.acct} confirmes que ets major d'edat, que cedeixes els teus tuts públics que escriguis a partir d'ara al projecte Corpus "
if is_added: post += "(https://git.mastodont.cat/spla/corpus) amb llicència CCO i que ets l'autor dels tuts que escrius (no els copies)?\n"
post += "Per a confirmar-ho tot, respon aquest tut amb:\n"
post += "@corpus confirmo"
post_id = bot.mastodon.status_post(post, in_reply_to_id=mention.status_id, visibility='direct').id
is_added = db.add_user(mention.acct, post_id)
if not is_added:
bot.mastodon.status_post(f'@{mention.acct}, error al desar.', in_reply_to_id=post_id, visibility='direct')
else:
if not pending:
bot.mastodon.status_post(f"@{mention.acct} ja has confirmat l'alta", in_reply_to_id=mention.status_id, visibility='direct')
else:
bot.mastodon.status_post(f"@{mention.acct} encara no has confirmat l'alta. Confirma-la responen sí a les preguntes de confirmació.", in_reply_to_id=mention.status_id, visibility='direct')
if mention.question == 'confirmo':
found_it, pending = db.check_user(mention.acct)
if found_it and pending:
is_confirmed = db.confirm_user(mention.acct)
if is_confirmed:
post = f"@{mention.acct} afegit amb èxit!\n\nD'ara endavant tots els teus tuts públics seràn desats en la base de dades.\n" post = f"@{mention.acct} afegit amb èxit!\n\nD'ara endavant tots els teus tuts públics seràn desats en la base de dades.\n"
@ -129,9 +161,9 @@ if __name__ == '__main__':
elif notif.type == 'status' and notif.status.visibility == 'public' and notif.status.language == 'ca': elif notif.type == 'status' and notif.status.visibility == 'public' and notif.status.language == 'ca':
found_it = db.check_user(notif.account.acct) found_it, pending = db.check_user(notif.account.acct)
if found_it and notif.status.in_reply_to_account_id == None: if found_it and not pending and notif.status.in_reply_to_account_id == None:
is_saved = db.save_post(notif.account.acct, unescape(cleanhtml(notif.status.content))) is_saved = db.save_post(notif.account.acct, unescape(cleanhtml(notif.status.content)))

Veure arxiu

@ -35,6 +35,8 @@ class Database():
found_it = False found_it = False
pending = False
conn = None conn = None
try: try:
@ -43,7 +45,7 @@ class Database():
cur = conn.cursor() cur = conn.cursor()
cur.execute("select username from users where username = (%s)", (username,)) cur.execute("select username, pending from users where username = (%s)", (username,))
row = cur.fetchone() row = cur.fetchone()
@ -51,6 +53,8 @@ class Database():
found_it = True found_it = True
pending = row[1]
cur.close() cur.close()
except (Exception, psycopg2.DatabaseError) as error: except (Exception, psycopg2.DatabaseError) as error:
@ -63,16 +67,18 @@ class Database():
conn.close() conn.close()
return found_it return (found_it, pending)
def add_user(self, username): def add_user(self, username, post_id):
is_added = False is_added = False
sql = "INSERT INTO users(id, username) VALUES(%s, %s)" sql = "INSERT INTO users(id, username, pending, post_id) VALUES(%s, %s, %s, %s)"
unique_id = str(uuid.uuid4()) unique_id = str(uuid.uuid4())
pending = True
conn = None conn = None
try: try:
@ -81,7 +87,7 @@ class Database():
cur = conn.cursor() cur = conn.cursor()
cur.execute(sql, (unique_id, username)) cur.execute(sql, (unique_id, username, pending, post_id))
conn.commit() conn.commit()
@ -101,6 +107,42 @@ class Database():
return is_added return is_added
def confirm_user(self, username):
is_confirmed = False
sql = "UPDATE users set pending = (%s) where username = (%s)"
pending = False
conn = None
try:
conn = psycopg2.connect(database = self.corpus_db, user = self.corpus_db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute(sql, (pending, username))
conn.commit()
cur.close()
is_confirmed = True
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
return is_confirmed
def del_user(self, username): def del_user(self, username):
is_deleted = False is_deleted = False
@ -173,6 +215,40 @@ class Database():
return is_saved return is_saved
def del_user_posts(self, username):
are_deleted = False
sql = "delete from corpus where username = (%s)"
conn = None
try:
conn = psycopg2.connect(database = self.corpus_db, user = self.corpus_db_user, password = "", host = "/var/run/postgresql", port = "5432")
cur = conn.cursor()
cur.execute(sql, (username,))
conn.commit()
cur.close()
are_deleted = True
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
return are_deleted
@staticmethod @staticmethod
def __check_dbsetup(self): def __check_dbsetup(self):
@ -234,7 +310,7 @@ class Database():
self.__create_table(self, table, sql) self.__create_table(self, table, sql)
table = "users" table = "users"
sql = "create table "+table+" (id uuid, username varchar(50), PRIMARY KEY (id))" sql = "create table "+table+" (id uuid, username varchar(50), pending boolean default True, post_id bigint, PRIMARY KEY (id))"
self.__create_table(self, table, sql) self.__create_table(self, table, sql)
@staticmethod @staticmethod

Veure arxiu

@ -6,6 +6,7 @@ import fileinput,re
import os import os
import sys import sys
import os.path import os.path
import pdb
### ###
# Dict helper class. # Dict helper class.
@ -307,7 +308,7 @@ class Mastodonbot:
keyword = question keyword = question
if keyword == 'alta' or keyword == 'baixa' or keyword == 'esborra': if keyword == 'alta' or keyword == 'baixa' or keyword == 'esborra' or keyword == 'confirmo':
keyword_length = len(keyword) keyword_length = len(keyword)