From 31944901d91e6734b9c214b64f43784e2e844874 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Wed, 6 Nov 2024 13:25:33 +0000 Subject: [PATCH] fixes --- .gitignore | 1 + README.md | 4 ++-- build.zig | 2 ++ src/parser.zig | 35 ++++++++++++++++++++++------------- src/shard.zig | 26 +++++++++++++++----------- 5 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index c067f5c..995438e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ lib/zlib +zig-out .zig-cache .env diff --git a/README.md b/README.md index f392306..0b86e19 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ Contributions are welcome! Please open an issue or pull request if you'd like to | message_create: ?*const fn (message: Discord.Message) void | ✅ | | message_update: ?*const fn (message: Discord.Message) void | ✅ | | message_delete: ?*const fn (message: Discord.MessageDelete) void | ✅ | -| message_delete_bulk: ?*const fn (message: Discord.MessageDelete) void | ✅ | +| message_delete_bulk: ?*const fn (message: Discord.MessageDeleteBulk) void | ✅ | | message_reaction_add | ❌ | | message_reaction_remove | ❌ | | message_reaction_remove_all | ❌ | @@ -128,5 +128,5 @@ Contributions are welcome! Please open an issue or pull request if you'd like to | message_poll_vote_remove | ❌ | | ready: ?*const fn (data: Discord.Ready) void | ✅ | | resumed | ❌ | -| any: ?*const fn (data: []u8) void | ✅ | +| any: ?*const fn (data: []const u8) void | ✅ | diff --git a/build.zig b/build.zig index 4319005..88e8fc6 100644 --- a/build.zig +++ b/build.zig @@ -60,6 +60,8 @@ pub fn build(b: *std.Build) void { marin.root_module.addImport("zmpl", zmpl.module("zmpl")); marin.root_module.addImport("deque", deque.module("zig-deque")); + b.installArtifact(marin); + // test const run_cmd = b.addRunArtifact(marin); run_cmd.step.dependOn(b.getInstallStep()); diff --git a/src/parser.zig b/src/parser.zig index 739ff9c..d2cccd8 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -1,8 +1,9 @@ const zmpl = @import("zmpl"); const Discord = @import("types.zig"); const std = @import("std"); +const mem = std.mem; -pub fn parseUser(obj: *zmpl.Data.Object) Discord.User { +pub fn parseUser(_: mem.Allocator, obj: *zmpl.Data.Object) !Discord.User { const avatar_decoration_data_obj = obj.getT(.object, "avatar_decoration_data"); const user = Discord.User{ .clan = null, @@ -33,7 +34,7 @@ pub fn parseUser(obj: *zmpl.Data.Object) Discord.User { return user; } -pub fn parseMember(obj: *zmpl.Data.Object) Discord.Member { +pub fn parseMember(_: mem.Allocator, obj: *zmpl.Data.Object) !Discord.Member { const avatar_decoration_data_member_obj = obj.getT(.object, "avatar_decoration_data"); const member = Discord.Member{ .deaf = obj.getT(.boolean, "deaf"), @@ -56,27 +57,35 @@ pub fn parseMember(obj: *zmpl.Data.Object) Discord.Member { return member; } -pub fn parseMessage(obj: *zmpl.Data.Object) Discord.Message { - var buf: [1000]u8 = undefined; - var fba = std.heap.FixedBufferAllocator.init(&buf); - +/// caller must free the received referenced_message if any +pub fn parseMessage(allocator: mem.Allocator, obj: *zmpl.Data.Object) !Discord.Message { // parse mentions const mentions_obj = obj.getT(.array, "mentions").?; - var mentions = std.ArrayList(Discord.User).init(fba.allocator()); + var mentions = std.ArrayList(Discord.User).init(allocator); defer mentions.deinit(); while (mentions_obj.iterator().next()) |m| { - mentions.append(parseUser(&m.object)) catch unreachable; + try mentions.append(try parseUser(allocator, &m.object)); } // parse member - const member = parseMember(obj.getT(.object, "member").?); + const member = try parseMember(allocator, obj.getT(.object, "member").?); // parse message - const author = parseUser(obj.getT(.object, "author").?); + const author = try parseUser(allocator, obj.getT(.object, "author").?); - //_ = if (obj.getT(.object, "referenced_message")) |m| parseMessage(m) else null; + // the referenced_message if any + const refmp = try allocator.create(Discord.Message); + + var invalid_ptr = false; + + if (obj.getT(.object, "referenced_message")) |m| { + refmp.* = try parseMessage(allocator, m); + } else { + allocator.destroy(refmp); + invalid_ptr = true; + } // parse message const message = Discord.Message{ @@ -94,7 +103,7 @@ pub fn parseMessage(obj: *zmpl.Data.Object) Discord.Message { .guild_id = obj.getT(.string, "guild_id"), .attachments = &[0]Discord.Attachment{}, .edited_timestamp = null, - .mentions = mentions.items, + .mentions = try mentions.toOwnedSlice(), .mention_roles = &[0]?[]const u8{}, .mention_channels = &[0]?Discord.ChannelMention{}, .embeds = &[0]Discord.Embed{}, @@ -116,7 +125,7 @@ pub fn parseMessage(obj: *zmpl.Data.Object) Discord.Message { .position = if (obj.getT(.integer, "position")) |p| @as(isize, @intCast(p)) else null, .poll = null, .call = null, - .referenced_message = null, + .referenced_message = if (invalid_ptr) null else refmp, }; return message; } diff --git a/src/shard.zig b/src/shard.zig index 2bc6f2a..ec31eb4 100644 --- a/src/shard.zig +++ b/src/shard.zig @@ -104,7 +104,7 @@ pub const GatewayDispatchEvent = struct { ready: ?*const fn (data: Discord.Ready) void = undefined, // TODO: implement // resumed: null = null, - any: ?*const fn (data: []u8) void = undefined, + any: ?*const fn (data: []const u8) void = undefined, }; const FetchReq = struct { @@ -498,7 +498,7 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { self.logif("new gateway url: {s}", .{self.gatewayUrl()}); const application = obj.getT(.object, "application").?; - const user = Parser.parseUser(obj.getT(.object, "user").?); + const user = try Parser.parseUser(self.allocator, obj.getT(.object, "user").?); var ready = Discord.Ready{ .v = @as(isize, @intCast(obj.getT(.integer, "v").?)), @@ -535,7 +535,7 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { .bot = null, .redirect_uris = null, .interactions_endpoint_url = null, - .flags = .{ .Embedded = true }, //@as(Discord.ApplicationFlags, @bitCast(@as(u25, @intCast(application.getT(.integer, "flags").?)))), + .flags = @as(Discord.ApplicationFlags, @bitCast(@as(u25, @intCast(application.getT(.integer, "flags").?)))), .id = application.getT(.string, "id").?, }, }; @@ -548,7 +548,7 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { else => unreachable, }; } - if (self.handler.ready) |event| @call(.auto, event, .{ready}); + if (self.handler.ready) |event| event(ready); } if (std.ascii.eqlIgnoreCase(name, "message_delete")) { @@ -560,7 +560,7 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { .guild_id = obj.getT(.string, "guild_id"), }; - if (self.handler.message_delete) |event| @call(.auto, event, .{data}); + if (self.handler.message_delete) |event| event(data); } if (std.ascii.eqlIgnoreCase(name, "message_delete_bulk")) { @@ -578,26 +578,30 @@ pub fn handleEvent(self: *Self, name: []const u8, payload: []const u8) !void { .guild_id = obj.getT(.string, "guild_id"), }; - if (self.handler.message_delete_bulk) |event| @call(.auto, event, .{data}); + if (self.handler.message_delete_bulk) |event| event(data); } if (std.ascii.eqlIgnoreCase(name, "message_update")) { const attempt = try self.parseJson(payload); const obj = attempt.getT(.object, "d").?; - const message = Parser.parseMessage(obj); + const message = try Parser.parseMessage(self.allocator, obj); + defer if (message.referenced_message) |mptr| self.allocator.destroy(mptr); - if (self.handler.message_update) |event| @call(.auto, event, .{message}); + if (self.handler.message_update) |event| event(message); } if (std.ascii.eqlIgnoreCase(name, "message_create")) { const attempt = try self.parseJson(payload); const obj = attempt.getT(.object, "d").?; - const message = Parser.parseMessage(obj); + const message = try Parser.parseMessage(self.allocator, obj); + defer if (message.referenced_message) |mptr| self.allocator.destroy(mptr); - if (self.handler.message_create) |event| @call(.auto, event, .{message}); - } else {} + if (self.handler.message_create) |event| event(message); + } else { + if (self.handler.any) |anyEvent| anyEvent(payload); + } } inline fn logif(self: *Self, comptime format: []const u8, args: anytype) void {