summaryrefslogtreecommitdiff
path: root/src/Bot.zig
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-07-26 12:20:41 +0300
committerGravatar Uko Kokņevičs2024-07-26 12:20:41 +0300
commitd703c899a79e790a8760140ad315093ad29efff4 (patch)
tree94d8eaf2967544f9c5daaaf3d169ba31fb1234c3 /src/Bot.zig
parentbugfix: Animation.thumbnail isn't an array (diff)
downloadukkobot-d703c899a79e790a8760140ad315093ad29efff4.tar.gz
ukkobot-d703c899a79e790a8760140ad315093ad29efff4.tar.xz
ukkobot-d703c899a79e790a8760140ad315093ad29efff4.zip
Respect request to wait on submitting requests
Diffstat (limited to 'src/Bot.zig')
-rw-r--r--src/Bot.zig89
1 files changed, 53 insertions, 36 deletions
diff --git a/src/Bot.zig b/src/Bot.zig
index d40a4a0..45717e1 100644
--- a/src/Bot.zig
+++ b/src/Bot.zig
@@ -116,47 +116,64 @@ fn call(
116 uri: Uri, 116 uri: Uri,
117 data: ?[]const u8, 117 data: ?[]const u8,
118) !Parsed(T) { 118) !Parsed(T) {
119 var request = try self.http_client.open(method, uri, .{ 119 while (true) {
120 .server_header_buffer = &self.server_header_buffer, 120 var request = try self.http_client.open(method, uri, .{
121 }); 121 .server_header_buffer = &self.server_header_buffer,
122 defer request.deinit(); 122 });
123 123 defer request.deinit();
124 if (data) |s| { 124
125 request.headers.content_type = .{ .override = "application/json" }; 125 if (data) |s| {
126 request.transfer_encoding = .{ .content_length = s.len }; 126 request.headers.content_type = .{ .override = "application/json" };
127 } 127 request.transfer_encoding = .{ .content_length = s.len };
128 try request.send(); 128 }
129 129 try request.send();
130 if (data) |s| {
131 try request.writeAll(s);
132 }
133 try request.finish();
134 130
135 try request.wait(); 131 if (data) |s| {
132 try request.writeAll(s);
133 }
134 try request.finish();
135
136 try request.wait();
137
138 var reader = std.json.reader(self.allocator, request.reader());
139 defer reader.deinit();
140
141 const result = try std.json.parseFromTokenSource(
142 Wrapper(T),
143 self.allocator,
144 &reader,
145 .{
146 .ignore_unknown_fields = true,
147 .allocate = .alloc_always,
148 },
149 );
150 errdefer result.deinit();
151
152 if (result.value.parameters) |params| {
153 if (params.retry_after) |sleeptime| {
154 std.log.info("Should sleep for {} seconds", .{sleeptime});
155
156 var res = @mulWithOverflow(sleeptime, std.time.ns_per_s);
157 if (res[1] != 0) {
158 res[0] = std.math.maxInt(u64);
159 }
136 160
137 var reader = std.json.reader(self.allocator, request.reader()); 161 std.log.info("Will try to sleep for {} seconds", .{res[0] / std.time.ns_per_s});
138 defer reader.deinit(); 162 std.time.sleep(res[0]);
163 continue;
164 }
165 }
139 166
140 const result = try std.json.parseFromTokenSource( 167 if (!result.value.ok or result.value.result == null) {
141 Wrapper(T), 168 std.log.err("Request failed: {any}", .{result.value});
142 self.allocator, 169 return error.RequestFailed;
143 &reader, 170 }
144 .{
145 .ignore_unknown_fields = true,
146 .allocate = .alloc_always,
147 },
148 );
149 errdefer result.deinit();
150 171
151 if (!result.value.ok or result.value.result == null) { 172 return .{
152 std.log.err("Request failed: {any}", .{result.value}); 173 .arena = result.arena,
153 return error.RequestFailed; 174 .value = result.value.result.?,
175 };
154 } 176 }
155
156 return .{
157 .arena = result.arena,
158 .value = result.value.result.?,
159 };
160} 177}
161 178
162inline fn isNull(value: anytype) bool { 179inline fn isNull(value: anytype) bool {