Procés d'alta en dos passos
This commit is contained in:
pare
9fe7b356da
commit
4ad008cd03
S'han modificat 4 arxius amb 136 adicions i 24 eliminacions
27
README.md
27
README.md
|
@ -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
|
||||
|
||||
|
|
42
corpus.py
42
corpus.py
|
@ -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)))
|
||||
|
||||
|
|
88
database.py
88
database.py
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Referencia en una nova incidència