@@ -149,56 +149,59 @@ static async Task Main()
149149 var lastRequest = ctx . PendingServiceRequests . LastOrDefault ( ) ;
150150 if ( lastRequest . Key != null )
151151 {
152- // Accumulate responses in buffer
152+ // Initialize buffer if needed
153153 if ( ! ctx . ServiceResponseBuffer . ContainsKey ( lastRequest . Key ) )
154154 ctx . ServiceResponseBuffer [ lastRequest . Key ] = new System . Collections . Generic . List < string > ( ) ;
155155
156+ // Add to buffer
156157 ctx . ServiceResponseBuffer [ lastRequest . Key ] . Add ( noticeContent ) ;
157- ctx . Logger ? . Log ( $ "[CHANSERV] Buffering response: { noticeContent } ") ;
158+ ctx . Logger ? . Log ( $ "[CHANSERV] Buffering response ( { ctx . ServiceResponseBuffer [ lastRequest . Key ] . Count } lines) : { noticeContent } ") ;
158159
159- // Check for end markers: "None" or "Found X matches."
160- bool isEndMarker = noticeContent . Equals ( "None" , StringComparison . OrdinalIgnoreCase ) ||
161- noticeContent . StartsWith ( "Found " , StringComparison . OrdinalIgnoreCase ) ;
162-
163- if ( isEndMarker )
160+ // Reset timeout - update last received time
161+ ctx . ServiceResponseTimeouts [ lastRequest . Key ] = DateTime . UtcNow ;
162+ }
163+ }
164+ continue ;
165+ }
166+
167+ // Check for timed-out ChanServ responses (2 second timeout)
168+ const int timeoutMs = 2000 ;
169+ var expiredRequests = ctx . ServiceResponseTimeouts
170+ . Where ( kvp => ( DateTime . UtcNow - kvp . Value ) . TotalMilliseconds > timeoutMs )
171+ . Select ( kvp => kvp . Key )
172+ . ToList ( ) ;
173+
174+ foreach ( var requestId in expiredRequests )
175+ {
176+ if ( ctx . PendingServiceRequests . TryGetValue ( requestId , out var requestInfo ) &&
177+ ctx . ServiceResponseBuffer . TryGetValue ( requestId , out var responses ) &&
178+ responses . Count > 0 )
179+ {
180+ string requesterNick = requestInfo . RequesterNick ;
181+ bool isDiscord = requestInfo . IsDiscord ;
182+
183+ ctx . Logger ? . Log ( $ "[CHANSERV TIMEOUT] Response complete: { responses . Count } lines for { requesterNick } ") ;
184+
185+ string fullResponse = string . Join ( "\n " , responses ) ;
186+
187+ if ( isDiscord )
188+ {
189+ ctx . Logger ? . Log ( $ "[CHANSERV RELAY] Sending to Discord...") ;
190+ await ctx . Discord ? . SendMessage ( $ "**{ requesterNick } ** banlist:\n ```\n { fullResponse } \n ```") ;
191+ }
192+ else
193+ {
194+ foreach ( var resp in responses )
164195 {
165- // End of ChanServ response - send accumulated responses
166- var responses = ctx . ServiceResponseBuffer [ lastRequest . Key ] ;
167- ctx . Logger ? . Log ( $ "[CHANSERV] End marker detected. Got { responses . Count } buffered responses") ;
168-
169- if ( responses . Count > 0 )
170- {
171- // Get request info BEFORE removing from pending
172- var requestInfo = ctx . PendingServiceRequests [ lastRequest . Key ] ;
173- string requesterNick = requestInfo . RequesterNick ;
174- bool isDiscord = requestInfo . IsDiscord ;
175-
176- // Remove from pending
177- ctx . PendingServiceRequests . Remove ( lastRequest . Key ) ;
178-
179- string fullResponse = string . Join ( "\n " , responses ) ;
180- ctx . Logger ? . Log ( $ "[CHANSERV RELAY] Sending { responses . Count } lines to { ( isDiscord ? "Discord" : "IRC" ) } for { requesterNick } ") ;
181-
182- if ( isDiscord )
183- {
184- ctx . Logger ? . Log ( $ "[CHANSERV RELAY] Attempting to send Discord message...") ;
185- await ctx . Discord ? . SendMessage ( $ "**{ requesterNick } ** banlist:\n ```\n { fullResponse } \n ```") ;
186- ctx . Logger ? . Log ( $ "[CHANSERV RELAY] Discord message sent!") ;
187- }
188- else
189- {
190- foreach ( var resp in responses )
191- {
192- writer . WriteLine ( $ "PRIVMSG { ctx . Channel } :{ resp } ") ;
193- }
194- }
195-
196- ctx . ServiceResponseBuffer . Remove ( lastRequest . Key ) ;
197- }
196+ writer . WriteLine ( $ "PRIVMSG { ctx . Channel } :{ resp } ") ;
198197 }
199198 }
199+
200+ // Clean up
201+ ctx . PendingServiceRequests . Remove ( requestId ) ;
202+ ctx . ServiceResponseBuffer . Remove ( requestId ) ;
203+ ctx . ServiceResponseTimeouts . Remove ( requestId ) ;
200204 }
201- continue ;
202205 }
203206
204207 if ( line . Contains ( " QUIT " ) )
0 commit comments