This is the entire code from import
import logging
from multiprocessing import contextlib
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup, InputMediaPhoto
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, CallbackContext
import time
import threading
# Enable logging
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
# Dictionary to store user data
user_data = {}
# Function to simulate background profit accumulation
def accumulate_profit():
while True:
time.sleep(3600) # Run every hour
for user_id, data in user_data.items():
data['points'] += data['profit_per_hour']
if not data['logged_in']:
context.bot.send_message(
chat_id=user_id,
text=f"You have earned {data['profit_per_hour']} points in the last hour!"
)
# Start profit accumulation thread
def start_profit_thread():
profit_thread = threading.Thread(target=accumulate_profit, daemon=True)
profit_thread.start()
def start(update: Update, context: CallbackContext) -> None:
user = update.effective_user
user_data[user.id] = {
"points": 0,
"energy_limit": 500,
"current_energy": 500,
"profit_per_hour": 0,
"tapping_increment": 1,
"wallet_connected": False,
"exchange_logo": None,
"refill_speed": 1,
"logged_in": True
}
update.message.reply_photo(
photo="https://new.express.adobe.com/publishedV2/urn:aaid:sc:EU:33b7a4ff-93e6-4abc-b89b-ca38cc64dfcb?promoid=Y69SGM5H&mv=other", # Replace with actual image URL
caption=f"Hi {user.first_name}! Welcome to Rooval Finance! Loading..."
)
time.sleep(3) # Simulate loading time
points = user_data[user.id]["points"]
profit_per_hour = user_data[user.id]["profit_per_hour"]
update.message.reply_text(
f'Welcome to Rooval Finance!\nPoints: {points}\nProfit per hour: {profit_per_hour}',
reply_markup=main_menu()
)
def main_menu() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Tap for Points", callback_data='tap_points')],
[InlineKeyboardButton("Tasks", callback_data='tasks')],
[InlineKeyboardButton("Shop", callback_data='shop')],
[InlineKeyboardButton("Invite Friends", callback_data='invite')],
[InlineKeyboardButton("Airdrop", callback_data='airdrop')],
]
return InlineKeyboardMarkup(keyboard)
def button(update: Update, context: CallbackContext) -> None:
query = update.callback_query
query.answer()
choice = query.data
user_id = query.from_user.id
if choice == 'tap_points':
display_tap_interface(query, user_id)
elif choice == 'tasks':
query.edit_message_text(
text="Complete these tasks to earn points:",
reply_markup=tasks_menu()
)
elif choice == 'shop':
query.edit_message_text(
text="Welcome to the shop! Choose a category:",
reply_markup=shop_menu()
)
elif choice == 'airdrop':
query.edit_message_text(
text="Airdrops coming soon\n\nConnect your TON Blockchain wallet:",
reply_markup=airdrop_menu()
)
elif choice == 'invite':
query.edit_message_text(
text="Invite your friends using this link: [Invite Link](https://t.me/YourBot?start=invite_code)", parse_mode='Markdown'
)
elif choice == 'daily_reward':
user_data[user_id]['points'] += 10
query.edit_message_text(
text=f"Daily reward claimed! You have {user_data[user_id]['points']} points.",
reply_markup=tasks_menu()
)
elif choice == 'boost':
query.edit_message_text(
text="Boost your tapping points or energy limit.",
reply_markup=boost_menu()
)
elif choice == 'change_logo':
query.edit_message_text(
text="Choose your preferred exchange logo:",
reply_markup=exchange_logo_menu()
)
elif choice == 'main':
points = user_data[user_id]["points"]
profit_per_hour = user_data[user_id]["profit_per_hour"]
query.edit_message_text(
text=f"Welcome back to the main menu. You have {points} points.\nProfit per hour: {profit_per_hour}",
reply_markup=main_menu()
)
elif choice == 'connect_wallet':
user_data[user_id]['wallet_connected'] = True
query.edit_message_text(
text="Your TON Blockchain wallet has been connected.",
reply_markup=main_menu()
)
elif choice.startswith('shop_'):
category = choice.split('_')[1]
query.edit_message_text(
text=f"Welcome to the {category.capitalize()} section. Choose an item to purchase:",
reply_markup=category_menu(category)
)
elif choice.startswith('buy_'):
item = choice.split('_')[1]
user_data[user_id]['points'] -= 1000 # Example cost
user_data[user_id]['profit_per_hour'] += 1 # Example profit per hour increment
query.edit_message_text(
text=f"You bought {item}. Your points: {user_data[user_id]['points']}, Profit per hour: {user_data[user_id]['profit_per_hour']} coins.",
reply_markup=main_menu()
)
elif choice.startswith('logo_'):
logo = choice.split('_')[1]
user_data[user_id]['exchange_logo'] = logo
query.edit_message_text(
text=f"Exchange logo changed to {logo}.",
reply_markup=main_menu()
)
elif choice.startswith('boost_'):
handle_boost(query, user_id, choice.split('_')[1])
else:
query.edit_message_text(text="Invalid option.")
def handle_tap(query, user_id):
if user_data[user_id]['current_energy'] > 0:
user_data[user_id]['points'] += user_data[user_id]['tapping_increment']
user_data[user_id]['current_energy'] -= 1
query.edit_message_text(
text=f"You tapped! Points: {user_data[user_id]['points']}, Energy: {user_data[user_id]['current_energy']}/{user_data[user_id]['energy_limit']}",
reply_markup=tap_menu()
)
else:
query.edit_message_text(
text=f"Out of energy! Points: {user_data[user_id]['points']}, Energy: {user_data[user_id]['current_energy']}/{user_data[user_id]['energy_limit']}",
reply_markup=tap_menu()
)
def handle_boost(query, user_id, boost_type):
if boost_type == 'tap':
if user_data[user_id]['points'] >= 100:
user_data[user_id]['points'] -= 100
user_data[user_id]['tapping_increment'] += 1
query.edit_message_text(
text=f"Tapping increment boosted! Current increment: {user_data[user_id]['tapping_increment']}. Points: {user_data[user_id]['points']}",
reply_markup=boost_menu()
)
else:
query.edit_message_text(
text="Not enough points to boost tapping increment.",
reply_markup=boost_menu()
)
elif boost_type == 'energy':
if user_data[user_id]['points'] >= 100:
user_data[user_id]['points'] -= 100
user_data[user_id]['energy_limit'] += 500
query.edit_message_text(
text=f"Energy limit boosted! Current limit: {user_data[user_id]['energy_limit']}. Points: {user_data[user_id]['points']}",
reply_markup=boost_menu()
)
else:
query.edit_message_text(
text="Not enough points to boost energy limit.",
reply_markup=boost_menu()
)
elif boost_type == 'refill':
if user_data[user_id]['points'] >= 100 and user_data[user_id]['refill_speed'] < 10:
user_data[user_id]['points'] -= 100
user_data[user_id]['refill_speed'] += 1
query.edit_message_text(
text=f"Refill speed boosted! Current speed: {user_data[user_id]['refill_speed']}. Points: {user_data[user_id]['points']}",
reply_markup=boost_menu()
)
else:
query.edit_message_text(
text="Not enough points to boost refill speed or maximum speed reached.",
reply_markup=boost_menu()
)
def display_tap_interface(query, user_id):
tap_card_image_url = "https://example.com/tap_card_image.jpg" # Replace with actual image URL
keyboard = [
[InlineKeyboardButton("Tap", callback_data='tap_points')],
[InlineKeyboardButton("Boost", callback_data='boost')],
[InlineKeyboardButton("Back to Main Menu", callback_data='main')]
]
points = user_data[user_id]["points"]
current_energy = user_data[user_id]["current_energy"]
energy_limit = user_data[user_id]["energy_limit"]
query.edit_message_media(
media=InputMediaPhoto(media=tap_card_image_url, caption=f"Points: {points}, Energy: {current_energy}/{energy_limit}"),
reply_markup=InlineKeyboardMarkup(keyboard)
)
def tap_menu() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Tap", callback_data='tap_points')],
[InlineKeyboardButton("Boost", callback_data='boost')],
[InlineKeyboardButton("Back to Main Menu", callback_data='main')]
]
return InlineKeyboardMarkup(keyboard)
def tasks_menu() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Daily Reward", callback_data='daily_reward')],
[InlineKeyboardButton("Daily Cipher", callback_data='daily_cipher')],
[InlineKeyboardButton("Daily Combo", callback_data='daily_combo')],
[InlineKeyboardButton("Mini Game", callback_data='mini_game')],
[InlineKeyboardButton("Back to Main Menu", callback_data='main')],
]
return InlineKeyboardMarkup(keyboard)
def shop_menu() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Furniture", callback_data='shop_furniture')],
[InlineKeyboardButton("Groceries", callback_data='shop_groceries')],
[InlineKeyboardButton("Fashion", callback_data='shop_fashion')],
[InlineKeyboardButton("Jewelry", callback_data='shop_jewelry')],
[InlineKeyboardButton("Properties", callback_data='shop_properties')],
[InlineKeyboardButton("Back to Main Menu", callback_data='main')],
]
return InlineKeyboardMarkup(keyboard)
def category_menu(category: str) -> InlineKeyboardMarkup:
items = {
'furniture': ['Table', 'Chair', 'Sofa'],
'groceries': ['Apple', 'Milk', 'Bread'],
'fashion': ['Shirt', 'Shoes', 'Hat'],
'jewelry': ['Necklace', 'Ring', 'Bracelet'],
'properties': ['House', 'Apartment', 'Land']
}
keyboard = [[InlineKeyboardButton(item, callback_data=f'buy_{item.lower()}')] for item in items[category]]
keyboard.append([InlineKeyboardButton("Back to Shop", callback_data='shop')])
return InlineKeyboardMarkup(keyboard)
def boost_menu() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Increase Tapping Increment", callback_data='boost_tap')],
[InlineKeyboardButton("Increase Energy Limit", callback_data='boost_energy')],
[InlineKeyboardButton("Increase Refill Speed", callback_data='boost_refill')],
[InlineKeyboardButton("Back to Main Menu", callback_data='main')]
]
return InlineKeyboardMarkup(keyboard)
def exchange_logo_menu() -> InlineKeyboardMarkup:
logos = ['Binance', 'Coinbase', 'Kraken', 'KuCoin', 'Bitfinex']
keyboard = [[InlineKeyboardButton(logo, callback_data=f'logo_{logo.lower()}')] for logo in logos]
keyboard.append([InlineKeyboardButton("Back to Main Menu", callback_data='main')])
return InlineKeyboardMarkup(keyboard)
def airdrop_menu() -> InlineKeyboardMarkup:
keyboard = [
[InlineKeyboardButton("Connect Wallet", callback_data='connect_wallet')],
[InlineKeyboardButton("Back to Main Menu", callback_data='main')],
]
return InlineKeyboardMarkup(keyboard)
def main() -> None:
updater = Updater("TELEGRAM_API",update_queue=True)
dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler("start", start))
dispatcher.add_handler(CallbackQueryHandler(button))
start_profit_thread()
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()