diff --git a/src/bot.zig b/src/bot.zig index 8f0827c..b5d2ebd 100644 --- a/src/bot.zig +++ b/src/bot.zig @@ -56,6 +56,8 @@ pub const Parser = struct { pub const AdminCommand = union(enum) { backlog: struct { history: u16 }, status: void, + join: struct { channel: []const u8 }, + err: struct { message: []const u8 }, pub fn parse(text: []const u8) ?AdminCommand { const original = Parser.init(text); @@ -63,6 +65,12 @@ pub const AdminCommand = union(enum) { if (command.consume_str("status")) |_| { return .status; } + if (command.consume_str("join").?.consume_char(' ')) |join| { + if (join.rest[0] != '#') { + return .{ .err = .{ .message = "channels must start with \"#\"" } }; + } + return .{ .join = .{ .channel = join.rest } }; + } if (command.consume_str("backlog")) |backlog| { const history = std.fmt.parseInt(u16, backlog.rest, 10) catch |err| { std.debug.print("failed to parse int ('{s}') with error: {}\n", .{ backlog.rest, err }); @@ -209,6 +217,10 @@ pub const Bot = struct { ); return .{ .PRIVMSG = .{ .targets = targets, .prefix = prefix, .text = msg } }; }, + .join => |msg| { + std.log.debug("received join request: channel \"{s}\"", .{msg.channel}); + return .{ .JOIN = .{ .prefix = prefix, .channels = msg.channel } }; + }, .backlog => |backlog| { if (self.top == self.bottom) { return Error.NoMessage; @@ -229,6 +241,9 @@ pub const Bot = struct { }; } else return Error.NoMessage; }, + .err => |err| { + return .{ .PRIVMSG = .{ .targets = targets, .prefix = prefix, .text = err.message } }; + }, } }