Skip to content

Commit 2fde9ef

Browse files
committed
fix !blist :(
1 parent 332ce39 commit 2fde9ef

2 files changed

Lines changed: 48 additions & 41 deletions

File tree

MedalBOT/BotContext.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ public class BotContext
6161
public Dictionary<string, System.Collections.Generic.List<string>> ServiceResponseBuffer { get; set; }
6262
= new();
6363

64+
// Track timeout for each pending request (requestId → lastReceivedTime)
65+
public Dictionary<string, DateTime> ServiceResponseTimeouts { get; set; }
66+
= new();
67+
6468
private readonly object _voicedLock = new();
6569
private readonly object _muteLock = new();
6670
private const string MutedIdsFile = "muted_ids.txt";

MedalBOT/Program.cs

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)