𝙊𝙪𝙚𝙧𝙥| 𝙈𝘼𝙏𝙍𝙀𝙎𝙃𝙆𝘼 𝙍𝙥
Открыть в Telegram
Софты, макросы и много другого от ouerp Бот: @OuerpMTshop_Bot Канал: https://t.me/ouerpov Чат: https://t.me/ouerpovChat
БольшеСтрана не указанаКатегория не указана
148
Подписчики
Нет данных24 часа
-437 дней
-16830 дней
Архив постов
Repost from Xline Russia - онлайн игра
Всем сап совмеска с zerixx/Kapter
От зерикса👇👇
МК ПК на выбор
МК панда на выбор
Оптима ПК 1000FPS
ЛЮБОЙ МК НА КВМ
АДМ ТГК
От каптера👇👇
Новая приватка
Старая приватка
Старый софт
Любой мк на панду
Реклама на 3часа (с закрепом)
Условия подписку на https://t.me/zerixx_777
@Kapternasvage
Итоги на 35тапов!
Раскид=100% выигрыш
Удачи!
Repost from Xline 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 Xline 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 Xline Russia - онлайн игра
Совместный розыгрыш с espino/Kapter
От еспино👇👇
Чит asuracore
Кастом чит
От каптера 👇👇
Новая приватка каптера
Старая приватка каптера
Старый софт каптера
Любой мк на выбор
Автослайды с автоджойстиком на 60фпс
Итоги на 50тапов!
Условия: подписку на @asuracore и @Kapternasvager
Удачи выиграть в конкурсе;)
Repost from 𝙊𝙪𝙚𝙧𝙥| 𝙈𝘼𝙏𝙍𝙀𝙎𝙃𝙆𝘼 𝙍𝙥
Всем привет выпустил софт на тф😱, для матрëшки рп
Цена небольшая эффективность хорошая
Что сейчас в софте на данный момент
🌟функции:
Оружие в данном разделе можно включить бесконечные патроны включить/или выключить и убрать разброс выключить/включить
Оптимизация когда ие нажимаете она стабилизирует фпс
Счëтчик фпс когда вы нажимаете добавляется на экран актуальный счëтчик фпс
Кнопка Пинг когда нажимаете показывает ваш Пинг
Настройки в них вы сможете сдвинуть панель верх низ влево право
В другое можно сделать обход фпс 250 или 500 ну или самим ввести до 1000 фпс также там есть стрелять без звука можно выключить/включить
👻Цена:
💎1 ключ на один вход: 15🔶/10₽
🍙День: 30🔶/30₽
❗Неделя: 85🔶/85₽
✨месяц: 125🔶/125₽
𑰽навсегда: 300🔶/300₽
Акция только СЕГОДНЯ!!!!!
✈️НАВСЕГДА: 250₽/250🔶
УСПЕВАЙТЕ!!!
За покупкой/вопросами в лс
@ouerp
