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
|
# 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
|
|
||||||
|
|
||||||
|
|
42
corpus.py
42
corpus.py
|
@ -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)))
|
||||||
|
|
||||||
|
|
88
database.py
88
database.py
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Referencia en una nova incidència