diff --git a/README.md b/README.md index 15f4348..3f4d2be 100644 --- a/README.md +++ b/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 diff --git a/corpus.py b/corpus.py index 9b3f69a..037a04e 100644 --- a/corpus.py +++ b/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))) diff --git a/database.py b/database.py index 4beedda..63aeb58 100644 --- a/database.py +++ b/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 diff --git a/mastodonbot.py b/mastodonbot.py index cdf97be..d94a08d 100644 --- a/mastodonbot.py +++ b/mastodonbot.py @@ -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)