from json import load from mipac import Note from mipac.models.lite.user import LiteUser from mipac.models.notification import ( NotificationFollow, NotificationFollowRequest, NotificationAchievement, NotificationNote, ) from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton from init import bot user_followed_template = """有人关注了你! {0}""" follow_request_template = """有人申请关注你! {0}""" follow_request_accept_template = """有人同意了你的关注申请! {0}""" achievement_template = """你获得了新成就! {0}:{1} {2}""" mention_template = """有人在帖子中提到了你! {0} {1}""" with open("gen/achievement.json", "r", encoding="utf-8") as f: achievement_map = load(f) def get_user_link(host: str, user: LiteUser) -> str: if user.host: return f"https://{host}/@{user.username}@{user.host}" return f"https://{host}/@{user.username}" def get_user_alink(host: str, user: LiteUser) -> str: return '{}'.format( get_user_link(host, user), user.nickname or f"@{user.username}" ) def get_note_link(host: str, note: Note) -> str: return f"https://{host}/notes/{note.id}" def gen_link_button(host: str, user: LiteUser = None, note: Note = None): return [ InlineKeyboardButton( text="Link", url=get_user_link(host, user) if user else get_note_link(host, note), ), ] async def send_user_followed( host: str, chat_id: int, notice: NotificationFollow, topic_id: int ): await bot.send_message( chat_id, user_followed_template.format( get_user_alink(host, notice.user), ), reply_to_message_id=topic_id, reply_markup=InlineKeyboardMarkup([gen_link_button(host, notice.user)]), ) async def send_follow_request( host: str, chat_id: int, notice: NotificationFollowRequest, topic_id: int ): await bot.send_message( chat_id, follow_request_template.format( get_user_alink(host, notice.user), ), reply_to_message_id=topic_id, reply_markup=InlineKeyboardMarkup( [ gen_link_button(host, notice.user), [ InlineKeyboardButton( text="Accept", callback_data=f"request_accept:{notice.user.id}", ), InlineKeyboardButton( text="Reject", callback_data=f"request_reject:{notice.user.id}", ), ], ], ), ) async def send_follow_request_accept( host: str, chat_id: int, notice: NotificationFollowRequest, topic_id: int ): await bot.send_message( chat_id, follow_request_accept_template.format( get_user_alink(host, notice.user), ), reply_to_message_id=topic_id, reply_markup=InlineKeyboardMarkup([gen_link_button(host, notice.user)]), ) async def send_achievement_earned( _: str, chat_id: int, notice: NotificationAchievement, topic_id: int ): name, desc, note = achievement_map.get(notice.achievement, ("", "", "")) await bot.send_message( chat_id, achievement_template.format( name, desc, f"- {note}" if note else "", ), reply_to_message_id=topic_id, ) async def send_note_mention( host: str, chat_id: int, notice: NotificationNote, topic_id: int, ): await bot.send_message( chat_id, mention_template.format( get_note_link(host, notice.note), get_user_alink(host, notice.user), ), reply_to_message_id=topic_id, reply_markup=InlineKeyboardMarkup([gen_link_button(host, note=notice.note)]), )