126 lines
4.3 KiB
Python
126 lines
4.3 KiB
Python
import telebot
|
||
import sqlite3
|
||
import random
|
||
import time
|
||
import re
|
||
from datetime import datetime
|
||
|
||
TOKEN = "8554851929:AAFOvEGDbmnmwusAdEjv7j1QNaqJ_-lMLCw"
|
||
bot = telebot.TeleBot(TOKEN)
|
||
|
||
DB_NAME = "energy.db"
|
||
COLLECT_COOLDOWN = 3600 # 1 час
|
||
|
||
# ---------- БАЗА ДАННЫХ ----------
|
||
def init_db():
|
||
with sqlite3.connect(DB_NAME) as conn:
|
||
conn.execute("""
|
||
CREATE TABLE IF NOT EXISTS users (
|
||
user_id INTEGER PRIMARY KEY,
|
||
username TEXT,
|
||
energy INTEGER DEFAULT 0,
|
||
registered_at TEXT,
|
||
last_collect INTEGER DEFAULT 0
|
||
)
|
||
""")
|
||
|
||
def get_user(user_id):
|
||
with sqlite3.connect(DB_NAME) as conn:
|
||
cur = conn.execute("SELECT * FROM users WHERE user_id = ?", (user_id,))
|
||
return cur.fetchone()
|
||
|
||
def register_user(user_id, username):
|
||
with sqlite3.connect(DB_NAME) as conn:
|
||
conn.execute(
|
||
"INSERT INTO users (user_id, username, registered_at) VALUES (?, ?, ?)",
|
||
(user_id, username, datetime.now().strftime("%d.%m.%Y"))
|
||
)
|
||
|
||
# ---------- УТИЛИТЫ ----------
|
||
def format_energy(kw):
|
||
if kw >= 1_000_000:
|
||
return f"{kw / 1_000_000:.2f} ГВт⋅ч"
|
||
elif kw >= 1000:
|
||
return f"{kw / 1000:.2f} МВт⋅ч"
|
||
else:
|
||
return f"{kw} кВт⋅ч"
|
||
|
||
# ---------- СТАРЫЙ ТЕКСТ ----------
|
||
REPLY_TEXT = "⚡️ На данный момент отсутствует электроэнергия, Rezoc Bot временно недоступен."
|
||
OLD_KEYWORDS = r'\b(ботр|кд|огород|ловить|ебот|медали|погода|ловушка|копать|королевство|/bal|/kd)\b'
|
||
|
||
# ---------- ТОП ----------
|
||
@bot.message_handler(commands=['etop'])
|
||
def top_handler(message):
|
||
with sqlite3.connect(DB_NAME) as conn:
|
||
rows = conn.execute(
|
||
"SELECT username, energy FROM users ORDER BY energy DESC LIMIT 15"
|
||
).fetchall()
|
||
|
||
if not rows:
|
||
bot.reply_to(message, "Топ пока пуст 😔")
|
||
return
|
||
|
||
text = "🏆 ТОП 15 по энергии\n\n"
|
||
for i, (username, energy) in enumerate(rows, 1):
|
||
name_display = username if username else f"User {i}"
|
||
text += f"{i}. {name_display}: {format_energy(energy)}\n"
|
||
|
||
bot.reply_to(message, text)
|
||
|
||
# ---------- /start ----------
|
||
@bot.message_handler(commands=['start'])
|
||
def start_handler(message):
|
||
bot.reply_to(message, ('Чтобы начать игру введите "квт"'))
|
||
|
||
# ---------- ХЕНДЛЕР ----------
|
||
@bot.message_handler(func=lambda m: m.text is not None)
|
||
def main_handler(message):
|
||
text = message.text.lower()
|
||
user_id = message.from_user.id
|
||
username = message.from_user.first_name or f"User{user_id}"
|
||
|
||
# ---------- Мини-игра ----------
|
||
if text == "квт" or text == "профиль":
|
||
user = get_user(user_id)
|
||
if not user:
|
||
register_user(user_id, username)
|
||
user = get_user(user_id)
|
||
|
||
# СОБРАТЬ
|
||
if text == "квт":
|
||
now = int(time.time())
|
||
last = user[4]
|
||
ban = user[5] # last_collect
|
||
|
||
if now - last < COLLECT_COOLDOWN:
|
||
wait = (COLLECT_COOLDOWN - (now - last)) // 60
|
||
bot.reply_to(message, f"⏳ Рано. Попробуй через {wait} мин.")
|
||
return
|
||
|
||
gain = random.randint(1, 100)
|
||
with sqlite3.connect(DB_NAME) as conn:
|
||
conn.execute(
|
||
"UPDATE users SET energy = energy + ?, last_collect = ? WHERE user_id = ?",
|
||
(gain, now, user_id)
|
||
)
|
||
bot.reply_to(message, f"⚡ Ты собрал {gain} кВт⋅ч энергии!\nБаланс - профиль\nТоп 15 - /etop")
|
||
return
|
||
|
||
# БАЛ
|
||
if text == "профиль":
|
||
energy = user[2] # energy
|
||
reg_date = user[3] # registered_at
|
||
bot.reply_to(
|
||
message,
|
||
f"⚡ Энергия: {format_energy(energy)}\n🏆Топ 10 - /top\n\n"
|
||
f"📅 Регистрация: {reg_date}\n"
|
||
f"👤 Игрок: {user[1]}"
|
||
)
|
||
return
|
||
|
||
# ---------- ЗАПУСК ----------
|
||
init_db()
|
||
print("⚡ Energy Bot запущен")
|
||
bot.send_message(-1001766074965, "✅ Бот перезапущен.")
|
||
bot.infinity_polling() |