import asyncio from aiogram import Bot, Dispatcher, types, F from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton from aiogram.filters import CommandStart from aiogram.fsm.storage.memory import MemoryStorage from aiogram.fsm.context import FSMContext from aiogram.fsm.state import StatesGroup, State TOKEN = "8517883174:AAFA-dHF5Xm6q1mPQJA_eSBcyqDsaO0nPS4" CHANNEL_ID = -1003749575740 REVIEW_ID = -1003911723791 bot = Bot(token=TOKEN) dp = Dispatcher(storage=MemoryStorage()) submissions = {} counter = 0 class Upload(StatesGroup): waiting_media = State() confirm = State() start_kb = ReplyKeyboardMarkup( keyboard=[ [KeyboardButton(text="Upload Photo")], [KeyboardButton(text="Upload Video")] ], resize_keyboard=True ) confirm_kb = InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="Submit", callback_data="submit")], [InlineKeyboardButton(text="Cancel", callback_data="cancel")] ] ) def admin_kb(sub_id): return InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="Approve", callback_data="a|" + str(sub_id))], [InlineKeyboardButton(text="Reject", callback_data="r|" + str(sub_id))] ] ) @dp.message(CommandStart()) async def start(message: types.Message, state: FSMContext): await message.answer("The other videos/images can be found in the channel. Channel invite link: https://t.me/+engKAbYjPgNmYTQ1 here is where your stuff will be posted too") args = message.text.split() if len(args) > 1 and args[1] == "submit": await message.answer("Send your photo or video", reply_markup=start_kb) else: await message.answer("Choose:", reply_markup=start_kb) @dp.message(F.text == "Upload Photo") async def photo_btn(message: types.Message, state: FSMContext): await state.set_state(Upload.waiting_media) await state.update_data(type="photo") await message.answer("Send photo") @dp.message(F.text == "Upload Video") async def video_btn(message: types.Message, state: FSMContext): await state.set_state(Upload.waiting_media) await state.update_data(type="video") await message.answer("Send video") @dp.message(Upload.waiting_media, F.photo | F.video) async def handle_media(message: types.Message, state: FSMContext): if message.photo: file_id = message.photo[-1].file_id file_type = "photo" else: file_id = message.video.file_id file_type = "video" await state.update_data(file_id=file_id, file_type=file_type) await state.set_state(Upload.confirm) await message.answer("Confirm submission", reply_markup=confirm_kb) @dp.callback_query(F.data == "submit") async def submit(cb: types.CallbackQuery, state: FSMContext): global counter data = await state.get_data() file_id = data["file_id"] file_type = data["file_type"] user = cb.from_user counter += 1 submissions[counter] = (user.id, file_id, file_type) caption = "New submission from @" + (user.username if user.username else user.full_name) if file_type == "photo": await bot.send_photo(REVIEW_ID, file_id, caption=caption, reply_markup=admin_kb(counter)) else: await bot.send_video(REVIEW_ID, file_id, caption=caption, reply_markup=admin_kb(counter)) await cb.message.answer("Submitted") await state.clear() @dp.callback_query(F.data == "cancel") async def cancel(cb: types.CallbackQuery, state: FSMContext): await state.clear() await cb.message.answer("Cancelled") @dp.callback_query(F.data.startswith("a|")) async def approve(cb: types.CallbackQuery): sub_id = int(cb.data.split("|")[1]) user_id, file_id, file_type = submissions[sub_id] if file_type == "photo": await bot.send_photo(CHANNEL_ID, file_id, caption="Approved submission, submit your own self-harm media using https://t.me/Selfharmmeowbot?start=submit") else: await bot.send_video(CHANNEL_ID, file_id, caption="Approved submission, submit your own self-harm media using https://t.me/Selfharmmeowbot?start=submit") await bot.send_message(user_id, "Your submission was approved") await cb.message.edit_reply_markup() @dp.callback_query(F.data.startswith("r|")) async def reject(cb: types.CallbackQuery): sub_id = int(cb.data.split("|")[1]) user_id, _, _ = submissions[sub_id] await bot.send_message(user_id, "Your submission was rejected") await cb.message.edit_reply_markup() @dp.message(F.new_chat_members) async def welcome(message: types.Message): for user in message.new_chat_members: text = f"{user.first_name} welcome to the channel. if you want to submit media of SH please use this link to our bot: https://t.me/selfharmmeowbot?start=submit If you want to view existing self-harm media in the channel, please click on it and go to the media section." msg = await message.answer(text, parse_mode="HTML") await asyncio.sleep(1800) await msg.delete() async def main(): await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())