diff --git a/shivu/modules/Uptry.py b/shivu/modules/Uptry.py new file mode 100644 index 00000000..f47491e9 --- /dev/null +++ b/shivu/modules/Uptry.py @@ -0,0 +1,175 @@ +import urllib.request +from pymongo import ReturnDocument + +from telegram import Update +from telegram.ext import CommandHandler, CallbackContext + +from shivu import application, sudo_users, collection, db, CHARA_CHANNEL_ID, SUPPORT_CHAT + +WRONG_FORMAT_TEXT = """Wrong ❌️ format... eg. /upload Img_url muzan-kibutsuji Demon-slayer 3 + +img_url character-name anime-name rarity-number + +use rarity number accordingly rarity Map + +rarity_map = 1 (⚪️ Common), 2 (🟣 Rare) , 3 (🟡 Legendary), 4 (🟢 Medium)""" + + + +async def get_next_sequence_number(sequence_name): + sequence_collection = db.sequences + sequence_document = await sequence_collection.find_one_and_update( + {'_id': sequence_name}, + {'$inc': {'sequence_value': 1}}, + return_document=ReturnDocument.AFTER + ) + if not sequence_document: + await sequence_collection.insert_one({'_id': sequence_name, 'sequence_value': 0}) + return 0 + return sequence_document['sequence_value'] + +async def upload(update: Update, context: CallbackContext) -> None: + if str(update.effective_user.id) not in sudo_users: + await update.message.reply_text('Ask My Owner...') + return + + try: + args = context.args + if len(args) != 4: + await update.message.reply_text(WRONG_FORMAT_TEXT) + return + + character_name = args[1].replace('-', ' ').title() + anime = args[2].replace('-', ' ').title() + + try: + urllib.request.urlopen(args[0]) + except: + await update.message.reply_text('Invalid URL.') + return + + rarity_map = {1: "⚪ Common", 2: "🟣 Rare", 3: "🟡 Legendary", 4: "🟢 Medium"} + try: + rarity = rarity_map[int(args[3])] + except KeyError: + await update.message.reply_text('Invalid rarity. Please use 1, 2, 3, 4, or 5.') + return + + id = str(await get_next_sequence_number('character_id')).zfill(2) + + character = { + 'img_url': args[0], + 'name': character_name, + 'anime': anime, + 'rarity': rarity, + 'id': id + } + + try: + message = await context.bot.send_photo( + chat_id=CHARA_CHANNEL_ID, + photo=args[0], + caption=f'Character Name: {character_name}\nAnime Name: {anime}\nRarity: {rarity}\nID: {id}\nAdded by {update.effective_user.first_name}', + parse_mode='HTML' + ) + character['message_id'] = message.message_id + await collection.insert_one(character) + await update.message.reply_text('CHARACTER ADDED....') + except: + await collection.insert_one(character) + update.effective_message.reply_text("Character Added but no Database Channel Found, Consider adding one.") + + except Exception as e: + await update.message.reply_text(f'Character Upload Unsuccessful. Error: {str(e)}\nIf you think this is a source error, forward to: {SUPPORT_CHAT}') + +async def delete(update: Update, context: CallbackContext) -> None: + if str(update.effective_user.id) not in sudo_users: + await update.message.reply_text('Ask my Owner to use this Command...') + return + + try: + args = context.args + if len(args) != 1: + await update.message.reply_text('Incorrect format... Please use: /delete ID') + return + + + character = await collection.find_one_and_delete({'id': args[0]}) + + if character: + + await context.bot.delete_message(chat_id=CHARA_CHANNEL_ID, message_id=character['message_id']) + await update.message.reply_text('DONE') + else: + await update.message.reply_text('Deleted Successfully from db, but character not found In Channel') + except Exception as e: + await update.message.reply_text(f'{str(e)}') + +async def update(update: Update, context: CallbackContext) -> None: + if str(update.effective_user.id) not in sudo_users: + await update.message.reply_text('You do not have permission to use this command.') + return + + try: + args = context.args + if len(args) != 3: + await update.message.reply_text('Incorrect format. Please use: /update id field new_value') + return + + # Get character by ID + character = await collection.find_one({'id': args[0]}) + if not character: + await update.message.reply_text('Character not found.') + return + + # Check if field is valid + valid_fields = ['img_url', 'name', 'anime', 'rarity'] + if args[1] not in valid_fields: + await update.message.reply_text(f'Invalid field. Please use one of the following: {", ".join(valid_fields)}') + return + + # Update field + if args[1] in ['name', 'anime']: + new_value = args[2].replace('-', ' ').title() + elif args[1] == 'rarity': + rarity_map = {1: "⚪ Common", 2: "🟣 Rare", 3: "🟡 Legendary", 4: "🟢 Medium", 5: "💮 Special edition"} + try: + new_value = rarity_map[int(args[2])] + except KeyError: + await update.message.reply_text('Invalid rarity. Please use 1, 2, 3, 4, or 5.') + return + else: + new_value = args[2] + + await collection.find_one_and_update({'id': args[0]}, {'$set': {args[1]: new_value}}) + + + if args[1] == 'img_url': + await context.bot.delete_message(chat_id=CHARA_CHANNEL_ID, message_id=character['message_id']) + message = await context.bot.send_photo( + chat_id=CHARA_CHANNEL_ID, + photo=new_value, + caption=f'Character Name: {character["name"]}\nAnime Name: {character["anime"]}\nRarity: {character["rarity"]}\nID: {character["id"]}\nUpdated by {update.effective_user.first_name}', + parse_mode='HTML' + ) + character['message_id'] = message.message_id + await collection.find_one_and_update({'id': args[0]}, {'$set': {'message_id': message.message_id}}) + else: + + await context.bot.edit_message_caption( + chat_id=CHARA_CHANNEL_ID, + message_id=character['message_id'], + caption=f'Character Name: {character["name"]}\nAnime Name: {character["anime"]}\nRarity: {character["rarity"]}\nID: {character["id"]}\nUpdated by {update.effective_user.first_name}', + parse_mode='HTML' + ) + + await update.message.reply_text('Updated Done in Database.... But sometimes it Takes Time to edit Caption in Your Channel..So wait..') + except Exception as e: + await update.message.reply_text(f'I guess did not added bot in channel.. or character uploaded Long time ago.. Or character not exits.. orr Wrong id') + +UPLOAD_HANDLER = CommandHandler('upload', upload, block=False) +application.add_handler(UPLOAD_HANDLER) +DELETE_HANDLER = CommandHandler('delete', delete, block=False) +application.add_handler(DELETE_HANDLER) +UPDATE_HANDLER = CommandHandler('update', update, block=False) +application.add_handler(UPDATE_HANDLER)