From 3cefe6945a7fc55a079a20edb021f0f8e2bcde80 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Mon, 14 Nov 2016 16:47:10 +0100 Subject: [PATCH 01/81] Configparser library added; now the config.ini file contains the configuration info; gitignore updated Signed-off-by: JaviBF92 --- .gitignore | 2 +- config.ini | 5 +++++ sugusbot.py | 10 ++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 config.ini diff --git a/.gitignore b/.gitignore index d9cfdd9..65313df 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -token +myconfig.ini log *.pyc *.db diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..c332aad --- /dev/null +++ b/config.ini @@ -0,0 +1,5 @@ +[Database] +route = sugusBotDB.db +[Telegram] +token = xxxx +id_admin = xxxx diff --git a/sugusbot.py b/sugusbot.py index 7c4326a..8affb02 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -15,13 +15,15 @@ import sqlite3 from datetime import datetime +import configparser -token = None -conn = sqlite3.connect('sugusBotDB.db') +config = configparser.ConfigParser() +config.read('myconfig.ini') +database = config['Database']['route'] +token = config['Telegram']['token'] -with open('token', 'rb') as token_file: - token = token_file.readline().decode('ascii')[:-1] +conn = sqlite3.connect(database) # Create bot object bot = telegram.Bot(token) From 5cf614c08ffacb2e23aa9503d6ca0fc43d866b0c Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Tue, 15 Nov 2016 20:09:23 +0100 Subject: [PATCH 02/81] Added to DB new tables and initialization for future permission roles Signed-off-by: JaviBF92 --- sugusbot.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 8affb02..a202c50 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -22,6 +22,7 @@ config.read('myconfig.ini') database = config['Database']['route'] token = config['Telegram']['token'] +id_admin = config['Telegram']['id_admin'] conn = sqlite3.connect(database) @@ -31,7 +32,19 @@ def secInit(): c = conn.cursor() - c.execute('create table if not exists eventTable(date text, event text, name text, UNIQUE(event, name) ON CONFLICT REPLACE)') + c.execute('CREATE TABLE IF NOT EXISTS eventTable(date TEXT, event TEXT, name TEXT, UNIQUE(event, name) ON CONFLICT REPLACE)') + c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER, user_name text, UNIQUE(id_user_telegram, user_name))') + c.execute('CREATE TABLE IF NOT EXISTS permissionTable(id_permission INTEGER PRIMARY KEY, permission TEXT, UNIQUE(permission))') + c.execute('CREATE TABLE IF NOT EXISTS rel_user_permission(user INTEGER, permission INTEGER, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(permission) REFERENCES permissionTable(id_permission))') + + if not c.execute('SELECT COUNT(*) FROM permissionTable').fetchone()[0]: + c.executemany('INSERT INTO permissionTable(permission) VALUES (?)', [('admin',), ('sugus',)]) + c.execute('INSERT INTO userTable(id_user_telegram) VALUES (?)', (id_admin,)) + #es necesario? + permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', ('admin',)).fetchone()[0] + c.execute('INSERT INTO rel_user_permission VALUES (?, ?)', (1, permission)) + + conn.commit() c.close() From d3da1a90c7abc9689b579610dd953bd0ef5dd5b7 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Fri, 18 Nov 2016 18:21:22 +0100 Subject: [PATCH 03/81] Code modularization. Now repository.py will contain the DataBase functions Signed-off-by: JaviBF92 --- repository.py | 94 +++++++++++++++++++++++++++++++++ sugusbot.py | 143 +++++++++++--------------------------------------- 2 files changed, 124 insertions(+), 113 deletions(-) create mode 100644 repository.py diff --git a/repository.py b/repository.py new file mode 100644 index 0000000..9ff50ba --- /dev/null +++ b/repository.py @@ -0,0 +1,94 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import sqlite3 +from datetime import datetime + +conn = None + +def connection(database): + global conn + conn = sqlite3.connect(database) + + +def sec_init(id_admin): + c = conn.cursor() + c.execute('CREATE TABLE IF NOT EXISTS eventTable(date TEXT, event TEXT, name TEXT, UNIQUE(event, name) ON CONFLICT REPLACE)') + c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER, user_name text, UNIQUE(id_user_telegram, user_name))') + c.execute('CREATE TABLE IF NOT EXISTS permissionTable(id_permission INTEGER PRIMARY KEY, permission TEXT, UNIQUE(permission))') + c.execute('CREATE TABLE IF NOT EXISTS rel_user_permission(user INTEGER, permission INTEGER, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(permission) REFERENCES permissionTable(id_permission))') + + if not c.execute('SELECT COUNT(*) FROM permissionTable').fetchone()[0]: + c.executemany('INSERT INTO permissionTable(permission) VALUES (?)', [('admin',), ('sugus',)]) + c.execute('INSERT INTO userTable(id_user_telegram) VALUES (?)', (id_admin,)) + #es necesario? + permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', ('admin',)).fetchone()[0] + c.execute('INSERT INTO rel_user_permission VALUES (?, ?)', (1, permission)) + + conn.commit() + c.close() + +def add_to(event, name): + + if event and name: + c = conn.cursor() + date = datetime.now().strftime("%d-%m-%y") + + c.execute('insert into eventTable values(?, ?, ?)', (date, event.replace(" ",""), u'@'+name)) + conn.commit() + c.close() + result =u'@' + name + ' añadido a ' + event + + elif name: + result = "No tienes nombre de usuario o alias. \n Es necesario para poder añadirte a un evento" + else: + result = "No se ha podido añadir el usuario @" + name+ " a la lista " + name + + return result + +def find_by_event(event): + c = conn.cursor() + + result = c.execute('select * from eventTable where event=?', (event.replace(" ",""),)).fetchall() + + c.close() + + return result + +def remove_from_event(event, name): + + if any([('@' + name) in i for i in find_by_event(event)]): + c = conn.cursor() + + c.execute('delete from eventTable where event=? and name=?', (event, u'@' + name)) + conn.commit() + + c.close() + result = "Has sido eliminado del evento " + event + else: + result = "No estás en el evento " + event + + return result + +def empty_event(event, name): + + if u'@' + name in find_by_event(event): + c = conn.cursor() + + c.execute('delete from eventTable where event=?', (event)) + + result = "El evento " + event +" ha sido eliminado" + conn.commit() + + c.close() + else: + result = 'El evento ' + event + ' NO ha sido eliminado' + + return result + +def list_events(): + c = conn.cursor() + + h = c.execute('select distinct event from eventTable') + + return h diff --git a/sugusbot.py b/sugusbot.py index a202c50..fbe7dfd 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -12,11 +12,11 @@ import codecs import sys -import sqlite3 from datetime import datetime import configparser +from dbaccess import connection, sec_init, add_to, find_by_event, remove_from_event, empty_event, list_events config = configparser.ConfigParser() config.read('myconfig.ini') @@ -24,33 +24,14 @@ token = config['Telegram']['token'] id_admin = config['Telegram']['id_admin'] -conn = sqlite3.connect(database) - # Create bot object bot = telegram.Bot(token) - -def secInit(): - c = conn.cursor() - c.execute('CREATE TABLE IF NOT EXISTS eventTable(date TEXT, event TEXT, name TEXT, UNIQUE(event, name) ON CONFLICT REPLACE)') - c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER, user_name text, UNIQUE(id_user_telegram, user_name))') - c.execute('CREATE TABLE IF NOT EXISTS permissionTable(id_permission INTEGER PRIMARY KEY, permission TEXT, UNIQUE(permission))') - c.execute('CREATE TABLE IF NOT EXISTS rel_user_permission(user INTEGER, permission INTEGER, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(permission) REFERENCES permissionTable(id_permission))') - - if not c.execute('SELECT COUNT(*) FROM permissionTable').fetchone()[0]: - c.executemany('INSERT INTO permissionTable(permission) VALUES (?)', [('admin',), ('sugus',)]) - c.execute('INSERT INTO userTable(id_user_telegram) VALUES (?)', (id_admin,)) - #es necesario? - permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', ('admin',)).fetchone()[0] - c.execute('INSERT INTO rel_user_permission VALUES (?, ?)', (1, permission)) - - - conn.commit() - c.close() +connection(database) def main(): - secInit() + sec_init(id_admin) # UTF-8 console stuff thingies sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) @@ -91,61 +72,61 @@ def main(): periodicCheck() - if checkTypeAndTextStart(aText= actText, cText='/who', aType=actType, cType='private'): + if check_type_and_text_start(aText= actText, cText='/who', aType=actType, cType='private'): who = getWho() if not who: #changes in emojis in python3 telegram version send_text = u"Parece que no hay nadie... {}".format(telegram.Emoji.DISAPPOINTED_FACE) else: - send_text = showList(u"Miembros en SUGUS:", who) + send_text = show_list(u"Miembros en SUGUS:", who) - if checkTypeAndTextStart(aText= actText, cText='/como', aType=actType, cType='private'): - send_text = addTo('comida', actUser) + if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): + send_text = add_to('comida', actUser) - if checkTypeAndTextStart(aText= actText, cText='/nocomo', aType=actType, cType='private'): - send_text = removeFromEvent('comida', actUser) + if check_type_and_text_start(aText= actText, cText='/nocomo', aType=actType, cType='private'): + send_text = remove_from_event('comida', actUser) - if checkTypeAndTextStart(aText= actText, cText='/quiencome', aType=actType, cType='private'): - if len(findByEvent('comida')) != 0: - send_text = showList(u"Hoy come en Sugus:", findByEvent('comida'), [2, 0]) + if check_type_and_text_start(aText= actText, cText='/quiencome', aType=actType, cType='private'): + if len(find_by_event('comida')) != 0: + send_text = show_list(u"Hoy come en Sugus:", find_by_event('comida'), [2, 0]) else: send_text = 'De momento nadie come en Sugus' - if checkTypeAndTextStart(aText= actText, cText='/testingjoin', aType=actType, cType='private'): + if check_type_and_text_start(aText= actText, cText='/testingjoin', aType=actType, cType='private'): rtext = actText.replace('/testingjoin','').replace(' ','') if not rtext: send_text = u"Elige un evento /testingparticipants" else: - addTo(rtext, actUser) + add_to(rtext, actUser) - if checkTypeAndTextStart(aText= actText, cText='/testingparticipants', aType=actType, cType='private'): + if check_type_and_text_start(aText= actText, cText='/testingparticipants', aType=actType, cType='private'): rtext = actText.replace('/testingparticipants','').replace(' ','') if not rtext: - send_text = showList(u"Elige una de las listas:", listEvents(), [0]) + send_text = show_list(u"Elige una de las listas:", list_events(), [0]) else: - if len(findByEvent(rtext)) == 0: + if len(find_by_event(rtext)) == 0: send_text = u"No hay nadie en {}".format(rtext) else: - send_text = showList(u"Participantes en {}:".format(rtext), findByEvent(rtext), [2, 0]) + send_text = show_list(u"Participantes en {}:".format(rtext), find_by_event(rtext), [2, 0]) - if checkTypeAndTextStart(aText= actText, cText='/testingdisjoin', aType=actType, cType='private'): + if check_type_and_text_start(aText= actText, cText='/testingdisjoin', aType=actType, cType='private'): rtext = actText.replace('/testingdisjoin','').replace(' ','') - send_text = removeFromEvent(rtext, actUser) + send_text = remove_from_event(rtext, actUser) - if checkTypeAndTextStart(aText= actText, cText='/testinghelp', aType=actType, cType='private'): #, aType=actType, cType='private'): + if check_type_and_text_start(aText= actText, cText='/testinghelp', aType=actType, cType='private'): #, aType=actType, cType='private'): send_text = helpTesting() - if checkTypeAndTextStart(aText= actText, cText='/testingempty', aType=actType, cType='private'): + if check_type_and_text_start(aText= actText, cText='/testingempty', aType=actType, cType='private'): rtext = actText.replace('/testingempty','').replace(' ','') if rtext != 'comida': - send_text = emptyEvent(rtext, actUser) + send_text = empty_event(rtext, actUser) else: send_text = 'No soy tonto, no voy a dejar que borres quien come hoy' if send_text != None: sendMessages(send_text, chat_id) - elif checkTypeAndTextStart(aType=actType, cType='private'): + elif check_type_and_text_start(aType=actType, cType='private'): sendMessages(help(), chat_id) else: print("Mensaje enviado y no publicado por: "+str(actUser)) @@ -153,7 +134,7 @@ def main(): LAST_UPDATE_ID = update_id + 1 -def checkTypeAndTextStart(aText = None, aUName = None, cText = None, aType = None, cType = None, cUName = None): +def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = None, cType = None, cUName = None): result = True @@ -167,7 +148,7 @@ def checkTypeAndTextStart(aText = None, aUName = None, cText = None, aType = Non return result -def showList(header, contains, positions = None): +def show_list(header, contains, positions = None): result = '{}'.format(header) if contains != None: for a in contains: @@ -184,25 +165,25 @@ def periodicCheck(): ## Remove periodic comida actDate = datetime.now().strftime("%d-%m-%y") - actComida = findByEvent('comida') + actComida = find_by_event('comida') for a in actComida: if a[0] != actDate: - removeFromEvent('comida', a[2][1:]) + remove_from_event('comida', a[2][1:]) def help(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/como','Yo como aquí']] contain = contain + [['/nocomo', 'Yo no como aquí'], ['/quiencome', '¿Quien come aquí?']] contain = contain +[['/testinghelp', 'Ayuda testing']] - return showList(header, contain, [0, 1]) + return show_list(header, contain, [0, 1]) def helpTesting(): header = "Elige una de las opciones: " contain = [['/testinghelp', 'Ayuda testing'], ['/testingjoin','Apuntarse a un evento']] contain = contain + [['/testingdisjoin','Desapuntarse de un evento'], ['/testingparticipants', 'Listar una lista']] contain = contain + [['/testingempty', 'Vaciar una lista']] - return showList(header, contain, [0, 1]) + return show_list(header, contain, [0, 1]) def getUpdates(LAST_UPDATE_ID, timeout = 30): while True: @@ -262,70 +243,6 @@ def getWho(): return who -def addTo(event, name): - - if event and name: - c = conn.cursor() - date = datetime.now().strftime("%d-%m-%y") - - c.execute('insert into eventTable values(?, ?, ?)', (date, event.replace(" ",""), u'@'+name.replace(" ", ""))) - conn.commit() - c.close() - result = name + ' añadido a ' + event - - elif name: - result = "No tienes nombre de usuario o alias. \n Es necesario para poder añadirte a un evento" - else: - result = "No se ha podido añadir el usuario @" + name+ " a la lista " + name - - return result - -def findByEvent(event): - c = conn.cursor() - - result = c.execute('select * from eventTable where event=?', (event.replace(" ",""),)).fetchall() - - c.close() - - return result - -def removeFromEvent(event, name): - - if any([('@' + name) in i for i in findByEvent(event)]): - c = conn.cursor() - - c.execute('delete from eventTable where event=? and name=?', (event, u'@' + name)) - conn.commit() - - c.close() - result = "Has sido eliminado del evento " + event - else: - result = "No estás en el evento " + event - - return result - -def emptyEvent(event, name): - - if u'@' + name in findByEvent(event): - c = conn.cursor() - - c.execute('delete from eventTable where event=?', (event)) - - result = "El evento " + event +" ha sido eliminado" - conn.commit() - - c.close() - else: - result = 'El evento ' + event + ' NO ha sido eliminado' - - return result - -def listEvents(): - c = conn.cursor() - - h = c.execute('select distinct event from eventTable') - - return h if __name__ == '__main__': while True: From dddc7fbad0842e4134108188d6d54e1a690f3f8d Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Sun, 20 Nov 2016 13:07:35 +0100 Subject: [PATCH 04/81] Name of function add_to changed; wrong module import changed Signed-off-by: JaviBF92 --- repository.py | 2 +- sugusbot.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/repository.py b/repository.py index 9ff50ba..c31ff89 100644 --- a/repository.py +++ b/repository.py @@ -28,7 +28,7 @@ def sec_init(id_admin): conn.commit() c.close() -def add_to(event, name): +def add_to_event(event, name): if event and name: c = conn.cursor() diff --git a/sugusbot.py b/sugusbot.py index fbe7dfd..fe48654 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -16,7 +16,7 @@ import configparser -from dbaccess import connection, sec_init, add_to, find_by_event, remove_from_event, empty_event, list_events +from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events config = configparser.ConfigParser() config.read('myconfig.ini') @@ -82,7 +82,7 @@ def main(): send_text = show_list(u"Miembros en SUGUS:", who) if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): - send_text = add_to('comida', actUser) + send_text = add_to_event('comida', actUser) if check_type_and_text_start(aText= actText, cText='/nocomo', aType=actType, cType='private'): send_text = remove_from_event('comida', actUser) @@ -98,7 +98,7 @@ def main(): if not rtext: send_text = u"Elige un evento /testingparticipants" else: - add_to(rtext, actUser) + add_to_event(rtext, actUser) if check_type_and_text_start(aText= actText, cText='/testingparticipants', aType=actType, cType='private'): rtext = actText.replace('/testingparticipants','').replace(' ','') From 0d9f067402879ed49d3c616d7ba4a1ef63d2c315 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 24 Nov 2016 00:52:45 +0100 Subject: [PATCH 05/81] Function empty_event edited to accept date as an optional parameter Signed-off-by: JaviBF92 --- repository.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/repository.py b/repository.py index c31ff89..a682e83 100644 --- a/repository.py +++ b/repository.py @@ -70,19 +70,25 @@ def remove_from_event(event, name): return result -def empty_event(event, name): +#el evento solo lo puede borrar un usuario con privilegios +def empty_event(event, date=None): - if u'@' + name in find_by_event(event): + if find_by_event(event): c = conn.cursor() - c.execute('delete from eventTable where event=?', (event)) + if date: + c.execute('DELETE FROM eventTable WHERE date=? AND event=?', (date,event)) + result = "El evento " + event + " de " + date + " ha sido eliminado" + else: + + c.execute('DELETE FROM eventTable WHERE event=?', (event,)) + result = "El evento " + event +" ha sido eliminado" - result = "El evento " + event +" ha sido eliminado" conn.commit() c.close() else: - result = 'El evento ' + event + ' NO ha sido eliminado' + result = 'El evento ' + event + ' no existe' return result From 1ef2ec39515ad18897374c8a1dbf48e20d8dd486 Mon Sep 17 00:00:00 2001 From: ManuelLR Date: Thu, 24 Nov 2016 13:37:55 +0100 Subject: [PATCH 06/81] Modularized code to messaging & ancillary_methods --- ancillary_methods.py | 52 +++++++++++++++++++++++ messaging.py | 57 ++++++++++++++++++++++++++ repository.py | 2 +- sugusbot.py | 98 +++----------------------------------------- 4 files changed, 115 insertions(+), 94 deletions(-) create mode 100644 ancillary_methods.py create mode 100644 messaging.py diff --git a/ancillary_methods.py b/ancillary_methods.py new file mode 100644 index 0000000..8ccde25 --- /dev/null +++ b/ancillary_methods.py @@ -0,0 +1,52 @@ +#!/usr/bin/python3.5 +# -*- coding: utf-8 -*- + +from urllib.request import urlopen +from pyquery import PyQuery +import telegram + + +def getWho(): + while True: + try: + url = 'http://sugus.eii.us.es/en_sugus.html' + #html = AssertionErrorurlopen(url).read() + html = urlopen(url).read() + pq = PyQuery(html) + break + except: + raise + + ul = pq('ul.usuarios > li') + who = [w.text() for w in ul.items() if w.text() != "Parece que no hay nadie."] + + return who + + +def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = None, cType = None, cUName = None): + + result = True + + if cType != None: + result = result and aType == cType + if cUName != None: + if aUName in cUName: + result = result and False + if cText != None: + result = result and aText.startswith(cText) + + return result + + +def show_list(header, contains, positions = None): + result = '{}'.format(header) + if contains != None: + for a in contains: + #changes in emojis in python3 telegram version + result = '{}\n {}'.format(result, telegram.Emoji.SMALL_BLUE_DIAMOND) + if positions != None: + for i in positions: + result = '{} {} '.format(result, a[i]) + else: + result = '{} {} '.format(result, a[:]) + return result diff --git a/messaging.py b/messaging.py new file mode 100644 index 0000000..e90ce8a --- /dev/null +++ b/messaging.py @@ -0,0 +1,57 @@ +#!/usr/bin/python3.5 +# -*- coding: utf-8 -*- + +import telegram +from urllib.error import URLError +import time + +bot = None + + +def create_bot(token): + # Create bot object + global bot + bot = telegram.Bot(token) + + +def getUpdates(LAST_UPDATE_ID, timeout = 30): + while True: + try: + updates = bot.getUpdates(LAST_UPDATE_ID, timeout=timeout, network_delay=2.0) + except telegram.TelegramError as error: + if error.message == "Timed out": + print(u"Timed out! Retrying...") + elif error.message == "Bad Gateway": + print("Bad gateway. Retrying...") + else: + raise + + except URLError as error: + print("URLError! Retrying...") + time.sleep(1) + except Exception as e: + print("Exception: " + e) + print('Ignore errors') + pass + else: + break + return updates + +def sendMessages(send_text, chat_id): + while True: + try: + bot.sendMessage(chat_id=chat_id, text=send_text) + print("Mensaje enviado a id: " + str(chat_id)) + break + except telegram.TelegramError as error: + if error.message == "Timed out": + print("Timed out! Retrying...") + else: + print(error) + except URLError as error: + print("URLError! Retrying to send message...") + time.sleep(1) + except Exception as e: + print("Exception: " + e) + print('Ignore exception') + pass diff --git a/repository.py b/repository.py index a682e83..8db82ab 100644 --- a/repository.py +++ b/repository.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3.5 # -*- coding: utf-8 -*- import sqlite3 diff --git a/sugusbot.py b/sugusbot.py index fe48654..540fc3d 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -1,13 +1,8 @@ -#!/usr/bin/python +#!/usr/bin/python3.5 # -*- coding: utf-8 -*- import logging -from urllib.request import urlopen -from urllib.error import URLError -import time -from pyquery import PyQuery import telegram -import string import codecs import sys @@ -17,6 +12,8 @@ import configparser from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events +from messaging import create_bot, getUpdates, sendMessages +from ancillary_methods import getWho, check_type_and_text_start, show_list config = configparser.ConfigParser() config.read('myconfig.ini') @@ -25,7 +22,7 @@ id_admin = config['Telegram']['id_admin'] # Create bot object -bot = telegram.Bot(token) +create_bot(token) connection(database) @@ -46,7 +43,7 @@ def main(): LAST_UPDATE_ID = None while True: - updates = bot.getUpdates(LAST_UPDATE_ID, timeout=1, network_delay=2.0) + updates = getUpdates(LAST_UPDATE_ID, timeout=1) if updates is not None and updates: num_discarded = num_discarded + len(updates) LAST_UPDATE_ID = updates[-1].update_id + 1 @@ -134,33 +131,6 @@ def main(): LAST_UPDATE_ID = update_id + 1 -def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = None, cType = None, cUName = None): - - result = True - - if cType != None: - result = result and aType == cType - if cUName != None: - if aUName in cUName: - result = result and False - if cText != None: - result = result and aText.startswith(cText) - - return result - -def show_list(header, contains, positions = None): - result = '{}'.format(header) - if contains != None: - for a in contains: - #changes in emojis in python3 telegram version - result = '{}\n {}'.format(result, telegram.Emoji.SMALL_BLUE_DIAMOND) - if positions != None: - for i in positions: - result = '{} {} '.format(result, a[i]) - else: - result = '{} {} '.format(result, a[:]) - return result - def periodicCheck(): ## Remove periodic comida @@ -185,64 +155,6 @@ def helpTesting(): contain = contain + [['/testingempty', 'Vaciar una lista']] return show_list(header, contain, [0, 1]) -def getUpdates(LAST_UPDATE_ID, timeout = 30): - while True: - try: - updates = bot.getUpdates(LAST_UPDATE_ID, timeout=timeout, network_delay=2.0) - except telegram.TelegramError as error: - if error.message == "Timed out": - print(u"Timed out! Retrying...") - elif error.message == "Bad Gateway": - print("Bad gateway. Retrying...") - else: - raise - - except URLError as error: - print("URLError! Retrying...") - time.sleep(1) - except Exception as e: - print("Exception: " + e) - print('Ignore errors') - pass - else: - break - return updates - -def sendMessages(send_text, chat_id): - while True: - try: - bot.sendMessage(chat_id=chat_id, text=send_text) - print("Mensaje enviado a id: " + str(chat_id)) - break - except telegram.TelegramError as error: - if error.message == "Timed out": - print("Timed out! Retrying...") - else: - print(error) - except URLError as error: - print("URLError! Retrying to send message...") - time.sleep(1) - except Exception as e: - print("Exception: " + e) - print('Ignore exception') - pass - -def getWho(): - while True: - try: - url = 'http://sugus.eii.us.es/en_sugus.html' - #html = AssertionErrorurlopen(url).read() - html = urlopen(url).read() - pq = PyQuery(html) - break - except: - raise - - ul = pq('ul.usuarios > li') - who = [w.text() for w in ul.items() if w.text() != "Parece que no hay nadie."] - - return who - if __name__ == '__main__': while True: From 909dc631380c3a47bce99dbc1fa3e018785ed925 Mon Sep 17 00:00:00 2001 From: ManuelLR Date: Thu, 24 Nov 2016 17:54:13 +0100 Subject: [PATCH 07/81] Added permission check to execute messages --- ancillary_methods.py | 12 ++++++++---- repository.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ancillary_methods.py b/ancillary_methods.py index 8ccde25..801bb91 100644 --- a/ancillary_methods.py +++ b/ancillary_methods.py @@ -4,6 +4,7 @@ from urllib.request import urlopen from pyquery import PyQuery import telegram +from repository import find_user_by_user_id, find_user_by_user_id_and_permission def getWho(): @@ -23,15 +24,18 @@ def getWho(): return who -def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = None, cType = None, cUName = None): +def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = None, cType = None, cUId = None, perm_required=None): + # Si perm_required es None y cUId no es None entonces se busca que el usuario esté en cualquier grupo result = True if cType != None: result = result and aType == cType - if cUName != None: - if aUName in cUName: - result = result and False + if cUId != None: + if perm_required: # Comprobar solo usuario y permiso + result = result and find_user_by_user_id(cUId) != None + else: # Comprobar usuario y permiso + result = result and find_user_by_user_id_and_permission(cUId, perm_required) != None if cText != None: result = result and aText.startswith(cText) diff --git a/repository.py b/repository.py index 8db82ab..23ae9b2 100644 --- a/repository.py +++ b/repository.py @@ -92,9 +92,28 @@ def empty_event(event, date=None): return result + def list_events(): c = conn.cursor() h = c.execute('select distinct event from eventTable') return h + + +def find_user_by_user_id(user_id): + c = conn.cursor() + + h = c.execute('select * from userTable where id_user_telegram=?', (user_id,)).fetchone() + + return h + + +def find_user_by_user_id_and_permission(user_id, permission): + c = conn.cursor() + + h = c.execute('select * from userTable INNER JOIN rel_user_permission ON userTable.id_user = rel_user_permission.user INNER JOIN permissionTable ON permissionTable.id_permission = rel_user_permission.permission where userTable.id_user_telegram = ? and permissionTable.permission = ?', (user_id, permission)).fetchone() + + return h + + From 1e33e624d1a6f03f28398644a282890f599b26fd Mon Sep 17 00:00:00 2001 From: ManuelLR Date: Thu, 24 Nov 2016 18:32:02 +0100 Subject: [PATCH 08/81] Permissions group handling (list, create and help) --- ancillary_methods.py | 2 +- repository.py | 19 +++++++++++++++++++ sugusbot.py | 37 +++++++++++++++++++++++++++++++++---- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/ancillary_methods.py b/ancillary_methods.py index 801bb91..ddd5cfa 100644 --- a/ancillary_methods.py +++ b/ancillary_methods.py @@ -32,7 +32,7 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = if cType != None: result = result and aType == cType if cUId != None: - if perm_required: # Comprobar solo usuario y permiso + if perm_required == None: # Comprobar solo usuario y permiso result = result and find_user_by_user_id(cUId) != None else: # Comprobar usuario y permiso result = result and find_user_by_user_id_and_permission(cUId, perm_required) != None diff --git a/repository.py b/repository.py index 23ae9b2..e6a9245 100644 --- a/repository.py +++ b/repository.py @@ -117,3 +117,22 @@ def find_user_by_user_id_and_permission(user_id, permission): return h +def add_permission_group(permission_name): + permission_name = permission_name.replace(" ", "_") + if permission_name != None and permission_name is not "" and permission_name is not "_": + c = conn.cursor() + + c.execute('INSERT INTO permissionTable(permission) VALUES (?)', (permission_name,)) + conn.commit() + c.close() + return "Añadido grupo de permiso '" + str(permission_name) + "'" + else: + return "Grupo de permiso no válido: " + str(permission_name) + + +def list_permission_group(): + c = conn.cursor() + + h = c.execute('SELECT permission FROM permissionTable') + + return h diff --git a/sugusbot.py b/sugusbot.py index 540fc3d..f99a6a0 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -11,7 +11,7 @@ import configparser -from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events +from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group from messaging import create_bot, getUpdates, sendMessages from ancillary_methods import getWho, check_type_and_text_start, show_list @@ -90,7 +90,20 @@ def main(): else: send_text = 'De momento nadie come en Sugus' - if check_type_and_text_start(aText= actText, cText='/testingjoin', aType=actType, cType='private'): + if check_type_and_text_start(aText=actText, cText='/comida', aType=actType, cType='private'): + send_text = help_eat() + + if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): + send_text = help_group() + + if check_type_and_text_start(aText=actText, cText='/groupadd', aType=actType, cType='private', cUId=message.from_user.id, perm_required="admin"): + rtext = actText.replace('/groupadd ','').replace('/groupadd','') + send_text = add_permission_group(rtext) + + if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): + send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group(), [0]) + + if check_type_and_text_start(aText=actText, cText='/testingjoin', aType=actType, cType='private'): rtext = actText.replace('/testingjoin','').replace(' ','') if not rtext: send_text = u"Elige un evento /testingparticipants" @@ -141,13 +154,29 @@ def periodicCheck(): if a[0] != actDate: remove_from_event('comida', a[2][1:]) + def help(): header = "Elige una de las opciones: " - contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/como','Yo como aquí']] - contain = contain + [['/nocomo', 'Yo no como aquí'], ['/quiencome', '¿Quien come aquí?']] + contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/comida','Opciones de comida']] + contain = contain + [['/group', 'Opciones de grupos de permisos']] contain = contain +[['/testinghelp', 'Ayuda testing']] return show_list(header, contain, [0, 1]) + +def help_eat(): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda']] + contain = contain + [['/como','Yo como aquí'], ['/nocomo', 'Yo no como aquí'], ['/quiencome', '¿Quien come aquí?']] + return show_list(header, contain, [0, 1]) + + +def help_group(): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda']] + contain = contain + [['/groups', 'Listar grupos'], ['/groupadd', 'Añadir un grupo']] + return show_list(header, contain, [0, 1]) + + def helpTesting(): header = "Elige una de las opciones: " contain = [['/testinghelp', 'Ayuda testing'], ['/testingjoin','Apuntarse a un evento']] From 74fab26144ebcc5894e0b173b1e391e6d3333c31 Mon Sep 17 00:00:00 2001 From: ManuelLR Date: Fri, 25 Nov 2016 18:01:44 +0100 Subject: [PATCH 09/81] Added class conversation_session --- conversation_session.py | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 conversation_session.py diff --git a/conversation_session.py b/conversation_session.py new file mode 100644 index 0000000..fdeefdb --- /dev/null +++ b/conversation_session.py @@ -0,0 +1,67 @@ +#!/usr/bin/python3.5 +# -*- coding: utf-8 -*- + + +class conversation_session(): + def __init__(self): + self.__inConversation = {} + + @staticmethod + def __g_key(act_user, conversation_id=None): + # Generate the key based on actUser and conversationId + if conversation_id is None: + conversation_id = act_user.id + + return str(act_user.id) + "-" + str(conversation_id) + + def __add(self, key, options): + self.__inConversation[key] = options + + def add_option(self, act_user, option, value, conversation_id=None): + """Añade el par de valores (option, value) para el usuario""" + key = self.__g_key(act_user, conversation_id) + if not self.get(act_user): + self.__inConversation[key] = {option: value} + else: + self.__inConversation[key][option] = value + + def del_option(self, act_user, option, conversation_id=None): + """Elimina la opción 'option' del usuario""" + key = self.__g_key(act_user, conversation_id) + del self.__inConversation[key][option] + + def empty(self, act_user, conversation_id=None): + """Elimina todas las opciones para el usuario""" + key = self.__g_key(act_user, conversation_id) + del self.__inConversation[key] + + def get(self, act_user, conversation_id=None): + """Devuelve todas las opciones del usuario""" + key = self.__g_key(act_user, conversation_id) + try: + result = self.__inConversation[key] + except KeyError as error: + result = [] + pass + return result + + def contain_option(self, act_user, option, conversation_id=None, c_opt_value=None): + """Comprueba si existe la opción 'option' para el usuario""" + options = self.get(act_user, conversation_id) + if option in options: + if c_opt_value == options[option]: + return True + elif c_opt_value == None: + return True + else: + return False + else: + return False + + def status(self, act_user, conversation_id=None): + """Dice si el usuario tiene alguna sesión en curso""" + key = self.__g_key(act_user, conversation_id) + if key in self.__inConversation: + return True + else: + return False From 408dd85f6c01fb1b142d7b178594c6fa7f79502e Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 1 Dec 2016 16:06:02 +0100 Subject: [PATCH 10/81] periodicCheck now uses empty_event function Signed-off-by: JaviBF92 --- sugusbot.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index fe48654..bb0e75b 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -165,11 +165,7 @@ def periodicCheck(): ## Remove periodic comida actDate = datetime.now().strftime("%d-%m-%y") - actComida = find_by_event('comida') - - for a in actComida: - if a[0] != actDate: - remove_from_event('comida', a[2][1:]) + empty_event('comida',actDate) def help(): header = "Elige una de las opciones: " From ac09e7ca836e48d7e7754657253e6e2c3f7eaa2e Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Fri, 2 Dec 2016 14:18:35 +0100 Subject: [PATCH 11/81] periodicCheck function fixed Signed-off-by: JaviBF92 --- sugusbot.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index d009d30..2089b77 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -7,7 +7,7 @@ import codecs import sys -from datetime import datetime +from datetime import datetime, timedelta import configparser @@ -147,8 +147,10 @@ def main(): def periodicCheck(): ## Remove periodic comida - actDate = datetime.now().strftime("%d-%m-%y") - empty_event('comida',actDate) + yesterdayDate = datetime.now() - timedelta(days = 1) + yesterdayDate = yesterdayDate.strftime("%d-%m-%y") + + empty_event('comida',yesterdayDate) def help(): From c08424d034033b520f2eb139ae0f9d0273388f24 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Fri, 2 Dec 2016 14:21:41 +0100 Subject: [PATCH 12/81] log file edition fixed Signed-off-by: JaviBF92 --- sugusbot.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 2089b77..ade11ea 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -188,7 +188,6 @@ def helpTesting(): try: main() except Exception as e: - with open('log','w+') as file: - file.write(str(datetime.now().strftime("%d-%m-%y"))+"\n") - file.write(str(e)+"\n") - pass + with open('log','w+') as f: + f.write(str(datetime.now().strftime("%d-%m-%y"))+"\n") + f.write(str(e)+"\n") From fe60717546d45b5cb17c461382ee9fc5a0bb1752 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Fri, 2 Dec 2016 14:50:37 +0100 Subject: [PATCH 13/81] Addition of spaces and some names changed Signed-off-by: JaviBF92 --- ancillary_methods.py => auxilliary_methods.py | 20 +++++++++---------- repository.py | 4 ++++ sugusbot.py | 9 ++++----- 3 files changed, 18 insertions(+), 15 deletions(-) rename ancillary_methods.py => auxilliary_methods.py (75%) diff --git a/ancillary_methods.py b/auxilliary_methods.py similarity index 75% rename from ancillary_methods.py rename to auxilliary_methods.py index ddd5cfa..41dd133 100644 --- a/ancillary_methods.py +++ b/auxilliary_methods.py @@ -4,10 +4,10 @@ from urllib.request import urlopen from pyquery import PyQuery import telegram -from repository import find_user_by_user_id, find_user_by_user_id_and_permission +from repository import find_user_by_user_id, check_user_permission -def getWho(): +def get_who(): while True: try: url = 'http://sugus.eii.us.es/en_sugus.html' @@ -29,14 +29,14 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = result = True - if cType != None: - result = result and aType == cType - if cUId != None: - if perm_required == None: # Comprobar solo usuario y permiso - result = result and find_user_by_user_id(cUId) != None + if cType is not None: + result = aType == cType + if cUId is not None: + if perm_required is None: # Comprobar solo usuario y permiso + result = result and find_user_by_user_id(cUId) else: # Comprobar usuario y permiso - result = result and find_user_by_user_id_and_permission(cUId, perm_required) != None - if cText != None: + result = result and check_user_permission(cUId, perm_required) + if cText is not None: result = result and aText.startswith(cText) return result @@ -44,7 +44,7 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = def show_list(header, contains, positions = None): result = '{}'.format(header) - if contains != None: + if contains is not None: for a in contains: #changes in emojis in python3 telegram version result = '{}\n {}'.format(result, telegram.Emoji.SMALL_BLUE_DIAMOND) diff --git a/repository.py b/repository.py index e6a9245..5717fe4 100644 --- a/repository.py +++ b/repository.py @@ -28,6 +28,7 @@ def sec_init(id_admin): conn.commit() c.close() + def add_to_event(event, name): if event and name: @@ -46,6 +47,7 @@ def add_to_event(event, name): return result + def find_by_event(event): c = conn.cursor() @@ -55,6 +57,7 @@ def find_by_event(event): return result + def remove_from_event(event, name): if any([('@' + name) in i for i in find_by_event(event)]): @@ -70,6 +73,7 @@ def remove_from_event(event, name): return result + #el evento solo lo puede borrar un usuario con privilegios def empty_event(event, date=None): diff --git a/sugusbot.py b/sugusbot.py index ade11ea..22756df 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -13,7 +13,7 @@ from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group from messaging import create_bot, getUpdates, sendMessages -from ancillary_methods import getWho, check_type_and_text_start, show_list +from auxilliary_methods import get_who, check_type_and_text_start, show_list config = configparser.ConfigParser() config.read('myconfig.ini') @@ -67,10 +67,10 @@ def main(): send_text = None - periodicCheck() + periodic_check() if check_type_and_text_start(aText= actText, cText='/who', aType=actType, cType='private'): - who = getWho() + who = get_who() if not who: #changes in emojis in python3 telegram version @@ -144,9 +144,8 @@ def main(): LAST_UPDATE_ID = update_id + 1 -def periodicCheck(): +def periodic_check(): - ## Remove periodic comida yesterdayDate = datetime.now() - timedelta(days = 1) yesterdayDate = yesterdayDate.strftime("%d-%m-%y") From 3e93bf866d89f7e0aae4cb7f65e3baf1293803b9 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Fri, 2 Dec 2016 17:25:26 +0100 Subject: [PATCH 14/81] Function add_user_permission added to repository.py; changes in database constraints; some changes in functions to improve behavior and cursor closing Signed-off-by: JaviBF92 --- repository.py | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/repository.py b/repository.py index 5717fe4..a4fbdda 100644 --- a/repository.py +++ b/repository.py @@ -13,8 +13,8 @@ def connection(database): def sec_init(id_admin): c = conn.cursor() - c.execute('CREATE TABLE IF NOT EXISTS eventTable(date TEXT, event TEXT, name TEXT, UNIQUE(event, name) ON CONFLICT REPLACE)') - c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER, user_name text, UNIQUE(id_user_telegram, user_name))') + c.execute('CREATE TABLE IF NOT EXISTS eventTable(date TEXT, event TEXT, name TEXT, UNIQUE(date, event, name) ON CONFLICT REPLACE)') + c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER UNIQUE, user_name text UNIQUE)') c.execute('CREATE TABLE IF NOT EXISTS permissionTable(id_permission INTEGER PRIMARY KEY, permission TEXT, UNIQUE(permission))') c.execute('CREATE TABLE IF NOT EXISTS rel_user_permission(user INTEGER, permission INTEGER, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(permission) REFERENCES permissionTable(id_permission))') @@ -99,31 +99,39 @@ def empty_event(event, date=None): def list_events(): c = conn.cursor() - h = c.execute('select distinct event from eventTable') + c.close() return h def find_user_by_user_id(user_id): c = conn.cursor() - h = c.execute('select * from userTable where id_user_telegram=?', (user_id,)).fetchone() + if h: + h = h[0] + + c.close() + return h -def find_user_by_user_id_and_permission(user_id, permission): +def check_user_permission(user_id, permission): c = conn.cursor() - h = c.execute('select * from userTable INNER JOIN rel_user_permission ON userTable.id_user = rel_user_permission.user INNER JOIN permissionTable ON permissionTable.id_permission = rel_user_permission.permission where userTable.id_user_telegram = ? and permissionTable.permission = ?', (user_id, permission)).fetchone() + if h: + h = h[0] + + c.close() + return h def add_permission_group(permission_name): - permission_name = permission_name.replace(" ", "_") - if permission_name != None and permission_name is not "" and permission_name is not "_": + if permission_name and permission_name is not " ": + permission_name = permission_name.replace(" ", "_") c = conn.cursor() c.execute('INSERT INTO permissionTable(permission) VALUES (?)', (permission_name,)) @@ -137,6 +145,25 @@ def add_permission_group(permission_name): def list_permission_group(): c = conn.cursor() - h = c.execute('SELECT permission FROM permissionTable') + h = c.execute('SELECT permission FROM permissionTable').fetchall() + if h: + h = [i[0] for i in c.execute('SELECT permission FROM permissionTable').fetchall()] + c.close() return h + + +def add_user_permission(id_user_telegram, permission): + c = conn.cursor() + permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', (permission,)).fetchone() + + if permission: + c.execute('INSERT INTO userTable(id_user_telegram) VALUES (?)', (id_user_telegram,)) + id_user = c.execute('SELECT id_user from userTable WHERE id_user_telegram = ?', (id_user_telegram,)).fetchone()[0] + c.execute('INSERT INTO rel_user_permission VALUES (?, ?)', (id_user, permission[0])) + conn.commit() + return "Rol añadido a usuario " + str(id_user_telegram) + else: + return "El rol indicado no existe" + + c.close() From e14dde2e2d08b7a9dfa16b4038e682cf5d05bf1d Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Fri, 2 Dec 2016 18:27:09 +0100 Subject: [PATCH 15/81] Events commands added & optimizations in sugusbot.py Signed-off-by: JaviBF92 --- sugusbot.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 22756df..f1f39cb 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -85,8 +85,9 @@ def main(): send_text = remove_from_event('comida', actUser) if check_type_and_text_start(aText= actText, cText='/quiencome', aType=actType, cType='private'): - if len(find_by_event('comida')) != 0: - send_text = show_list(u"Hoy come en Sugus:", find_by_event('comida'), [2, 0]) + quiencome = find_by_event('comida') + if quiencome: + send_text = show_list(u"Hoy come en Sugus:", quiencome, [2, 0]) else: send_text = 'De momento nadie come en Sugus' @@ -96,6 +97,9 @@ def main(): if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): send_text = help_group() + if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): + send_text = help_event() + if check_type_and_text_start(aText=actText, cText='/groupadd', aType=actType, cType='private', cUId=message.from_user.id, perm_required="admin"): rtext = actText.replace('/groupadd ','').replace('/groupadd','') send_text = add_permission_group(rtext) @@ -156,6 +160,7 @@ def help(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/comida','Opciones de comida']] contain = contain + [['/group', 'Opciones de grupos de permisos']] + contain = contain + [['/events', 'Opciones de eventos']] contain = contain +[['/testinghelp', 'Ayuda testing']] return show_list(header, contain, [0, 1]) @@ -167,6 +172,13 @@ def help_eat(): return show_list(header, contain, [0, 1]) +def help_event(): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda']] + contain = contain + [['/events', 'Listar eventos'], ['/addevent', 'Añadir un evento'], ['/jointoevent', 'Unirte a un evento']] + contain = contain + [['/leaveevent', 'Abandonar un evento'], ['/removeevent', 'Eliminar un evento']] + return show_list(header, contain, [0, 1]) + def help_group(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda']] From 128afc70e585dec52ade889046add927f720c707 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Tue, 13 Dec 2016 00:07:15 +0100 Subject: [PATCH 16/81] auxiliar function show_list simplified Signed-off-by: JaviBF92 --- auxilliary_methods.py | 26 ++++++++++++++------------ sugusbot.py | 10 +++++----- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 41dd133..d2ee720 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -8,6 +8,7 @@ def get_who(): + while True: try: url = 'http://sugus.eii.us.es/en_sugus.html' @@ -41,16 +42,17 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = return result - def show_list(header, contains, positions = None): - result = '{}'.format(header) - if contains is not None: - for a in contains: - #changes in emojis in python3 telegram version - result = '{}\n {}'.format(result, telegram.Emoji.SMALL_BLUE_DIAMOND) - if positions != None: - for i in positions: - result = '{} {} '.format(result, a[i]) - else: - result = '{} {} '.format(result, a[:]) - return result + + result = [header + "\n"] + + if contains: + if positions: + for a in contains: + a_ordered = [a[i] for i in positions] + result.append("{} {}\n".format(telegram.Emoji.SMALL_BLUE_DIAMOND," ".join(a_ordered))) + else: + rows = ["{} {}\n".format(telegram.Emoji.SMALL_BLUE_DIAMOND ," ".join(a)) for a in contains] + result += rows + + return "".join(result) diff --git a/sugusbot.py b/sugusbot.py index f1f39cb..32d3ab4 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -159,17 +159,17 @@ def periodic_check(): def help(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/comida','Opciones de comida']] - contain = contain + [['/group', 'Opciones de grupos de permisos']] + contain = contain + [['/group', 'Opciones de permisos']] contain = contain + [['/events', 'Opciones de eventos']] contain = contain +[['/testinghelp', 'Ayuda testing']] - return show_list(header, contain, [0, 1]) + return show_list(header, contain) def help_eat(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda']] contain = contain + [['/como','Yo como aquí'], ['/nocomo', 'Yo no como aquí'], ['/quiencome', '¿Quien come aquí?']] - return show_list(header, contain, [0, 1]) + return show_list(header, contain) def help_event(): @@ -177,13 +177,13 @@ def help_event(): contain = [['/help', 'Ayuda']] contain = contain + [['/events', 'Listar eventos'], ['/addevent', 'Añadir un evento'], ['/jointoevent', 'Unirte a un evento']] contain = contain + [['/leaveevent', 'Abandonar un evento'], ['/removeevent', 'Eliminar un evento']] - return show_list(header, contain, [0, 1]) + return show_list(header, contain) def help_group(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda']] contain = contain + [['/groups', 'Listar grupos'], ['/groupadd', 'Añadir un grupo']] - return show_list(header, contain, [0, 1]) + return show_list(header, contain) def helpTesting(): From 176d90919525ef244ea1914bd2f96ece0363105c Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Wed, 14 Dec 2016 18:42:05 +0100 Subject: [PATCH 17/81] Deprecated emojis changed for emoji library Signed-off-by: JaviBF92 --- auxilliary_methods.py | 5 +++-- sugusbot.py | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index d2ee720..be38201 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -5,6 +5,7 @@ from pyquery import PyQuery import telegram from repository import find_user_by_user_id, check_user_permission +from emoji import emojize def get_who(): @@ -50,9 +51,9 @@ def show_list(header, contains, positions = None): if positions: for a in contains: a_ordered = [a[i] for i in positions] - result.append("{} {}\n".format(telegram.Emoji.SMALL_BLUE_DIAMOND," ".join(a_ordered))) + result.append("{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True)," ".join(a_ordered))) else: - rows = ["{} {}\n".format(telegram.Emoji.SMALL_BLUE_DIAMOND ," ".join(a)) for a in contains] + rows = ["{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True) ," ".join(a)) for a in contains] result += rows return "".join(result) diff --git a/sugusbot.py b/sugusbot.py index 32d3ab4..6465da9 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -11,6 +11,8 @@ import configparser +from emoji import emojize + from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group from messaging import create_bot, getUpdates, sendMessages from auxilliary_methods import get_who, check_type_and_text_start, show_list @@ -74,7 +76,7 @@ def main(): if not who: #changes in emojis in python3 telegram version - send_text = u"Parece que no hay nadie... {}".format(telegram.Emoji.DISAPPOINTED_FACE) + send_text = u"Parece que no hay nadie... {}".format(emojize(":disappointed_face:", use_aliases=True)) else: send_text = show_list(u"Miembros en SUGUS:", who) From 9eb4293b76487a40fa1ec70f1385ee796295c990 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Wed, 14 Dec 2016 19:11:52 +0100 Subject: [PATCH 18/81] emoji library added to requirements Signed-off-by: JaviBF92 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 431e59d..cf93bd0 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,4 @@ Es necesario tener el archivo "token" para enviar mensajes con el bot. Es necesario instalar la librería [python-telegram-bot](https://github.com/leandrotoledo/python-telegram-bot), junto con algunos paquetes adicionales: # apt-get install python-libxml2 - # pip install python-telegram-bot pyquery cssselect lxml + # pip install python-telegram-bot pyquery cssselect lxml emoji From 968289fc05db16071e127640d36aee48371501bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Fri, 16 Dec 2016 18:55:21 +0100 Subject: [PATCH 19/81] Added ban users with no username to be added to a list (Solved issue #2) --- repository.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repository.py b/repository.py index a4fbdda..2ace9c5 100644 --- a/repository.py +++ b/repository.py @@ -35,15 +35,15 @@ def add_to_event(event, name): c = conn.cursor() date = datetime.now().strftime("%d-%m-%y") - c.execute('insert into eventTable values(?, ?, ?)', (date, event.replace(" ",""), u'@'+name)) + c.execute('insert into eventTable values(?, ?, ?)', (date, event.replace(" ", ""), u'@'+name)) conn.commit() c.close() result =u'@' + name + ' añadido a ' + event - elif name: + elif not name: result = "No tienes nombre de usuario o alias. \n Es necesario para poder añadirte a un evento" else: - result = "No se ha podido añadir el usuario @" + name+ " a la lista " + name + result = "No se ha podido añadir el usuario @" + name + " a la lista" return result From bc4eac7f875e990d99ab104561f3e4e1d553b987 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Sat, 17 Dec 2016 02:35:12 +0100 Subject: [PATCH 20/81] added to show_list function one-value list treatment Signed-off-by: JaviBF92 --- auxilliary_methods.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index be38201..3cf3f9f 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -53,7 +53,10 @@ def show_list(header, contains, positions = None): a_ordered = [a[i] for i in positions] result.append("{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True)," ".join(a_ordered))) else: - rows = ["{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True) ," ".join(a)) for a in contains] + if isinstance(contains[0], str): + rows = ["{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True) ,a) for a in contains] + else: + rows = ["{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True) ," ".join(a)) for a in contains] result += rows return "".join(result) From 9ef5a047141fbea2c1ac6476a66440aa66737498 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Sat, 17 Dec 2016 02:52:23 +0100 Subject: [PATCH 21/81] Parameters of some show_list callings changed (issue #6 fixed) Signed-off-by: JaviBF92 --- sugusbot.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 6465da9..dabfd92 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -75,7 +75,6 @@ def main(): who = get_who() if not who: - #changes in emojis in python3 telegram version send_text = u"Parece que no hay nadie... {}".format(emojize(":disappointed_face:", use_aliases=True)) else: send_text = show_list(u"Miembros en SUGUS:", who) @@ -107,7 +106,7 @@ def main(): send_text = add_permission_group(rtext) if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): - send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group(), [0]) + send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group()) if check_type_and_text_start(aText=actText, cText='/testingjoin', aType=actType, cType='private'): rtext = actText.replace('/testingjoin','').replace(' ','') @@ -119,7 +118,7 @@ def main(): if check_type_and_text_start(aText= actText, cText='/testingparticipants', aType=actType, cType='private'): rtext = actText.replace('/testingparticipants','').replace(' ','') if not rtext: - send_text = show_list(u"Elige una de las listas:", list_events(), [0]) + send_text = show_list(u"Elige una de las listas:", list_events()) else: if len(find_by_event(rtext)) == 0: send_text = u"No hay nadie en {}".format(rtext) @@ -193,7 +192,7 @@ def helpTesting(): contain = [['/testinghelp', 'Ayuda testing'], ['/testingjoin','Apuntarse a un evento']] contain = contain + [['/testingdisjoin','Desapuntarse de un evento'], ['/testingparticipants', 'Listar una lista']] contain = contain + [['/testingempty', 'Vaciar una lista']] - return show_list(header, contain, [0, 1]) + return show_list(header, contain) if __name__ == '__main__': From 376ba8693f963f32d3610a1c277fa32e5b2c1e3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 17 Dec 2016 13:41:29 +0100 Subject: [PATCH 22/81] Added rel_user_event --- auxilliary_methods.py | 4 +- repository.py | 96 ++++++++++++++++++++++++++----------------- sugusbot.py | 50 +++++++++++++--------- 3 files changed, 91 insertions(+), 59 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index be38201..8da2159 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -4,7 +4,7 @@ from urllib.request import urlopen from pyquery import PyQuery import telegram -from repository import find_user_by_user_id, check_user_permission +from repository import find_user_by_telegram_user_id, check_user_permission from emoji import emojize @@ -35,7 +35,7 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = result = aType == cType if cUId is not None: if perm_required is None: # Comprobar solo usuario y permiso - result = result and find_user_by_user_id(cUId) + result = result and find_user_by_telegram_user_id(cUId) else: # Comprobar usuario y permiso result = result and check_user_permission(cUId, perm_required) if cText is not None: diff --git a/repository.py b/repository.py index 2ace9c5..7dd5a8c 100644 --- a/repository.py +++ b/repository.py @@ -6,6 +6,7 @@ conn = None + def connection(database): global conn conn = sqlite3.connect(database) @@ -13,8 +14,9 @@ def connection(database): def sec_init(id_admin): c = conn.cursor() - c.execute('CREATE TABLE IF NOT EXISTS eventTable(date TEXT, event TEXT, name TEXT, UNIQUE(date, event, name) ON CONFLICT REPLACE)') + c.execute('CREATE TABLE IF NOT EXISTS event_table(id_event INTEGER PRIMARY KEY, date TEXT, name TEXT, UNIQUE(date, name))') c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER UNIQUE, user_name text UNIQUE)') + c.execute('CREATE TABLE IF NOT EXISTS rel_user_event(user INTEGER, event INTEGER, date TEXT, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(event) REFERENCES event_table(id_event), UNIQUE(user, event) ON CONFLICT REPLACE)') c.execute('CREATE TABLE IF NOT EXISTS permissionTable(id_permission INTEGER PRIMARY KEY, permission TEXT, UNIQUE(permission))') c.execute('CREATE TABLE IF NOT EXISTS rel_user_permission(user INTEGER, permission INTEGER, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(permission) REFERENCES permissionTable(id_permission))') @@ -25,93 +27,113 @@ def sec_init(id_admin): permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', ('admin',)).fetchone()[0] c.execute('INSERT INTO rel_user_permission VALUES (?, ?)', (1, permission)) + if not c.execute('SELECT COUNT(*) FROM event_table').fetchone()[0]: + c.execute('INSERT INTO event_table(date, name) VALUES (?, ?)', ("", "comida")) + conn.commit() c.close() -def add_to_event(event, name): +def add_to_event(event_name, user_id): + user = find_user_by_telegram_user_id(user_id=user_id) + event = find_event_by_name(event_name=event_name) - if event and name: + if event and user: c = conn.cursor() date = datetime.now().strftime("%d-%m-%y") - c.execute('insert into eventTable values(?, ?, ?)', (date, event.replace(" ", ""), u'@'+name)) + c.execute('insert into rel_user_event values(?, ?, ?)', (user[0], event[0], date)) conn.commit() c.close() - result =u'@' + name + ' añadido a ' + event + result = "añadido a " + event_name - elif not name: - result = "No tienes nombre de usuario o alias. \n Es necesario para poder añadirte a un evento" + elif not user: + result = "No estás registrado en el sistema" else: - result = "No se ha podido añadir el usuario @" + name + " a la lista" + result = "Evento no encontrado" return result -def find_by_event(event): +def find_event_by_name(event_name): c = conn.cursor() - - result = c.execute('select * from eventTable where event=?', (event.replace(" ",""),)).fetchall() + h = c.execute('select * from event_table where name=?', (event_name,)).fetchone() c.close() - return result + return h -def remove_from_event(event, name): +def find_users_by_event(event_name): + event = find_event_by_name(event_name=event_name) - if any([('@' + name) in i for i in find_by_event(event)]): + if event: c = conn.cursor() - c.execute('delete from eventTable where event=? and name=?', (event, u'@' + name)) - conn.commit() + result = c.execute('SELECT * FROM userTable INNER JOIN rel_user_event ON userTable.id_user = rel_user_event.user where rel_user_event.event = ?', (event[0],)).fetchall() c.close() - result = "Has sido eliminado del evento " + event else: - result = "No estás en el evento " + event + result = "Evento no encontrado" return result -#el evento solo lo puede borrar un usuario con privilegios -def empty_event(event, date=None): +def remove_from_event(event, name): - if find_by_event(event): - c = conn.cursor() + result = "No implementado" - if date: - c.execute('DELETE FROM eventTable WHERE date=? AND event=?', (date,event)) - result = "El evento " + event + " de " + date + " ha sido eliminado" - else: +# if any([('@' + name) in i for i in find_users_by_event(event)]): +# c = conn.cursor() +# +# c.execute('delete from eventTable where event=? and name=?', (event, u'@' + name)) +# conn.commit() +# +# c.close() +# result = "Has sido eliminado del evento " + event +# else: +# result = "No estás en el evento " + event - c.execute('DELETE FROM eventTable WHERE event=?', (event,)) - result = "El evento " + event +" ha sido eliminado" + return result - conn.commit() - c.close() - else: - result = 'El evento ' + event + ' no existe' +#el evento solo lo puede borrar un usuario con privilegios +def empty_event(event, date=None): + + result = "No implementado" + + # if find_users_by_event(event): + # c = conn.cursor() + # + # if date: + # c.execute('DELETE FROM eventTable WHERE date=? AND event=?', (date,event)) + # result = "El evento " + event + " de " + date + " ha sido eliminado" + # else: + # + # c.execute('DELETE FROM eventTable WHERE event=?', (event,)) + # result = "El evento " + event +" ha sido eliminado" + # + # conn.commit() + # + # c.close() + # else: + # result = 'El evento ' + event + ' no existe' return result def list_events(): c = conn.cursor() - h = c.execute('select distinct event from eventTable') + h = c.execute('select distinct name from event_table').fetchall() c.close() return h -def find_user_by_user_id(user_id): +def find_user_by_telegram_user_id(user_id): c = conn.cursor() h = c.execute('select * from userTable where id_user_telegram=?', (user_id,)).fetchone() - if h: - h = h[0] - c.close() return h diff --git a/sugusbot.py b/sugusbot.py index 6465da9..38b170f 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -13,7 +13,7 @@ from emoji import emojize -from repository import connection, sec_init, add_to_event, find_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group +from repository import connection, sec_init, add_to_event, find_users_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group from messaging import create_bot, getUpdates, sendMessages from auxilliary_methods import get_who, check_type_and_text_start, show_list @@ -66,6 +66,7 @@ def main(): chat_id = message.chat.id update_id = update.update_id actUser = message.from_user.username + act_user_id = message.from_user.id send_text = None @@ -81,13 +82,13 @@ def main(): send_text = show_list(u"Miembros en SUGUS:", who) if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): - send_text = add_to_event('comida', actUser) + send_text = add_to_event('comida', act_user_id) if check_type_and_text_start(aText= actText, cText='/nocomo', aType=actType, cType='private'): send_text = remove_from_event('comida', actUser) if check_type_and_text_start(aText= actText, cText='/quiencome', aType=actType, cType='private'): - quiencome = find_by_event('comida') + quiencome = find_users_by_event('comida') if quiencome: send_text = show_list(u"Hoy come en Sugus:", quiencome, [2, 0]) else: @@ -99,9 +100,6 @@ def main(): if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): send_text = help_group() - if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): - send_text = help_event() - if check_type_and_text_start(aText=actText, cText='/groupadd', aType=actType, cType='private', cUId=message.from_user.id, perm_required="admin"): rtext = actText.replace('/groupadd ','').replace('/groupadd','') send_text = add_permission_group(rtext) @@ -109,25 +107,37 @@ def main(): if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group(), [0]) - if check_type_and_text_start(aText=actText, cText='/testingjoin', aType=actType, cType='private'): - rtext = actText.replace('/testingjoin','').replace(' ','') + if check_type_and_text_start(aText=actText, cText='/helpevents', aType=actType, cType='private'): + send_text = help_event() + + if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): + send_text = show_list(u"Elige una de las listas:", list_events(), [0]) + + if check_type_and_text_start(aText=actText, cText='/addevent', aType=actType, cType='private'): + send_text = "No disponible" + + if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private'): + send_text = "No disponible" + + if check_type_and_text_start(aText=actText, cText='/jointoevent', aType=actType, cType='private'): + rtext = actText.replace('/jointoevent','').replace(' ','') if not rtext: - send_text = u"Elige un evento /testingparticipants" + send_text = u"Elige un evento /events" else: - add_to_event(rtext, actUser) + add_to_event(rtext, act_user_id) - if check_type_and_text_start(aText= actText, cText='/testingparticipants', aType=actType, cType='private'): - rtext = actText.replace('/testingparticipants','').replace(' ','') + if check_type_and_text_start(aText= actText, cText='/participants', aType=actType, cType='private'): + rtext = actText.replace('/participants','').replace(' ','') if not rtext: send_text = show_list(u"Elige una de las listas:", list_events(), [0]) else: - if len(find_by_event(rtext)) == 0: + if len(find_users_by_event(rtext)) == 0: send_text = u"No hay nadie en {}".format(rtext) else: - send_text = show_list(u"Participantes en {}:".format(rtext), find_by_event(rtext), [2, 0]) + send_text = show_list(u"Participantes en {}:".format(rtext), find_users_by_event(rtext), [0]) - if check_type_and_text_start(aText= actText, cText='/testingdisjoin', aType=actType, cType='private'): - rtext = actText.replace('/testingdisjoin','').replace(' ','') + if check_type_and_text_start(aText= actText, cText='/leaveevent', aType=actType, cType='private'): + rtext = actText.replace('/leaveevent','').replace(' ','') send_text = remove_from_event(rtext, actUser) if check_type_and_text_start(aText= actText, cText='/testinghelp', aType=actType, cType='private'): #, aType=actType, cType='private'): @@ -155,14 +165,14 @@ def periodic_check(): yesterdayDate = datetime.now() - timedelta(days = 1) yesterdayDate = yesterdayDate.strftime("%d-%m-%y") - empty_event('comida',yesterdayDate) + empty_event('comida', yesterdayDate) def help(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/comida','Opciones de comida']] contain = contain + [['/group', 'Opciones de permisos']] - contain = contain + [['/events', 'Opciones de eventos']] + contain = contain + [['/helpevents', 'Opciones de eventos']] contain = contain +[['/testinghelp', 'Ayuda testing']] return show_list(header, contain) @@ -177,8 +187,8 @@ def help_eat(): def help_event(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda']] - contain = contain + [['/events', 'Listar eventos'], ['/addevent', 'Añadir un evento'], ['/jointoevent', 'Unirte a un evento']] - contain = contain + [['/leaveevent', 'Abandonar un evento'], ['/removeevent', 'Eliminar un evento']] + contain += [['/events', 'Listar eventos'], ['/addevent', 'Añadir un evento'], ['/removeevent', 'Eliminar un evento']] + contain += [['/leaveevent', 'Abandonar un evento'], ['/jointoevent', 'Unirte a un evento'], ['/participants', 'Listar participantes']] return show_list(header, contain) def help_group(): From 97b15135c5180717a694fb3cf817db6709013126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 17 Dec 2016 14:12:49 +0100 Subject: [PATCH 23/81] Improve show_list --- auxilliary_methods.py | 5 +++-- sugusbot.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index c02961b..8b5c778 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -43,6 +43,7 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = return result + def show_list(header, contains, positions = None): result = [header + "\n"] @@ -50,8 +51,8 @@ def show_list(header, contains, positions = None): if contains: if positions: for a in contains: - a_ordered = [a[i] for i in positions] - result.append("{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True)," ".join(a_ordered))) + a_ordered = [str(a[i]) for i in positions] + result.append("{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True), " ".join(a_ordered))) else: if isinstance(contains[0], str): rows = ["{} {}\n".format(emojize(":small_blue_diamond:", use_aliases=True) ,a) for a in contains] diff --git a/sugusbot.py b/sugusbot.py index d417683..783f65e 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -89,7 +89,7 @@ def main(): if check_type_and_text_start(aText= actText, cText='/quiencome', aType=actType, cType='private'): quiencome = find_users_by_event('comida') if quiencome: - send_text = show_list(u"Hoy come en Sugus:", quiencome, [2, 0]) + send_text = show_list(u"Hoy come en Sugus:", quiencome, [2]) else: send_text = 'De momento nadie come en Sugus' @@ -133,7 +133,7 @@ def main(): if len(find_users_by_event(rtext)) == 0: send_text = u"No hay nadie en {}".format(rtext) else: - send_text = show_list(u"Participantes en {}:".format(rtext), find_users_by_event(rtext), [0]) + send_text = show_list(u"Participantes en {}:".format(rtext), find_users_by_event(rtext), [2]) if check_type_and_text_start(aText= actText, cText='/leaveevent', aType=actType, cType='private'): rtext = actText.replace('/leaveevent','').replace(' ','') From fee0d91a42eca9fb2220c3f095782bce50ebf202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 17 Dec 2016 14:46:43 +0100 Subject: [PATCH 24/81] Update remove_from_event --- repository.py | 33 ++++++++++++++++++--------------- sugusbot.py | 4 ++-- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/repository.py b/repository.py index 7dd5a8c..fafba3e 100644 --- a/repository.py +++ b/repository.py @@ -35,7 +35,7 @@ def sec_init(id_admin): def add_to_event(event_name, user_id): - user = find_user_by_telegram_user_id(user_id=user_id) + user = find_user_by_telegram_user_id(telegram_user_id=user_id) event = find_event_by_name(event_name=event_name) if event and user: @@ -79,20 +79,23 @@ def find_users_by_event(event_name): return result -def remove_from_event(event, name): +def remove_from_event(event_name, telegram_user_id): - result = "No implementado" + event = find_event_by_name(event_name=event_name) + user = find_user_by_telegram_user_id(telegram_user_id=telegram_user_id) + print(event) + +# if any([('@' + name) in i for i in find_users_by_event(event_name)]): + if event and user: + c = conn.cursor() -# if any([('@' + name) in i for i in find_users_by_event(event)]): -# c = conn.cursor() -# -# c.execute('delete from eventTable where event=? and name=?', (event, u'@' + name)) -# conn.commit() -# -# c.close() -# result = "Has sido eliminado del evento " + event -# else: -# result = "No estás en el evento " + event + c.execute('delete from rel_user_event where event=? and user=?', (event[0], user[0])) + conn.commit() + + c.close() + result = "Has sido eliminado del evento " + event_name + else: + result = "Evento o usuario no encontrado" return result @@ -130,9 +133,9 @@ def list_events(): return h -def find_user_by_telegram_user_id(user_id): +def find_user_by_telegram_user_id(telegram_user_id): c = conn.cursor() - h = c.execute('select * from userTable where id_user_telegram=?', (user_id,)).fetchone() + h = c.execute('select * from userTable where id_user_telegram=?', (telegram_user_id,)).fetchone() c.close() diff --git a/sugusbot.py b/sugusbot.py index 783f65e..7ea17b5 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -84,7 +84,7 @@ def main(): send_text = add_to_event('comida', act_user_id) if check_type_and_text_start(aText= actText, cText='/nocomo', aType=actType, cType='private'): - send_text = remove_from_event('comida', actUser) + send_text = remove_from_event('comida', act_user_id) if check_type_and_text_start(aText= actText, cText='/quiencome', aType=actType, cType='private'): quiencome = find_users_by_event('comida') @@ -137,7 +137,7 @@ def main(): if check_type_and_text_start(aText= actText, cText='/leaveevent', aType=actType, cType='private'): rtext = actText.replace('/leaveevent','').replace(' ','') - send_text = remove_from_event(rtext, actUser) + send_text = remove_from_event(rtext, act_user_id) if check_type_and_text_start(aText= actText, cText='/testinghelp', aType=actType, cType='private'): #, aType=actType, cType='private'): send_text = helpTesting() From 78b01ef34727a92ee8a1084615698f17287e6dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 17 Dec 2016 20:26:36 +0100 Subject: [PATCH 25/81] Empty_event & periodic_check updated --- repository.py | 38 +++++++++++++++++--------------------- sugusbot.py | 14 +++++++++++--- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/repository.py b/repository.py index fafba3e..e4134a5 100644 --- a/repository.py +++ b/repository.py @@ -40,7 +40,7 @@ def add_to_event(event_name, user_id): if event and user: c = conn.cursor() - date = datetime.now().strftime("%d-%m-%y") + date = datetime.now().strftime("%d-%m-%y %H:%M:%S") c.execute('insert into rel_user_event values(?, ?, ?)', (user[0], event[0], date)) conn.commit() @@ -101,26 +101,22 @@ def remove_from_event(event_name, telegram_user_id): #el evento solo lo puede borrar un usuario con privilegios -def empty_event(event, date=None): - - result = "No implementado" - - # if find_users_by_event(event): - # c = conn.cursor() - # - # if date: - # c.execute('DELETE FROM eventTable WHERE date=? AND event=?', (date,event)) - # result = "El evento " + event + " de " + date + " ha sido eliminado" - # else: - # - # c.execute('DELETE FROM eventTable WHERE event=?', (event,)) - # result = "El evento " + event +" ha sido eliminado" - # - # conn.commit() - # - # c.close() - # else: - # result = 'El evento ' + event + ' no existe' +def empty_event(event_name): + + event = find_event_by_name(event_name=event_name) + + if event: + c = conn.cursor() + + c.execute('DELETE FROM rel_user_event WHERE event=?', (event[0],)) + + result = "El evento " + event_name +" ha sido eliminado" + + conn.commit() + + c.close() + else: + result = 'El evento ' + event_name + ' no existe' return result diff --git a/sugusbot.py b/sugusbot.py index 7ea17b5..69ac007 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -23,11 +23,14 @@ token = config['Telegram']['token'] id_admin = config['Telegram']['id_admin'] +last_periodic_check = None + # Create bot object create_bot(token) connection(database) + def main(): sec_init(id_admin) @@ -161,10 +164,15 @@ def main(): def periodic_check(): - yesterdayDate = datetime.now() - timedelta(days = 1) - yesterdayDate = yesterdayDate.strftime("%d-%m-%y") + global last_periodic_check + + yesterday_date = datetime.now() - timedelta(days=1) + yesterday_date = yesterday_date.strftime("%d-%m-%y") + + if last_periodic_check is yesterday_date: + empty_event('comida') - empty_event('comida', yesterdayDate) + last_periodic_check = datetime.now().strftime("%d-%m-%y") def help(): From e18e24fa85123f1cc0264fe8001a4f83343b0a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Sat, 17 Dec 2016 22:25:32 +0100 Subject: [PATCH 26/81] Added Auto update user data --- repository.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ sugusbot.py | 29 ++++++++++++++++++++------- 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/repository.py b/repository.py index e4134a5..4f3f513 100644 --- a/repository.py +++ b/repository.py @@ -5,6 +5,8 @@ from datetime import datetime conn = None +user_cache = list() +user_cache_last_update = None def connection(database): @@ -188,3 +190,55 @@ def add_user_permission(id_user_telegram, permission): return "El rol indicado no existe" c.close() + + +def update_user(id_user_telegram, user_name, force_update=False): + global user_cache, user_cache_last_update + result = None + stop = False + date = datetime.now().strftime("%j_%p") + + if user_cache_last_update != date or force_update: + print("Clean user_cache") + + user_cache = list() + user_cache_last_update = date + + if id_user_telegram in user_cache: # In cache + return stop, result + else: + user = find_user_by_telegram_user_id(telegram_user_id=id_user_telegram) + + if user is not None and user[2] == '@' + user_name: # In DB and not modified + user_cache.append(id_user_telegram) + return stop, result + elif user is not None: # In DB modified + try: + c = conn.cursor() + c.execute('UPDATE userTable SET user_name = ? WHERE id_user_telegram = ?', + ("@" + user_name, id_user_telegram)) + + conn.commit() + c.close() + except: + result = "No he podido actualizarte en la base de datos" + return True, result + finally: + user_cache.append(int(id_user_telegram)) + return stop, result + + else: + try: + c = conn.cursor() + c.execute('INSERT INTO userTable(id_user_telegram, user_name) VALUES (?, ?)', + (id_user_telegram, "@" + user_name)) + + conn.commit() + c.close() + except: + result = "No he podido guardarte en la base de datos" + return True, result + finally: + user_cache.append(int(id_user_telegram)) + return stop, result + diff --git a/sugusbot.py b/sugusbot.py index 69ac007..486c843 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -14,6 +14,7 @@ from emoji import emojize from repository import connection, sec_init, add_to_event, find_users_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group +import repository from messaging import create_bot, getUpdates, sendMessages from auxilliary_methods import get_who, check_type_and_text_start, show_list @@ -25,6 +26,9 @@ last_periodic_check = None +# Get last update ID +LAST_UPDATE_ID = None + # Create bot object create_bot(token) @@ -44,14 +48,11 @@ def main(): # Discard old updates, sent before the bot was started num_discarded = 0 - # Get last update ID - LAST_UPDATE_ID = None - while True: updates = getUpdates(LAST_UPDATE_ID, timeout=1) if updates is not None and updates: - num_discarded = num_discarded + len(updates) - LAST_UPDATE_ID = updates[-1].update_id + 1 + num_discarded += len(updates) + update_last_update_id(updates[-1].update_id) else: break @@ -71,7 +72,15 @@ def main(): actUser = message.from_user.username act_user_id = message.from_user.id - send_text = None + stop, send_text = repository.update_user(id_user_telegram=act_user_id, user_name=actUser) + + if send_text: + sendMessages(send_text, chat_id) + update_last_update_id(update_id) + send_text = None + + if stop: + break periodic_check() @@ -159,7 +168,13 @@ def main(): else: print("Mensaje enviado y no publicado por: "+str(actUser)) - LAST_UPDATE_ID = update_id + 1 + update_last_update_id(update_id) + + +def update_last_update_id(update_id): + global LAST_UPDATE_ID + + LAST_UPDATE_ID = update_id + 1 def periodic_check(): From 4de732e3917ae23ab3e59178746908e154825966 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Sat, 7 Jan 2017 19:56:25 +0100 Subject: [PATCH 27/81] Some fixes included Signed-off-by: JaviBF92 --- repository.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/repository.py b/repository.py index 4f3f513..2b7dbef 100644 --- a/repository.py +++ b/repository.py @@ -85,7 +85,6 @@ def remove_from_event(event_name, telegram_user_id): event = find_event_by_name(event_name=event_name) user = find_user_by_telegram_user_id(telegram_user_id=telegram_user_id) - print(event) # if any([('@' + name) in i for i in find_users_by_event(event_name)]): if event and user: @@ -170,7 +169,7 @@ def list_permission_group(): h = c.execute('SELECT permission FROM permissionTable').fetchall() if h: - h = [i[0] for i in c.execute('SELECT permission FROM permissionTable').fetchall()] + h = [i[0] for i in h] c.close() return h @@ -209,10 +208,10 @@ def update_user(id_user_telegram, user_name, force_update=False): else: user = find_user_by_telegram_user_id(telegram_user_id=id_user_telegram) - if user is not None and user[2] == '@' + user_name: # In DB and not modified + if user and user[2] == '@' + user_name: # In DB and not modified user_cache.append(id_user_telegram) return stop, result - elif user is not None: # In DB modified + elif user: # In DB modified try: c = conn.cursor() c.execute('UPDATE userTable SET user_name = ? WHERE id_user_telegram = ?', @@ -241,4 +240,3 @@ def update_user(id_user_telegram, user_name, force_update=False): finally: user_cache.append(int(id_user_telegram)) return stop, result - From fc1117039531b9b020e850d1e64cc94316b08d91 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Sat, 14 Jan 2017 00:59:11 +0100 Subject: [PATCH 28/81] Functions for delete and create events added; some warning messages changed Signed-off-by: JaviBF92 --- repository.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/repository.py b/repository.py index 2b7dbef..36daf1a 100644 --- a/repository.py +++ b/repository.py @@ -35,6 +35,16 @@ def sec_init(id_admin): conn.commit() c.close() +def add_event(event_name, event_date): + + if not find_event_by_name(event_name): + c = conn.cursor() + c.execute('INSERT INTO event_table(date, name) VALUES (?, ?)', (event_date, event_name)) + conn.commit() + c.close() + result = "Evento " + event_name + " creado" + else: + result = "El evento " + event_name + " ya existe" def add_to_event(event_name, user_id): user = find_user_by_telegram_user_id(telegram_user_id=user_id) @@ -101,7 +111,7 @@ def remove_from_event(event_name, telegram_user_id): return result -#el evento solo lo puede borrar un usuario con privilegios +#el evento solo lo puede vaciar un usuario con privilegios def empty_event(event_name): event = find_event_by_name(event_name=event_name) @@ -111,7 +121,7 @@ def empty_event(event_name): c.execute('DELETE FROM rel_user_event WHERE event=?', (event[0],)) - result = "El evento " + event_name +" ha sido eliminado" + result = "El evento " + event_name +" ha sido vaciado de usuarios" conn.commit() @@ -129,6 +139,19 @@ def list_events(): return h +#el evento solo lo puede borrar un usuario con privilegios +def remove_event(event_name): + event = find_event_by_name(event_name=event_name) + + if event: + c = conn.cursor() + h = c.execute('DELETE FROM event_table WHERE name=?', (event_name,)) + result = "El evento " + event_name + " ha sido eliminado" + conn.commit() + c.close() + else: + result = "El evento " + event_name + " no existe" + def find_user_by_telegram_user_id(telegram_user_id): c = conn.cursor() From 47a7662206006897b27aaa4195d330d591a2a9f6 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Wed, 25 Jan 2017 17:21:16 +0100 Subject: [PATCH 29/81] Writing permissions in log modified Signed-off-by: JaviBF92 --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 486c843..25d4f91 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -233,6 +233,6 @@ def helpTesting(): try: main() except Exception as e: - with open('log','w+') as f: + with open('log','a') as f: f.write(str(datetime.now().strftime("%d-%m-%y"))+"\n") f.write(str(e)+"\n") From 017f6e00bda7504a9632770172c514f60ed306fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 8 Feb 2017 16:26:22 +0100 Subject: [PATCH 30/81] URL change getWho URL changed from "http" to "https" --- auxilliary_methods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 8b5c778..64f5daf 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -12,7 +12,7 @@ def get_who(): while True: try: - url = 'http://sugus.eii.us.es/en_sugus.html' + url = 'https://sugus.eii.us.es/en_sugus.html' #html = AssertionErrorurlopen(url).read() html = urlopen(url).read() pq = PyQuery(html) From 0a7752e770d948f5d433ce7ffc08a23d4fb008b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 8 Feb 2017 17:28:16 +0100 Subject: [PATCH 31/81] Function /addevent Added fucntion /addevent --- auxilliary_methods.py | 10 ++++++++++ repository.py | 5 +++-- sugusbot.py | 10 +++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 64f5daf..8cb7526 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -6,6 +6,7 @@ import telegram from repository import find_user_by_telegram_user_id, check_user_permission from emoji import emojize +import datetime def get_who(): @@ -61,3 +62,12 @@ def show_list(header, contains, positions = None): result += rows return "".join(result) + + +def check_date(date): + try: + datetime.datetime.strptime(date, '%d-%m-%Y') + except ValueError: + return False + else: + return True diff --git a/repository.py b/repository.py index 36daf1a..c6e9321 100644 --- a/repository.py +++ b/repository.py @@ -35,6 +35,7 @@ def sec_init(id_admin): conn.commit() c.close() + def add_event(event_name, event_date): if not find_event_by_name(event_name): @@ -42,9 +43,9 @@ def add_event(event_name, event_date): c.execute('INSERT INTO event_table(date, name) VALUES (?, ?)', (event_date, event_name)) conn.commit() c.close() - result = "Evento " + event_name + " creado" + return "Evento " + event_name + " creado" else: - result = "El evento " + event_name + " ya existe" + return "El evento " + event_name + " ya existe" def add_to_event(event_name, user_id): user = find_user_by_telegram_user_id(telegram_user_id=user_id) diff --git a/sugusbot.py b/sugusbot.py index 25d4f91..2619cfa 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -17,6 +17,7 @@ import repository from messaging import create_bot, getUpdates, sendMessages from auxilliary_methods import get_who, check_type_and_text_start, show_list +import auxilliary_methods config = configparser.ConfigParser() config.read('myconfig.ini') @@ -125,7 +126,14 @@ def main(): send_text = show_list(u"Elige una de las listas:", list_events(), [0]) if check_type_and_text_start(aText=actText, cText='/addevent', aType=actType, cType='private'): - send_text = "No disponible" + rtext = actText.replace('/addevent ','').replace('/addevent','').split(" ") + if len(rtext) < 2: + send_text = "Formato incorrecto. EL formato debe ser: \n '/addevent nombre evento dd-mm-aaaa'" + elif not auxilliary_methods.check_date(rtext[len(rtext) - 1]): + send_text = "Formato de fecha incorrecto. Esperado 'dd-mm-aaaa'" + else: + event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) + send_text = repository.add_event(event_name=event_name, event_date=rtext[len(rtext) - 1]) if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private'): send_text = "No disponible" From df502530e2ca962acef413664e26125e0058635f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 8 Feb 2017 18:15:27 +0100 Subject: [PATCH 32/81] Function /addtogroup Added function /addtogroup --- repository.py | 19 +++++++++++++++---- sugusbot.py | 10 ++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/repository.py b/repository.py index c6e9321..4156998 100644 --- a/repository.py +++ b/repository.py @@ -163,6 +163,18 @@ def find_user_by_telegram_user_id(telegram_user_id): return h +def find_user_by_telegram_user_name(telegram_user_name): + + if not telegram_user_name.startswith("@"): + telegram_user_name = "@" + telegram_user_name + + c = conn.cursor() + h = c.execute('select * from userTable where user_name=?', (telegram_user_name,)).fetchone() + + c.close() + + return h + def check_user_permission(user_id, permission): c = conn.cursor() h = c.execute('select * from userTable INNER JOIN rel_user_permission ON userTable.id_user = rel_user_permission.user INNER JOIN permissionTable ON permissionTable.id_permission = rel_user_permission.permission where userTable.id_user_telegram = ? and permissionTable.permission = ?', (user_id, permission)).fetchone() @@ -202,17 +214,16 @@ def list_permission_group(): def add_user_permission(id_user_telegram, permission): c = conn.cursor() permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', (permission,)).fetchone() + ret = "El rol indicado no existe" if permission: - c.execute('INSERT INTO userTable(id_user_telegram) VALUES (?)', (id_user_telegram,)) id_user = c.execute('SELECT id_user from userTable WHERE id_user_telegram = ?', (id_user_telegram,)).fetchone()[0] c.execute('INSERT INTO rel_user_permission VALUES (?, ?)', (id_user, permission[0])) conn.commit() - return "Rol añadido a usuario " + str(id_user_telegram) - else: - return "El rol indicado no existe" + ret = "Rol añadido a usuario " + str(id_user_telegram) c.close() + return ret def update_user(id_user_telegram, user_name, force_update=False): diff --git a/sugusbot.py b/sugusbot.py index 2619cfa..da8f48b 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -116,6 +116,16 @@ def main(): rtext = actText.replace('/groupadd ','').replace('/groupadd','') send_text = add_permission_group(rtext) + if check_type_and_text_start(aText=actText, cText='/addtogroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required="admin"): + rtext = actText.replace('/addtogroup ','').replace('/addtogroup','').split(" ") + db_user = repository.find_user_by_telegram_user_name(rtext[0]) + if len(rtext) != 2: + send_text = "Formato incorrecto. El formato debe ser: \n '/addtogroup @username group_name'" + elif not db_user: + send_text = "Nombre de usuario '" + rtext[0] + "' no encontrado en la base de datos" + else: + send_text = repository.add_user_permission(db_user[1], rtext[1]) + if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group()) From edd6670527334195cb682d695e8c011cfb613876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 8 Feb 2017 18:23:19 +0100 Subject: [PATCH 33/81] Now check_type_and_text_start support multiple perm_required Modified auxilillary_methods.check_type_and_text_start for sypport multiple perm_required groups --- auxilliary_methods.py | 6 ++++-- sugusbot.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 8cb7526..132ab58 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -37,8 +37,10 @@ def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = if cUId is not None: if perm_required is None: # Comprobar solo usuario y permiso result = result and find_user_by_telegram_user_id(cUId) - else: # Comprobar usuario y permiso - result = result and check_user_permission(cUId, perm_required) + else: # Comprobar usuario y permisos + for a in perm_required: + if check_user_permission(cUId, a): + result = result and True if cText is not None: result = result and aText.startswith(cText) diff --git a/sugusbot.py b/sugusbot.py index da8f48b..d076f05 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -112,11 +112,11 @@ def main(): if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): send_text = help_group() - if check_type_and_text_start(aText=actText, cText='/groupadd', aType=actType, cType='private', cUId=message.from_user.id, perm_required="admin"): + if check_type_and_text_start(aText=actText, cText='/groupadd', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): rtext = actText.replace('/groupadd ','').replace('/groupadd','') send_text = add_permission_group(rtext) - if check_type_and_text_start(aText=actText, cText='/addtogroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required="admin"): + if check_type_and_text_start(aText=actText, cText='/addtogroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): rtext = actText.replace('/addtogroup ','').replace('/addtogroup','').split(" ") db_user = repository.find_user_by_telegram_user_name(rtext[0]) if len(rtext) != 2: From d7c8918cc894b094e750d602c3bdf55c8f8fb26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 8 Feb 2017 18:44:36 +0100 Subject: [PATCH 34/81] check_date only permit future event Improve auxilliary_methods.check_Date to permit only future date --- auxilliary_methods.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 132ab58..9121566 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -68,7 +68,8 @@ def show_list(header, contains, positions = None): def check_date(date): try: - datetime.datetime.strptime(date, '%d-%m-%Y') + if datetime.datetime.strptime(date + " 23:59:59", '%d-%m-%Y %H:%M:%S') < datetime.datetime.today(): + return False except ValueError: return False else: From e8e1cf2b32146250215de3b6b4441231897b10ac Mon Sep 17 00:00:00 2001 From: robertohueso Date: Fri, 10 Feb 2017 19:45:40 +0100 Subject: [PATCH 35/81] Add emoji package Adds emoji package to requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 855ac7c..6369115 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ pyquery python-telegram-bot cssselect lxml +emoji From 23aa1e1615c20182c2c1a6a6f8541dc2a9a934d5 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Sun, 12 Feb 2017 20:43:23 +0100 Subject: [PATCH 36/81] Improve check_user_permission Signed-off-by: JaviBF92 --- repository.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/repository.py b/repository.py index 4156998..1f0b675 100644 --- a/repository.py +++ b/repository.py @@ -178,13 +178,9 @@ def find_user_by_telegram_user_name(telegram_user_name): def check_user_permission(user_id, permission): c = conn.cursor() h = c.execute('select * from userTable INNER JOIN rel_user_permission ON userTable.id_user = rel_user_permission.user INNER JOIN permissionTable ON permissionTable.id_permission = rel_user_permission.permission where userTable.id_user_telegram = ? and permissionTable.permission = ?', (user_id, permission)).fetchone() - - if h: - h = h[0] - c.close() - return h + return bool(h) def add_permission_group(permission_name): From 7a48e449512087c7a43bd8166d2c96adda1782ec Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Mon, 13 Feb 2017 17:35:06 +0100 Subject: [PATCH 37/81] Addition of remove_from_group Function added in order to delete users' permissions. Signed-off-by: JaviBF92 --- repository.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/repository.py b/repository.py index 1f0b675..a166d5d 100644 --- a/repository.py +++ b/repository.py @@ -182,6 +182,19 @@ def check_user_permission(user_id, permission): return bool(h) +def remove_from_group(user_id, permission): + if check_user_permission(user_id, permission): + c = conn.cursor() + h = c.execute('DELETE from rel_user_permission where user=' + '(SELECT id_user FROM userTable where id_user_telegram=?) ' + 'and permission=(SELECT id_permission FROM permissionTable ' + 'WHERE permission=?)', (user_id, permission)) + conn.commit() + c.close() + result = "El usuario ha sido eliminado del grupo " + permission + else: + result = "El usuario no se encuentra en el grupo " + permission + return result def add_permission_group(permission_name): if permission_name and permission_name is not " ": From 25c059cff4ab9df0fd45cd83915fa7e81f4362eb Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Tue, 14 Feb 2017 16:14:34 +0100 Subject: [PATCH 38/81] Import changes Changes in module imports. Signed-off-by: JaviBF92 --- sugusbot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 675c887..947c13b 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -14,7 +14,7 @@ from emoji import emojize -from repository import connection, sec_init, add_to_event, find_users_by_event, remove_from_event, empty_event, list_events, add_permission_group, list_permission_group +from repository import * import repository from messaging import create_bot, getUpdates, sendMessages from auxilliary_methods import get_who, check_type_and_text_start, show_list @@ -74,7 +74,7 @@ def main(): actUser = message.from_user.username act_user_id = message.from_user.id - stop, send_text = repository.update_user(id_user_telegram=act_user_id, user_name=actUser) + stop, send_text = update_user(id_user_telegram=act_user_id, user_name=actUser) if send_text: sendMessages(send_text, chat_id) From 089ceeb821cf40abe84cde8ddb89279513732702 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Tue, 14 Feb 2017 20:32:41 +0100 Subject: [PATCH 39/81] Log writing permission fixed The script now checks if the log file exists before trying to write in it. Signed-off-by: JaviBF92 --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 947c13b..24e5a98 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -251,7 +251,7 @@ def helpTesting(): try: main() except Exception as e: - if os.stat('log').st_size > 1024: + if os.path.isfile('log') and os.stat('log').st_size > 1024: permission = 'w' else: permission = 'a' From c12a4ded95490b9a86159ae6ad4a224b5ee9dbd8 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Tue, 14 Feb 2017 20:38:52 +0100 Subject: [PATCH 40/81] Changes in commands Syntax in commands changed, and testing commands have been removed. Signed-off-by: JaviBF92 --- sugusbot.py | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 24e5a98..7ccbfa2 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -112,9 +112,9 @@ def main(): if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): send_text = help_group() - - if check_type_and_text_start(aText=actText, cText='/groupadd', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): - rtext = actText.replace('/groupadd ','').replace('/groupadd','') + #comprobar comando + if check_type_and_text_start(aText=actText, cText='/addgroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): + rtext = actText.replace('/addgroup ','').replace('/addgroup','') send_text = add_permission_group(rtext) if check_type_and_text_start(aText=actText, cText='/addtogroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): @@ -127,10 +127,17 @@ def main(): else: send_text = repository.add_user_permission(db_user[1], rtext[1]) + if check_type_and_text_start(aText=actText, cText='/quitgroup', aType=actType, cType='private', cUId=message.from_user.id): + msg = actText.split(" ") + if len(msg) != 2: + send_text = "Has introducido el comando de manera incorrecta. El formato debe ser:\n'/quitgroup'" + else: + send_text = remove_from_group(user_id, permission) + if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group()) - if check_type_and_text_start(aText=actText, cText='/helpevents', aType=actType, cType='private'): + if check_type_and_text_start(aText=actText, cText='/event', aType=actType, cType='private'): send_text = help_event() if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): @@ -170,16 +177,6 @@ def main(): rtext = actText.replace('/leaveevent','').replace(' ','') send_text = remove_from_event(rtext, act_user_id) - if check_type_and_text_start(aText= actText, cText='/testinghelp', aType=actType, cType='private'): #, aType=actType, cType='private'): - send_text = helpTesting() - - if check_type_and_text_start(aText= actText, cText='/testingempty', aType=actType, cType='private'): - rtext = actText.replace('/testingempty','').replace(' ','') - if rtext != 'comida': - send_text = empty_event(rtext, actUser) - else: - send_text = 'No soy tonto, no voy a dejar que borres quien come hoy' - if send_text != None: sendMessages(send_text, chat_id) elif check_type_and_text_start(aType=actType, cType='private'): @@ -212,8 +209,7 @@ def help(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/comida','Opciones de comida']] contain = contain + [['/group', 'Opciones de permisos']] - contain = contain + [['/helpevents', 'Opciones de eventos']] - contain = contain +[['/testinghelp', 'Ayuda testing']] + contain = contain + [['/event', 'Opciones de eventos']] return show_list(header, contain) @@ -231,18 +227,11 @@ def help_event(): contain += [['/leaveevent', 'Abandonar un evento'], ['/jointoevent', 'Unirte a un evento'], ['/participants', 'Listar participantes']] return show_list(header, contain) -def help_group(): - header = "Elige una de las opciones: " - contain = [['/help', 'Ayuda']] - contain = contain + [['/groups', 'Listar grupos'], ['/groupadd', 'Añadir un grupo']] - return show_list(header, contain) - -def helpTesting(): +def help_group(): header = "Elige una de las opciones: " - contain = [['/testinghelp', 'Ayuda testing'], ['/testingjoin','Apuntarse a un evento']] - contain = contain + [['/testingdisjoin','Desapuntarse de un evento'], ['/testingparticipants', 'Listar una lista']] - contain = contain + [['/testingempty', 'Vaciar una lista']] + contain = [['/help', 'Ayuda'], ['/groups', 'Listar grupos'], ['/addgroup', 'Añadir un grupo']] + contain += [['/addtogroup', 'Añadir a alguien a un grupo'], ['/quitgroup', 'Sacar a alguien de un grupo']] return show_list(header, contain) From bb47afc775a90f99e5f8184533e60351db019142 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Wed, 15 Feb 2017 19:38:09 +0100 Subject: [PATCH 41/81] Import changes Duplications in module imports deleted. Signed-off-by: JaviBF92 --- auxilliary_methods.py | 4 ++-- sugusbot.py | 14 ++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 9121566..a24f888 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -6,7 +6,7 @@ import telegram from repository import find_user_by_telegram_user_id, check_user_permission from emoji import emojize -import datetime +from datetime import datetime def get_who(): @@ -68,7 +68,7 @@ def show_list(header, contains, positions = None): def check_date(date): try: - if datetime.datetime.strptime(date + " 23:59:59", '%d-%m-%Y %H:%M:%S') < datetime.datetime.today(): + if datetime.strptime(date + " 23:59:59", '%d-%m-%Y %H:%M:%S') < datetime.today(): return False except ValueError: return False diff --git a/sugusbot.py b/sugusbot.py index 7ccbfa2..83b4c28 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -8,17 +8,15 @@ import sys import os -from datetime import datetime, timedelta +from datetime import timedelta import configparser from emoji import emojize from repository import * -import repository from messaging import create_bot, getUpdates, sendMessages -from auxilliary_methods import get_who, check_type_and_text_start, show_list -import auxilliary_methods +from auxilliary_methods import * config = configparser.ConfigParser() config.read('myconfig.ini') @@ -119,13 +117,13 @@ def main(): if check_type_and_text_start(aText=actText, cText='/addtogroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): rtext = actText.replace('/addtogroup ','').replace('/addtogroup','').split(" ") - db_user = repository.find_user_by_telegram_user_name(rtext[0]) + db_user = find_user_by_telegram_user_name(rtext[0]) if len(rtext) != 2: send_text = "Formato incorrecto. El formato debe ser: \n '/addtogroup @username group_name'" elif not db_user: send_text = "Nombre de usuario '" + rtext[0] + "' no encontrado en la base de datos" else: - send_text = repository.add_user_permission(db_user[1], rtext[1]) + send_text = add_user_permission(db_user[1], rtext[1]) if check_type_and_text_start(aText=actText, cText='/quitgroup', aType=actType, cType='private', cUId=message.from_user.id): msg = actText.split(" ") @@ -147,11 +145,11 @@ def main(): rtext = actText.replace('/addevent ','').replace('/addevent','').split(" ") if len(rtext) < 2: send_text = "Formato incorrecto. EL formato debe ser: \n '/addevent nombre evento dd-mm-aaaa'" - elif not auxilliary_methods.check_date(rtext[len(rtext) - 1]): + elif not check_date(rtext[len(rtext) - 1]): send_text = "Formato de fecha incorrecto. Esperado 'dd-mm-aaaa'" else: event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) - send_text = repository.add_event(event_name=event_name, event_date=rtext[len(rtext) - 1]) + send_text = add_event(event_name=event_name, event_date=rtext[len(rtext) - 1]) if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private'): send_text = "No disponible" From 66835bbe45fd851105d081445dd8f100309222db Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Wed, 15 Feb 2017 19:44:27 +0100 Subject: [PATCH 42/81] Addition of delfromgroup command Command made for the deletion of users included in groups Signed-off-by: JaviBF92 --- sugusbot.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 83b4c28..422849e 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -110,7 +110,7 @@ def main(): if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): send_text = help_group() - #comprobar comando + if check_type_and_text_start(aText=actText, cText='/addgroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): rtext = actText.replace('/addgroup ','').replace('/addgroup','') send_text = add_permission_group(rtext) @@ -125,12 +125,13 @@ def main(): else: send_text = add_user_permission(db_user[1], rtext[1]) - if check_type_and_text_start(aText=actText, cText='/quitgroup', aType=actType, cType='private', cUId=message.from_user.id): - msg = actText.split(" ") - if len(msg) != 2: - send_text = "Has introducido el comando de manera incorrecta. El formato debe ser:\n'/quitgroup'" + if check_type_and_text_start(aText=actText, cText='/delfromgroup', aType=actType, cType='private', cUId=message.from_user.id): + rtext = actText.split(" ") + if len(rtext) != 3: + send_text = "Has introducido el comando de manera incorrecta. El formato debe ser:\n'/delfromgroup @usermane groupname'" else: - send_text = remove_from_group(user_id, permission) + user = find_user_by_telegram_user_name(rtext[1]) + send_text = remove_from_group(user[1], rtext[2]) if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group()) @@ -229,7 +230,7 @@ def help_event(): def help_group(): header = "Elige una de las opciones: " contain = [['/help', 'Ayuda'], ['/groups', 'Listar grupos'], ['/addgroup', 'Añadir un grupo']] - contain += [['/addtogroup', 'Añadir a alguien a un grupo'], ['/quitgroup', 'Sacar a alguien de un grupo']] + contain += [['/addtogroup', 'Añadir a alguien a un grupo'], ['/delfromgroup', 'Sacar a alguien de un grupo']] return show_list(header, contain) From d6e769248b5222e08eebdc9f1695b46a13cb7b4b Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Wed, 15 Feb 2017 19:49:13 +0100 Subject: [PATCH 43/81] Addition of delfromgroup command Command made for the deletion of users included in groups. It call the remove_from_group function. Signed-off-by: JaviBF92 --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 422849e..4a33601 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -125,7 +125,7 @@ def main(): else: send_text = add_user_permission(db_user[1], rtext[1]) - if check_type_and_text_start(aText=actText, cText='/delfromgroup', aType=actType, cType='private', cUId=message.from_user.id): + if check_type_and_text_start(aText=actText, cText='/delfromgroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): rtext = actText.split(" ") if len(rtext) != 3: send_text = "Has introducido el comando de manera incorrecta. El formato debe ser:\n'/delfromgroup @usermane groupname'" From 1cf365054007e1145411317e21d23b67bc1c14b2 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 19:27:19 +0100 Subject: [PATCH 44/81] addevent command permissions 'creator' column added to event_table with same parameter in add_event function, plus creator and permission checkers to control the making (and removal) of events. Signed-off-by: JaviBF92 --- repository.py | 6 +++--- sugusbot.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/repository.py b/repository.py index a166d5d..f2d29d6 100644 --- a/repository.py +++ b/repository.py @@ -16,7 +16,7 @@ def connection(database): def sec_init(id_admin): c = conn.cursor() - c.execute('CREATE TABLE IF NOT EXISTS event_table(id_event INTEGER PRIMARY KEY, date TEXT, name TEXT, UNIQUE(date, name))') + c.execute('CREATE TABLE IF NOT EXISTS event_table(id_event INTEGER PRIMARY KEY, date TEXT, name TEXT, creator TEXT, UNIQUE(date, name))') c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER UNIQUE, user_name text UNIQUE)') c.execute('CREATE TABLE IF NOT EXISTS rel_user_event(user INTEGER, event INTEGER, date TEXT, FOREIGN KEY(user) REFERENCES userTable(id_user), FOREIGN KEY(event) REFERENCES event_table(id_event), UNIQUE(user, event) ON CONFLICT REPLACE)') c.execute('CREATE TABLE IF NOT EXISTS permissionTable(id_permission INTEGER PRIMARY KEY, permission TEXT, UNIQUE(permission))') @@ -36,11 +36,11 @@ def sec_init(id_admin): c.close() -def add_event(event_name, event_date): +def add_event(event_name, event_date, creator): if not find_event_by_name(event_name): c = conn.cursor() - c.execute('INSERT INTO event_table(date, name) VALUES (?, ?)', (event_date, event_name)) + c.execute('INSERT INTO event_table(date, name, creator) VALUES (?, ?, ?)', (event_date, event_name, creator)) conn.commit() c.close() return "Evento " + event_name + " creado" diff --git a/sugusbot.py b/sugusbot.py index 4a33601..6a4d80c 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -142,15 +142,15 @@ def main(): if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): send_text = show_list(u"Elige una de las listas:", list_events(), [0]) - if check_type_and_text_start(aText=actText, cText='/addevent', aType=actType, cType='private'): + if check_type_and_text_start(aText=actText, cText='/addevent', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): rtext = actText.replace('/addevent ','').replace('/addevent','').split(" ") if len(rtext) < 2: - send_text = "Formato incorrecto. EL formato debe ser: \n '/addevent nombre evento dd-mm-aaaa'" + send_text = "Formato incorrecto. El formato debe ser: \n '/addevent nombre-evento dd-mm-aaaa'" elif not check_date(rtext[len(rtext) - 1]): send_text = "Formato de fecha incorrecto. Esperado 'dd-mm-aaaa'" else: event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) - send_text = add_event(event_name=event_name, event_date=rtext[len(rtext) - 1]) + send_text = add_event(event_name, rtext[len(rtext) - 1], message.from_user.id) if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private'): send_text = "No disponible" From ca4bf545ecb4d2dba183a852cc0d175c8ad1988a Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 19:39:00 +0100 Subject: [PATCH 45/81] addition of removeevent command It calls to remove_event function (which now removes rel_user_event table entries related to the event and user). Also checks the number of entries, the existence of the event and its owner before calling the function. Signed-off-by: JaviBF92 --- repository.py | 3 ++- sugusbot.py | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/repository.py b/repository.py index f2d29d6..dc11b50 100644 --- a/repository.py +++ b/repository.py @@ -142,9 +142,10 @@ def list_events(): #el evento solo lo puede borrar un usuario con privilegios def remove_event(event_name): - event = find_event_by_name(event_name=event_name) + event = find_event_by_name(event_name) if event: + empty_event(event[0]) c = conn.cursor() h = c.execute('DELETE FROM event_table WHERE name=?', (event_name,)) result = "El evento " + event_name + " ha sido eliminado" diff --git a/sugusbot.py b/sugusbot.py index 6a4d80c..b83bd5f 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -152,8 +152,18 @@ def main(): event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) send_text = add_event(event_name, rtext[len(rtext) - 1], message.from_user.id) - if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private'): - send_text = "No disponible" + if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): + rtext = actText.split(' ') + if len(rtext) < 2: + send_text = "Formato incorrecto. El formato debe ser:\n/removeevent nombre-evento" + else: + event = find_event_by_name(rtext[1]) + if not event: + send_text = "El evento no existe" + elif int(event[3]) == message.from_user.id: + send_text = remove_event(rtext[1]) + else: + send_text = "No tienes permiso para eliminar este evento" if check_type_and_text_start(aText=actText, cText='/jointoevent', aType=actType, cType='private'): rtext = actText.replace('/jointoevent','').replace(' ','') From f8552ec1c59e94f184726b1df75f8af1baac1263 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 19:45:59 +0100 Subject: [PATCH 46/81] fixes in addevent command Signed-off-by: JaviBF92 --- repository.py | 2 +- sugusbot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/repository.py b/repository.py index dc11b50..221444c 100644 --- a/repository.py +++ b/repository.py @@ -58,7 +58,7 @@ def add_to_event(event_name, user_id): c.execute('insert into rel_user_event values(?, ?, ?)', (user[0], event[0], date)) conn.commit() c.close() - result = "añadido a " + event_name + result = "Añadido a " + event_name elif not user: result = "No estás registrado en el sistema" diff --git a/sugusbot.py b/sugusbot.py index b83bd5f..ea57a7b 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -170,7 +170,7 @@ def main(): if not rtext: send_text = u"Elige un evento /events" else: - add_to_event(rtext, act_user_id) + send_text = add_to_event(rtext, act_user_id) if check_type_and_text_start(aText= actText, cText='/participants', aType=actType, cType='private'): rtext = actText.replace('/participants','').replace(' ','') From 4c02fbbda7f2dc52451ebbdafc504a3222097559 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 21:06:03 +0100 Subject: [PATCH 47/81] Changes in removeevent command An event can only be removed by its creator if its date has expired and it's empty. Signed-off-by: JaviBF92 --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index ea57a7b..722d3d7 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -160,7 +160,7 @@ def main(): event = find_event_by_name(rtext[1]) if not event: send_text = "El evento no existe" - elif int(event[3]) == message.from_user.id: + elif int(event[3]) == message.from_user.id and not bool(find_users_by_event(rtext[1])) and datetime.strptime(event[1],"%d-%m-%Y").date() < datetime.today().date() : send_text = remove_event(rtext[1]) else: send_text = "No tienes permiso para eliminar este evento" From a66d90c5e374225397320dc6325f7bc870439722 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 21:25:24 +0100 Subject: [PATCH 48/81] auxilliary_methods function check_date improved Signed-off-by: JaviBF92 --- auxilliary_methods.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index a24f888..7ef9a29 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -67,10 +67,11 @@ def show_list(header, contains, positions = None): def check_date(date): + res = True + try: - if datetime.strptime(date + " 23:59:59", '%d-%m-%Y %H:%M:%S') < datetime.today(): - return False + if datetime.strptime(date, '%d-%m-%Y').date() < datetime.today().date(): + res = False except ValueError: - return False - else: - return True + res = False + return res From b513d0b7cde46b8390942af463695275f6e07fe3 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 21:27:09 +0100 Subject: [PATCH 49/81] Redundant code deleted Signed-off-by: JaviBF92 --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 722d3d7..482d429 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -160,7 +160,7 @@ def main(): event = find_event_by_name(rtext[1]) if not event: send_text = "El evento no existe" - elif int(event[3]) == message.from_user.id and not bool(find_users_by_event(rtext[1])) and datetime.strptime(event[1],"%d-%m-%Y").date() < datetime.today().date() : + elif int(event[3]) == message.from_user.id and not bool(find_users_by_event(rtext[1])) and check_date(event[1],"%d-%m-%Y"): send_text = remove_event(rtext[1]) else: send_text = "No tienes permiso para eliminar este evento" From 3c2df8ceed46e43f9aa9c9efadd0fdf275203c10 Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 21:28:16 +0100 Subject: [PATCH 50/81] Changes in events command It shows their date besides its name now. Signed-off-by: JaviBF92 --- repository.py | 2 +- sugusbot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/repository.py b/repository.py index 221444c..b1fa865 100644 --- a/repository.py +++ b/repository.py @@ -135,7 +135,7 @@ def empty_event(event_name): def list_events(): c = conn.cursor() - h = c.execute('select distinct name from event_table').fetchall() + h = c.execute('select distinct name, date from event_table').fetchall() c.close() return h diff --git a/sugusbot.py b/sugusbot.py index 482d429..a638861 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -140,7 +140,7 @@ def main(): send_text = help_event() if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): - send_text = show_list(u"Elige una de las listas:", list_events(), [0]) + send_text = show_list(u"Elige una de las listas:", list_events(), [0, 1]) if check_type_and_text_start(aText=actText, cText='/addevent', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): rtext = actText.replace('/addevent ','').replace('/addevent','').split(" ") From ec2b7b8604baa789a1c84dddc8b4b7e7f72cc33b Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Thu, 23 Feb 2017 21:30:20 +0100 Subject: [PATCH 51/81] Changes in /addevent message Signed-off-by: JaviBF92 --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index a638861..09a97d3 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -147,7 +147,7 @@ def main(): if len(rtext) < 2: send_text = "Formato incorrecto. El formato debe ser: \n '/addevent nombre-evento dd-mm-aaaa'" elif not check_date(rtext[len(rtext) - 1]): - send_text = "Formato de fecha incorrecto. Esperado 'dd-mm-aaaa'" + send_text = "Formato de fecha incorrecto ('dd-mm-aaaa') o la fecha ya ha pasado" else: event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) send_text = add_event(event_name, rtext[len(rtext) - 1], message.from_user.id) From 281d07b338bedab210e6d04ccc2d8c198abf9fda Mon Sep 17 00:00:00 2001 From: JaviBF92 Date: Tue, 28 Feb 2017 17:30:52 +0100 Subject: [PATCH 52/81] Log messages improved Signed-off-by: JaviBF92 --- sugusbot.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 09a97d3..59b986b 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -7,6 +7,7 @@ import codecs import sys import os +import traceback from datetime import timedelta @@ -248,11 +249,12 @@ def help_group(): while True: try: main() - except Exception as e: + except Exception: if os.path.isfile('log') and os.stat('log').st_size > 1024: permission = 'w' else: permission = 'a' with open('log', permission) as f: - f.write(str(datetime.now().strftime("%d-%m-%y"))+"\n") - f.write(str(e)+"\n") + info = traceback.format_exc() + f.write(str(datetime.now().strftime("%d-%m-%y %H:%M"))+"\n") + f.write(info+"\n") From e21f2ecf9186170ddd948267d531b62a5e81a675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Mon, 15 May 2017 17:55:01 +0200 Subject: [PATCH 53/81] Capturando error al obtener usuarios --- sugusbot.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 59b986b..0a97c66 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -86,12 +86,20 @@ def main(): periodic_check() if check_type_and_text_start(aText= actText, cText='/who', aType=actType, cType='private'): - who = get_who() - - if not who: - send_text = u"Parece que no hay nadie... {}".format(emojize(":disappointed_face:", use_aliases=True)) - else: - send_text = show_list(u"Miembros en SUGUS:", who) + max_retry = 2 + for i in range(max_retry): + try: + who = get_who() + if not who: + send_text = u"Parece que no hay nadie... {}".format( + emojize(":disappointed_face:", use_aliases=True)) + else: + send_text = show_list(u"Miembros en SUGUS:", who) + break + except Exception as e: + if i is max_retry - 1: + print("Hubo un error repetitivo al intentar conectar al servidor: ", e) + send_text = u"Hubo algún error al realizar la petición a la web de sugus" if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): send_text = add_to_event('comida', act_user_id) From ddb37900142cfbc0af467ef5fe2e6463b784d8e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Fri, 19 May 2017 20:35:46 +0200 Subject: [PATCH 54/81] =?UTF-8?q?Debug=20no=20se=20vacia=20comida=20autom?= =?UTF-8?q?=C3=A1ticamente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- repository.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/repository.py b/repository.py index b1fa865..291eacb 100644 --- a/repository.py +++ b/repository.py @@ -114,7 +114,7 @@ def remove_from_event(event_name, telegram_user_id): #el evento solo lo puede vaciar un usuario con privilegios def empty_event(event_name): - + print("Vamos a proceder a vaciar el evento: " + event_name) event = find_event_by_name(event_name=event_name) if event: @@ -122,7 +122,7 @@ def empty_event(event_name): c.execute('DELETE FROM rel_user_event WHERE event=?', (event[0],)) - result = "El evento " + event_name +" ha sido vaciado de usuarios" + result = "El evento " + event_name + " ha sido vaciado de usuarios" conn.commit() @@ -130,6 +130,7 @@ def empty_event(event_name): else: result = 'El evento ' + event_name + ' no existe' + print(result) return result From c6fea050c918501678d292b62ff5b47bbfefe1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Fri, 19 May 2017 20:43:57 +0200 Subject: [PATCH 55/81] =?UTF-8?q?Capturando=20m=C3=A1s=20detalladamente=20?= =?UTF-8?q?los=20errores=20del=20archivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sugusbot.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 0a97c66..ec2fb2f 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -8,6 +8,7 @@ import sys import os import traceback +import time from datetime import timedelta @@ -257,12 +258,17 @@ def help_group(): while True: try: main() - except Exception: - if os.path.isfile('log') and os.stat('log').st_size > 1024: - permission = 'w' - else: - permission = 'a' - with open('log', permission) as f: - info = traceback.format_exc() - f.write(str(datetime.now().strftime("%d-%m-%y %H:%M"))+"\n") - f.write(info+"\n") + except Exception as e: + logging.error("Ocurrió el siguiente error: ", e) + try: + if os.path.isfile('log') and os.stat('log').st_size > 1024: + permission = 'w' + else: + permission = 'a' + with open('log', permission) as f: + info = traceback.format_exc() + f.write(str(datetime.now().strftime("%d-%m-%y %H:%M"))+"\n") + f.write(info+"\n") + except Exception as e: + logging.error("Ocurrió el siguiente error al intentar persistir el error: ", e) + time.sleep(20) From ad67695caa8de045213cbc686eab4ceea3169120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Fri, 19 May 2017 20:51:18 +0200 Subject: [PATCH 56/81] Posible Fix autoborrado evento comida --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index ec2fb2f..e2bbf3f 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -26,7 +26,7 @@ token = config['Telegram']['token'] id_admin = config['Telegram']['id_admin'] -last_periodic_check = None +last_periodic_check = datetime.now().strftime("%d-%m-%y") # Get last update ID LAST_UPDATE_ID = None From 360bfaa11442890f4ee7a6690f40ad8804656aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Fri, 30 Jun 2017 12:52:20 +0200 Subject: [PATCH 57/81] Changed detach call --- sugusbot.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index e2bbf3f..8bc9d4e 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -42,7 +42,8 @@ def main(): sec_init(id_admin) # UTF-8 console stuff thingies - sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) + sys.stdout = codecs.getwriter("utf-8") + sys.stdout.detach() # Init logging logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') From e8b9f4a4cdf26706758fde684116771c80e722dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Fri, 30 Jun 2017 13:14:55 +0200 Subject: [PATCH 58/81] Removed detach call for testing --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 8bc9d4e..8cbf386 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -43,7 +43,7 @@ def main(): # UTF-8 console stuff thingies sys.stdout = codecs.getwriter("utf-8") - sys.stdout.detach() + # sys.stdout.detach() # Init logging logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') From 296e18157b53825bf21546cbc08c1b6e998f9a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Fri, 30 Jun 2017 14:03:31 +0200 Subject: [PATCH 59/81] Commented out buggy print --- sugusbot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sugusbot.py b/sugusbot.py index 8cbf386..866af87 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -59,7 +59,7 @@ def main(): else: break - print("Discarded {} old updates".format(num_discarded)) + # print("Discarded {} old updates".format(num_discarded)) # Main loop print('Working...') From 3e2c2cd5b584f24e250eaa92d2c1683ebfa5b55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Fri, 30 Jun 2017 14:19:25 +0200 Subject: [PATCH 60/81] Modified prints --- sugusbot.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index 866af87..d69b235 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -59,10 +59,10 @@ def main(): else: break - # print("Discarded {} old updates".format(num_discarded)) + print("Discarded {} old updates".format(num_discarded), file=sys.stdout) # Main loop - print('Working...') + print('Working...', file=sys.stdout) while True: updates = getUpdates(LAST_UPDATE_ID) @@ -100,7 +100,7 @@ def main(): break except Exception as e: if i is max_retry - 1: - print("Hubo un error repetitivo al intentar conectar al servidor: ", e) + print("Hubo un error repetitivo al intentar conectar al servidor: ", e, file=sys.stdout) send_text = u"Hubo algún error al realizar la petición a la web de sugus" if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): @@ -202,7 +202,7 @@ def main(): elif check_type_and_text_start(aType=actType, cType='private'): sendMessages(help(), chat_id) else: - print("Mensaje enviado y no publicado por: "+str(actUser)) + print("Mensaje enviado y no publicado por: "+str(actUser), file=sys.stdout) update_last_update_id(update_id) From 8f846bbd1196f0278116ab8c59325be62bfd35f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Tue, 4 Jul 2017 17:15:46 +0200 Subject: [PATCH 61/81] Added editor folders to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 65313df..de31331 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ myconfig.ini log *.pyc *.db +.idea +.vscode \ No newline at end of file From f43cda28eb5d3cd478161e84ee025e2242c3f0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Tue, 4 Jul 2017 17:17:51 +0200 Subject: [PATCH 62/81] Print functions removed in main --- sugusbot.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sugusbot.py b/sugusbot.py index d69b235..2cdac05 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -42,7 +42,7 @@ def main(): sec_init(id_admin) # UTF-8 console stuff thingies - sys.stdout = codecs.getwriter("utf-8") + # sys.stdout = codecs.getwriter("utf-8") # sys.stdout.detach() # Init logging @@ -59,10 +59,10 @@ def main(): else: break - print("Discarded {} old updates".format(num_discarded), file=sys.stdout) + # print("Discarded {} old updates".format(num_discarded)) # Main loop - print('Working...', file=sys.stdout) + # print('Working...') while True: updates = getUpdates(LAST_UPDATE_ID) @@ -100,7 +100,7 @@ def main(): break except Exception as e: if i is max_retry - 1: - print("Hubo un error repetitivo al intentar conectar al servidor: ", e, file=sys.stdout) + print("Hubo un error repetitivo al intentar conectar al servidor: ", e) send_text = u"Hubo algún error al realizar la petición a la web de sugus" if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): @@ -201,8 +201,8 @@ def main(): sendMessages(send_text, chat_id) elif check_type_and_text_start(aType=actType, cType='private'): sendMessages(help(), chat_id) - else: - print("Mensaje enviado y no publicado por: "+str(actUser), file=sys.stdout) + # else: + # print("Mensaje enviado y no publicado por: "+str(actUser)) update_last_update_id(update_id) @@ -272,4 +272,3 @@ def help_group(): f.write(info+"\n") except Exception as e: logging.error("Ocurrió el siguiente error al intentar persistir el error: ", e) - time.sleep(20) From a24b1f85287fb7387a4195e3f356a29d431d1c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Tue, 4 Jul 2017 17:22:53 +0200 Subject: [PATCH 63/81] New main loop using library DRY extension --- handlers.py | 392 ++++++++++++++++++++++++++++++++++++++++++++++++ sugusbot_new.py | 87 +++++++++++ 2 files changed, 479 insertions(+) create mode 100644 handlers.py create mode 100644 sugusbot_new.py diff --git a/handlers.py b/handlers.py new file mode 100644 index 0000000..1148c77 --- /dev/null +++ b/handlers.py @@ -0,0 +1,392 @@ +#!/usr/bin/python3.5 +# -*- coding: utf-8 -*- + +import repository +from emoji import emojize +from auxilliary_methods import * + +""" +This module contains the functions that handlers execute. +""" + +# Help functions +def help_eat(): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda']] + contain = contain + [['/como', 'Yo como aquí'], + ['/nocomo', 'Yo no como aquí'], + ['/quiencome', '¿Quien come aquí?']] + return show_list(header, contain) + + +def help_event(): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda']] + contain += [['/events', 'Listar eventos'], + ['/addevent', 'Añadir un evento'], + ['/removeevent', 'Eliminar un evento']] + contain += [['/leaveevent', 'Abandonar un evento'], + ['/jointoevent', 'Unirte a un evento'], + ['/participants', 'Listar participantes']] + return show_list(header, contain) + + +def help_group(): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda'], ['/groups', 'Listar grupos'], + ['/addgroup', 'Añadir un grupo']] + contain += [['/addtogroup', 'Añadir a alguien a un grupo'], + ['/delfromgroup', 'Sacar a alguien de un grupo']] + return show_list(header, contain) + + +# Command handlers definitions +def start(bot, update): + update.message.reply_text('¡Hola! Soy SugusBot, escribe "/help" para ver' + ' la lista de comandos disponibles.') + + +def help(bot, update): + header = "Elige una de las opciones: " + contain = [['/help', 'Ayuda'], ['/who', '¿Quien hay en Sugus?'], + ['/comida', 'Opciones de comida']] + contain = contain + [['/group', 'Opciones de permisos']] + contain = contain + [['/event', 'Opciones de eventos']] + update.message.reply_text(show_list(header, contain)) + + +def who(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/who', aType=actType, + cType='private'): + max_retry = 2 + for i in range(max_retry): + try: + who = get_who() + if not who: + send_text = u"Parece que no hay nadie... {}".format( + emojize(":disappointed_face:", use_aliases=True)) + else: + send_text = show_list(u"Miembros en SUGUS:", who) + break + except Exception as e: + if i is max_retry - 1: + print("Hubo un error repetitivo al intentar conectar al " + "servidor: ", e) + send_text = u"Hubo algún error al realizar la petición" + \ + u" a la web de sugus" + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def como(bot, update): + actText = update.message.text + actType = update.message.chat.type + act_user_id = update.message.from_user.id + + if check_type_and_text_start(aText=actText, cText='/como', aType=actType, + cType='private'): + send_text = add_to_event('comida', act_user_id) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def no_como(bot, update): + actText = update.message.text + actType = update.message.chat.type + act_user_id = update.message.from_user.id + + if check_type_and_text_start(aText=actText, cText='/nocomo', aType=actType, + cType='private'): + send_text = remove_from_event('comida', act_user_id) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def quien_come(bot, update): + actText = update.message.text + actType = update.message.chat.type + act_user_id = update.message.from_user.id + + if check_type_and_text_start(aText=actText, cText='/quiencome', + aType=actType, cType='private'): + quiencome = repository.find_users_by_event('comida') + if quiencome: + send_text = show_list(u"Hoy come en Sugus:", quiencome, [2]) + else: + send_text = 'De momento nadie come en Sugus' + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def comida(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/comida', + aType=actType, cType='private'): + send_text = help_eat() + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def group(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/group', + aType=actType, cType='private'): + send_text = help_eat() + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def add_group(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/addgroup', + aType=actType, cType='private', + cUId=update.message.from_user.id, + perm_required=["admin"]): + rtext = actText.replace('/addgroup ', '').replace('/addgroup', '') + send_text = repository.add_permission_group(rtext) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def add_to_group(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/addtogroup', + aType=actType, cType='private', + cUId=update.message.from_user.id, + perm_required=["admin", "sugus"]): + rtext = actText.replace('/addtogroup ', '').replace('/addtogroup', '')\ + .split(" ") + db_user = repository.find_user_by_telegram_user_name(rtext[0]) + + if len(rtext) != 2: + send_text = "Formato incorrecto. El formato debe ser: \n" + \ + "'/addtogroup @username group_name'" + elif not db_user: + send_text = "Nombre de usuario '" + rtext[0] + \ + "' no encontrado en la base de datos" + else: + send_text = repository.add_user_permission(db_user[1], rtext[1]) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def del_from_group(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/delfromgroup', + aType=actType, cType='private', + cUId=update.message.from_user.id, + perm_required=["admin", "sugus"]): + rtext = actText.split(" ") + + if len(rtext) != 3: + send_text = "Has introducido el comando de manera incorrecta." + \ + "El formato debe ser:\n'/delfromgroup @usermane " + \ + "groupname'" + else: + user = find_user_by_telegram_user_name(rtext[1]) + send_text = repository.remove_from_group(user[1], rtext[2]) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def groups(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/groups', + aType=actType, cType='private', + cUId=update.message.from_user.id): + send_text = show_list(u"Grupos de permisos disponibles:", + repository.list_permission_group()) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def event(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/event', + aType=actType, cType='private'): + send_text = help_event() + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def events(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/events', + aType=actType, cType='private'): + send_text = show_list(u"Elige una de las listas:", + repository.list_events(), [0, 1]) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def add_event(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/addevent', + aType=actType, cType='private', + cUId=update.message.from_user.id, + perm_required=["admin", "sugus"]): + rtext = actText.replace('/addevent ', '').replace('/addevent', '')\ + .split(" ") + if len(rtext) < 2: + send_text = "Formato incorrecto. El formato debe ser: \n " + \ + "'/addevent nombre-evento dd-mm-aaaa'" + elif not check_date(rtext[len(rtext) - 1]): + send_text = "Formato de fecha incorrecto ('dd-mm-aaaa') " + \ + "o la fecha ya ha pasado" + else: + event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) + send_text = repository.add_event(event_name, rtext[len(rtext) - 1], + update.message.from_user.id) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def remove_event(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/removeevent', + aType=actType, cType='private', + cUId=update.message.from_user.id, + perm_required=["admin"]): + rtext = actText.split(' ') + + if len(rtext) < 2: + send_text = "Formato incorrecto. El formato debe ser:\n" + \ + "'/removeevent nombre-evento'" + else: + event = repository.find_event_by_name(rtext[1]) + + if not event: + send_text = "El evento no existe" + elif (int(event[3]) == update.message.from_user.id and + not bool(repository.find_users_by_event(rtext[1])) and + check_date(event[1], "%d-%m-%Y")): + send_text = remove_event(rtext[1]) + else: + send_text = "No tienes permiso para eliminar este evento" + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def join_to_event(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/jointoevent', + aType=actType, cType='private'): + rtext = actText.replace('/jointoevent', '').replace(' ', '') + if not rtext: + send_text = u"Elige un evento /events" + else: + send_text = repository.add_to_event(rtext, act_user_id) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def participants(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/participants', + aType=actType, cType='private'): + rtext = actText.replace('/participants', '').replace(' ', '') + + if not rtext: + send_text = show_list(u"Elige una de las listas:", list_events()) + else: + if len(find_users_by_event(rtext)) == 0: + send_text = u"No hay nadie en {}".format(rtext) + else: + send_text = show_list(u"Participantes en {}:".format(rtext), + find_users_by_event(rtext), [2]) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def leave_event(bot, update): + actText = update.message.text + actType = update.message.chat.type + + if check_type_and_text_start(aText=actText, cText='/leaveevent', + aType=actType, cType='private'): + rtext = actText.replace('/leaveevent', '').replace(' ', '') + send_text = repository.remove_from_event(rtext, act_user_id) + + if send_text is not None: + update.message.reply_text(send_text) + else: + update.message.reply_text(help()) + + +def error(bot, update, error): + logger.warn('Update "%s" caused error "%s"' % (update, error)) diff --git a/sugusbot_new.py b/sugusbot_new.py new file mode 100644 index 0000000..12fc81d --- /dev/null +++ b/sugusbot_new.py @@ -0,0 +1,87 @@ +#!/usr/bin/python3.5 +# -*- coding: utf-8 -*- + +import logging +import repository +import handlers + +from configparser import ConfigParser +from telegram.ext import Updater, CommandHandler, MessageHandler, Filters + +# Init logging +logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s ' + '- %(message)s', level=logging.INFO) + +logger = logging.getLogger(__name__) + +# Retrieve configuration from config file +config = ConfigParser() +config.read('myconfig.ini') +database = config['Database']['route'] +token = config['Telegram']['token'] +id_admin = config['Telegram']['id_admin'] + +# Start database connection +repository.connection(database) + + +def main(): + # Database initialization + repository.sec_init(id_admin) + + # EventHandler creation + updater = Updater(token) + + dispatcher = updater.dispatcher + + # Assign functions to handlers + dispatcher.add_handler(CommandHandler('start', + handlers.start)) + dispatcher.add_handler(CommandHandler('help', + handlers.help)) + dispatcher.add_handler(CommandHandler('who', + handlers.who)) + dispatcher.add_handler(CommandHandler('como', + handlers.como)) + dispatcher.add_handler(CommandHandler('quiencome', + handlers.quien_come)) + dispatcher.add_handler(CommandHandler('comida', + handlers.comida)) + dispatcher.add_handler(CommandHandler('group', + handlers.group)) + dispatcher.add_handler(CommandHandler('addgroup', + handlers.add_group)) + dispatcher.add_handler(CommandHandler('addtogroup', + handlers.add_to_group)) + dispatcher.add_handler(CommandHandler('delfromgroup', + handlers.del_from_group)) + dispatcher.add_handler(CommandHandler('groups', + handlers.groups)) + dispatcher.add_handler(CommandHandler('event', + handlers.event)) + dispatcher.add_handler(CommandHandler('events', + handlers.events)) + dispatcher.add_handler(CommandHandler('addevent', + handlers.add_event)) + dispatcher.add_handler(CommandHandler('removeevent', + handlers.remove_event)) + dispatcher.add_handler(CommandHandler('jointoevent', + handlers.join_to_event)) + dispatcher.add_handler(CommandHandler('participants', + handlers.participants)) + dispatcher.add_handler(CommandHandler('leaveevent', + handlers.leave_event)) + + # Error handler, for logging purposes + dispatcher.add_error_handler(handlers.error) + + # Start the bot + updater.start_polling() + + # Run the bot until you press Ctrl-C or the process receives SIGINT, + # SIGTERM or SIGABRT. This should be used most of the time, since + # start_polling() is non-blocking and will stop the bot gracefully. + updater.idle() + +if __name__ == '__main__': + main() From 5604dfcc0841d8f6889cc66632b908e6923c0342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Sun, 16 Jul 2017 12:08:12 +0200 Subject: [PATCH 64/81] Fixed SQLite thread error and others --- handlers.py | 7 ++++--- repository.py | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/handlers.py b/handlers.py index 1148c77..ad935a2 100644 --- a/handlers.py +++ b/handlers.py @@ -9,6 +9,7 @@ This module contains the functions that handlers execute. """ + # Help functions def help_eat(): header = "Elige una de las opciones: " @@ -91,7 +92,7 @@ def como(bot, update): if check_type_and_text_start(aText=actText, cText='/como', aType=actType, cType='private'): - send_text = add_to_event('comida', act_user_id) + send_text = repository.add_to_event('comida', act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -106,7 +107,7 @@ def no_como(bot, update): if check_type_and_text_start(aText=actText, cText='/nocomo', aType=actType, cType='private'): - send_text = remove_from_event('comida', act_user_id) + send_text = repository.remove_from_event('comida', act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -220,7 +221,7 @@ def del_from_group(bot, update): "El formato debe ser:\n'/delfromgroup @usermane " + \ "groupname'" else: - user = find_user_by_telegram_user_name(rtext[1]) + user = repository.find_user_by_telegram_user_name(rtext[1]) send_text = repository.remove_from_group(user[1], rtext[2]) if send_text is not None: diff --git a/repository.py b/repository.py index 291eacb..32c7900 100644 --- a/repository.py +++ b/repository.py @@ -7,14 +7,23 @@ conn = None user_cache = list() user_cache_last_update = None +db = None def connection(database): - global conn + global conn, db conn = sqlite3.connect(database) + db = database + + +def check_connection(): + global conn + if conn is None: + connection(db) def sec_init(id_admin): + global conn c = conn.cursor() c.execute('CREATE TABLE IF NOT EXISTS event_table(id_event INTEGER PRIMARY KEY, date TEXT, name TEXT, creator TEXT, UNIQUE(date, name))') c.execute('CREATE TABLE IF NOT EXISTS userTable(id_user INTEGER PRIMARY KEY, id_user_telegram NUMBER UNIQUE, user_name text UNIQUE)') @@ -34,9 +43,11 @@ def sec_init(id_admin): conn.commit() c.close() + conn = None def add_event(event_name, event_date, creator): + check_connection() if not find_event_by_name(event_name): c = conn.cursor() @@ -47,7 +58,9 @@ def add_event(event_name, event_date, creator): else: return "El evento " + event_name + " ya existe" + def add_to_event(event_name, user_id): + check_connection() user = find_user_by_telegram_user_id(telegram_user_id=user_id) event = find_event_by_name(event_name=event_name) @@ -69,6 +82,7 @@ def add_to_event(event_name, user_id): def find_event_by_name(event_name): + check_connection() c = conn.cursor() h = c.execute('select * from event_table where name=?', (event_name,)).fetchone() @@ -78,6 +92,7 @@ def find_event_by_name(event_name): def find_users_by_event(event_name): + check_connection() event = find_event_by_name(event_name=event_name) if event: @@ -93,7 +108,7 @@ def find_users_by_event(event_name): def remove_from_event(event_name, telegram_user_id): - + check_connection() event = find_event_by_name(event_name=event_name) user = find_user_by_telegram_user_id(telegram_user_id=telegram_user_id) @@ -112,8 +127,9 @@ def remove_from_event(event_name, telegram_user_id): return result -#el evento solo lo puede vaciar un usuario con privilegios +# el evento solo lo puede vaciar un usuario con privilegios def empty_event(event_name): + check_connection() print("Vamos a proceder a vaciar el evento: " + event_name) event = find_event_by_name(event_name=event_name) @@ -135,14 +151,17 @@ def empty_event(event_name): def list_events(): + check_connection() c = conn.cursor() h = c.execute('select distinct name, date from event_table').fetchall() c.close() return h + #el evento solo lo puede borrar un usuario con privilegios def remove_event(event_name): + check_connection() event = find_event_by_name(event_name) if event: @@ -157,6 +176,7 @@ def remove_event(event_name): def find_user_by_telegram_user_id(telegram_user_id): + check_connection() c = conn.cursor() h = c.execute('select * from userTable where id_user_telegram=?', (telegram_user_id,)).fetchone() @@ -166,6 +186,7 @@ def find_user_by_telegram_user_id(telegram_user_id): def find_user_by_telegram_user_name(telegram_user_name): + check_connection() if not telegram_user_name.startswith("@"): telegram_user_name = "@" + telegram_user_name @@ -177,14 +198,18 @@ def find_user_by_telegram_user_name(telegram_user_name): return h + def check_user_permission(user_id, permission): + check_connection() c = conn.cursor() h = c.execute('select * from userTable INNER JOIN rel_user_permission ON userTable.id_user = rel_user_permission.user INNER JOIN permissionTable ON permissionTable.id_permission = rel_user_permission.permission where userTable.id_user_telegram = ? and permissionTable.permission = ?', (user_id, permission)).fetchone() c.close() return bool(h) + def remove_from_group(user_id, permission): + check_connection() if check_user_permission(user_id, permission): c = conn.cursor() h = c.execute('DELETE from rel_user_permission where user=' @@ -198,7 +223,9 @@ def remove_from_group(user_id, permission): result = "El usuario no se encuentra en el grupo " + permission return result + def add_permission_group(permission_name): + check_connection() if permission_name and permission_name is not " ": permission_name = permission_name.replace(" ", "_") c = conn.cursor() @@ -212,6 +239,7 @@ def add_permission_group(permission_name): def list_permission_group(): + check_connection() c = conn.cursor() h = c.execute('SELECT permission FROM permissionTable').fetchall() @@ -223,6 +251,7 @@ def list_permission_group(): def add_user_permission(id_user_telegram, permission): + check_connection() c = conn.cursor() permission = c.execute('SELECT id_permission FROM permissionTable WHERE permission = ?', (permission,)).fetchone() ret = "El rol indicado no existe" @@ -238,6 +267,7 @@ def add_user_permission(id_user_telegram, permission): def update_user(id_user_telegram, user_name, force_update=False): + check_connection() global user_cache, user_cache_last_update result = None stop = False From b1048b716a60456ab53e7c1d3b7943a5c98b98a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Tue, 25 Jul 2017 16:26:20 +0200 Subject: [PATCH 65/81] Modified import of repository module --- handlers.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/handlers.py b/handlers.py index ad935a2..a46b0f9 100644 --- a/handlers.py +++ b/handlers.py @@ -1,7 +1,7 @@ #!/usr/bin/python3.5 # -*- coding: utf-8 -*- -import repository +from repository import * from emoji import emojize from auxilliary_methods import * @@ -92,7 +92,7 @@ def como(bot, update): if check_type_and_text_start(aText=actText, cText='/como', aType=actType, cType='private'): - send_text = repository.add_to_event('comida', act_user_id) + send_text = add_to_event('comida', act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -107,7 +107,7 @@ def no_como(bot, update): if check_type_and_text_start(aText=actText, cText='/nocomo', aType=actType, cType='private'): - send_text = repository.remove_from_event('comida', act_user_id) + send_text = remove_from_event('comida', act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -122,7 +122,7 @@ def quien_come(bot, update): if check_type_and_text_start(aText=actText, cText='/quiencome', aType=actType, cType='private'): - quiencome = repository.find_users_by_event('comida') + quiencome = find_users_by_event('comida') if quiencome: send_text = show_list(u"Hoy come en Sugus:", quiencome, [2]) else: @@ -171,7 +171,7 @@ def add_group(bot, update): cUId=update.message.from_user.id, perm_required=["admin"]): rtext = actText.replace('/addgroup ', '').replace('/addgroup', '') - send_text = repository.add_permission_group(rtext) + send_text = add_permission_group(rtext) if send_text is not None: update.message.reply_text(send_text) @@ -189,7 +189,7 @@ def add_to_group(bot, update): perm_required=["admin", "sugus"]): rtext = actText.replace('/addtogroup ', '').replace('/addtogroup', '')\ .split(" ") - db_user = repository.find_user_by_telegram_user_name(rtext[0]) + db_user = find_user_by_telegram_user_name(rtext[0]) if len(rtext) != 2: send_text = "Formato incorrecto. El formato debe ser: \n" + \ @@ -198,7 +198,7 @@ def add_to_group(bot, update): send_text = "Nombre de usuario '" + rtext[0] + \ "' no encontrado en la base de datos" else: - send_text = repository.add_user_permission(db_user[1], rtext[1]) + send_text = add_user_permission(db_user[1], rtext[1]) if send_text is not None: update.message.reply_text(send_text) @@ -221,8 +221,8 @@ def del_from_group(bot, update): "El formato debe ser:\n'/delfromgroup @usermane " + \ "groupname'" else: - user = repository.find_user_by_telegram_user_name(rtext[1]) - send_text = repository.remove_from_group(user[1], rtext[2]) + user = find_user_by_telegram_user_name(rtext[1]) + send_text = remove_from_group(user[1], rtext[2]) if send_text is not None: update.message.reply_text(send_text) @@ -238,7 +238,7 @@ def groups(bot, update): aType=actType, cType='private', cUId=update.message.from_user.id): send_text = show_list(u"Grupos de permisos disponibles:", - repository.list_permission_group()) + list_permission_group()) if send_text is not None: update.message.reply_text(send_text) @@ -267,7 +267,7 @@ def events(bot, update): if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): send_text = show_list(u"Elige una de las listas:", - repository.list_events(), [0, 1]) + list_events(), [0, 1]) if send_text is not None: update.message.reply_text(send_text) @@ -293,8 +293,8 @@ def add_event(bot, update): "o la fecha ya ha pasado" else: event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) - send_text = repository.add_event(event_name, rtext[len(rtext) - 1], - update.message.from_user.id) + send_text = add_event(event_name, rtext[len(rtext) - 1], + update.message.from_user.id) if send_text is not None: update.message.reply_text(send_text) @@ -316,12 +316,12 @@ def remove_event(bot, update): send_text = "Formato incorrecto. El formato debe ser:\n" + \ "'/removeevent nombre-evento'" else: - event = repository.find_event_by_name(rtext[1]) + event = find_event_by_name(rtext[1]) if not event: send_text = "El evento no existe" elif (int(event[3]) == update.message.from_user.id and - not bool(repository.find_users_by_event(rtext[1])) and + not bool(find_users_by_event(rtext[1])) and check_date(event[1], "%d-%m-%Y")): send_text = remove_event(rtext[1]) else: @@ -343,7 +343,7 @@ def join_to_event(bot, update): if not rtext: send_text = u"Elige un evento /events" else: - send_text = repository.add_to_event(rtext, act_user_id) + send_text = add_to_event(rtext, act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -360,7 +360,8 @@ def participants(bot, update): rtext = actText.replace('/participants', '').replace(' ', '') if not rtext: - send_text = show_list(u"Elige una de las listas:", list_events()) + send_text = show_list(u"Elige una de las listas:", + list_events()) else: if len(find_users_by_event(rtext)) == 0: send_text = u"No hay nadie en {}".format(rtext) @@ -381,7 +382,7 @@ def leave_event(bot, update): if check_type_and_text_start(aText=actText, cText='/leaveevent', aType=actType, cType='private'): rtext = actText.replace('/leaveevent', '').replace(' ', '') - send_text = repository.remove_from_event(rtext, act_user_id) + send_text = remove_from_event(rtext, act_user_id) if send_text is not None: update.message.reply_text(send_text) From 57eb690c77fffad056f6970f0d3374a9959adddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Garc=C3=ADa=20Calero?= Date: Tue, 25 Jul 2017 17:05:10 +0200 Subject: [PATCH 66/81] Improved imports in handlers module --- handlers.py | 208 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 128 insertions(+), 80 deletions(-) diff --git a/handlers.py b/handlers.py index a46b0f9..b070a74 100644 --- a/handlers.py +++ b/handlers.py @@ -1,9 +1,9 @@ #!/usr/bin/python3.5 # -*- coding: utf-8 -*- -from repository import * +import repository from emoji import emojize -from auxilliary_methods import * +import auxilliary_methods """ This module contains the functions that handlers execute. @@ -17,7 +17,7 @@ def help_eat(): contain = contain + [['/como', 'Yo como aquí'], ['/nocomo', 'Yo no como aquí'], ['/quiencome', '¿Quien come aquí?']] - return show_list(header, contain) + return auxilliary_methods.show_list(header, contain) def help_event(): @@ -29,7 +29,7 @@ def help_event(): contain += [['/leaveevent', 'Abandonar un evento'], ['/jointoevent', 'Unirte a un evento'], ['/participants', 'Listar participantes']] - return show_list(header, contain) + return auxilliary_methods.show_list(header, contain) def help_group(): @@ -38,7 +38,7 @@ def help_group(): ['/addgroup', 'Añadir un grupo']] contain += [['/addtogroup', 'Añadir a alguien a un grupo'], ['/delfromgroup', 'Sacar a alguien de un grupo']] - return show_list(header, contain) + return auxilliary_methods.show_list(header, contain) # Command handlers definitions @@ -53,24 +53,27 @@ def help(bot, update): ['/comida', 'Opciones de comida']] contain = contain + [['/group', 'Opciones de permisos']] contain = contain + [['/event', 'Opciones de eventos']] - update.message.reply_text(show_list(header, contain)) + update.message.reply_text(auxilliary_methods.show_list(header, contain)) def who(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/who', aType=actType, - cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/who', + aType=actType, + cType='private'): max_retry = 2 for i in range(max_retry): try: - who = get_who() + who = auxilliary_methods.get_who() if not who: send_text = u"Parece que no hay nadie... {}".format( emojize(":disappointed_face:", use_aliases=True)) else: - send_text = show_list(u"Miembros en SUGUS:", who) + send_text = auxilliary_methods.show_list( + u"Miembros en SUGUS:", who) break except Exception as e: if i is max_retry - 1: @@ -90,9 +93,11 @@ def como(bot, update): actType = update.message.chat.type act_user_id = update.message.from_user.id - if check_type_and_text_start(aText=actText, cText='/como', aType=actType, - cType='private'): - send_text = add_to_event('comida', act_user_id) + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/como', + aType=actType, + cType='private'): + send_text = repository.add_to_event('comida', act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -105,9 +110,11 @@ def no_como(bot, update): actType = update.message.chat.type act_user_id = update.message.from_user.id - if check_type_and_text_start(aText=actText, cText='/nocomo', aType=actType, - cType='private'): - send_text = remove_from_event('comida', act_user_id) + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/nocomo', + aType=actType, + cType='private'): + send_text = repository.remove_from_event('comida', act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -120,11 +127,14 @@ def quien_come(bot, update): actType = update.message.chat.type act_user_id = update.message.from_user.id - if check_type_and_text_start(aText=actText, cText='/quiencome', - aType=actType, cType='private'): - quiencome = find_users_by_event('comida') + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/quiencome', + aType=actType, + cType='private'): + quiencome = repository.find_users_by_event('comida') if quiencome: - send_text = show_list(u"Hoy come en Sugus:", quiencome, [2]) + send_text = auxilliary_methods.show_list(u"Hoy come en Sugus:", + quiencome, [2]) else: send_text = 'De momento nadie come en Sugus' @@ -138,8 +148,10 @@ def comida(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/comida', - aType=actType, cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/comida', + aType=actType, + cType='private'): send_text = help_eat() if send_text is not None: @@ -152,8 +164,10 @@ def group(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/group', - aType=actType, cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/group', + aType=actType, + cType='private'): send_text = help_eat() if send_text is not None: @@ -166,12 +180,15 @@ def add_group(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/addgroup', - aType=actType, cType='private', - cUId=update.message.from_user.id, - perm_required=["admin"]): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/addgroup', + aType=actType, + cType='private', + cUId=update.message. + from_user.id, + perm_required=["admin"]): rtext = actText.replace('/addgroup ', '').replace('/addgroup', '') - send_text = add_permission_group(rtext) + send_text = repository.add_permission_group(rtext) if send_text is not None: update.message.reply_text(send_text) @@ -183,13 +200,17 @@ def add_to_group(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/addtogroup', - aType=actType, cType='private', - cUId=update.message.from_user.id, - perm_required=["admin", "sugus"]): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/addtogroup', + aType=actType, + cType='private', + cUId=update.message. + from_user.id, + perm_required=["admin", + "sugus"]): rtext = actText.replace('/addtogroup ', '').replace('/addtogroup', '')\ .split(" ") - db_user = find_user_by_telegram_user_name(rtext[0]) + db_user = repository.find_user_by_telegram_user_name(rtext[0]) if len(rtext) != 2: send_text = "Formato incorrecto. El formato debe ser: \n" + \ @@ -198,7 +219,7 @@ def add_to_group(bot, update): send_text = "Nombre de usuario '" + rtext[0] + \ "' no encontrado en la base de datos" else: - send_text = add_user_permission(db_user[1], rtext[1]) + send_text = repository.add_user_permission(db_user[1], rtext[1]) if send_text is not None: update.message.reply_text(send_text) @@ -210,10 +231,14 @@ def del_from_group(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/delfromgroup', - aType=actType, cType='private', - cUId=update.message.from_user.id, - perm_required=["admin", "sugus"]): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/delfromgroup', + aType=actType, + cType='private', + cUId=update.message. + from_user.id, + perm_required=["admin", + "sugus"]): rtext = actText.split(" ") if len(rtext) != 3: @@ -221,8 +246,8 @@ def del_from_group(bot, update): "El formato debe ser:\n'/delfromgroup @usermane " + \ "groupname'" else: - user = find_user_by_telegram_user_name(rtext[1]) - send_text = remove_from_group(user[1], rtext[2]) + user = repository.find_user_by_telegram_user_name(rtext[1]) + send_text = repository.remove_from_group(user[1], rtext[2]) if send_text is not None: update.message.reply_text(send_text) @@ -234,11 +259,15 @@ def groups(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/groups', - aType=actType, cType='private', - cUId=update.message.from_user.id): - send_text = show_list(u"Grupos de permisos disponibles:", - list_permission_group()) + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/groups', + aType=actType, + cType='private', + cUId=update.message. + from_user.id): + send_text = auxilliary_methods.show_list( + u"Grupos de permisos disponibles:", + repository.list_permission_group()) if send_text is not None: update.message.reply_text(send_text) @@ -250,8 +279,10 @@ def event(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/event', - aType=actType, cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/event', + aType=actType, + cType='private'): send_text = help_event() if send_text is not None: @@ -264,10 +295,13 @@ def events(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/events', - aType=actType, cType='private'): - send_text = show_list(u"Elige una de las listas:", - list_events(), [0, 1]) + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/events', + aType=actType, + cType='private'): + send_text = auxilliary_methods.show_list( + u"Elige una de las listas:", repository.list_events(), + [0, 1]) if send_text is not None: update.message.reply_text(send_text) @@ -279,22 +313,26 @@ def add_event(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/addevent', - aType=actType, cType='private', - cUId=update.message.from_user.id, - perm_required=["admin", "sugus"]): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/addevent', + aType=actType, + cType='private', + cUId=update.message. + from_user.id, + perm_required=["admin", + "sugus"]): rtext = actText.replace('/addevent ', '').replace('/addevent', '')\ .split(" ") if len(rtext) < 2: send_text = "Formato incorrecto. El formato debe ser: \n " + \ "'/addevent nombre-evento dd-mm-aaaa'" - elif not check_date(rtext[len(rtext) - 1]): + elif not auxilliary_methods.check_date(rtext[len(rtext) - 1]): send_text = "Formato de fecha incorrecto ('dd-mm-aaaa') " + \ "o la fecha ya ha pasado" else: event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) - send_text = add_event(event_name, rtext[len(rtext) - 1], - update.message.from_user.id) + send_text = repository.add_event(event_name, rtext[len(rtext) - 1], + update.message.from_user.id) if send_text is not None: update.message.reply_text(send_text) @@ -306,24 +344,27 @@ def remove_event(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/removeevent', - aType=actType, cType='private', - cUId=update.message.from_user.id, - perm_required=["admin"]): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/removeevent', + aType=actType, + cType='private', + cUId=update.message. + from_user.id, + perm_required=["admin"]): rtext = actText.split(' ') if len(rtext) < 2: send_text = "Formato incorrecto. El formato debe ser:\n" + \ "'/removeevent nombre-evento'" else: - event = find_event_by_name(rtext[1]) + event = repository.find_event_by_name(rtext[1]) if not event: send_text = "El evento no existe" elif (int(event[3]) == update.message.from_user.id and - not bool(find_users_by_event(rtext[1])) and - check_date(event[1], "%d-%m-%Y")): - send_text = remove_event(rtext[1]) + not bool(repository.find_users_by_event(rtext[1])) and + auxilliary_methods.check_date(event[1], "%d-%m-%Y")): + send_text = repository.remove_event(rtext[1]) else: send_text = "No tienes permiso para eliminar este evento" @@ -337,13 +378,15 @@ def join_to_event(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/jointoevent', - aType=actType, cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/jointoevent', + aType=actType, + cType='private'): rtext = actText.replace('/jointoevent', '').replace(' ', '') if not rtext: send_text = u"Elige un evento /events" else: - send_text = add_to_event(rtext, act_user_id) + send_text = repository.add_to_event(rtext, act_user_id) if send_text is not None: update.message.reply_text(send_text) @@ -355,19 +398,22 @@ def participants(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/participants', - aType=actType, cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/participants', + aType=actType, + cType='private'): rtext = actText.replace('/participants', '').replace(' ', '') if not rtext: - send_text = show_list(u"Elige una de las listas:", - list_events()) + send_text = auxilliary_methods.show_list( + u"Elige una de las listas:", repository.list_events()) else: - if len(find_users_by_event(rtext)) == 0: + if len(repository.find_users_by_event(rtext)) == 0: send_text = u"No hay nadie en {}".format(rtext) else: - send_text = show_list(u"Participantes en {}:".format(rtext), - find_users_by_event(rtext), [2]) + send_text = auxilliary_methods.show_list( + u"Participantes en {}:".format(rtext), + repository.find_users_by_event(rtext), [2]) if send_text is not None: update.message.reply_text(send_text) @@ -379,10 +425,12 @@ def leave_event(bot, update): actText = update.message.text actType = update.message.chat.type - if check_type_and_text_start(aText=actText, cText='/leaveevent', - aType=actType, cType='private'): + if auxilliary_methods.check_type_and_text_start(aText=actText, + cText='/leaveevent', + aType=actType, + cType='private'): rtext = actText.replace('/leaveevent', '').replace(' ', '') - send_text = remove_from_event(rtext, act_user_id) + send_text = repository.remove_from_event(rtext, act_user_id) if send_text is not None: update.message.reply_text(send_text) From b6f58554dc32c5a5d83425f2facfab2bdb7187ae Mon Sep 17 00:00:00 2001 From: robertohueso Date: Tue, 3 Oct 2017 20:21:40 +0200 Subject: [PATCH 67/81] Improves gitignore Add gitignore for Emacs, Linux, Python --- .gitignore | 188 +++++++++++++++++++++++++++++++++++++++++++++++- config.ini | 5 -- sugusbot_new.py | 2 +- 3 files changed, 187 insertions(+), 8 deletions(-) delete mode 100644 config.ini diff --git a/.gitignore b/.gitignore index de31331..02f4cd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,190 @@ -myconfig.ini +config.ini log *.pyc *.db .idea -.vscode \ No newline at end of file +.vscode + +# Created by https://www.gitignore.io/api/linux,emacs,python + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile +projectile-bookmarks.eld + +# directory configuration +.dir-locals.el + +# saveplace +places + +# url cache +url/cache/ + +# cedet +ede-projects.el + +# smex +smex-items + +# company-statistics +company-statistics-cache.el + +# anaconda-mode +anaconda-mode/ + +### Linux ### + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/config.ini b/config.ini deleted file mode 100644 index c332aad..0000000 --- a/config.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Database] -route = sugusBotDB.db -[Telegram] -token = xxxx -id_admin = xxxx diff --git a/sugusbot_new.py b/sugusbot_new.py index 12fc81d..f657c23 100644 --- a/sugusbot_new.py +++ b/sugusbot_new.py @@ -16,7 +16,7 @@ # Retrieve configuration from config file config = ConfigParser() -config.read('myconfig.ini') +config.read('config.ini') database = config['Database']['route'] token = config['Telegram']['token'] id_admin = config['Telegram']['id_admin'] From 1f5429a931586eb1507c117b729b33536455c519 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Tue, 3 Oct 2017 21:01:59 +0200 Subject: [PATCH 68/81] Add comida inline buttons --- handlers.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/handlers.py b/handlers.py index b070a74..a29f727 100644 --- a/handlers.py +++ b/handlers.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import repository +import telegram from emoji import emojize import auxilliary_methods @@ -148,16 +149,17 @@ def comida(bot, update): actText = update.message.text actType = update.message.chat.type + comida_keyboard = [[telegram.InlineKeyboardButton('Help', url='www.google.com')], + [telegram.InlineKeyboardButton('Como', url='www.google.com')], + [telegram.InlineKeyboardButton('No Como', url='www.google.com')], + [telegram.InlineKeyboardButton('Quién come?', url='www.google.com')]] + if auxilliary_methods.check_type_and_text_start(aText=actText, cText='/comida', aType=actType, cType='private'): - send_text = help_eat() - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) + reply_markup = telegram.InlineKeyboardMarkup(comida_keyboard) + update.message.reply_text('Elige una de las opciones:', reply_markup=reply_markup) def group(bot, update): From 9e0b5289489398b22f9575853e470dab08f7a583 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Wed, 4 Oct 2017 20:54:04 +0200 Subject: [PATCH 69/81] Implement quien_come --- auxilliary_methods.py | 8 +++++++- handlers.py | 36 +++++++++++++----------------------- sugusbot_new.py | 6 ++++-- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 7ef9a29..089c079 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -27,7 +27,13 @@ def get_who(): return who -def check_type_and_text_start(aText = None, aUName = None, cText = None, aType = None, cType = None, cUId = None, perm_required=None): +def check_type_and_text_start(aText = None, + aUName = None, + cText = None, + aType = None, + cType = None, + cUId = None, + perm_required=None): # Si perm_required es None y cUId no es None entonces se busca que el usuario esté en cualquier grupo result = True diff --git a/handlers.py b/handlers.py index a29f727..06675ad 100644 --- a/handlers.py +++ b/handlers.py @@ -124,41 +124,31 @@ def no_como(bot, update): def quien_come(bot, update): - actText = update.message.text - actType = update.message.chat.type - act_user_id = update.message.from_user.id - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/quiencome', - aType=actType, - cType='private'): - quiencome = repository.find_users_by_event('comida') - if quiencome: - send_text = auxilliary_methods.show_list(u"Hoy come en Sugus:", - quiencome, [2]) - else: - send_text = 'De momento nadie come en Sugus' - - if send_text is not None: - update.message.reply_text(send_text) + quiencome = repository.find_users_by_event('comida') + if quiencome: + send_text = auxilliary_methods.show_list(u"Hoy come en Sugus:", + quiencome, [2]) else: - update.message.reply_text(help()) + send_text = 'De momento nadie come en Sugus' + update.callback_query.message.reply_text(send_text) + id = update.callback_query.id + bot.answerCallbackQuery(id) def comida(bot, update): actText = update.message.text actType = update.message.chat.type - comida_keyboard = [[telegram.InlineKeyboardButton('Help', url='www.google.com')], - [telegram.InlineKeyboardButton('Como', url='www.google.com')], - [telegram.InlineKeyboardButton('No Como', url='www.google.com')], - [telegram.InlineKeyboardButton('Quién come?', url='www.google.com')]] + comida_btns = [[telegram.InlineKeyboardButton('Help', url='www.google.com')], + [telegram.InlineKeyboardButton('Como', url='www.google.com')], + [telegram.InlineKeyboardButton('No Como', url='www.google.com')], + [telegram.InlineKeyboardButton('Quién come?', callback_data = 'quien_come')]] if auxilliary_methods.check_type_and_text_start(aText=actText, cText='/comida', aType=actType, cType='private'): - reply_markup = telegram.InlineKeyboardMarkup(comida_keyboard) + reply_markup = telegram.InlineKeyboardMarkup(comida_btns) update.message.reply_text('Elige una de las opciones:', reply_markup=reply_markup) diff --git a/sugusbot_new.py b/sugusbot_new.py index f657c23..8a7e54d 100644 --- a/sugusbot_new.py +++ b/sugusbot_new.py @@ -6,7 +6,8 @@ import handlers from configparser import ConfigParser -from telegram.ext import Updater, CommandHandler, MessageHandler, Filters +from telegram.ext import Updater, CommandHandler, MessageHandler, Filters,\ + CallbackQueryHandler # Init logging logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s ' @@ -24,7 +25,6 @@ # Start database connection repository.connection(database) - def main(): # Database initialization repository.sec_init(id_admin) @@ -43,6 +43,8 @@ def main(): handlers.who)) dispatcher.add_handler(CommandHandler('como', handlers.como)) + dispatcher.add_handler(CallbackQueryHandler(handlers.quien_come, + pattern = 'quien_come')) dispatcher.add_handler(CommandHandler('quiencome', handlers.quien_come)) dispatcher.add_handler(CommandHandler('comida', From 04e9c83c3bd599818422b40f9ea5cccbb39ddb29 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Thu, 5 Oct 2017 13:33:52 +0200 Subject: [PATCH 70/81] Replace sugusbot.py --- handlers.py | 2 +- sugusbot.py | 333 +++++++++++------------------------------------- sugusbot_new.py | 89 ------------- 3 files changed, 75 insertions(+), 349 deletions(-) delete mode 100644 sugusbot_new.py diff --git a/handlers.py b/handlers.py index 06675ad..c21be29 100644 --- a/handlers.py +++ b/handlers.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3.5 +#!/usr/bin/python3.6 # -*- coding: utf-8 -*- import repository diff --git a/sugusbot.py b/sugusbot.py index 2cdac05..d76fd81 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -1,274 +1,89 @@ -#!/usr/bin/python3.5 +#!/usr/bin/python3.6 # -*- coding: utf-8 -*- import logging -import telegram +import repository +import handlers -import codecs -import sys -import os -import traceback -import time +from configparser import ConfigParser +from telegram.ext import Updater, CommandHandler, MessageHandler, Filters,\ + CallbackQueryHandler -from datetime import timedelta +# Init logging +logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s ' + '- %(message)s', level=logging.INFO) -import configparser +logger = logging.getLogger(__name__) -from emoji import emojize - -from repository import * -from messaging import create_bot, getUpdates, sendMessages -from auxilliary_methods import * - -config = configparser.ConfigParser() -config.read('myconfig.ini') +# Retrieve configuration from config file +config = ConfigParser() +config.read('config.ini') database = config['Database']['route'] token = config['Telegram']['token'] id_admin = config['Telegram']['id_admin'] -last_periodic_check = datetime.now().strftime("%d-%m-%y") - -# Get last update ID -LAST_UPDATE_ID = None - -# Create bot object -create_bot(token) - -connection(database) - +# Start database connection +repository.connection(database) def main(): - - sec_init(id_admin) - - # UTF-8 console stuff thingies - # sys.stdout = codecs.getwriter("utf-8") - # sys.stdout.detach() - - # Init logging - logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - # Discard old updates, sent before the bot was started - num_discarded = 0 - - while True: - updates = getUpdates(LAST_UPDATE_ID, timeout=1) - if updates is not None and updates: - num_discarded += len(updates) - update_last_update_id(updates[-1].update_id) - else: - break - - # print("Discarded {} old updates".format(num_discarded)) - - # Main loop - # print('Working...') - while True: - updates = getUpdates(LAST_UPDATE_ID) - - for update in updates: - message = update.message - actText = message.text - actType = message.chat.type - chat_id = message.chat.id - update_id = update.update_id - actUser = message.from_user.username - act_user_id = message.from_user.id - - stop, send_text = update_user(id_user_telegram=act_user_id, user_name=actUser) - - if send_text: - sendMessages(send_text, chat_id) - update_last_update_id(update_id) - send_text = None - - if stop: - break - - periodic_check() - - if check_type_and_text_start(aText= actText, cText='/who', aType=actType, cType='private'): - max_retry = 2 - for i in range(max_retry): - try: - who = get_who() - if not who: - send_text = u"Parece que no hay nadie... {}".format( - emojize(":disappointed_face:", use_aliases=True)) - else: - send_text = show_list(u"Miembros en SUGUS:", who) - break - except Exception as e: - if i is max_retry - 1: - print("Hubo un error repetitivo al intentar conectar al servidor: ", e) - send_text = u"Hubo algún error al realizar la petición a la web de sugus" - - if check_type_and_text_start(aText= actText, cText='/como', aType=actType, cType='private'): - send_text = add_to_event('comida', act_user_id) - - if check_type_and_text_start(aText= actText, cText='/nocomo', aType=actType, cType='private'): - send_text = remove_from_event('comida', act_user_id) - - if check_type_and_text_start(aText= actText, cText='/quiencome', aType=actType, cType='private'): - quiencome = find_users_by_event('comida') - if quiencome: - send_text = show_list(u"Hoy come en Sugus:", quiencome, [2]) - else: - send_text = 'De momento nadie come en Sugus' - - if check_type_and_text_start(aText=actText, cText='/comida', aType=actType, cType='private'): - send_text = help_eat() - - if check_type_and_text_start(aText=actText, cText='/group', aType=actType, cType='private'): - send_text = help_group() - - if check_type_and_text_start(aText=actText, cText='/addgroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): - rtext = actText.replace('/addgroup ','').replace('/addgroup','') - send_text = add_permission_group(rtext) - - if check_type_and_text_start(aText=actText, cText='/addtogroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): - rtext = actText.replace('/addtogroup ','').replace('/addtogroup','').split(" ") - db_user = find_user_by_telegram_user_name(rtext[0]) - if len(rtext) != 2: - send_text = "Formato incorrecto. El formato debe ser: \n '/addtogroup @username group_name'" - elif not db_user: - send_text = "Nombre de usuario '" + rtext[0] + "' no encontrado en la base de datos" - else: - send_text = add_user_permission(db_user[1], rtext[1]) - - if check_type_and_text_start(aText=actText, cText='/delfromgroup', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): - rtext = actText.split(" ") - if len(rtext) != 3: - send_text = "Has introducido el comando de manera incorrecta. El formato debe ser:\n'/delfromgroup @usermane groupname'" - else: - user = find_user_by_telegram_user_name(rtext[1]) - send_text = remove_from_group(user[1], rtext[2]) - - if check_type_and_text_start(aText= actText, cText='/groups', aType=actType, cType='private', cUId=message.from_user.id): - send_text = show_list(u"Grupos de permisos disponibles:", list_permission_group()) - - if check_type_and_text_start(aText=actText, cText='/event', aType=actType, cType='private'): - send_text = help_event() - - if check_type_and_text_start(aText=actText, cText='/events', aType=actType, cType='private'): - send_text = show_list(u"Elige una de las listas:", list_events(), [0, 1]) - - if check_type_and_text_start(aText=actText, cText='/addevent', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin", "sugus"]): - rtext = actText.replace('/addevent ','').replace('/addevent','').split(" ") - if len(rtext) < 2: - send_text = "Formato incorrecto. El formato debe ser: \n '/addevent nombre-evento dd-mm-aaaa'" - elif not check_date(rtext[len(rtext) - 1]): - send_text = "Formato de fecha incorrecto ('dd-mm-aaaa') o la fecha ya ha pasado" - else: - event_name = ' '.join([str(x) for x in rtext[0:len(rtext) - 1]]) - send_text = add_event(event_name, rtext[len(rtext) - 1], message.from_user.id) - - if check_type_and_text_start(aText=actText, cText='/removeevent', aType=actType, cType='private', cUId=message.from_user.id, perm_required=["admin"]): - rtext = actText.split(' ') - if len(rtext) < 2: - send_text = "Formato incorrecto. El formato debe ser:\n/removeevent nombre-evento" - else: - event = find_event_by_name(rtext[1]) - if not event: - send_text = "El evento no existe" - elif int(event[3]) == message.from_user.id and not bool(find_users_by_event(rtext[1])) and check_date(event[1],"%d-%m-%Y"): - send_text = remove_event(rtext[1]) - else: - send_text = "No tienes permiso para eliminar este evento" - - if check_type_and_text_start(aText=actText, cText='/jointoevent', aType=actType, cType='private'): - rtext = actText.replace('/jointoevent','').replace(' ','') - if not rtext: - send_text = u"Elige un evento /events" - else: - send_text = add_to_event(rtext, act_user_id) - - if check_type_and_text_start(aText= actText, cText='/participants', aType=actType, cType='private'): - rtext = actText.replace('/participants','').replace(' ','') - if not rtext: - send_text = show_list(u"Elige una de las listas:", list_events()) - else: - if len(find_users_by_event(rtext)) == 0: - send_text = u"No hay nadie en {}".format(rtext) - else: - send_text = show_list(u"Participantes en {}:".format(rtext), find_users_by_event(rtext), [2]) - - if check_type_and_text_start(aText= actText, cText='/leaveevent', aType=actType, cType='private'): - rtext = actText.replace('/leaveevent','').replace(' ','') - send_text = remove_from_event(rtext, act_user_id) - - if send_text != None: - sendMessages(send_text, chat_id) - elif check_type_and_text_start(aType=actType, cType='private'): - sendMessages(help(), chat_id) - # else: - # print("Mensaje enviado y no publicado por: "+str(actUser)) - - update_last_update_id(update_id) - - -def update_last_update_id(update_id): - global LAST_UPDATE_ID - - LAST_UPDATE_ID = update_id + 1 - - -def periodic_check(): - - global last_periodic_check - - yesterday_date = datetime.now() - timedelta(days=1) - yesterday_date = yesterday_date.strftime("%d-%m-%y") - - if last_periodic_check is yesterday_date: - empty_event('comida') - - last_periodic_check = datetime.now().strftime("%d-%m-%y") - -def help(): - header = "Elige una de las opciones: " - contain = [['/help', 'Ayuda'], ['/who','¿Quien hay en Sugus?'], ['/comida','Opciones de comida']] - contain = contain + [['/group', 'Opciones de permisos']] - contain = contain + [['/event', 'Opciones de eventos']] - return show_list(header, contain) - - -def help_eat(): - header = "Elige una de las opciones: " - contain = [['/help', 'Ayuda']] - contain = contain + [['/como','Yo como aquí'], ['/nocomo', 'Yo no como aquí'], ['/quiencome', '¿Quien come aquí?']] - return show_list(header, contain) - - -def help_event(): - header = "Elige una de las opciones: " - contain = [['/help', 'Ayuda']] - contain += [['/events', 'Listar eventos'], ['/addevent', 'Añadir un evento'], ['/removeevent', 'Eliminar un evento']] - contain += [['/leaveevent', 'Abandonar un evento'], ['/jointoevent', 'Unirte a un evento'], ['/participants', 'Listar participantes']] - return show_list(header, contain) - - -def help_group(): - header = "Elige una de las opciones: " - contain = [['/help', 'Ayuda'], ['/groups', 'Listar grupos'], ['/addgroup', 'Añadir un grupo']] - contain += [['/addtogroup', 'Añadir a alguien a un grupo'], ['/delfromgroup', 'Sacar a alguien de un grupo']] - return show_list(header, contain) - + # Database initialization + repository.sec_init(id_admin) + + # EventHandler creation + updater = Updater(token) + + dispatcher = updater.dispatcher + + # Assign functions to handlers + dispatcher.add_handler(CommandHandler('start', + handlers.start)) + dispatcher.add_handler(CommandHandler('help', + handlers.help)) + dispatcher.add_handler(CommandHandler('who', + handlers.who)) + dispatcher.add_handler(CommandHandler('como', + handlers.como)) + dispatcher.add_handler(CallbackQueryHandler(handlers.quien_come, + pattern = 'quien_come')) + dispatcher.add_handler(CommandHandler('quiencome', + handlers.quien_come)) + dispatcher.add_handler(CommandHandler('comida', + handlers.comida)) + dispatcher.add_handler(CommandHandler('group', + handlers.group)) + dispatcher.add_handler(CommandHandler('addgroup', + handlers.add_group)) + dispatcher.add_handler(CommandHandler('addtogroup', + handlers.add_to_group)) + dispatcher.add_handler(CommandHandler('delfromgroup', + handlers.del_from_group)) + dispatcher.add_handler(CommandHandler('groups', + handlers.groups)) + dispatcher.add_handler(CommandHandler('event', + handlers.event)) + dispatcher.add_handler(CommandHandler('events', + handlers.events)) + dispatcher.add_handler(CommandHandler('addevent', + handlers.add_event)) + dispatcher.add_handler(CommandHandler('removeevent', + handlers.remove_event)) + dispatcher.add_handler(CommandHandler('jointoevent', + handlers.join_to_event)) + dispatcher.add_handler(CommandHandler('participants', + handlers.participants)) + dispatcher.add_handler(CommandHandler('leaveevent', + handlers.leave_event)) + + # Error handler, for logging purposes + dispatcher.add_error_handler(handlers.error) + + # Start the bot + updater.start_polling() + + # Run the bot until you press Ctrl-C or the process receives SIGINT, + # SIGTERM or SIGABRT. This should be used most of the time, since + # start_polling() is non-blocking and will stop the bot gracefully. + updater.idle() if __name__ == '__main__': - while True: - try: - main() - except Exception as e: - logging.error("Ocurrió el siguiente error: ", e) - try: - if os.path.isfile('log') and os.stat('log').st_size > 1024: - permission = 'w' - else: - permission = 'a' - with open('log', permission) as f: - info = traceback.format_exc() - f.write(str(datetime.now().strftime("%d-%m-%y %H:%M"))+"\n") - f.write(info+"\n") - except Exception as e: - logging.error("Ocurrió el siguiente error al intentar persistir el error: ", e) + main() diff --git a/sugusbot_new.py b/sugusbot_new.py deleted file mode 100644 index 8a7e54d..0000000 --- a/sugusbot_new.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/python3.5 -# -*- coding: utf-8 -*- - -import logging -import repository -import handlers - -from configparser import ConfigParser -from telegram.ext import Updater, CommandHandler, MessageHandler, Filters,\ - CallbackQueryHandler - -# Init logging -logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s ' - '- %(message)s', level=logging.INFO) - -logger = logging.getLogger(__name__) - -# Retrieve configuration from config file -config = ConfigParser() -config.read('config.ini') -database = config['Database']['route'] -token = config['Telegram']['token'] -id_admin = config['Telegram']['id_admin'] - -# Start database connection -repository.connection(database) - -def main(): - # Database initialization - repository.sec_init(id_admin) - - # EventHandler creation - updater = Updater(token) - - dispatcher = updater.dispatcher - - # Assign functions to handlers - dispatcher.add_handler(CommandHandler('start', - handlers.start)) - dispatcher.add_handler(CommandHandler('help', - handlers.help)) - dispatcher.add_handler(CommandHandler('who', - handlers.who)) - dispatcher.add_handler(CommandHandler('como', - handlers.como)) - dispatcher.add_handler(CallbackQueryHandler(handlers.quien_come, - pattern = 'quien_come')) - dispatcher.add_handler(CommandHandler('quiencome', - handlers.quien_come)) - dispatcher.add_handler(CommandHandler('comida', - handlers.comida)) - dispatcher.add_handler(CommandHandler('group', - handlers.group)) - dispatcher.add_handler(CommandHandler('addgroup', - handlers.add_group)) - dispatcher.add_handler(CommandHandler('addtogroup', - handlers.add_to_group)) - dispatcher.add_handler(CommandHandler('delfromgroup', - handlers.del_from_group)) - dispatcher.add_handler(CommandHandler('groups', - handlers.groups)) - dispatcher.add_handler(CommandHandler('event', - handlers.event)) - dispatcher.add_handler(CommandHandler('events', - handlers.events)) - dispatcher.add_handler(CommandHandler('addevent', - handlers.add_event)) - dispatcher.add_handler(CommandHandler('removeevent', - handlers.remove_event)) - dispatcher.add_handler(CommandHandler('jointoevent', - handlers.join_to_event)) - dispatcher.add_handler(CommandHandler('participants', - handlers.participants)) - dispatcher.add_handler(CommandHandler('leaveevent', - handlers.leave_event)) - - # Error handler, for logging purposes - dispatcher.add_error_handler(handlers.error) - - # Start the bot - updater.start_polling() - - # Run the bot until you press Ctrl-C or the process receives SIGINT, - # SIGTERM or SIGABRT. This should be used most of the time, since - # start_polling() is non-blocking and will stop the bot gracefully. - updater.idle() - -if __name__ == '__main__': - main() From 46f0c3852528d498a2fac5be3184f29b6e46e931 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Thu, 5 Oct 2017 13:47:31 +0200 Subject: [PATCH 71/81] Implement no_como --- handlers.py | 24 +++++++----------------- sugusbot.py | 2 ++ 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/handlers.py b/handlers.py index c21be29..e7ca727 100644 --- a/handlers.py +++ b/handlers.py @@ -107,21 +107,11 @@ def como(bot, update): def no_como(bot, update): - actText = update.message.text - actType = update.message.chat.type - act_user_id = update.message.from_user.id - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/nocomo', - aType=actType, - cType='private'): - send_text = repository.remove_from_event('comida', act_user_id) - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) - + user_id = update.callback_query.from_user.id + send_text = repository.remove_from_event('comida', user_id) + update.callback_query.message.reply_text(send_text) + id = update.callback_query.id + bot.answerCallbackQuery(id) def quien_come(bot, update): quiencome = repository.find_users_by_event('comida') @@ -141,8 +131,8 @@ def comida(bot, update): comida_btns = [[telegram.InlineKeyboardButton('Help', url='www.google.com')], [telegram.InlineKeyboardButton('Como', url='www.google.com')], - [telegram.InlineKeyboardButton('No Como', url='www.google.com')], - [telegram.InlineKeyboardButton('Quién come?', callback_data = 'quien_come')]] + [telegram.InlineKeyboardButton('No Como', callback_data='no_como')], + [telegram.InlineKeyboardButton('Quién come?', callback_data='quien_come')]] if auxilliary_methods.check_type_and_text_start(aText=actText, cText='/comida', diff --git a/sugusbot.py b/sugusbot.py index d76fd81..2b8aa30 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -43,6 +43,8 @@ def main(): handlers.who)) dispatcher.add_handler(CommandHandler('como', handlers.como)) + dispatcher.add_handler(CallbackQueryHandler(handlers.no_como, + pattern = 'no_como')) dispatcher.add_handler(CallbackQueryHandler(handlers.quien_come, pattern = 'quien_come')) dispatcher.add_handler(CommandHandler('quiencome', From 37de759ee3ae381b5383fb9f670b01402481ba69 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Thu, 5 Oct 2017 14:03:13 +0200 Subject: [PATCH 72/81] Implement help --- handlers.py | 31 ++++++++++++++----------------- sugusbot.py | 4 ++++ 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/handlers.py b/handlers.py index e7ca727..51856db 100644 --- a/handlers.py +++ b/handlers.py @@ -54,7 +54,13 @@ def help(bot, update): ['/comida', 'Opciones de comida']] contain = contain + [['/group', 'Opciones de permisos']] contain = contain + [['/event', 'Opciones de eventos']] - update.message.reply_text(auxilliary_methods.show_list(header, contain)) + send_text = auxilliary_methods.show_list(header, contain) + if update.message: + update.message.reply_text(send_text) + elif update.callback_query: + update.callback_query.message.reply_text(send_text) + id = update.callback_query.id + bot.answerCallbackQuery(id) def who(bot, update): @@ -90,20 +96,11 @@ def who(bot, update): def como(bot, update): - actText = update.message.text - actType = update.message.chat.type - act_user_id = update.message.from_user.id - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/como', - aType=actType, - cType='private'): - send_text = repository.add_to_event('comida', act_user_id) - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) + user_id = update.callback_query.from_user.id + send_text = repository.add_to_event('comida', user_id) + update.callback_query.message.reply_text(send_text) + id = update.callback_query.id + bot.answerCallbackQuery(id) def no_como(bot, update): @@ -129,8 +126,8 @@ def comida(bot, update): actText = update.message.text actType = update.message.chat.type - comida_btns = [[telegram.InlineKeyboardButton('Help', url='www.google.com')], - [telegram.InlineKeyboardButton('Como', url='www.google.com')], + comida_btns = [[telegram.InlineKeyboardButton('Help', callback_data='help')], + [telegram.InlineKeyboardButton('Como', callback_data='como')], [telegram.InlineKeyboardButton('No Como', callback_data='no_como')], [telegram.InlineKeyboardButton('Quién come?', callback_data='quien_come')]] diff --git a/sugusbot.py b/sugusbot.py index 2b8aa30..e4afa93 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -37,10 +37,14 @@ def main(): # Assign functions to handlers dispatcher.add_handler(CommandHandler('start', handlers.start)) + dispatcher.add_handler(CallbackQueryHandler(handlers.help, + pattern = 'help')) dispatcher.add_handler(CommandHandler('help', handlers.help)) dispatcher.add_handler(CommandHandler('who', handlers.who)) + dispatcher.add_handler(CallbackQueryHandler(handlers.como, + pattern = 'como')) dispatcher.add_handler(CommandHandler('como', handlers.como)) dispatcher.add_handler(CallbackQueryHandler(handlers.no_como, From 1439d4624528070b6b04369a4a583e63a0f87b7f Mon Sep 17 00:00:00 2001 From: robertohueso Date: Thu, 5 Oct 2017 14:09:37 +0200 Subject: [PATCH 73/81] Create config_sample.ini --- config_samle.ini | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 config_samle.ini diff --git a/config_samle.ini b/config_samle.ini new file mode 100644 index 0000000..bf70679 --- /dev/null +++ b/config_samle.ini @@ -0,0 +1,5 @@ +[Database] +route = sugusBotDB.db +[Telegram] +token = XXXX +id_admin = XXXX From 9e45ffe91cb26cdd21bb29b732c8817f0f3c778c Mon Sep 17 00:00:00 2001 From: robertohueso Date: Fri, 6 Oct 2017 18:41:38 +0200 Subject: [PATCH 74/81] Implement join_to_event --- handlers.py | 37 ++++++++++++++++++------------------- sugusbot.py | 2 ++ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/handlers.py b/handlers.py index 51856db..8acaad1 100644 --- a/handlers.py +++ b/handlers.py @@ -113,7 +113,7 @@ def no_como(bot, update): def quien_come(bot, update): quiencome = repository.find_users_by_event('comida') if quiencome: - send_text = auxilliary_methods.show_list(u"Hoy come en Sugus:", + send_text = auxilliary_methods.show_list("Hoy come en Sugus:", quiencome, [2]) else: send_text = 'De momento nadie come en Sugus' @@ -354,24 +354,23 @@ def remove_event(bot, update): def join_to_event(bot, update): - actText = update.message.text - actType = update.message.chat.type - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/jointoevent', - aType=actType, - cType='private'): - rtext = actText.replace('/jointoevent', '').replace(' ', '') - if not rtext: - send_text = u"Elige un evento /events" - else: - send_text = repository.add_to_event(rtext, act_user_id) - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) - + if update.message: + event_btns = [] + for name in repository.list_events(): + btn = telegram.InlineKeyboardButton(str(name[0]), + callback_data = 'join_event.'+str(name[0])) + event_btns.append([btn]) + reply_markup = telegram.InlineKeyboardMarkup(event_btns) + update.message.reply_text('Elige una de las opciones:', reply_markup=reply_markup) + return + elif update.callback_query: + event_name = update.callback_query.data.split('.')[1] + user_id = update.callback_query.from_user.id + repository.add_to_event(event_name, user_id) + update.callback_query.message.reply_text("Te has unido a " + event_name) + id = update.callback_query.id + bot.answerCallbackQuery(id) + return def participants(bot, update): actText = update.message.text diff --git a/sugusbot.py b/sugusbot.py index e4afa93..385204e 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -73,6 +73,8 @@ def main(): handlers.add_event)) dispatcher.add_handler(CommandHandler('removeevent', handlers.remove_event)) + dispatcher.add_handler(CallbackQueryHandler(handlers.join_to_event, + pattern = '^join_event.')) dispatcher.add_handler(CommandHandler('jointoevent', handlers.join_to_event)) dispatcher.add_handler(CommandHandler('participants', From 1cffef0a5a71660f36f80c9a3f37757f0ade38c5 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Fri, 6 Oct 2017 19:29:11 +0200 Subject: [PATCH 75/81] Implement leave_event --- handlers.py | 31 +++++++++++++++++-------------- sugusbot.py | 2 ++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/handlers.py b/handlers.py index 8acaad1..c74417d 100644 --- a/handlers.py +++ b/handlers.py @@ -400,20 +400,23 @@ def participants(bot, update): def leave_event(bot, update): - actText = update.message.text - actType = update.message.chat.type - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/leaveevent', - aType=actType, - cType='private'): - rtext = actText.replace('/leaveevent', '').replace(' ', '') - send_text = repository.remove_from_event(rtext, act_user_id) - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) + if update.message: + event_btns = [] + for name in repository.list_events(): + btn = telegram.InlineKeyboardButton(str(name[0]), + callback_data = 'leave_event.'+str(name[0])) + event_btns.append([btn]) + reply_markup = telegram.InlineKeyboardMarkup(event_btns) + update.message.reply_text('Elige una de las opciones:', reply_markup=reply_markup) + return + elif update.callback_query: + event_name = update.callback_query.data.split('.')[1] + user_id = update.callback_query.from_user.id + repository.remove_from_event(event_name, user_id) + update.callback_query.message.reply_text("Has abandonado el evento " + event_name) + id = update.callback_query.id + bot.answerCallbackQuery(id) + return def error(bot, update, error): diff --git a/sugusbot.py b/sugusbot.py index 385204e..c159319 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -79,6 +79,8 @@ def main(): handlers.join_to_event)) dispatcher.add_handler(CommandHandler('participants', handlers.participants)) + dispatcher.add_handler(CallbackQueryHandler(handlers.leave_event, + pattern = '^leave_event.')) dispatcher.add_handler(CommandHandler('leaveevent', handlers.leave_event)) From 5eb963a663d7a3c279451c343fc29e62da7242c9 Mon Sep 17 00:00:00 2001 From: robertohueso Date: Sat, 7 Oct 2017 03:01:02 +0200 Subject: [PATCH 76/81] Implement participants --- handlers.py | 44 ++++++++++++++++++++------------------------ sugusbot.py | 2 ++ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/handlers.py b/handlers.py index c74417d..e8dee71 100644 --- a/handlers.py +++ b/handlers.py @@ -373,30 +373,26 @@ def join_to_event(bot, update): return def participants(bot, update): - actText = update.message.text - actType = update.message.chat.type - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/participants', - aType=actType, - cType='private'): - rtext = actText.replace('/participants', '').replace(' ', '') - - if not rtext: - send_text = auxilliary_methods.show_list( - u"Elige una de las listas:", repository.list_events()) - else: - if len(repository.find_users_by_event(rtext)) == 0: - send_text = u"No hay nadie en {}".format(rtext) - else: - send_text = auxilliary_methods.show_list( - u"Participantes en {}:".format(rtext), - repository.find_users_by_event(rtext), [2]) - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) + if update.message: + event_btns = [] + for name in repository.list_events(): + btn = telegram.InlineKeyboardButton(str(name[0]), + callback_data = 'participants.'+str(name[0])) + event_btns.append([btn]) + reply_markup = telegram.InlineKeyboardMarkup(event_btns) + update.message.reply_text('Elige una de los eventos:', reply_markup=reply_markup) + return + elif update.callback_query: + event_name = update.callback_query.data.split('.')[1] + user_id = update.callback_query.from_user.id + repository.add_to_event(event_name, user_id) + send_text = auxilliary_methods.show_list( + 'Participantes en ' + event_name, + repository.find_users_by_event(event_name), [2]) + update.callback_query.message.reply_text(send_text) + id = update.callback_query.id + bot.answerCallbackQuery(id) + return def leave_event(bot, update): diff --git a/sugusbot.py b/sugusbot.py index c159319..3eb7aa3 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -77,6 +77,8 @@ def main(): pattern = '^join_event.')) dispatcher.add_handler(CommandHandler('jointoevent', handlers.join_to_event)) + dispatcher.add_handler(CallbackQueryHandler(handlers.participants, + pattern = '^participants.')) dispatcher.add_handler(CommandHandler('participants', handlers.participants)) dispatcher.add_handler(CallbackQueryHandler(handlers.leave_event, From 9807558dee670c33b76fc137c08fa9030b5447df Mon Sep 17 00:00:00 2001 From: robertohueso Date: Sat, 7 Oct 2017 14:08:21 +0200 Subject: [PATCH 77/81] Implement remove_event Add aux function to check user permissions --- auxilliary_methods.py | 2 ++ handlers.py | 52 +++++++++++++++++-------------------------- repository.py | 2 +- sugusbot.py | 2 ++ 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 089c079..4449099 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -52,6 +52,8 @@ def check_type_and_text_start(aText = None, return result +def check_permissions(user_id, required_perm): + return all([check_user_permission(user_id, perm) for perm in required_perm]) def show_list(header, contains, positions = None): diff --git a/handlers.py b/handlers.py index e8dee71..7d9b59a 100644 --- a/handlers.py +++ b/handlers.py @@ -320,37 +320,27 @@ def add_event(bot, update): def remove_event(bot, update): - actText = update.message.text - actType = update.message.chat.type - - if auxilliary_methods.check_type_and_text_start(aText=actText, - cText='/removeevent', - aType=actType, - cType='private', - cUId=update.message. - from_user.id, - perm_required=["admin"]): - rtext = actText.split(' ') - - if len(rtext) < 2: - send_text = "Formato incorrecto. El formato debe ser:\n" + \ - "'/removeevent nombre-evento'" - else: - event = repository.find_event_by_name(rtext[1]) - - if not event: - send_text = "El evento no existe" - elif (int(event[3]) == update.message.from_user.id and - not bool(repository.find_users_by_event(rtext[1])) and - auxilliary_methods.check_date(event[1], "%d-%m-%Y")): - send_text = repository.remove_event(rtext[1]) - else: - send_text = "No tienes permiso para eliminar este evento" - - if send_text is not None: - update.message.reply_text(send_text) - else: - update.message.reply_text(help()) + user_id = update.effective_user.id + if not auxilliary_methods.check_permissions(user_id, ['admin']): + update.message.reply_text('No tienes permiso') + return + elif update.message: + event_btns = [] + for name in repository.list_events(): + btn = telegram.InlineKeyboardButton(str(name[0]), + callback_data = 'remove_event.'+str(name[0])) + event_btns.append([btn]) + reply_markup = telegram.InlineKeyboardMarkup(event_btns) + update.message.reply_text('Elige una de las opciones:', reply_markup=reply_markup) + return + elif update.callback_query: + event_name = update.callback_query.data.split('.')[1] + repository.remove_event(event_name) + send_text = 'Has eliminado el evento ' + event_name + update.callback_query.message.reply_text(send_text) + id = update.callback_query.id + bot.answerCallbackQuery(id) + return def join_to_event(bot, update): diff --git a/repository.py b/repository.py index 32c7900..eaf6e34 100644 --- a/repository.py +++ b/repository.py @@ -165,7 +165,7 @@ def remove_event(event_name): event = find_event_by_name(event_name) if event: - empty_event(event[0]) + empty_event(event[2]) c = conn.cursor() h = c.execute('DELETE FROM event_table WHERE name=?', (event_name,)) result = "El evento " + event_name + " ha sido eliminado" diff --git a/sugusbot.py b/sugusbot.py index 3eb7aa3..2b65c60 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -71,6 +71,8 @@ def main(): handlers.events)) dispatcher.add_handler(CommandHandler('addevent', handlers.add_event)) + dispatcher.add_handler(CallbackQueryHandler(handlers.remove_event, + pattern = '^remove_event.')) dispatcher.add_handler(CommandHandler('removeevent', handlers.remove_event)) dispatcher.add_handler(CallbackQueryHandler(handlers.join_to_event, From c4e919a3a9ead5a7f78fd1fc9d8b75dd556086bc Mon Sep 17 00:00:00 2001 From: robertohueso Date: Sat, 7 Oct 2017 18:00:03 +0200 Subject: [PATCH 78/81] Add new user when /start --- handlers.py | 3 +++ repository.py | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/handlers.py b/handlers.py index 7d9b59a..01b5b9e 100644 --- a/handlers.py +++ b/handlers.py @@ -44,6 +44,9 @@ def help_group(): # Command handlers definitions def start(bot, update): + user_id = update.effective_user.id + user_name = update.effective_user.username + send_text = repository.update_user(user_id, user_name) update.message.reply_text('¡Hola! Soy SugusBot, escribe "/help" para ver' ' la lista de comandos disponibles.') diff --git a/repository.py b/repository.py index eaf6e34..3181336 100644 --- a/repository.py +++ b/repository.py @@ -145,8 +145,6 @@ def empty_event(event_name): c.close() else: result = 'El evento ' + event_name + ' no existe' - - print(result) return result @@ -316,3 +314,12 @@ def update_user(id_user_telegram, user_name, force_update=False): finally: user_cache.append(int(id_user_telegram)) return stop, result + +def add_user(user_id, user_name): + check_connection() + c = conn.cursor() + c.execute('INSERT INTO userTable(id_user_telegram, user_name) VALUES (?, ?)', + (user_id, user_name)) + conn.commit() + c.close() + return "Registrado en el sistema '" + str(user_name) + "'" From a1cbaba335a4c5d01fc572424f50ef5df153476b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 22 Nov 2017 21:02:50 +0100 Subject: [PATCH 79/81] Multiple improves --- .gitignore | 5 +++++ auxilliary_methods.py | 8 ++++++++ handlers.py | 7 ++++--- requirements.txt | 8 ++++---- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 02f4cd1..d061b2b 100644 --- a/.gitignore +++ b/.gitignore @@ -188,3 +188,8 @@ venv.bak/ # mypy .mypy_cache/ + +bin/ +include/ +pip-selfcheck.json + diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 4449099..92df8fd 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -83,3 +83,11 @@ def check_date(date): except ValueError: res = False return res + +def extract_user_from_update(update): + try: + user = update.callback_query.from_user + except AttributeError: + user = update.message.from_user + + return user diff --git a/handlers.py b/handlers.py index 01b5b9e..637d834 100644 --- a/handlers.py +++ b/handlers.py @@ -5,6 +5,7 @@ import telegram from emoji import emojize import auxilliary_methods +import logging """ This module contains the functions that handlers execute. @@ -99,7 +100,7 @@ def who(bot, update): def como(bot, update): - user_id = update.callback_query.from_user.id + user_id = auxilliary_methods.extract_user_from_update(update).id send_text = repository.add_to_event('comida', user_id) update.callback_query.message.reply_text(send_text) id = update.callback_query.id @@ -107,7 +108,7 @@ def como(bot, update): def no_como(bot, update): - user_id = update.callback_query.from_user.id + user_id = auxilliary_methods.extract_user_from_update(update).id send_text = repository.remove_from_event('comida', user_id) update.callback_query.message.reply_text(send_text) id = update.callback_query.id @@ -409,4 +410,4 @@ def leave_event(bot, update): def error(bot, update, error): - logger.warn('Update "%s" caused error "%s"' % (update, error)) + logging.warn('Update "%s" caused error "%s"' % (update, error)) diff --git a/requirements.txt b/requirements.txt index 6369115..5aa645d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -pyquery -python-telegram-bot +pyquery==1.3.0 +python-telegram-bot==8.1.1 cssselect -lxml -emoji +lxml==4.1.1 +emoji==0.4.5 From 2d5a5286c474e8bc10c2929de0a7a7c008ed48c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez=20Ruiz?= Date: Wed, 22 Nov 2017 21:27:51 +0100 Subject: [PATCH 80/81] Adding auto-clean comida event every day --- auxilliary_methods.py | 19 +++++++++++++++++++ repository.py | 3 ++- requirements.txt | 1 + sugusbot.py | 11 ++++++++++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/auxilliary_methods.py b/auxilliary_methods.py index 92df8fd..fb91298 100644 --- a/auxilliary_methods.py +++ b/auxilliary_methods.py @@ -7,6 +7,9 @@ from repository import find_user_by_telegram_user_id, check_user_permission from emoji import emojize from datetime import datetime +import time +import schedule +import threading def get_who(): @@ -91,3 +94,19 @@ def extract_user_from_update(update): user = update.message.from_user return user + + +def init_scheduler(): + cease_continuous_run = threading.Event() + + class ScheduleThread(threading.Thread): + @classmethod + def run(cls): + while not cease_continuous_run.is_set(): + schedule.run_pending() + time.sleep(1) + + continuous_thread = ScheduleThread() + continuous_thread.start() + + return cease_continuous_run diff --git a/repository.py b/repository.py index 3181336..e244b25 100644 --- a/repository.py +++ b/repository.py @@ -3,6 +3,7 @@ import sqlite3 from datetime import datetime +import logging conn = None user_cache = list() @@ -130,7 +131,7 @@ def remove_from_event(event_name, telegram_user_id): # el evento solo lo puede vaciar un usuario con privilegios def empty_event(event_name): check_connection() - print("Vamos a proceder a vaciar el evento: " + event_name) + logging.info("Vamos a proceder a vaciar el evento: " + event_name) event = find_event_by_name(event_name=event_name) if event: diff --git a/requirements.txt b/requirements.txt index 5aa645d..593929a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ python-telegram-bot==8.1.1 cssselect lxml==4.1.1 emoji==0.4.5 +schedule==0.5.0 diff --git a/sugusbot.py b/sugusbot.py index 2b65c60..1c75af4 100755 --- a/sugusbot.py +++ b/sugusbot.py @@ -4,11 +4,15 @@ import logging import repository import handlers +import schedule from configparser import ConfigParser -from telegram.ext import Updater, CommandHandler, MessageHandler, Filters,\ +from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, \ CallbackQueryHandler +from auxilliary_methods import init_scheduler +from repository import empty_event + # Init logging logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s ' '- %(message)s', level=logging.INFO) @@ -91,6 +95,10 @@ def main(): # Error handler, for logging purposes dispatcher.add_error_handler(handlers.error) + # Clean event comida every day + schedule.every().day.at("0:30").do(empty_event, 'comida').tag('empty_event comida') + init_scheduler() + # Start the bot updater.start_polling() @@ -99,5 +107,6 @@ def main(): # start_polling() is non-blocking and will stop the bot gracefully. updater.idle() + if __name__ == '__main__': main() From febcda645950c6fb2102830fee838be74cd95545 Mon Sep 17 00:00:00 2001 From: rarellano Date: Wed, 13 Dec 2017 14:40:25 +0100 Subject: [PATCH 81/81] Fix como and join_to_event --- config_samle.ini => config_sample.ini | 0 handlers.py | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) rename config_samle.ini => config_sample.ini (100%) diff --git a/config_samle.ini b/config_sample.ini similarity index 100% rename from config_samle.ini rename to config_sample.ini diff --git a/handlers.py b/handlers.py index 637d834..16beec6 100644 --- a/handlers.py +++ b/handlers.py @@ -48,7 +48,7 @@ def start(bot, update): user_id = update.effective_user.id user_name = update.effective_user.username send_text = repository.update_user(user_id, user_name) - update.message.reply_text('¡Hola! Soy SugusBot, escribe "/help" para ver' + update.message.reply_text('¡Hola! Soy @SugusBot, escribe "/help" para ver' ' la lista de comandos disponibles.') @@ -66,7 +66,6 @@ def help(bot, update): id = update.callback_query.id bot.answerCallbackQuery(id) - def who(bot, update): actText = update.message.text actType = update.message.chat.type @@ -101,6 +100,8 @@ def who(bot, update): def como(bot, update): user_id = auxilliary_methods.extract_user_from_update(update).id + user_name = update.effective_user.username + repository.update_user(user_id, user_name) send_text = repository.add_to_event('comida', user_id) update.callback_query.message.reply_text(send_text) id = update.callback_query.id @@ -360,6 +361,8 @@ def join_to_event(bot, update): elif update.callback_query: event_name = update.callback_query.data.split('.')[1] user_id = update.callback_query.from_user.id + user_name = update.effective_user.username + repository.update_user(user_id, user_name) repository.add_to_event(event_name, user_id) update.callback_query.message.reply_text("Te has unido a " + event_name) id = update.callback_query.id