𝙊𝙪𝙚𝙧𝙥 | ПОИСК
Відкрити в Telegram
Самый лучший сайт для поиска - https://ouerp-probiv.vzleteam.ru
Показати більшеКраїна не вказанаКатегорія не вказана
347
Підписники
-124 години
-397 днів
-26230 днів
Архів дописів
💎<Всем привет я создаю
1️⃣<ТЕЛЕГРАМ БОТЫ, абсолютно какой вам нужен по описания: цена зависит от работы
2️⃣<САЙТЫ, делаю под вас как вам нужно разные системы подробное в ЛС: цена зависит от работы
3️⃣<APP- приложения, делаю польностью под вас могу сделать в боте: цена зависит от работы
4️⃣<СКРИПТЫ, например для докса/сноса или под вас: цена зависит от работы
5️⃣<СОФТЫ, могу создать софт под вас любую игру по критериям: цена зависит от работы
6️⃣<АИМ/ЧИТЫ, могу создать АИМ/чит под вас также на любую игру с большими возможностями: цена зависит от работы
7️⃣<ПРИЛОЖЕНИЯ любое со страницами профилями под вас:цена зависит от работы
8️⃣<ТАКЖЕ ЕСЛИ ВЫ НЕ НАШЛИ ТО ЧТО НУЖНО ВАМ МОЖЕТЕ написать в ЛС и я скажу смогу ли я это сделать
🔥>ЦЕНА/ВОПРОСЫ/Т.Д: @ouerp
Repost from SIMPL RUSSIA- Мобильная онлайн игра
Всем сап совмеска с zerixx/Kapter
От зерикса👇👇
МК ПК на выбор
МК панда на выбор
Оптима ПК 1000FPS
ЛЮБОЙ МК НА КВМ
АДМ ТГК
От каптера👇👇
Новая приватка
Старая приватка
Старый софт
Любой мк на панду
Реклама на 3часа (с закрепом)
Условия подписку на https://t.me/zerixx_777
@Kapternasvage
Итоги на 35тапов!
Раскид=100% выигрыш
Удачи!
Repost from SIMPL RUSSIA- Мобильная онлайн игра
Конкурс чтобы добить 1к сабов 60тапов, 25призовых
1. Новый приват каптера
2. Новый приват каптера
3. Новый приват каптера
4. Старый приват каптера
5. Старый приват каптера
Старый софт каптера (навсегда)
6. Новый софт каптера (на 2дня)
7.Приват бахмута
8. Приват шапика и верти
9. Приват Андрюши новый
10.Приват шизи
11. Приват Андрюши старый
12. Приват тана
13. Приват вертелы
14. Приват
Хама и хашимуро
15. Приват зетикса
16. Приват простоузглянского
17. Приват гамбио
18. Реклама на 3часа(с закрепом)
19. Реклама на 1час (с закрепом)
20. Любой мк на панду на выбор
21/22. Капт сборка/ПК на 60фпс
23/25. Мини капт сборка 60фпс (21-25 это сборки на панду)
Условия=подписку на тгк @Kapternasvage
Раскид=100% выигрыш
Удачи выиграть
cid = callback.data.split("_", 2)[2]
comp = competitions.get(cid)
if not comp:
await callback.answer("Конкурс не найден.", show_alert=True)
return
if len(comp["participants"]) < comp["winners_count"]:
await callback.answer("Ещё недостаточно участников.", show_alert=True)
return
winners_ids = random.sample(comp["participants"], comp["winners_count"])
winners_mentions = []
for wid in winners_ids:
try:
u = await bot.get_chat(wid)
mention = u.username or f"[{u.full_name}](tg://user?id={wid})"
winners_mentions.append(mention)
except Exception:
winners_mentions.append(f"Пользователь {wid}")
comp["status"] = "finished"
text = (
f"🏆 Конкурс «{comp['name']}» завершён!\n"
f"Победители: {', '.join(winners_mentions)}"
)
await bot.send_message(CHANNEL_ID, text)
await callback.message.edit_text(f"{text}\nКонкурс завершён.", parse_mode="Markdown")
await callback.answer()
@dp.callback_query(F.data.startswith("cancel_comp_"))
async def cb_cancel_comp(callback: types.CallbackQuery):
cid = callback.data.split("_", 2)[2]
comp = competitions.get(cid)
if not comp:
await callback.answer
preview = (
f"🏆 КОНКУРС: {comp['name']}\n"
f"Нужно участников: {comp['participants_count']}\n"
f"Победителей: {comp['winners_count']}"
)
builder = InlineKeyboardBuilder()
builder.button(text="✅ Участвовать", callback_data=f"join_comp_{cid}")
kb = builder.as_markup()
if comp["photo_id"]:
msg = await bot.send_photo(
CHANNEL_ID,
photo=comp["photo_id"],
caption=preview,
reply_markup=kb
)
else:
msg = await bot.send_message(
CHANNEL_ID,
preview,
reply_markup=kb
)
comp["status"] = "active"
comp["channel_msg_id"] = msg.message_id
comp["created_at"] = datetime.now()
# Статистика создателя
if uid not in user_stats:
user_stats[uid] = {"created_competitions": 0}
user_stats[uid]["created_competitions"] += 1
del user_state[uid]
await message.answer(f"🎉 Конкурс «{name}» опубликован в канале! Теперь собирайте участников.", reply_markup=kb_start())
else:
# Неизвестное состояние — сбрасываем
del user_state[uid]
await message.answer("Не понимаю. Нажмите /start или выберите действие в меню.", reply_markup=kb_start())
# Обработка кнопки «Участвовать»
@dp.callback_query(F.data.startswith("join_comp_"))
async def cb_join_competition(callback: types.CallbackQuery):
cid = callback.data.split("_", 2)[2]
comp = competitions.get(cid)
if not comp or comp["status"] != "active":
await callback.answer("Конкурс не найден или завершён.", show_alert=True)
return
uid = callback.from_user.id
if uid in comp["participants"]:
await callback.answer("Вы уже участвуете!", show_alert=True)
return
if len(comp["participants"]) >= comp["participants_count"]:
await callback.answer("Лимит участников достигнут.", show_alert=True)
return
comp["participants"].append(uid)
await callback.answer("✅ Вы записались на участие!")
# Проверка: набрано ли нужное число участников
if len(comp["participants"]) == comp["participants_count"]:
# Можно автоматически завершить конкурс или просто уведомить админа — тут просто уведомление в канал
await bot.send_message(
CHANNEL_ID,
f"🎉 Набрано нужное число участников в конкурсе «{comp['name']}».\n"
f"Можно выбрать победителя через бота."
)
# Управление конкурсами
@dp.callback_query(F.data == "manage_competitions")
async def cb_manage_competitions(callback: types.CallbackQuery):
uid = callback.from_user.id
my_comps = [
cid for cid, c in competitions.items()
if c["creator_id"] == uid and c["status"] in ("active", "draft")
]
if not my_comps:
await callback.answer("У вас нет активных конкурсов.", show_alert=True)
return
await callback.message.edit_text("Выберите конкурс для управления:", reply_markup=kb_manage_list(my_comps))
await callback.answer()
@dp.callback_query(F.data.startswith("manage_comp_"))
async def cb_manage_comp(callback: types.CallbackQuery):
cid = callback.data.split("_", 2)[2]
comp = competitions.get(cid)
if not comp:
await callback.answer("Конкурс не найден.", show_alert=True)
return
await callback.message.edit_text(
f"Управление конкурсом: {comp['name']}\n"
f"Статус: {comp['status']}\n"
f"Участников: {len(comp['participants'])}/{comp['participants_count']}",
reply_markup=kb_comp_actions(cid)
)
await callback.answer()
@dp.callback_query(F.data.startswith("choose_winner_"))
async def cb_choose_winner(callback: types.CallbackQuery):
return
# Тут можно дополнительно проверить права бота, но get_chat_member для бота в канале не всегда работает напрямую.
# Для простоты считаем, что админ добавил бота как админа.
except Exception as e:
await callback.answer(f"Ошибка доступа к каналу: {e}", show_alert=True)
return
await callback.message.answer(
"✅ Вы добавили меня в канал как админа.\n"
"Теперь напишите название конкурса:"
)
user_state[callback.from_user.id] = COMP_STEP_WAIT_NAME
await callback.answer()
@dp.message(F.text)
async def handle_text(message: types.Message):
uid = message.from_user.id
step = user_state.get(uid)
# Логика шагов создания конкурса
if step == COMP_STEP_WAIT_NAME:
name = message.text.strip()
if len(name) < 2:
await message.answer("Название должно быть длиннее 2 символов. Напишите ещё раз:")
return
user_state[uid] = COMP_STEP_WAIT_PHOTO
await message.answer(f"Название: {name}.\nОтправьте фото для конкурса (или /skip, чтобы пропустить):")
elif step == COMP_STEP_WAIT_PHOTO:
if message.photo:
photo_file_id = message.photo[-1].file_id
user_state[uid] = (COMP_STEP_WAIT_PARTICIPANTS, photo_file_id)
await message.answer("Фото сохранено. Теперь напишите, сколько нужно участников:")
elif message.text and message.text.lower() == "/skip":
user_state[uid] = (COMP_STEP_WAIT_PARTICIPANTS, None)
await message.answer("Фото пропущено. Сколько нужно участников?")
else:
await message.answer("Отправьте фото или напишите /skip, чтобы пропустить. Или число участников:")
elif isinstance(step, tuple) and step[0] == COMP_STEP_WAIT_PARTICIPANTS:
photo_id = step[1]
try:
participants = int(message.text)
if participants <= 0:
raise ValueError
except ValueError:
await message.answer("Введите корректное число участников (больше 0):")
return
user_state[uid] = (COMP_STEP_WAIT_WINNERS, photo_id, participants)
await message.answer(f"Нужно участников: {participants}. Сколько выбрать победителей?")
elif isinstance(step, tuple) and step[0] == COMP_STEP_WAIT_WINNERS:
photo_id, participants = step[1], step[2]
try:
winners = int(message.text)
if winners <= 0 or winners > participants:
raise ValueError
except ValueError:
await message.answer(f"Число победителей должно быть от 1 до {participants}. Напишите ещё раз:")
return
# Формируем черновик конкурса
cid = f"c_{int(datetime.now().timestamp())}_{uid}"
competitions[cid] = {
"name": None, # заполним ниже
"photo_id": photo_id,
"participants_count": participants,
"winners_count": winners,
"creator_id": uid,
"status": "draft",
"channel_msg_id": None,
"participants": [],
}
# Сохраняем название, которое мы не сохранили явно: нужно либо хранить в state, либо попросить повторно.
# Упрощение: попросим ещё раз ввести название для финального подтверждения
competitions[cid]["name"] = "Конкурс без названия" # заглушка, исправим в confirm
user_state[uid] = (COMP_STEP_CONFIRM_PUBLISH, cid)
await message.answer(
f"📝 Параметры конкурса:\n"
f"Фото: {'✅' if photo_id else '❌'}\n"
f"Участников нужно: {participants}\n"
f"Победителей: {winners}\n\n"
f"Напишите название конкурса, затем бот предложит опубликовать в канал."
)
elif isinstance(step, tuple) and step[0] == COMP_STEP_CONFIRM_PUBLISH:
cid = step[1]
name = message.text.strip()
if len(name) < 2:
await message.answer("Название слишком короткое. Напишите ещё раз:")
return
competitions[cid]["name"] = name
comp = competitions[cid]
import asyncio
import random
from datetime import datetime
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder
# --- НАСТРОЙКИ ---
BOT_TOKEN = "ВАШ_ТОКЕН_ОТ_BOTFATHER"
CHANNEL_ID = "-100XXXXXXXXXX" # ID канала (с минусом для приватных)
ADMINS = [123456789] # список ID админов (число), можно добавить несколько
# Хранилища (в памяти, при рестарте пропадут)
competitions = {} # id_конкурса: {data}
user_stats = {} # user_id: {created_competitions: int}
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
# --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---
def get_user_profile(user: types.User) -> str:
name = user.full_name
role = "Админ" if user.id in ADMINS else "Пользователь"
stats = user_stats.get(user.id, {"created_competitions": 0})
return (
f"👤 Профиль\n"
f"Имя: {name}\n"
f"Роль: {role}\n"
f"Проведено конкурсов: {stats['created_competitions']}"
)
def make_comp_key(chat_id: int, msg_id: int) -> str:
return f"{chat_id}:{msg_id}"
# --- КЛАВИАТУРЫ ---
def kb_start():
builder = InlineKeyboardBuilder()
builder.button(text="🎲 Создать конкурс", callback_data="create_competition")
builder.button(text="📋 Управление конкурсами", callback_data="manage_competitions")
builder.button(text="👤 Мой профиль", callback_data="profile")
if ADMINS and True:
builder.button(text="🛠 Админ-меню", callback_data="admin_menu")
return builder.as_markup()
def kb_manage_list(comp_ids):
builder = InlineKeyboardBuilder()
for cid in comp_ids:
c = competitions.get(cid)
if not c:
continue
text = f"🏆 {c['name']} ({c['participants_count']} уч.)"
builder.button(text=text, callback_data=f"manage_comp_{cid}")
builder.button(text="❌ Отмена", callback_data="cancel_manage")
return builder.as_markup()
def kb_comp_actions(cid: str):
builder = InlineKeyboardBuilder()
builder.button(text="✅ Выбрать победителя", callback_data=f"choose_winner_{cid}")
builder.button(text="🗑 Отменить конкурс", callback_data=f"cancel_comp_{cid}")
builder.button(text="🔙 Назад", callback_data="manage_competitions")
return builder.as_markup()
def kb_admin_list():
builder = InlineKeyboardBuilder()
builder.button(text="📜 Список активных конкурсов", callback_data="admin_list_comps")
builder.button(text="👥 Пользователи и конкурсы", callback_data="admin_users")
builder.button(text="➕ Добавить админа", callback_data="admin_add_admin")
builder.button(text="🔙 Назад", callback_data="admin_menu")
return builder.as_markup()
# --- МАШИНА СОСТОЯНИЙ (ПРОСТОЙ ВАРИАНТ) ---
# Храним состояние пользователя: user_id -> step
user_state = {}
COMP_STEP_WAIT_NAME = "wait_name"
COMP_STEP_WAIT_PHOTO = "wait_photo"
COMP_STEP_WAIT_PARTICIPANTS = "wait_participants"
COMP_STEP_WAIT_WINNERS = "wait_winners"
COMP_STEP_CONFIRM_PUBLISH = "confirm_publish"
ADMIN_STEP_WAIT_ADMIN_ID = "admin_wait_id"
# --- ОБРАБОТЧИКИ КОМАНД И КОЛЛБЕКОВ ---
@dp.message(Command("start"))
async def cmd_start(message: types.Message):
await message.answer("👋 Привет! Я бот-рандомайзер для конкурсов.", reply_markup=kb_start())
@dp.callback_query(F.data == "create_competition")
async def cb_create_competition(callback: types.CallbackQuery):
# Сначала проверяем, что бот добавлен в канал и имеет права админа
try:
chat = await bot.get_chat(CHANNEL_ID)
member = await bot.get_chat_member(CHANNEL_ID, callback.from_user.id)
# Если бот не админ в канале — просим добавить
if chat.type != "channel":
await callback.answer("Канал должен быть публичным или приватным каналом.", show_alert=True)
Repost from SIMPL RUSSIA- Мобильная онлайн игра
Конкурс чтобы добить 1к сабов 60тапов, 25призовых
1. Новый приват каптера
2. Новый приват каптера
3. Новый приват каптера
4. Старый приват каптера
5. Старый приват каптера
Старый софт каптера (навсегда)
6. Новый софт каптера (на 2дня)
7.Приват бахмута
8. Приват шапика и верти
9. Приват Андрюши новый
10.Приват шизи
11. Приват Андрюши старый
12. Приват тана
13. Приват вертелы
14. Приват
Хама и хашимуро
15. Приват зетикса
16. Приват простоузглянского
17. Приват гамбио
18. Реклама на 3часа(с закрепом)
19. Реклама на 1час (с закрепом)
20. Любой мк на панду на выбор
21/22. Капт сборка/ПК на 60фпс
23/25. Мини капт сборка 60фпс (21-25 это сборки на панду)
Условия=подписку на тгк @Kapternasvage
Раскид=100% выигрыш
Удачи выиграть
Repost from SIMPL RUSSIA- Мобильная онлайн игра
Совместный розыгрыш с espino/Kapter
От еспино👇👇
Чит asuracore
Кастом чит
От каптера 👇👇
Новая приватка каптера
Старая приватка каптера
Старый софт каптера
Любой мк на выбор
Автослайды с автоджойстиком на 60фпс
Итоги на 50тапов!
Условия: подписку на @asuracore и @Kapternasvager
Удачи выиграть в конкурсе;)
