1
0
Fork 0
QuasselClient/src/client.zig
2021-06-02 12:47:24 +01:00

75 lines
2.4 KiB
Zig

const std = @import("std");
const read = @import("./qtshit/read.zig");
const write = @import("./qtshit/write.zig");
const qvar = @import("./qtshit/qvariant.zig");
fn dumpDebug(name: []const u8, list: std.ArrayList(u8)) !void {
std.debug.print("dumpDebug list len {d}\n", .{list.items.len});
const file = try std.fs.cwd().createFile(
name,
.{ .truncate = false },
);
defer file.close();
try file.writeAll(list.items);
}
pub const Client = struct {
allocator: *std.mem.Allocator,
stream: *std.net.Stream,
pub fn handshake(s: *Client) !void {
const magic = 0x42b33f00;
try write.add_int(s.stream.writer(), magic);
try write.add_int(s.stream.writer(), 2);
try write.add_int(s.stream.writer(), 1 << 31);
var resp = try read.get_int(s.stream.reader());
if ((resp & 0xff) != 1) {
@panic("No support 4 legacy protocol.");
}
if (((resp >> 24) & 1) != 0) {
@panic("No support 4 ssl protocol.");
}
if (((resp >> 24) & 2) != 0) {
@panic("No support 4 compression.");
}
std.debug.print("Handshake Success!\n", .{});
}
pub fn quassel_init_packet(s: *Client) !void {
var list = std.ArrayList(u8).init(s.allocator);
var map = std.StringHashMap(qvar.QVariant).init(s.allocator);
try map.put("UseSSL", .{ .byte = 0 });
try map.put("UseCompression", .{ .byte = 0 });
try map.put("ProtocolVersion", .{ .int = 10 });
try map.put("MsgType", .{ .string = "ClientInit" });
try map.put("ClientVersion", .{ .string = "0.1 (quasselclient)" });
try map.put("ClientDate", .{ .string = "0" });
try write.add_qvariantmap(list.writer(), map);
try dumpDebug("ClientInit.bin", list);
try s.stream.writer().writeAll(list.items);
}
pub fn quassel_login(s: *Client, username: []const u8, password: []const u8) !void {
var map = std.StringHashMap(qvar.QVariant).init(s.allocator);
try map.put("MsgType", .{ .string = "ClientLogin" });
try map.put("User", .{ .string = username });
try map.put("Password", .{ .string = password });
try write.add_qvariantmap(s.stream.writer(), map);
}
};
pub fn initClient(allocator: *std.mem.Allocator, stream: *std.net.Stream) Client {
return Client{
.allocator = allocator,
.stream = stream,
};
}