-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.py
137 lines (108 loc) Β· 4.6 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import asyncio
import datetime
import logging
import os
from telegram import Update
from telegram.ext import (
Application,
CallbackContext,
CommandHandler,
ContextTypes,
PicklePersistence,
)
from backend_api_manager.client import BackendAPIClient
from conversation_handlers.control_bots.control_bots import (
get_control_bots_conversation_handler,
)
from conversation_handlers.create_bot.create_bot import (
get_create_bot_conversation_handler,
)
from utils.auth import restricted
from utils.config import TELEGRAM_TOKEN
# Enable logging
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
)
@restricted
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Start the conversation and display the main menu."""
reply_text = """
π **Welcome to Condor\!** π¦
Manage your trading bots efficiently and monitor their performance\.
ποΈ **Quick Commands**:
πΈ `/create_bot`: Launch a new trading bot instance with customized settings\.
πΈ `/bots_status`: View the current status and performance of all your active bots\.
πΈ `/create_bot`: Manage your bot's activities, such as starting or stopping trading strategies\.
πΈ `/add_config`: Add or modify configuration settings for your trading bots\.
π **Need help?** Type `/help` for assistance\.
Get started on your automated trading journey with ease and precision\!
"""
await update.message.reply_text(reply_text, parse_mode="MarkdownV2")
async def help(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Provide help information for each command."""
help_text = """
π **Help & Information**
Here's a detailed guide on how to use each command:
πΉ `/create_bot`: Launch a new bot instance\.
\- You'll be prompted to enter:
\- **Bot Name**: A unique name for your bot\.
\- **Docker Image**: The Docker image to use for the bot\.
\- **Script \(Optional\)**: A script for custom bot operations\.
\- **Config \(Optional\)**: Configuration settings for the bot\.
πΉ `/bots_status`: View the status of all active bots\.
\- Displays for each bot:
\- **Name**: The name of the bot\.
\- **Status**: Running status \(running or not\)\.
\- **PNL**: Profit and loss information\.
\- **Volume Traded**: The trading volume handled by the bot\.
πΉ `/create_bot`: Manage an active bot\.
\- Choose a bot to:
\- **Start**: Begin the bot's trading operations\.
\- **Stop**: Pause the bot's trading operations\.
\- **Remove**: Delete the bot\.
\- **Logs**: View the bot's operation logs\.
\- **Performance**: Check the bot's trading performance\.
πΉ `/add_config`: Add or modify a bot's configuration\.
\- Steps:
\- Pick a script to generate the configuration\.
\- Engage in a conversation to fill out the configuration details\.
\- Store and optionally deploy the configuration\.
For further assistance or more information, feel free to ask\!
"""
await update.message.reply_text(help_text, parse_mode="MarkdownV2")
async def initialize_backend_api(context: CallbackContext):
backend_api_client = BackendAPIClient.get_instance(
base_url=os.environ.get("BACKEND_API_URL", "http://localhost:8000")
)
# Retrieve the list of images from environment variable
all_images = os.environ.get("ALL_HUMMINGBOT_IMAGES", "").split(",")
# Create a list of tasks for pulling each image
pull_tasks = [
backend_api_client.async_pull_image(image_name=image.strip())
for image in all_images
if image.strip()
]
# Pull images concurrently
if pull_tasks:
logging.info(f"Pulling images: {datetime.datetime.now()}")
await asyncio.gather(*pull_tasks)
else:
logging.warning("No images to pull.")
def main() -> None:
"""Run the bot."""
# Persistent storage to save bot's conversations
persistence = PicklePersistence(
filepath="data/condorbot_persistence"
) # TODO: evaluate usage of PicklePersistence
# Create the Application and pass it your bot's token
application = Application.builder().token(TELEGRAM_TOKEN).build()
application.job_queue.run_once(initialize_backend_api, when=1)
# Add command handlers
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("help", help))
application.add_handler(get_create_bot_conversation_handler())
application.add_handler(get_control_bots_conversation_handler())
# Run the bot
application.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()