bafifi4972 commited on
Commit
21ced4e
·
verified ·
1 Parent(s): 5ebf6e7

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +278 -0
app.py ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import logging
3
+ from aiogram import Bot, Dispatcher, types, F
4
+ from aiogram.filters import Command
5
+ from aiogram.utils.keyboard import InlineKeyboardBuilder
6
+ from deep_translator import GoogleTranslator
7
+ import sqlite3
8
+ from datetime import datetime
9
+ from dotenv import load_dotenv
10
+
11
+ # Загрузка переменных окружения
12
+ load_dotenv()
13
+ API_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
14
+
15
+ # Инициализация бота
16
+ bot = Bot(API_TOKEN)
17
+ dp = Dispatcher()
18
+ logging.basicConfig(level=logging.INFO)
19
+
20
+ # Инициализация БД
21
+ DB_NAME = 'translator_bot.db'
22
+
23
+ def init_db():
24
+ conn = sqlite3.connect(DB_NAME)
25
+ c = conn.cursor()
26
+ c.execute('''CREATE TABLE IF NOT EXISTS users
27
+ (user_id INT PRIMARY KEY,
28
+ target_lang TEXT DEFAULT 'en',
29
+ active INT DEFAULT 1)''')
30
+ c.execute('''CREATE TABLE IF NOT EXISTS history
31
+ (id INTEGER PRIMARY KEY AUTOINCREMENT,
32
+ user_id INT,
33
+ original TEXT,
34
+ translated TEXT,
35
+ direction TEXT,
36
+ timestamp DATETIME)''')
37
+ conn.commit()
38
+ conn.close()
39
+
40
+ init_db()
41
+
42
+ # Языки с эмодзи
43
+ LANGUAGES = {
44
+ 'en': '🇬🇧 Английский',
45
+ 'es': '🇪🇸 Испанский',
46
+ 'fr': '🇫🇷 Французский',
47
+ 'de': '🇩🇪 Немецкий',
48
+ 'zh-CN': '🇨🇳 Китайский',
49
+ 'ja': '🇯🇵 Японский',
50
+ 'ru': '🇷🇺 Русский',
51
+ 'ar': '🇦🇪 Арабский',
52
+ 'hi': '🇮🇳 Хинди',
53
+ 'ko': '🇰🇷 Корейский',
54
+ 'it': '🇮🇹 Итальянский',
55
+ 'pt': '🇵🇹 Португальский',
56
+ 'tr': '🇹🇷 Турецкий'
57
+ }
58
+
59
+ # Клавиатуры
60
+ def main_keyboard():
61
+ builder = InlineKeyboardBuilder()
62
+ builder.button(text="⚙️ Настройки", callback_data="settings")
63
+ builder.button(text="📜 История", callback_data="history")
64
+ builder.button(text="❌ Выключить", callback_data="toggle_off")
65
+ builder.button(text="✅ Включить", callback_data="toggle_on")
66
+ builder.adjust(2)
67
+ return builder.as_markup()
68
+
69
+ def settings_keyboard():
70
+ builder = InlineKeyboardBuilder()
71
+ for code, name in LANGUAGES.items():
72
+ builder.button(text=name, callback_data=f"set_{code}")
73
+ builder.button(text="🔙 Назад", callback_data="main_menu")
74
+ builder.adjust(3)
75
+ return builder.as_markup()
76
+
77
+ # Управление пользователями
78
+ def get_user_settings(user_id):
79
+ conn = sqlite3.connect(DB_NAME)
80
+ c = conn.cursor()
81
+ c.execute("SELECT target_lang, active FROM users WHERE user_id=?", (user_id,))
82
+ user = c.fetchone()
83
+ conn.close()
84
+
85
+ if user:
86
+ return {'target_lang': user[0], 'active': bool(user[1])}
87
+ else:
88
+ # Создаем нового пользователя
89
+ set_user_settings(user_id, 'en', 1)
90
+ return {'target_lang': 'en', 'active': True}
91
+
92
+ def set_user_settings(user_id, target_lang=None, active=None):
93
+ conn = sqlite3.connect(DB_NAME)
94
+ c = conn.cursor()
95
+
96
+ c.execute("SELECT * FROM users WHERE user_id=?", (user_id,))
97
+ user = c.fetchone()
98
+
99
+ if user:
100
+ if target_lang:
101
+ c.execute("UPDATE users SET target_lang=? WHERE user_id=?",
102
+ (target_lang, user_id))
103
+ if active is not None:
104
+ c.execute("UPDATE users SET active=? WHERE user_id=?",
105
+ (int(active), user_id))
106
+ else:
107
+ c.execute("INSERT INTO users (user_id, target_lang, active) VALUES (?, ?, ?)",
108
+ (user_id, target_lang or 'en', int(active) if active is not None else 1))
109
+
110
+ conn.commit()
111
+ conn.close()
112
+
113
+ def save_history(user_id, original, translated, direction):
114
+ conn = sqlite3.connect(DB_NAME)
115
+ c = conn.cursor()
116
+ c.execute("INSERT INTO history (user_id, original, translated, direction, timestamp) VALUES (?, ?, ?, ?, ?)",
117
+ (user_id, original, translated, direction, datetime.now()))
118
+ conn.commit()
119
+ conn.close()
120
+
121
+ def get_history(user_id, limit=10):
122
+ conn = sqlite3.connect(DB_NAME)
123
+ c = conn.cursor()
124
+ c.execute("SELECT original, translated, direction, timestamp FROM history WHERE user_id=? ORDER BY timestamp DESC LIMIT ?",
125
+ (user_id, limit))
126
+ history = c.fetchall()
127
+ conn.close()
128
+ return history
129
+
130
+ # Обработчики команд
131
+ @dp.message(Command('start'))
132
+ async def start_cmd(message: types.Message):
133
+ user_id = message.from_user.id
134
+ set_user_settings(user_id, active=1)
135
+
136
+ welcome_text = (
137
+ "🚀 <b>Ultra Translator</b> - мгновенный переводчик\n\n"
138
+ "Просто отправьте текст и получите перевод!\n\n"
139
+ "• Автоопределение языка\n"
140
+ "• Поддержка 15+ языков\n"
141
+ "• История переводов\n\n"
142
+ "⚙️ Настройте язык перевода через меню"
143
+ )
144
+
145
+ await message.answer(welcome_text,
146
+ reply_markup=main_keyboard(),
147
+ parse_mode='HTML')
148
+
149
+ @dp.message(Command('toggle'))
150
+ async def toggle_cmd(message: types.Message):
151
+ user_id = message.from_user.id
152
+ settings = get_user_settings(user_id)
153
+ new_status = not settings['active']
154
+
155
+ set_user_settings(user_id, active=new_status)
156
+
157
+ if new_status:
158
+ await message.answer("✅ Переводчик включен. Отправьте текст для перевода!")
159
+ else:
160
+ await message.answer("❌ Переводчик выключен. Используйте /toggle для включения.")
161
+
162
+ # Основной обработчик текста
163
+ @dp.message(F.text)
164
+ async def handle_text(message: types.Message):
165
+ user_id = message.from_user.id
166
+ settings = get_user_settings(user_id)
167
+
168
+ # Проверка активности
169
+ if not settings['active']:
170
+ return
171
+
172
+ text = message.text
173
+ target_lang = settings['target_lang']
174
+
175
+ # Перевод
176
+ try:
177
+ # Автоопределение языка и перевод
178
+ translated = GoogleTranslator(source='auto', target=target_lang).translate(text)
179
+
180
+ # Определение языка источника
181
+ detected_lang = GoogleTranslator(source='auto').detect(text)
182
+ lang_name = LANGUAGES.get(detected_lang, detected_lang)
183
+
184
+ # Сохранение в историю
185
+ direction = f"{detected_lang}→{target_lang}"
186
+ save_history(user_id, text, translated, direction)
187
+
188
+ # Форматирование ответа
189
+ response = (
190
+ f"🌐 Перевод (<b>{lang_name} → {LANGUAGES[target_lang]}</b>):\n"
191
+ f"{translated}"
192
+ )
193
+
194
+ await message.reply(response, parse_mode='HTML')
195
+
196
+ except Exception as e:
197
+ logging.error(f"Translation error: {e}")
198
+ await message.reply("⚠️ Ошибка перевода. Попробуйте другой текст.")
199
+
200
+ # Обработчики инлайн-кнопок
201
+ @dp.callback_query(F.data == "settings")
202
+ async def settings_menu(callback: types.CallbackQuery):
203
+ user_id = callback.from_user.id
204
+ settings = get_user_settings(user_id)
205
+ current_lang = LANGUAGES.get(settings['target_lang'], settings['target_lang'])
206
+
207
+ await callback.message.edit_text(
208
+ f"⚙️ <b>Настройки</b>\nТекущий язык: {current_lang}\nВыберите новый язык:",
209
+ reply_markup=settings_keyboard(),
210
+ parse_mode='HTML'
211
+ )
212
+ await callback.answer()
213
+
214
+ @dp.callback_query(F.data == "history")
215
+ async def show_history(callback: types.CallbackQuery):
216
+ user_id = callback.from_user.id
217
+ history = get_history(user_id)
218
+
219
+ if not history:
220
+ await callback.message.answer("📭 История переводов пуста")
221
+ await callback.answer()
222
+ return
223
+
224
+ response = "🕒 <b>Последние переводы</b>:\n\n"
225
+ for i, (original, translated, direction, timestamp) in enumerate(history):
226
+ response += f"▫️ {original[:50]}{'...' if len(original) > 50 else ''}\n"
227
+ response += f" → {translated[:50]}{'...' if len(translated) > 50 else ''}\n\n"
228
+
229
+ await callback.message.answer(response, parse_mode='HTML')
230
+ await callback.answer()
231
+
232
+ @dp.callback_query(F.data.startswith("set_"))
233
+ async def set_language(callback: types.CallbackQuery):
234
+ lang_code = callback.data.split('_')[1]
235
+ user_id = callback.from_user.id
236
+
237
+ if lang_code in LANGUAGES:
238
+ set_user_settings(user_id, target_lang=lang_code)
239
+ lang_name = LANGUAGES[lang_code]
240
+ await callback.answer(f"✅ Язык перевода: {lang_name}")
241
+ else:
242
+ await callback.answer("⚠️ Неподдерживаемый язык")
243
+
244
+ # Возвращаемся в главное меню
245
+ await callback.message.edit_text(
246
+ "Настройки сохранены!",
247
+ reply_markup=main_keyboard()
248
+ )
249
+
250
+ @dp.callback_query(F.data == "main_menu")
251
+ async def main_menu(callback: types.CallbackQuery):
252
+ await callback.message.edit_text(
253
+ "Выберите действие:",
254
+ reply_markup=main_keyboard()
255
+ )
256
+ await callback.answer()
257
+
258
+ @dp.callback_query(F.data == "toggle_on")
259
+ async def toggle_on(callback: types.CallbackQuery):
260
+ user_id = callback.from_user.id
261
+ set_user_settings(user_id, active=True)
262
+ await callback.answer("✅ Переводчик включен")
263
+ await main_menu(callback)
264
+
265
+ @dp.callback_query(F.data == "toggle_off")
266
+ async def toggle_off(callback: types.CallbackQuery):
267
+ user_id = callback.from_user.id
268
+ set_user_settings(user_id, active=False)
269
+ await callback.answer("❌ Переводчик выключен")
270
+ await main_menu(callback)
271
+
272
+ # Запуск бота
273
+ async def main():
274
+ await dp.start_polling(bot)
275
+
276
+ if __name__ == "__main__":
277
+ import asyncio
278
+ asyncio.run(main())