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
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.
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.
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, 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
@ -18,14 +31,4 @@ Dins del entorn virtual Python:
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':
found_it = db.check_user(mention.acct)
found_it, pending = db.check_user(mention.acct)
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"
@ -129,9 +161,9 @@ if __name__ == '__main__':
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)))

Veure arxiu

@ -35,6 +35,8 @@ class Database():
found_it = False
pending = False
conn = None
try:
@ -43,7 +45,7 @@ class Database():
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()
@ -51,6 +53,8 @@ class Database():
found_it = True
pending = row[1]
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
@ -63,16 +67,18 @@ class Database():
conn.close()
return found_it
return (found_it, pending)
def add_user(self, username):
def add_user(self, username, post_id):
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())
pending = True
conn = None
try:
@ -81,7 +87,7 @@ class Database():
cur = conn.cursor()
cur.execute(sql, (unique_id, username))
cur.execute(sql, (unique_id, username, pending, post_id))
conn.commit()
@ -101,6 +107,42 @@ class Database():
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):
is_deleted = False
@ -173,6 +215,40 @@ class Database():
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
def __check_dbsetup(self):
@ -234,7 +310,7 @@ class Database():
self.__create_table(self, table, sql)
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)
@staticmethod

Veure arxiu

@ -6,6 +6,7 @@ import fileinput,re
import os
import sys
import os.path
import pdb
###
# Dict helper class.
@ -307,7 +308,7 @@ class Mastodonbot:
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)