You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
7.5 KiB
Python

3 years ago
#!/usr/bin/env python
# -*- coding: utf-8 -*-
3 years ago
import glob
import logging
3 years ago
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
3 years ago
from telegram import ParseMode
3 years ago
from telegram.ext.callbackcontext import CallbackContext
3 years ago
from telegram.ext.callbackqueryhandler import CallbackQueryHandler
3 years ago
from telegram.ext.commandhandler import CommandHandler
from telegram.ext.conversationhandler import ConversationHandler
from telegram.ext.filters import Filters
3 years ago
from telegram.ext.messagehandler import MessageHandler
from telegram.ext.updater import Updater
from telegram.update import Update
3 years ago
import database_lib as DB
3 years ago
import libreremo_assets as txt
from libreremo_conf import TOKEN, CALIBRE_DIR, MIN_QUERY_LENGTH
3 years ago
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
3 years ago
level=logging.INFO)
3 years ago
3 years ago
updater = Updater(TOKEN, use_context=True, arbitrary_callback_data=True)
db = DB.Database(CALIBRE_DIR + "metadata.db")
3 years ago
def start(update: Update, context: CallbackContext):
3 years ago
update.message.reply_text(txt.INTRO, parse_mode=ParseMode.HTML)
3 years ago
def help(update: Update, context: CallbackContext):
3 years ago
update.message.reply_text(txt.HELP, parse_mode=ParseMode.HTML)
3 years ago
def _ask_resource_type(update, context):
keyboard = [[InlineKeyboardButton(text="Titolo", callback_data="titolo")],
3 years ago
[InlineKeyboardButton(text="Autore", callback_data="autore")]]
3 years ago
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(
3 years ago
text="In base a cosa vuoi cercare il tuo libro?",
3 years ago
reply_markup=reply_markup)
return GET_RESOURCE_TYPE
def _get_resource_type(update, context):
query = update.callback_query
context.user_data["resource"] = query.data
context.bot.send_message(
3 years ago
chat_id=query.message.chat_id,
text="quale {} stai cercando?".format(context.user_data["resource"]))
3 years ago
return GET_RESOURCE
def _get_resource(update, context):
resource = update.message.text
3 years ago
result_list = []
if len(resource) <= MIN_QUERY_LENGTH:
update.message.reply_text(txt.SHORTQUERY)
update.message.reply_text("Cosa stai cercando?")
3 years ago
return GET_RESOURCE
3 years ago
if context.user_data["resource"] == "titolo":
3 years ago
result_list = db.select_books_by_title(resource)
text = "Scegli uno di questi libri"
handler = GET_BOOK
3 years ago
elif context.user_data["resource"] == "autore":
3 years ago
result_list = db.select_authors(resource)
text = "Scegli uno di questi autori"
handler = GET_AUTHOR
3 years ago
elif context.user_data["resource"] == "cds":
# result_list = db.select_class(resource)
3 years ago
text = "Scegli uno di questi corsi di studio"
handler = GET_CDS
logging.info("asked resource {res}: {txt}"
3 years ago
.format(res=context.user_data["resource"], txt=resource))
3 years ago
if not result_list:
logging.info("cannot found result for {}".format(resource))
3 years ago
update.message.reply_text(txt.FILENOTFOUND, parse_mode=ParseMode.HTML)
3 years ago
return ConversationHandler.END
reply_markup = __format_reply_markup(result_list)
update.message.reply_text(
3 years ago
text=text,
3 years ago
reply_markup=reply_markup)
3 years ago
return handler
3 years ago
def _get_author(update: Update, context: CallbackContext):
query = update.callback_query
result_list = db.select_books_by_author(query.data)
if not result_list:
logging.info("cannot find books for requested author")
context.bot.send_message(
3 years ago
chat_id=query.message.chat_id,
text="Mi dispiace ma non riesco a trovare libri per questo autore")
3 years ago
return ConversationHandler.END
context.bot.send_message(
3 years ago
chat_id=query.message.chat_id,
text="scegli uno di questi libri",
reply_markup=__format_reply_markup(result_list))
return GET_BOOK
3 years ago
def _get_cds(update: Update, context: CallbackContext):
query = update.callback_query
3 years ago
# result_list = db.select_books_by_cds(query)
3 years ago
context.bot.send_message(
3 years ago
chat_id=query.message.chat_id,
text="scegli uno di questi libri")
return GET_BOOK
3 years ago
def _get_book(update: Update, context: CallbackContext):
query = update.callback_query
chat_id = query.message.chat_id
query.message.reply_text(
3 years ago
'perfetto, ti invio immediatamente il file, abbi un attimo di pazienza se il libro non arriva subito')
3 years ago
try:
3 years ago
filepath = CALIBRE_DIR + query.data + "/*.pdf"
3 years ago
for file in glob.glob(filepath):
3 years ago
with open(file, 'rb') as doc_pdf:
3 years ago
context.bot.send_document(chat_id, doc_pdf)
3 years ago
logging.info("Sharing {}".format(file))
3 years ago
except FileNotFoundError:
logging.info("cannot send {}".format(filepath))
query.message.reply_text(
3 years ago
"Mi dispiace non rieco a trovare il file, prova piu' tardi")
3 years ago
return ConversationHandler.END
def _cnv_stop(update: Update, context: CallbackContext):
update.message.reply_text("ciao")
return ConversationHandler.END
def search_by_title(update: Update, context: CallbackContext):
update.message.reply_text("che libro stai cercando?")
context.user_data["resource"] = "titolo"
return GET_RESOURCE
3 years ago
3 years ago
def search_by_title_default(update: Update, context: CallbackContext):
context.user_data["resource"] = "titolo"
3 years ago
return _get_resource(update, context)
3 years ago
def search_by_author(update: Update, context: CallbackContext):
update.message.reply_text("di quale autore stai cercando i libri?")
context.user_data["resource"] = "autore"
return GET_RESOURCE
3 years ago
3 years ago
def search_by_class(update: Update, context: CallbackContext):
update.message.reply_text("di quale corso di studio stai cercando i libri?")
context.user_data["resource"] = "cds"
return GET_RESOURCE
def unknown(update: Update, context: CallbackContext):
update.message.reply_text(
"Sorry '%s' is not a valid command" % update.message.text)
def __format_reply_markup(list_of_res):
return InlineKeyboardMarkup([
[InlineKeyboardButton(
3 years ago
text=res.format_text(),
callback_data=res.format_data())]
for res in list_of_res])
3 years ago
3 years ago
def handle_error(update: Update, context: CallbackContext):
context.bot.send_message(chat_id=update.callback_query.message.chat_id,
text="Oh no, qualcosa è andato storto, riprova più tardi...")
return ConversationHandler.END
3 years ago
3 years ago
GET_RESOURCE_TYPE, ASK_RESOURCE, GET_RESOURCE, GET_BOOK, GET_AUTHOR, GET_CDS = range(6)
cnv_handler = ConversationHandler(
3 years ago
entry_points=[CommandHandler('search', _ask_resource_type),
CommandHandler('search_by_title', search_by_title),
CommandHandler('search_by_author', search_by_author),
CommandHandler('search_by_class', search_by_class),
MessageHandler(Filters.text, search_by_title_default)],
states={
3 years ago
GET_RESOURCE_TYPE: [CallbackQueryHandler(_get_resource_type)],
GET_RESOURCE: [MessageHandler(Filters.text, _get_resource)],
GET_AUTHOR: [CallbackQueryHandler(_get_author)],
GET_BOOK: [CallbackQueryHandler(_get_book)],
GET_CDS: [CallbackQueryHandler(_get_cds)]
},
fallbacks=[CommandHandler('stop', _cnv_stop),
MessageHandler(Filters.command, _cnv_stop)],
)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('help', help))
3 years ago
updater.dispatcher.add_handler(cnv_handler)
3 years ago
updater.dispatcher.add_handler(MessageHandler(Filters.command, unknown)) # Filters out unknown commands
3 years ago
updater.dispatcher.add_error_handler(handle_error)
3 years ago
updater.start_polling()
updater.idle()