diff --git a/README.md b/README.md index 2c63626..f23ed98 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # greed -A customizable Telegram shop bot, developed for the High School oral exam +A customizable Telegram shop bot, developed as a project for the final exam. ![](https://img.shields.io/badge/version-alpha-blue.svg) diff --git a/config/template_config.ini b/config/template_config.ini index a6fd98d..cd2dd1d 100644 --- a/config/template_config.ini +++ b/config/template_config.ini @@ -5,7 +5,7 @@ # Config file parameters [Config] ; Config file version. DO NOT EDIT THIS! -version = 12 +version = 13 ; Set this to no when you are done editing the file is_template = yes @@ -13,50 +13,60 @@ is_template = yes [Telegram] ; Your bot token goes here. Get one from @BotFather! token = 123456789:YOUR_TOKEN_GOES_HERE_______________ -; Time in seconds before a conversation with no new messages expires -; A lower value reduces memory usage but can be inconvenient for the users +; Time in seconds before a conversation (thread) with no new messages expires +; A lower value reduces memory usage, but can be inconvenient for the users conversation_timeout = 7200 -; Time to wait before sending another getUpdates request +; Time to wait before sending another update request if there are no messages long_polling_timeout = 30 +; Time in seconds before retrying a request if it times out +timed_out_pause = 1 +; Time in seconds before retrying a request that returned an error +error_pause = 5 # Database parameters [Database] -; The database engine you want to use. Refer to http://docs.sqlalchemy.org/en/latest/core/engines.html for the possible settings. +; The database engine you want to use. +; Refer to http://docs.sqlalchemy.org/en/latest/core/engines.html for the possible settings. engine = sqlite:// # General payment settings [Payments] -# ISO currency code +; ISO currency code currency = EUR -# Currency exp parameter. You can find that on https://core.telegram.org/bots/payments/currencies.json +; Currency exp parameter. You can find that on https://core.telegram.org/bots/payments/currencies.json. +; It has a value of 2 in most currencies (EUR, USD, GBP...) currency_exp = 2 # Credit card payment settings [Credit Card] -# Provider token: get the token at @BotFather +; Provider token: get the token by linking the payment provider with @BotFather credit_card_token = 123456789:YOUR_TOKEN_HERE_ -# Minimum wallet payment accepted (in miniumum currency units, $1.00 = 100 units) +; Minimum wallet payment accepted (in miniumum currency units, $1.00 = 100 units) min_amount = 1000 -# Maximum wallet payment accepted (in miniumum currency units, $1.00 = 100 units) +; Maximum wallet payment accepted (in miniumum currency units, $1.00 = 100 units) max_amount = 10000 -# Make the user pay a fee when loading the wallet with a credit card -# Credit card fee percentage (set to 0.0 to disable) +; Make the user pay a extra fee when adding credit to the wallet with a credit card +; The formula for determining the total cost is: +; cost = added_funds + added_funds * fee_percentage / 100 + fee_fixed +; Set these values to 0 to disable the feature. fee_percentage = 2.9 -# Credit card fee fixed (in miniumum currency units, $1.00 = 100 units) (set to 0 to disable) fee_fixed = 30 -# Require the name of the user +; "Shipping" information +; Telegram can ask for extra information when charging the user for a credit card transaction +; Set to yes the data you want to be required +; This data will be stored in the database name_required = yes -# Require the email of the user email_required = yes -# Require the phone number of the user phone_required = yes # Bot appearance settings [Appearance] -# Show the full order info to the customers +; Display the full order information to the customers instead of the shortened version +; The full order information includes the order number and the timestamp of the order placement full_order_info = no # Exception reporting settings [Error Reporting] -# Optional sentry token: get the token at https://sentry.io/ +; Optional sentry token: get the token at https://sentry.io/ or ask @Steffo for one +; Needed to automatically report bugs found by the users in the code. sentry_token = https://00000000000000000000000000000000:00000000000000000000000000000000@sentry.io/0000000 \ No newline at end of file diff --git a/utils.py b/utils.py index df8c8ea..52e67d4 100644 --- a/utils.py +++ b/utils.py @@ -19,6 +19,8 @@ else: class Price: + """The base class for the prices in greed. + Its int value is in minimum units, while its float and str values are in decimal format.int(""" def __init__(self, value: typing.Union[int, float, str, "Price"]=0): if isinstance(value, int): # Keep the value as it is @@ -121,26 +123,31 @@ def catch_telegram_errors(func): break # Telegram API didn't answer in time except telegram.error.TimedOut: - print(f"Timed out while calling {func.__name__}(), retrying in 1 sec...") - time.sleep(1) + print(f"Timed out while calling {func.__name__}()," + f" retrying in {config['Telegram']['timed_out_pause']} secs...") + time.sleep(int(config["Telegram"]["timed_out_pause"])) # Telegram is not reachable except telegram.error.NetworkError: - print(f"Network error while calling {func.__name__}(), retrying in 5 secs...") - time.sleep(5) + print(f"Network error while calling {func.__name__}()," + f" retrying in {config['Telegram']['error_pause']} secs...") + time.sleep(int(config["Telegram"]["error_pause"])) # Unknown error except telegram.error.TelegramError as error: if error.message.lower() in ["bad gateway", "invalid server response"]: - print(f"Bad Gateway while calling {func.__name__}(), retrying in 5 secs...") - time.sleep(5) + print(f"Bad Gateway while calling {func.__name__}()," + f" retrying in {config['Telegram']['error_pause']} secs...") + time.sleep(int(config["Telegram"]["error_pause"])) elif error.message.lower() == "timed out": - print(f"Timed out while calling {func.__name__}(), retrying in 1 sec...") - time.sleep(1) + print(f"Timed out while calling {func.__name__}()," + f" retrying in {config['Telegram']['timed_out_pause']} secs...") + time.sleep(int(config["Telegram"]["timed_out_pause"])) else: - print(f"Telegram error while calling {func.__name__}(), retrying in 5 secs...") + print(f"Telegram error while calling {func.__name__}()," + f" retrying in {config['Telegram']['error_pause']} secs...") # Send the error to the Sentry server if sentry_client is not None: sentry_client.captureException(exc_info=sys.exc_info()) - time.sleep(5) + time.sleep(int(config["Telegram"]["error_pause"])) return result_func @@ -203,4 +210,4 @@ class DuckBot: def send_document(self, *args, **kwargs): return self.bot.send_document(*args, **kwargs) - # TODO: add more methods + # More methods can be added here