1
Fork 0
mirror of https://github.com/Steffo99/greed.git synced 2025-03-27 10:50:31 +00:00

Started work on the admin menu

This commit is contained in:
Steffo 2018-01-29 13:26:49 +01:00
parent a0552503a3
commit b7bdae4678
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: C27544372FBB445D
2 changed files with 127 additions and 5 deletions

View file

@ -16,14 +16,21 @@ conversation_after_start = "Ciao!\n" \
"Benvenuto su greed!"
# Conversation: to send an inline keyboard you need to send a message with it
conversation_open_user_menu = "Allora, {username}, cosa vorresti fare?"
conversation_open_user_menu = "Cosa vorresti fare?"
# Conversation: the same message as above but when the first has already been sent
conversation_open_user_menu_multiple = "Hai bisogno di qualcos'altro?"
# Conversation: like above, but for administrators
conversation_open_admin_menu = "Sei un amministratore di greed!\n" \
"Cosa vorresti fare?"
# Conversation: select a payment method
conversation_payment_method = "Come vuoi aggiungere fondi al tuo portafoglio?"
# Conversation: select a product to edit
conversation_admin_select_product = "Che prodotto vuoi modificare?"
# Notification: the conversation has expired
conversation_expired = "🕐 Il bot non ha ricevuto messaggi per un po' di tempo, quindi ha chiuso la conversazione.\n" \
"Per riavviarne una nuova, invia il comando /start."
@ -46,9 +53,30 @@ menu_cash = "💵 In contanti"
# User menu: credit card
menu_credit_card = "💳 Con una carta di credito"
# User menu: cancel
# Admin menu: products
menu_products = "📝️ Prodotti"
# Admin menu: orders
menu_orders = "📦 Ordini"
# Admin menu: go to user mode
menu_user_mode = "👤 Passa alla modalità utente"
# Admin menu: add product
menu_add_product = "✨ Nuovo prodotto"
# Menu: cancel
menu_cancel = "🔙 Annulla"
# Add product: name?
ask_product_name = "Come si deve chiamare il prodotto?"
# Add product: description?
ask_product_description = "Quale deve essere la descrizione del prodotto?"
# Add product: price?
ask_product_price = "Quanto deve costare il prodotto?"
# Payment: cash payment info
payment_cash = "Puoi pagare in contanti alla sede fisica del negozio.\n" \
"Il gestore provvederà ad aggiungere credito al tuo account appena gli avrai consegnato i soldi."
@ -74,6 +102,9 @@ bot_info = 'Questo bot utilizza <a href="https://github.com/Steffo99/greed">gree
' <a href="https://github.com/Steffo99/greed/blob/master/LICENSE">Affero General Public License 3.0</a>.\n' \
'Il codice sorgente di questa versione è disponibile <i>qui</i>.\n'
# Success: product has been added to the database
success_product_added = "✅ Il prodotto è stato aggiunto con successo!"
# Error: message received not in a private chat
error_nonprivate_chat = "⚠️ Questo bot funziona solo in chat private."
@ -88,4 +119,9 @@ error_payment_amount_over_max = "⚠️ Il massimo di fondi che possono essere a
error_payment_amount_under_min = "⚠️ Il minimo di fondi che possono essere aggiunti in una singola transazione è {min_amount}."
# Error: the invoice has expired and can't be paid
error_invoice_expired = "⚠️ Questo pagamento è scaduto ed è stato annullato. Se vuoi ancora aggiungere fondi, usa l'opzione Aggiungi fondi del menu."
error_invoice_expired = "⚠️ Questo pagamento è scaduto ed è stato annullato. Se vuoi ancora aggiungere fondi, usa l'opzione Aggiungi fondi del menu."
# Error: a product with that name already exists
error_duplicate_name = "️⚠ Esiste già un prodotto con questo nome."

View file

