diff --git a/languages/built-in/en.yml b/languages/built-in/en.yml index 9bac84c..45130bc 100644 --- a/languages/built-in/en.yml +++ b/languages/built-in/en.yml @@ -391,6 +391,12 @@ us_static_uploading: Uploading pictures... us_static_rounding: Rounding in progress... us_change_rounding_true: Automatic conversion of rounded corners for stickers has been turned on. us_change_rounding_false: Automatic conversion of rounded corners for stickers has been turned off. +## merge +merge_command_error: Command parameter error! +merge_processing_left: Processing the 【 +merge_processing_right: 】st message. +merge_total_processed_left: A total of 【 +merge_total_processed_right: 】 stickers were processed. # system # sh diff --git a/languages/built-in/zh-cn.yml b/languages/built-in/zh-cn.yml index 0ae4ac8..d8a3ddc 100644 --- a/languages/built-in/zh-cn.yml +++ b/languages/built-in/zh-cn.yml @@ -409,6 +409,12 @@ us_static_uploading: 上传图片中 . . . us_static_rounding: 图片圆角处理中 . . . us_change_rounding_true: 已开启贴纸自动转换圆角功能 us_change_rounding_false: 已关闭贴纸自动转换圆角功能 +## merge +merge_command_error: 命令参数错误! +merge_processing_left: 正在处理第【 +merge_processing_right: 】条消息。 +merge_total_processed_left: 共处理了【 +merge_total_processed_right: 】张贴纸。 # system ## sh diff --git a/languages/built-in/zh-tw.yml b/languages/built-in/zh-tw.yml index 25a0a5b..b90e986 100644 --- a/languages/built-in/zh-tw.yml +++ b/languages/built-in/zh-tw.yml @@ -391,6 +391,12 @@ us_static_uploading: 上傳圖片中… us_static_rounding: 圖片圓角處理中… us_change_rounding_true: 已開啟貼紙自動轉換圓角功能 us_change_rounding_false: 已關閉貼紙自動轉換圓角功能 +## merge +merge_command_error: 命令參數錯誤! +merge_processing_left: 正在處理第【 +merge_processing_right: 】條消息。 +merge_total_processed_left: 共處理了【 +merge_total_processed_right: 】張貼紙。 # system # sh diff --git a/pagermaid/modules/sticker.py b/pagermaid/modules/sticker.py index 3755813..ac00f01 100644 --- a/pagermaid/modules/sticker.py +++ b/pagermaid/modules/sticker.py @@ -13,6 +13,7 @@ from math import floor from pagermaid import bot, redis, redis_status from pagermaid.listener import listener from pagermaid.utils import lang +from pagermaid import log @listener(is_plugin=False, outgoing=True, command="s", @@ -21,33 +22,142 @@ from pagermaid.utils import lang async def sticker(context): """ Fetches images/stickers and add them to your pack. """ pic_round = False + is_batch = False + package_name = "" if redis_status(): if redis.get("sticker.round"): pic_round = True - if len(context.parameter) == 1: - if context.parameter[0] == "set_round": - if pic_round: - redis.delete("sticker.round") + + if len(context.parameter) >= 1: + # s merge + await log(f"{context.parameter}") + if context.parameter[0] == "merge" or context.parameter[0] == "m": + is_batch = True + # s merge png + try: + if context.parameter[3].isnumeric(): + if "png" in context.parameter[1]: + pic_round = False + else: + pic_round = True + package_name = context.parameter[2] + except: + # 异常,多半是数组越界,不处理,继续参数校验 + pass + try: + # s merge + if context.parameter[2].isnumeric(): + if "png" in context.parameter[1]: + pic_round = False + package_name = context.parameter[2] + else: + package_name = context.parameter[1] + # s merge png + elif "png" in context.parameter[1]: + pic_round = False + package_name = context.parameter[2] + # s merge + else: + package_name = context.parameter[1] + + except: + # 异常,多半是数组越界 + # s merge try: - await context.edit(lang('us_change_rounding_false')) + if "png" in context.parameter[1]: + raise Exception() + package_name = context.parameter[1] except: - pass + # 命令错误 + try: + await context.edit(lang('merge_command_error')) + except: + pass + return + + # s | error + else: + if context.parameter[0] == "set_round": + if pic_round: + redis.delete("sticker.round") + try: + await context.edit(lang('us_change_rounding_false')) + except: + pass + else: + redis.set("sticker.round", "true") + try: + await context.edit(lang('us_change_rounding_true')) + except: + pass + return + elif "png" in context.parameter[0]: + pic_round = False + # s + elif context.parameter[0].isnumeric(): + pass + elif isEmoji(context.parameter[0]) or len(context.parameter[0]) == 1: + await log(f"emoji:{context.parameter[0]}") + pass else: - redis.set("sticker.round", "true") try: - await context.edit(lang('us_change_rounding_true')) + await context.edit(lang('merge_command_error')) except: pass - return - elif "png" in context.parameter[0]: - pic_round = False + return + user = await bot.get_me() if not user.username: user.username = user.first_name - message = await context.get_reply_message() + custom_emoji = False animated = False emoji = "" + + if is_batch: + # 多张 + """ merge every single sticker after the message you replied to. """ + if not context.reply_to_msg_id: + await context.edit(lang('not_reply')) + return + input_chat = await context.get_input_chat() + count = 0 + scount = 0 + result = "" + if context.parameter[0] == "m": + message = await context.get_reply_message() + await single_sticker(animated, context, custom_emoji, emoji, message, pic_round, user, + package_name) + else: + async for message in context.client.iter_messages(input_chat, min_id=context.reply_to_msg_id): + count += 1 + if message and message.media: + scount += 1 + try: + await log(f"{lang('merge_processing_left')}{count}{lang('merge_processing_right')}") + await context.edit(f"{lang('merge_processing_left')}{count}{lang('merge_processing_right')}") + except: + pass + result = await single_sticker(animated, context, custom_emoji, emoji, message, pic_round, user, + package_name) + await sleep(.5) + try: + await context.edit(f"{result}\n" + f"{lang('merge_total_processed_left')}{scount}{lang('merge_total_processed_right')}", parse_mode='md') + except: + pass + await sleep(5) + try: + await context.delete() + except: + pass + else: + # 单张收集图片 + message = await context.get_reply_message() + await single_sticker(animated, context, custom_emoji, emoji, message, pic_round, user, "") + + +async def single_sticker(animated, context, custom_emoji, emoji, message, pic_round, user, package_name): try: await context.edit(lang('sticker_processing')) except: @@ -99,19 +209,38 @@ async def sticker(context): emoji = "👀" pack = 1 sticker_already = False - if len(split_strings) == 3: - pack = split_strings[2] - if split_strings[1].replace("png", "") != "": - emoji = split_strings[1].replace("png", "") - elif len(split_strings) == 2: - if split_strings[1].isnumeric(): - pack = int(split_strings[1]) - else: + if package_name: + # 批量处理贴纸无法指定emoji,只获取第几个pack + # s merge png + if len(split_strings) == 5: + pack = split_strings[4] + # s merge + elif len(split_strings) == 4: + pack = split_strings[3] + else: + if len(split_strings) == 3: + # s png + pack = split_strings[2] if split_strings[1].replace("png", "") != "": emoji = split_strings[1].replace("png", "") + elif len(split_strings) == 2: + # s + if split_strings[1].isnumeric(): + pack = int(split_strings[1]) + else: + if split_strings[1].replace("png", "") != "": + emoji = split_strings[1].replace("png", "") - pack_name = f"{user.username}_{pack}" - pack_title = f"@{user.username} {lang('sticker_pack_title')} ({pack})" + if not isinstance(pack, int): + pack = 1 + + if package_name: + # merge指定package_name + pack_name = f"{user.username}_{package_name}_{pack}" + pack_title = f"@{user.username} {lang('sticker_pack_title')} ({package_name}) ({pack})" + else: + pack_name = f"{user.username}_{pack}" + pack_title = f"@{user.username} {lang('sticker_pack_title')} ({pack})" command = '/newpack' file = BytesIO() @@ -126,7 +255,7 @@ async def sticker(context): await context.edit(lang('us_static_rounding')) except: pass - image = await rounded_image(photo) + image = await rounded_image(image) file.name = "sticker.png" image.save(file, "PNG") else: @@ -136,13 +265,15 @@ async def sticker(context): try: response = request.urlopen( - request.Request(f'http://t.me/addstickers/{pack_name}'), context=ssl.create_default_context(cafile=certifi.where())) + request.Request(f'http://t.me/addstickers/{pack_name}'), + context=ssl.create_default_context(cafile=certifi.where())) except UnicodeEncodeError: pack_name = 's' + hex(context.sender.id)[2:] if animated: pack_name = 's' + hex(context.sender.id)[2:] + '_animated' response = request.urlopen( - request.Request(f'http://t.me/addstickers/{pack_name}'), context=ssl.create_default_context(cafile=certifi.where())) + request.Request(f'http://t.me/addstickers/{pack_name}'), + context=ssl.create_default_context(cafile=certifi.where())) if not response.status == 200: try: await context.edit(lang('sticker_telegram_server_error')) @@ -153,7 +284,7 @@ async def sticker(context): if " A Telegram user has created the Sticker Set." not in \ http_response: - for _ in range(20): # 最多重试20次 + for _ in range(20): # 最多重试20次 try: async with bot.conversation('Stickers') as conversation: await conversation.send_message('/addsticker') @@ -164,17 +295,29 @@ async def sticker(context): while chat_response.text == "Whoa! That's probably enough stickers for one pack, give it a break. \ A pack can't have more than 120 stickers at the moment.": pack += 1 - pack_name = f"{user.username}_{pack}" - pack_title = f"@{user.username} {lang('sticker_pack_title')} ({pack})" + + if package_name: + # merge指定package_name + pack_name = f"{user.username}_{package_name}_{pack}" + pack_title = f"@{user.username} {lang('sticker_pack_title')} ({package_name}) ({pack})" + else: + pack_name = f"{user.username}_{pack}" + pack_title = f"@{user.username} {lang('sticker_pack_title')} ({pack})" try: - await context.edit(lang('sticker_change_pack_to') + str(pack) + lang('sticker_last_is_full')) + if package_name: + await context.edit( + lang('sticker_change_pack_to') + str(package_name) + str(pack) + lang( + 'sticker_last_is_full')) + else: + await context.edit( + lang('sticker_change_pack_to') + str(pack) + lang('sticker_last_is_full')) except: pass await conversation.send_message(pack_name) chat_response = await conversation.get_response() if chat_response.text == "Invalid pack selected.": await add_sticker(conversation, command, pack_title, pack_name, animated, message, - context, file, emoji) + context, file, emoji) try: await context.edit( f"{lang('sticker_has_been_added')} [{lang('sticker_this')}](t.me/addstickers/{pack_name}) {lang('sticker_pack')}", @@ -218,11 +361,14 @@ A pack can't have more than 120 stickers at the moment.": parse_mode='md') except: pass - await sleep(5) - try: - await context.delete() - except: - pass + if package_name: + return f"{lang('sticker_has_been_added')} [{lang('sticker_this')}](t.me/addstickers/{pack_name}) {lang('sticker_pack')}" + else: + await sleep(5) + try: + await context.delete() + except: + pass async def add_sticker(conversation, command, pack_title, pack_name, animated, message, context, file, emoji): @@ -292,8 +438,8 @@ async def resize_image(photo): return image -async def rounded_image(photo): - image = Image.open(photo) + +async def rounded_image(image): w = image.width h = image.height resize_size = 0 @@ -302,7 +448,7 @@ async def rounded_image(photo): resize_size = h else: resize_size = w - half_size = floor(resize_size/2) + half_size = floor(resize_size / 2) # 获取圆角模版,切割成4个角 tl = (0, 0, 256, 256) @@ -321,7 +467,6 @@ async def rounded_image(photo): blp = blp.resize((half_size, half_size)) brp = brp.resize((half_size, half_size)) - # 扩展四个角大小到目标图大小 # tlp = ImageOps.expand(tlp, (0, 0, w - tlp.width, h - tlp.height)) # trp = ImageOps.expand(trp, (w - trp.width, 0, 0, h - trp.height)) @@ -339,3 +484,18 @@ async def rounded_image(photo): image.putalpha(ImageOps.invert(ni)) return image + + +def isEmoji(content): + if not content: + return False + if u"\U0001F600" <= content <= u"\U0001F64F": + return True + elif u"\U0001F300" <= content <= u"\U0001F5FF": + return True + elif u"\U0001F680" <= content <= u"\U0001F6FF": + return True + elif u"\U0001F1E0" <= content <= u"\U0001F1FF": + return True + else: + return False