44
55import telegramify_markdown
66from pydantic import BaseModel , ConfigDict , Field
7- from telegram import Update , User
7+ from telegram import Bot , Update , User
88from telegram .ext import Application , CommandHandler , ContextTypes , MessageHandler , filters
99
1010from framework .im .adapter import EditStateAdapter , IMAdapter , UserProfileAdapter
11- from framework .im .message import ImageMessage , IMMessage , TextMessage , VoiceMessage
11+ from framework .im .message import ImageMessage , IMMessage , MentionElement , TextMessage , VoiceMessage
1212from framework .im .profile import Gender , UserProfile
1313from framework .im .sender import ChatSender , ChatType
1414from framework .logger import get_logger
@@ -46,17 +46,17 @@ class TelegramAdapter(IMAdapter, UserProfileAdapter, EditStateAdapter):
4646 def __init__ (self , config : TelegramConfig ):
4747 self .config = config
4848 self .application = Application .builder ().token (config .token ).build ()
49-
49+ self . bot = Bot ( token = config . token )
5050 # 注册命令处理器和消息处理器
51- self .application .add_handler (CommandHandler ("start" , self .start ))
51+ self .application .add_handler (CommandHandler ("start" , self .command_start ))
5252 self .application .add_handler (
5353 MessageHandler (
5454 filters .TEXT | filters .VOICE | filters .PHOTO , self .handle_message
5555 )
5656 )
5757 self .logger = get_logger ("Telegram-Adapter" )
5858
59- async def start (self , update : Update , context : ContextTypes .DEFAULT_TYPE ):
59+ async def command_start (self , update : Update , context : ContextTypes .DEFAULT_TYPE ):
6060 """处理 /start 命令"""
6161 await update .message .reply_text ("Welcome! I am ready to receive your messages." )
6262
@@ -94,11 +94,41 @@ def convert_to_message(self, raw_message: Update) -> IMMessage:
9494
9595 message_elements = []
9696 raw_message_dict = raw_message .message .to_dict ()
97-
9897 # 处理文本消息
9998 if raw_message .message .text :
100- text_element = TextMessage (text = raw_message .message .text )
101- message_elements .append (text_element )
99+ text = raw_message .message .text
100+ offset = 0
101+ for entity in raw_message .message .entities or []:
102+ if entity .type in ("mention" , "text_mention" ):
103+ # Extract mention text
104+ mention_text = text [entity .offset :entity .offset + entity .length ]
105+
106+ # Add preceding text as TextMessage
107+ if entity .offset > offset :
108+ message_elements .append (TextMessage (text = text [offset :entity .offset ]))
109+
110+ # Create ChatSender for MentionElement
111+ if entity .type == "text_mention" and entity .user :
112+ if entity .user .id == self .me .id :
113+ mention_element = MentionElement (target = ChatSender .get_bot_sender ())
114+ else :
115+ mention_element = MentionElement (target = ChatSender .from_c2c_chat (user_id = entity .user .id , display_name = mention_text ))
116+ elif entity .type == "mention" :
117+ # 这里需要从 adapter 实例中获取 bot 的 username
118+ if mention_text == f'@{ self .me .username } ' :
119+ mention_element = MentionElement (target = ChatSender .get_bot_sender ())
120+ else :
121+ mention_element = MentionElement (target = ChatSender .from_c2c_chat (user_id = f'unknown_id:{ mention_text } ' , display_name = mention_text ))
122+ else :
123+ # Fallback in case of unknown entity type
124+ mention_element = TextMessage (text = mention_text ) # Or handle as needed
125+ message_elements .append (mention_element )
126+
127+ offset = entity .offset + entity .length
128+
129+ # Add remaining text as TextMessage
130+ if offset < len (text ):
131+ message_elements .append (TextMessage (text = text [offset :]))
102132
103133 # 处理语音消息
104134 if raw_message .message .voice :
@@ -115,13 +145,14 @@ def convert_to_message(self, raw_message: Update) -> IMMessage:
115145 photo_url = photo_file .file_path
116146 photo_element = ImageMessage (url = photo_url )
117147 message_elements .append (photo_element )
118-
148+
119149 # 创建 Message 对象
120150 message = IMMessage (
121151 sender = sender ,
122152 message_elements = message_elements ,
123153 raw_message = raw_message_dict ,
124154 )
155+ print (message )
125156 return message
126157
127158 async def send_message (self , message : IMMessage , recipient : ChatSender ):
@@ -171,6 +202,7 @@ async def start(self):
171202 """启动 Bot"""
172203 await self .application .initialize ()
173204 await self .application .start ()
205+ self .me = await self .bot .get_me ()
174206 await self .application .updater .start_polling (drop_pending_updates = True )
175207
176208 async def stop (self ):
0 commit comments