75 lines
2.4 KiB
Zig
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,
|
|
};
|
|
}
|