1
Fork 0
mirror of https://github.com/Steffo99/greed.git synced 2024-11-22 14:04:18 +00:00

Add payment verification

This commit is contained in:
Steffo 2018-01-03 14:52:05 +01:00
parent 2720d96c57
commit ddbd7ee667
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
3 changed files with 62 additions and 4 deletions

View file

@ -3,7 +3,7 @@
# Config file parameters # Config file parameters
[Config] [Config]
; Config file version. DO NOT EDIT THIS! ; Config file version. DO NOT EDIT THIS!
version = 5 version = 6
; Set this to no when you are done editing the file ; Set this to no when you are done editing the file
is_template = yes is_template = yes
@ -27,4 +27,10 @@ engine = sqlite://
[Payment Methods] [Payment Methods]
# Cash payment is always enabled # Cash payment is always enabled
# Credit card: get the token at @BotFather # Credit card: get the token at @BotFather
credit_card_token = 123456789:YOUR_TOKEN_HERE_ credit_card_token = 123456789:YOUR_TOKEN_HERE_
[Payments]
# Minimum wallet payment accepted
min_amount = 10
# Maximum wallet payment accepted
max_amount = 100

View file

@ -54,6 +54,9 @@ menu_cancel = "🔙 Annulla"
payment_cash = "Puoi pagare in contanti alla sede fisica del negozio.\n" \ 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." "Il gestore provvederà ad aggiungere credito al tuo account appena gli avrai consegnato i soldi."
# Payment: invoice amount
payment_cc_amount = "Quanti fondi vuoi aggiungere al tuo portafoglio?"
# Info: informazioni sul bot # Info: informazioni sul bot
bot_info = 'Questo bot utilizza <a href="https://github.com/Steffo99/greed">greed</a>,' \ bot_info = 'Questo bot utilizza <a href="https://github.com/Steffo99/greed">greed</a>,' \
' un framework di @Steffo per i pagamenti su Telegram rilasciato sotto la' \ ' un framework di @Steffo per i pagamenti su Telegram rilasciato sotto la' \
@ -66,3 +69,9 @@ error_nonprivate_chat = "⚠️ Questo bot funziona solo in chat private."
# Error: a message was sent in a chat, but no worker exists for that chat. Suggest the creation of a new worker with /start # Error: a message was sent in a chat, but no worker exists for that chat. Suggest the creation of a new worker with /start
error_no_worker_for_chat = "⚠️ La conversazione con il bot è interrotta.\n" \ error_no_worker_for_chat = "⚠️ La conversazione con il bot è interrotta.\n" \
"Per riavviarla, manda il comando /start al bot." "Per riavviarla, manda il comando /start al bot."
# Error: add funds amount over max
error_payment_amount_over_max = "⚠️ Il massimo di fondi che possono essere aggiunti in una singola transazione è {max_amount}."
# Error: add funds amount under min
error_payment_amount_under_min = "⚠️ Il minimo di fondi che possono essere aggiunti in una singola transazione è {min_amount}."

View file

@ -6,6 +6,8 @@ import configloader
import sys import sys
import queue as queuem import queue as queuem
import database as db import database as db
import re
from decimal import Decimal
class StopSignal: class StopSignal:
"""A data class that should be sent to the worker when the conversation has to be stopped abnormally.""" """A data class that should be sent to the worker when the conversation has to be stopped abnormally."""
@ -92,6 +94,25 @@ class ChatWorker(threading.Thread):
# Return the message text # Return the message text
return update.message.text return update.message.text
def __wait_for_regex(self, regex:str) -> str:
"""Continue getting updates until the regex finds a match in a message, then return the first capture group."""
while True:
# Get the next update
update = self.__receive_next_update()
# Ensure the update contains a message
if update.message is None:
continue
# Ensure the message contains text
if update.message.text is None:
continue
# Try to match the regex with the received message
match = re.search(regex, update.message.text)
# Ensure there is a match
if match is None:
continue
# Return the first capture group
return match.group(1)
def __user_menu(self): def __user_menu(self):
"""Function called from the run method when the user is not an administrator. """Function called from the run method when the user is not an administrator.
Normal bot actions should be placed here.""" Normal bot actions should be placed here."""
@ -163,11 +184,33 @@ class ChatWorker(threading.Thread):
return return
def __add_credit_cash(self): def __add_credit_cash(self):
"""Tell the user how to pay with cash at this shop""" """Tell the user how to pay with cash at this shop."""
self.bot.send_message(self.chat.id, strings.payment_cash) self.bot.send_message(self.chat.id, strings.payment_cash)
def __add_credit_cc(self): def __add_credit_cc(self):
raise NotImplementedError() """Ask the user how much money he wants to add to his wallet."""
# Loop used to continue asking if there's an error during the input
while True:
# 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"))],
[telegram.KeyboardButton(strings.currency_format_string.format(symbol=strings.currency_symbol, value="50"))],
[telegram.KeyboardButton(strings.currency_format_string.format(symbol=strings.currency_symbol, value="100"))]]
# Send the message and the keyboard
self.bot.send_message(self.chat.id, strings.payment_cc_amount,
reply_markup=telegram.ReplyKeyboardMarkup(keyboard, one_time_keyboard=True))
# Wait until a valid amount is sent
# TODO: check and debug the regex
selection = Decimal(self.__wait_for_regex(r"([0-9]{1,3}(?:[.,][0-9]{1,2})?)").replace(",", "."))
# Ensure the amount is within the range
if selection > Decimal(configloader.config["Payments"]["max_amount"]):
self.bot.send_message(self.chat.id, strings.error_payment_amount_over_max.format(max_amount=strings.currency_format_string.format(symbol=strings.currency_symbol, value=configloader.config["Payments"]["max_amount"])))
continue
elif selection < Decimal(configloader.config["Payments"]["min_amount"]):
self.bot.send_message(self.chat.id, strings.error_payment_amount_under_min.format(min_amount=strings.currency_format_string.format(symbol=strings.currency_symbol, value=configloader.config["Payments"]["min_amount"])))
continue
# The amount is valid, send the invoice
print(selection)
def __bot_info(self): def __bot_info(self):
"""Send information about the bot.""" """Send information about the bot."""