@ -155,7 +155,7 @@ class ChatWorker(threading.Thread):
[telegram.KeyboardButton(strings.menu_add_credit)],
[telegram.KeyboardButton(strings.menu_bot_info)]]
# Send the previously created keyboard to the user (ensuring it can be clicked only 1 time)
self.bot.send_message(self.chat.id, strings.conversation_open_user_menu.format(username=str(self.user)),
self.bot.send_message(self.chat.id, strings.conversation_open_user_menu,
reply_markup=telegram.ReplyKeyboardMarkup(keyboard, one_time_keyboard=True))
# Wait for a reply from the user
selection = self.__wait_for_specific_message([strings.menu_order, strings.menu_order_status,
@ -219,7 +219,7 @@ class ChatWorker(threading.Thread):
self.bot.send_message(self.chat.id, strings.payment_cash)
def __add_credit_cc(self):
"""Ask the user how much money he wants to add to his wallet."""
"""Add money to the wallet through a credit card payment."""
# Create a keyboard to be sent later
keyboard = [[telegram.KeyboardButton(strings.currency_format_string.format(symbol=strings.currency_symbol, value="10"))],
[telegram.KeyboardButton(strings.currency_format_string.format(symbol=strings.currency_symbol, value="25"))],
@ -296,6 +296,92 @@ class ChatWorker(threading.Thread):
def __admin_menu(self):
"""Function called from the run method when the user is an administrator.
Administrative bot actions should be placed here."""
# Loop used to return to the menu after executing a command
while True:
# Create a keyboard with the admin main menu
keyboard = [[telegram.KeyboardButton(strings.menu_products)],
[telegram.KeyboardButton(strings.menu_orders)],
[telegram.KeyboardButton(strings.menu_user_mode)]]
# Send the previously created keyboard to the user (ensuring it can be clicked only 1 time)
self.bot.send_message(self.chat.id, strings.conversation_open_admin_menu,
reply_markup=telegram.ReplyKeyboardMarkup(keyboard, one_time_keyboard=True))
# Wait for a reply from the user
selection = self.__wait_for_specific_message([strings.menu_products, strings.menu_orders,
strings.menu_user_mode])
# If the user has selected the Products option...
if selection == strings.menu_products:
# Open the products menu
self.__products_menu()
# If the user has selected the Orders option...
elif selection == strings.menu_orders:
# Open the orders menu
self.__orders_menu()
# If the user has selected the User mode option...
elif selection == strings.menu_user_mode:
# Start the bot in user mode
self.__user_menu()
def __products_menu(self):
"""Display the admin menu to select a product to edit."""
# Get the products list from the db
products = self.session.query(db.Product).all()
# Create a list of product names
product_names = [product.name for product in products]
# Insert at the start of the list the add product option
product_names.insert(0, strings.menu_add_product)
# Create a keyboard using the product names
keyboard = [[telegram.KeyboardButton(product_name)] for product_name in product_names]
# Send the previously created keyboard to the user (ensuring it can be clicked only 1 time)
self.bot.send_message(self.chat.id, strings.conversation_admin_select_product,
reply_markup=telegram.ReplyKeyboardMarkup(keyboard, one_time_keyboard=True))
# Wait for a reply from the user
selection = self.__wait_for_specific_message(product_names)
# If the user has selected the Add Product option...
if selection == strings.menu_add_product:
# Open the add product menu
self.__add_product_menu()
# If the user has selected a product
else:
# Open the edit menu for that specific product
self.__edit_product_menu(selection)
def __add_product_menu(self):
"""Add a product to the database."""
# Ask for the product name until a valid product name is specified
while True:
# Ask the question to the user
self.bot.send_message(self.chat.id, strings.ask_product_name)
# Wait for an answer
name = self.__wait_for_regex(r"(.*)")
# Ensure a product with that name doesn't already exist
if self.session.query(db.Product).filter_by(name=name).one_or_none() is None:
# Exit the loop
break
self.bot.send_message(self.chat.id, strings.error_duplicate_name)
# Ask for the product description
self.bot.send_message(self.chat.id, strings.ask_product_description)
# Wait for an answer
description = self.__wait_for_regex(r"(.*)")
# Ask for the product price
self.bot.send_message(self.chat.id, strings.ask_product_price)
# Wait for an answer
price = int(self.__wait_for_regex(r"([0-9]{1,3}(?:[.,][0-9]{1,2})?)").replace(".", "").replace(",", "")) * (
10 ** int(configloader.config["Payments"]["currency_exp"]))
# TODO: ask for product image
# Create the db record for the product
product = db.Product(name=name,
description=description,
price=price)
# Add the record to the session, then commit
self.session.add(product)
self.session.commit()
# Notify the user
self.bot.send_message(self.chat.id, strings.success_product_added)
def __edit_product_menu(self, name: str):
raise NotImplementedError()
def __orders_menu(self):
raise NotImplementedError()
def __graceful_stop(self):