@@ -24,6 +24,7 @@ pub struct Chat {
2424 pub chat_type : String , // "user", "group", "channel"
2525 pub last_message : Option < String > ,
2626 pub avatar_path : Option < String > ,
27+ pub is_forum : bool ,
2728}
2829
2930#[ derive( Debug , Clone , Serialize ) ]
@@ -61,6 +62,7 @@ pub async fn get_cached_chats(
6162 chat_type : r. chat_type ,
6263 last_message : r. last_message ,
6364 avatar_path : r. avatar_path ,
65+ is_forum : r. is_forum ,
6466 } )
6567 . collect ( ) ;
6668
@@ -114,17 +116,24 @@ pub async fn start_loading_chats(
114116 while let Some ( dialog) = dialogs. next ( ) . await . map_err ( |e| format ! ( "Failed to get dialogs: {}" , e) ) ? {
115117 let peer = & dialog. peer ;
116118
117- let chat_type = match peer {
118- Peer :: User ( _) => "user" ,
119- Peer :: Group ( _) => "group" ,
120- Peer :: Channel ( _) => "channel" ,
119+ let ( chat_type, is_forum) = match peer {
120+ Peer :: User ( _) => ( "user" , false ) ,
121+ Peer :: Group ( g) => {
122+ // Megagroups (supergroups) with forum flag enabled
123+ let forum = match & g. raw {
124+ grammers_tl_types:: enums:: Chat :: Channel ( ch) => ch. forum ,
125+ _ => false ,
126+ } ;
127+ ( "group" , forum)
128+ } ,
129+ Peer :: Channel ( c) => ( "channel" , c. raw . forum ) ,
121130 } ;
122131
123132 let title = peer. name ( ) . unwrap_or ( "Unknown" ) . to_string ( ) ;
124133 let username = match peer {
125134 Peer :: User ( u) => u. username ( ) . map ( |s| s. to_string ( ) ) ,
126135 Peer :: Channel ( c) => c. username ( ) . map ( |s| s. to_string ( ) ) ,
127- _ => None ,
136+ Peer :: Group ( g ) => g . username ( ) . map ( |s| s . to_string ( ) ) ,
128137 } ;
129138
130139 let chat_id = PeerRef :: from ( peer) . id . bot_api_dialog_id ( ) ;
@@ -164,6 +173,7 @@ pub async fn start_loading_chats(
164173 chat_type : chat_type. to_string ( ) ,
165174 last_message : last_message_text. clone ( ) ,
166175 avatar_path : cached_avatar. clone ( ) ,
176+ is_forum,
167177 } ;
168178
169179 // EMIT IMMEDIATELY — no waiting for avatar download or DB save
@@ -186,6 +196,7 @@ pub async fn start_loading_chats(
186196 let last_message_text = last_message_text. clone ( ) ;
187197 let cached_avatar = cached_avatar. clone ( ) ;
188198 let semaphore = Arc :: clone ( & avatar_semaphore) ;
199+ let is_forum = is_forum;
189200
190201 tokio:: spawn ( async move {
191202 // Download avatar if not cached (rate-limited by semaphore)
@@ -213,6 +224,7 @@ pub async fn start_loading_chats(
213224 avatar_path : avatar_path. clone ( ) ,
214225 last_message : last_message_text. clone ( ) ,
215226 unread_count : 0 ,
227+ is_forum,
216228 } ;
217229 if let Err ( e) = storage. save_chat ( & record) . await {
218230 tracing:: warn!( chat_id = chat_id, error = %e, "Failed to save chat to storage" ) ;
@@ -259,17 +271,23 @@ pub async fn get_chats(
259271
260272 while let Some ( dialog) = dialogs. next ( ) . await . map_err ( |e| format ! ( "Failed to get dialogs: {}" , e) ) ? {
261273 let peer = & dialog. peer ;
262- let chat_type = match peer {
263- Peer :: User ( _) => "user" ,
264- Peer :: Group ( _) => "group" ,
265- Peer :: Channel ( _) => "channel" ,
274+ let ( chat_type, is_forum) = match peer {
275+ Peer :: User ( _) => ( "user" , false ) ,
276+ Peer :: Group ( g) => {
277+ let forum = match & g. raw {
278+ grammers_tl_types:: enums:: Chat :: Channel ( ch) => ch. forum ,
279+ _ => false ,
280+ } ;
281+ ( "group" , forum)
282+ } ,
283+ Peer :: Channel ( c) => ( "channel" , c. raw . forum ) ,
266284 } ;
267285
268286 let title = peer. name ( ) . unwrap_or ( "Unknown" ) . to_string ( ) ;
269287 let username = match peer {
270288 Peer :: User ( u) => u. username ( ) . map ( |s| s. to_string ( ) ) ,
271289 Peer :: Channel ( c) => c. username ( ) . map ( |s| s. to_string ( ) ) ,
272- _ => None ,
290+ Peer :: Group ( g ) => g . username ( ) . map ( |s| s . to_string ( ) ) ,
273291 } ;
274292
275293 let chat_id = PeerRef :: from ( peer) . id . bot_api_dialog_id ( ) ;
@@ -283,6 +301,7 @@ pub async fn get_chats(
283301 chat_type : chat_type. to_string ( ) ,
284302 last_message : None ,
285303 avatar_path,
304+ is_forum,
286305 } ) ;
287306 }
288307
0 commit comments