PagerMaid-Modify/pagermaid/modules/account.py
2020-05-04 17:00:39 +08:00

256 lines
10 KiB
Python

""" This module contains utils to configure your account. """
from os import remove
from telethon.errors import ImageProcessFailedError, PhotoCropSizeSmallError
from telethon.errors.rpcerrorlist import PhotoExtInvalidError, UsernameOccupiedError, AboutTooLongError, \
FirstNameInvalidError, UsernameInvalidError
from telethon.tl.functions.account import UpdateProfileRequest, UpdateUsernameRequest
from telethon.tl.functions.photos import DeletePhotosRequest, GetUserPhotosRequest, UploadProfilePhotoRequest
from telethon.tl.functions.users import GetFullUserRequest
from telethon.tl.types import InputPhoto, MessageMediaPhoto, MessageEntityMentionName
from struct import error as StructError
from pagermaid import bot, log
from pagermaid.listener import listener
@listener(outgoing=True, command="username",
description="通过命令快捷设置道纹(不支持回复)",
parameters="<username>")
async def username(context):
""" 重新配置您的用户名。 """
if len(context.parameter) > 1:
await context.edit("出错了呜呜呜 ~ 您好像输入了一个无效的参数。")
if len(context.parameter) == 1:
result = context.parameter[0]
else:
result = ""
try:
await bot(UpdateUsernameRequest(result))
except UsernameOccupiedError:
await context.edit("出错了呜呜呜 ~ 道纹已存在。")
return
except UsernameInvalidError:
await context.edit("出错了呜呜呜 ~ 您好像输入了一个无效的道纹。")
return
await context.edit("道纹设置完毕。")
if result == "":
await log("道纹已被取消。")
return
await log(f"道纹已被设置为 `{result}`.")
@listener(outgoing=True, command="name",
description="换个名称。(不支持回复)",
parameters="<first name> <last name>")
async def name(context):
""" Updates your display name. """
if len(context.parameter) == 2:
first_name = context.parameter[0]
last_name = context.parameter[1]
elif len(context.parameter) == 1:
first_name = context.parameter[0]
last_name = " "
else:
await context.edit("出错了呜呜呜 ~ 您好像输入了一个无效的参数。")
return
try:
await bot(UpdateProfileRequest(
first_name=first_name,
last_name=last_name))
except FirstNameInvalidError:
await context.edit("出错了呜呜呜 ~ 您好像输入了一个无效的 first name.")
return
await context.edit("显示名称已成功更改。")
if last_name != " ":
await log(f"显示名称已被更改为 `{first_name} {last_name}`.")
else:
await log(f"显示名称已被更改为 `{first_name}`.")
@listener(outgoing=True, command="pfp",
description="回复某条带附件的消息然后把它变成咱的头像")
async def pfp(context):
""" Sets your profile picture. """
reply = await context.get_reply_message()
photo = None
await context.edit("设置头像中 . . .")
if reply.media:
if isinstance(reply.media, MessageMediaPhoto):
photo = await bot.download_media(message=reply.photo)
elif "image" in reply.media.document.mime_type.split('/'):
photo = await bot.download_file(reply.media.document)
else:
await context.edit("出错了呜呜呜 ~ 无法将此附件解析为图片。")
if photo:
try:
await bot(UploadProfilePhotoRequest(
await bot.upload_file(photo)
))
remove(photo)
await context.edit("头像修改成功啦 ~")
except PhotoCropSizeSmallError:
await context.edit("出错了呜呜呜 ~ 此图像尺寸小于最小要求。")
except ImageProcessFailedError:
await context.edit("出错了呜呜呜 ~ 服务器解释命令时发生错误。")
except PhotoExtInvalidError:
await context.edit("出错了呜呜呜 ~ 无法将此附件解析为图片。")
@listener(outgoing=True, command="bio",
description="设置咱的公开情报",
parameters="<string>")
async def bio(context):
""" Sets your bio. """
try:
await bot(UpdateProfileRequest(about=context.arguments))
except AboutTooLongError:
await context.edit("出错了呜呜呜 ~ 情报太长啦")
return
await context.edit("此公开情报设置成功啦 ~")
if context.arguments == "":
await log("公开的情报成功关闭啦")
return
await log(f"公开的情报已被设置为 `{context.arguments}`.")
@listener(outgoing=True, command="rmpfp",
description="删除指定数量的咱的头像",
parameters="<整数>")
async def rmpfp(context):
""" Removes your profile picture. """
group = context.text[8:]
if group == 'all':
limit = 0
elif group.isdigit():
limit = int(group)
else:
limit = 1
pfp_list = await bot(GetUserPhotosRequest(
user_id=context.from_id,
offset=0,
max_id=0,
limit=limit))
input_photos = []
for sep in pfp_list.photos:
input_photos.append(
InputPhoto(
id=sep.id,
access_hash=sep.access_hash,
file_reference=sep.file_reference
)
)
await bot(DeletePhotosRequest(id=input_photos))
await context.edit(f"`删除了 {len(input_photos)} 张头像。`")
@listener(outgoing=True, command="profile",
description="生成一位用户简介 ~ 消息有点长",
parameters="<username>")
async def profile(context):
""" Queries profile of a user. """
if len(context.parameter) > 1:
await context.edit("出错了呜呜呜 ~ 无效的参数。")
return
await context.edit("正在生成用户简介摘要中 . . .")
if context.reply_to_msg_id:
reply_message = await context.get_reply_message()
user_id = reply_message.from_id
target_user = await context.client(GetFullUserRequest(user_id))
else:
if len(context.parameter) == 1:
user = context.parameter[0]
if user.isnumeric():
user = int(user)
else:
user_object = await context.client.get_me()
user = user_object.id
if context.message.entities is not None:
if isinstance(context.message.entities[0], MessageEntityMentionName):
return await context.client(GetFullUserRequest(context.message.entities[0].user_id))
try:
user_object = await context.client.get_entity(user)
target_user = await context.client(GetFullUserRequest(user_object.id))
except (TypeError, ValueError, OverflowError, StructError) as exception:
if str(exception).startswith("出错了呜呜呜 ~ 找不到与之对应的任何内容"):
await context.edit("出错了呜呜呜 ~ 指定的用户不存在。")
return
if str(exception).startswith("出错了呜呜呜 ~ 没有用户"):
await context.edit("出错了呜呜呜 ~ 指定的道纹不存在。")
return
if str(exception).startswith("出错了呜呜呜 ~ 您确定输入了东西?") or isinstance(exception, StructError):
await context.edit("出错了呜呜呜 ~ 找不到对应的 UserID 。")
return
if isinstance(exception, OverflowError):
await context.edit("出错了呜呜呜 ~ 指定的 UserID 已超出长度限制,您确定输对了?")
return
raise exception
user_type = "Bot" if target_user.user.bot else "用户"
username_system = f"@{target_user.user.username}" if target_user.user.username is not None else (
"喵喵喵 ~ 好像没有设置")
first_name = target_user.user.first_name.replace("\u2060", "")
last_name = target_user.user.last_name.replace("\u2060", "") if target_user.user.last_name is not None else (
"喵喵喵 ~ 好像没有设置"
)
biography = target_user.about if target_user.about is not None else "没有公开的情报"
verified = "" if target_user.user.verified else ""
restricted = "" if target_user.user.restricted else ""
caption = f"**用户简介:** \n" \
f"道纹: {username_system} \n" \
f"ID: {target_user.user.id} \n" \
f"名字: {first_name} \n" \
f"姓氏: {last_name} \n" \
f"目前已知的情报: {biography} \n" \
f"共同裙: {target_user.common_chats_count} \n" \
f"官方认证: {verified} \n" \
f"受限制: {restricted} \n" \
f"类型: {user_type} \n" \
f"[{first_name}](tg://user?id={target_user.user.id})"
photo = await context.client.download_profile_photo(
target_user.user.id,
"./" + str(target_user.user.id) + ".jpg",
download_big=True
)
try:
reply_to = context.message.reply_to_msg_id
try:
await context.client.send_file(
context.chat_id,
photo,
caption=caption,
link_preview=False,
force_document=False,
reply_to=reply_to
)
if not photo.startswith("http"):
remove(photo)
await context.delete()
try:
remove(photo)
except:
pass
return
except TypeError:
await context.edit(caption)
except:
try:
await context.client.send_file(
context.chat_id,
photo,
caption=caption,
link_preview=False,
force_document=False
)
if not photo.startswith("http"):
remove(photo)
await context.delete()
try:
remove(photo)
except:
pass
return
except TypeError:
await context.edit(caption)