@@ -12,6 +12,7 @@ final class ChatMessage with ChatMessageMappable {
1212 /// Constructor.
1313 const ChatMessage ({
1414 required this .author,
15+ required this .authorUid,
1516 required this .authorAvatarUrl,
1617 required this .message,
1718 required this .dateTime,
@@ -22,6 +23,11 @@ final class ChatMessage with ChatMessageMappable {
2223 /// Optional because it's null when current sent the message.
2324 final String ? author;
2425
26+ /// Uid of message author.
27+ ///
28+ /// Required as it is used to visit user space page.
29+ final String ? authorUid;
30+
2531 /// Avatar url of author.
2632 final String ? authorAvatarUrl;
2733
@@ -38,15 +44,16 @@ final class ChatMessage with ChatMessageMappable {
3844 /// Build from node `<dl>` with id starts with "pmlist_".
3945 static ChatMessage ? fromDl (uh.Element element) {
4046 // Not null when another user sent the message.
41- final username =
42- element.querySelector ('dd.ptm > a' )? .innerText ?? element.querySelector ('dd.ptm > span.xi2' )? .innerText;
47+ final username = element.querySelector ('dd.ptm > a' )? .innerText.trim ();
4348 // Not null when current logged user sent the message.
44- final currentUserNode = element.querySelector ('dd.ptm > span.xi2' );
45- if (username == null && currentUserNode == null ) {
49+ final currentUsername = element.querySelector ('dd.ptm > span.xi2' ) ? .innerText. trim ( );
50+ if (username == null && currentUsername == null ) {
4651 talker.error ('failed to build chat message: author not found' );
4752 return null ;
4853 }
4954
55+ final uid = element.querySelector ('dd.m.avt > a' )? .attributes['href' ]? .tryParseAsUri ()? .queryParameters['uid' ];
56+
5057 final message = element.querySelector ('dd:nth-child(4)' )? .innerHtml;
5158 if (message == null ) {
5259 talker.error ('failed to build chat message: message not found' );
@@ -57,10 +64,20 @@ final class ChatMessage with ChatMessageMappable {
5764
5865 final authorAvatarUrl = element.querySelector ('dd.m.avt > a > img' )? .imageUrl ();
5966
60- return ChatMessage (author: username, authorAvatarUrl: authorAvatarUrl, message: message, dateTime: dateTime);
67+ return ChatMessage (
68+ author: username ?? currentUsername,
69+ authorUid: uid,
70+ authorAvatarUrl: authorAvatarUrl,
71+ message: message,
72+ dateTime: dateTime,
73+ );
6174 }
6275
6376 /// Build from node `<li class="cl pmm">` .
77+ ///
78+ /// Chat page, not chat history page.
79+ ///
80+ /// With username, without avatar and uid.
6481 static ChatMessage ? fromLi (uh.Element element) {
6582 final username = element.querySelector ('div.pmt' )? .innerText.split (':' ).first;
6683 final message = element.querySelector ('div.pmd' )? .innerHtml;
@@ -72,6 +89,6 @@ final class ChatMessage with ChatMessageMappable {
7289 return null ;
7390 }
7491
75- return ChatMessage (author: username, authorAvatarUrl: null , message: message, dateTime: null );
92+ return ChatMessage (author: username, authorUid : null , authorAvatarUrl: null , message: message, dateTime: null );
7693 }
7794}
0 commit comments