slowly making more reliable, using the log functionality too

This commit is contained in:
Adam D. Ruppe 2025-05-20 09:59:07 -04:00
parent 6234e64d7f
commit f907585145
1 changed files with 33 additions and 26 deletions

View File

@ -156,7 +156,7 @@ class DiscordUser : DiscordMentionable {
// PUT /guilds/{guild.id}/members/{user.id}/roles/{role.id} // PUT /guilds/{guild.id}/members/{user.id}/roles/{role.id}
auto thing = api.rest.guilds[role.guild.id].members[this.id].roles[role.id]; auto thing = api.rest.guilds[role.guild.id].members[this.id].roles[role.id];
writeln(thing.toUri); //writeln(thing.toUri);
auto result = api.rest.guilds[role.guild.id].members[this.id].roles[role.id].PUT().result; auto result = api.rest.guilds[role.guild.id].members[this.id].roles[role.id].PUT().result;
} }
@ -165,7 +165,7 @@ class DiscordUser : DiscordMentionable {
// DELETE /guilds/{guild.id}/members/{user.id}/roles/{role.id} // DELETE /guilds/{guild.id}/members/{user.id}/roles/{role.id}
auto thing = api.rest.guilds[role.guild.id].members[this.id].roles[role.id]; auto thing = api.rest.guilds[role.guild.id].members[this.id].roles[role.id];
writeln(thing.toUri); //writeln(thing.toUri);
auto result = api.rest.guilds[role.guild.id].members[this.id].roles[role.id].DELETE().result; auto result = api.rest.guilds[role.guild.id].members[this.id].roles[role.id].DELETE().result;
} }
@ -296,10 +296,10 @@ class SlashCommandHandler {
var result = api.rest. var result = api.rest.
interactions[commandArgs.interactionId][commandArgs.interactionToken].callback interactions[commandArgs.interactionId][commandArgs.interactionToken].callback
.POST(reply).result; .POST(reply).result;
writeln(result.toString); // writeln(result.toString);
} catch(Exception e) { } catch(Exception e) {
import std.stdio; writeln(commandArgs); // import std.stdio; writeln(commandArgs);
writeln(e.toString()); logSwallowedException(e);
} }
} }
} }
@ -497,8 +497,7 @@ ync def something(interaction:discord.Interaction):
} }
static void sendHandlerReply(T)(T ret, scope InteractionReplyHelper replyHelper, bool ephemeral) { static void sendHandlerReply(T)(T ret, scope InteractionReplyHelper replyHelper, bool ephemeral) {
import std.conv; // FIXME replyHelper.reply(toStringInternal(ret), ephemeral);
replyHelper.reply(to!string(ret), ephemeral);
} }
void registerAll(T)(T t) { void registerAll(T)(T t) {
@ -665,7 +664,8 @@ class DiscordGatewayConnection {
+/ +/
protected void handleWebsocketClose(WebSocket.CloseEvent closeEvent) { protected void handleWebsocketClose(WebSocket.CloseEvent closeEvent) {
import std.stdio; writeln(closeEvent); logger.info(i"$(closeEvent.toString())");
if(heartbeatTimer) if(heartbeatTimer)
heartbeatTimer.cancel(); heartbeatTimer.cancel();
@ -730,12 +730,13 @@ class DiscordGatewayConnection {
mostRecentHeartbeatAckRecivedAt = MonoTime.currTime; mostRecentHeartbeatAckRecivedAt = MonoTime.currTime;
break; break;
case OpCode.Reconnect: case OpCode.Reconnect:
writeln("reconnecting"); logger.info(i"Reconnecting discord websocket");
this.close(4999, "Reconnect requested"); this.close(4999, "Reconnect requested");
reconnectAndResume(); reconnectAndResume();
break; break;
case OpCode.InvalidSession: case OpCode.InvalidSession:
writeln("starting new session"); logger.info(i"Starting new discord session");
close(); close();
connect(); // try starting a brand new session connect(); // try starting a brand new session
@ -746,12 +747,7 @@ class DiscordGatewayConnection {
} }
protected void reconnectAndResume() { protected void reconnectAndResume() {
this.websocket_ = new WebSocket(Uri(this.resume_gateway_url)); websocketConnectInLoop(Uri(this.resume_gateway_url));
websocket.onmessage = &handleWebsocketMessage;
websocket.onclose = &handleWebsocketClose;
websocketConnectInLoop();
var resumeData = var.emptyObject; var resumeData = var.emptyObject;
resumeData.token = this.token; resumeData.token = this.token;
@ -861,7 +857,7 @@ class DiscordGatewayConnection {
private MonoTime mostRecentHeartbeatAckRecivedAt; private MonoTime mostRecentHeartbeatAckRecivedAt;
protected void sendHeartbeat() { protected void sendHeartbeat() {
arsd.core.writeln("sendHeartbeat"); logger.info(i"heartbeat");
sendWebsocketCommand(OpCode.Heartbeat, var(lastSequenceNumberReceived)); sendWebsocketCommand(OpCode.Heartbeat, var(lastSequenceNumberReceived));
} }
@ -894,8 +890,8 @@ class DiscordGatewayConnection {
// so we'll do that one-off (but with a non-zero time // so we'll do that one-off (but with a non-zero time
// since my timers don't like being run twice in one loop // since my timers don't like being run twice in one loop
// iteration) then that first one will set the repeating time // iteration) then that first one will set the repeating time
import std.random; import arsd.random;
auto firstBeat = std.random.uniform(10, msecs); auto firstBeat = arsd.random.uniform(10, msecs);
heartbeatTimer.changeTime(firstBeat, false); heartbeatTimer.changeTime(firstBeat, false);
} }
@ -922,12 +918,7 @@ class DiscordGatewayConnection {
cachedGatewayUrl = obj.url.get!string; cachedGatewayUrl = obj.url.get!string;
} }
this.websocket_ = new WebSocket(Uri(cachedGatewayUrl)); websocketConnectInLoop(Uri(cachedGatewayUrl));
websocket.onmessage = &handleWebsocketMessage;
websocket.onclose = &handleWebsocketClose;
websocketConnectInLoop();
var d = var.emptyObject; var d = var.emptyObject;
d.token = token; d.token = token;
@ -941,7 +932,11 @@ class DiscordGatewayConnection {
sendWebsocketCommand(OpCode.Identify, d); sendWebsocketCommand(OpCode.Identify, d);
} }
void websocketConnectInLoop() { /+
SocketOSException needs full reconnect
+/
void websocketConnectInLoop(Uri uri) {
// FIXME: if the connect fails we should set a timer and try // FIXME: if the connect fails we should set a timer and try
// again, but if it fails then, quit. at least if it is not a websocket reply // again, but if it fails then, quit. at least if it is not a websocket reply
// cuz it could be discord went down or something. // cuz it could be discord went down or something.
@ -952,9 +947,21 @@ class DiscordGatewayConnection {
try_again: try_again:
this.websocket_ = new WebSocket(uri);
websocket.onmessage = &handleWebsocketMessage;
websocket.onclose = &handleWebsocketClose;
try { try {
this.websocket_.connect(); this.websocket_.connect();
} catch(Exception e) { } catch(Exception e) {
// it disconnects after 30 days rn w/
// std.socket.SocketOSException@std/socket.d(2897): Unable to connect socket: Transport endpoint is already connected
// and idk the root cause, it has invalid session at first
.destroy(this.websocket_);
logSwallowedException(e);
import core.thread; import core.thread;
Thread.sleep(d); Thread.sleep(d);
d *= 2; d *= 2;