an experimental irc client

bouncer-networks: use network nickname instead of config nickname

rockorager.dev 2993fd2b ffabed46

verified
+25 -16
+18 -16
src/app.zig
··· 550 550 } 551 551 } 552 552 553 - var attr_iter = std.mem.splitScalar(u8, attr, ';'); 554 - const name: ?[]const u8 = name: while (attr_iter.next()) |kv| { 555 - const n = std.mem.indexOfScalar(u8, kv, '=') orelse continue; 556 - if (mem.eql(u8, kv[0..n], "name")) 557 - break :name try self.alloc.dupe(u8, kv[n + 1 ..]); 558 - } else null; 559 - 560 553 var cfg = client.config; 561 554 cfg.network_id = try self.alloc.dupe(u8, id); 562 - cfg.name = name; 555 + 556 + var attr_iter = std.mem.splitScalar(u8, attr, ';'); 557 + while (attr_iter.next()) |kv| { 558 + const n = std.mem.indexOfScalar(u8, kv, '=') orelse continue; 559 + const key = kv[0..n]; 560 + if (mem.eql(u8, key, "name")) 561 + cfg.name = try self.alloc.dupe(u8, kv[n + 1 ..]) 562 + else if (mem.eql(u8, key, "nickname")) 563 + cfg.network_nick = try self.alloc.dupe(u8, kv[n + 1 ..]); 564 + } 563 565 loop.postEvent(.{ .connect = cfg }); 564 566 } 565 567 } ··· 608 610 609 611 var channel = try client.getOrCreateChannel(target); 610 612 const user_ptr = try client.getOrCreateUser(target); 611 - const me_ptr = try client.getOrCreateUser(client.config.nick); 613 + const me_ptr = try client.getOrCreateUser(client.nickname()); 612 614 try channel.addMember(user_ptr, .{}); 613 615 try channel.addMember(me_ptr, .{}); 614 616 // we set who_requested so we don't try to request ··· 635 637 var channel = try client.getOrCreateChannel(target); 636 638 637 639 // If it's our nick, we request chat history 638 - if (mem.eql(u8, user.nick, client.config.nick)) 640 + if (mem.eql(u8, user.nick, client.nickname())) 639 641 try client.requestHistory(.after, channel) 640 642 else 641 643 try channel.addMember(user, .{}); ··· 672 674 var iter = msg.paramIterator(); 673 675 const target = iter.next() orelse continue; 674 676 675 - if (mem.eql(u8, user.nick, client.config.nick)) { 677 + if (mem.eql(u8, user.nick, client.nickname())) { 676 678 for (client.channels.items, 0..) |channel, i| { 677 679 if (!mem.eql(u8, channel.name, target)) continue; 678 680 var chan = client.channels.orderedRemove(i); ··· 692 694 var iter = msg2.paramIterator(); 693 695 const target = blk: { 694 696 const tgt = iter.next() orelse continue; 695 - if (mem.eql(u8, tgt, client.config.nick)) { 697 + if (mem.eql(u8, tgt, client.nickname())) { 696 698 // If the target is us, it likely has our 697 699 // hostname in it. 698 700 const source = msg2.source() orelse continue; ··· 718 720 if (time.unixTimestamp() > channel.last_read) { 719 721 channel.has_unread = true; 720 722 const content = iter.next() orelse continue; 721 - if (std.mem.indexOf(u8, content, client.config.nick)) |_| { 723 + if (std.mem.indexOf(u8, content, client.nickname())) |_| { 722 724 channel.has_unread_highlight = true; 723 725 } 724 726 } ··· 740 742 }; 741 743 try lua.onMessage(lua_state, client, channel.name, sender, content); 742 744 } 743 - if (std.mem.indexOf(u8, content, client.config.nick)) |_| { 745 + if (std.mem.indexOf(u8, content, client.nickname())) |_| { 744 746 var buf: [64]u8 = undefined; 745 747 const title_or_err = if (msg2.source()) |source| 746 748 std.fmt.bufPrint(&buf, "{s} - {s}", .{ channel.name, source }) ··· 770 772 src.len; 771 773 break :blk src[0..l]; 772 774 }; 773 - if (std.mem.eql(u8, sender, client.config.nick)) { 775 + if (std.mem.eql(u8, sender, client.nickname())) { 774 776 self.markSelectedChannelRead(); 775 777 } 776 778 }, ··· 1365 1367 _ = iter.next() orelse continue; 1366 1368 1367 1369 const content = iter.next() orelse continue; 1368 - if (std.mem.indexOf(u8, content, client.config.nick)) |_| { 1370 + if (std.mem.indexOf(u8, content, client.nickname())) |_| { 1369 1371 for (segments.items) |*item| { 1370 1372 if (item.style.fg == .default) 1371 1373 item.style.fg = .{ .index = 3 };
+7
src/irc.zig
··· 444 444 server: []const u8, 445 445 port: ?u16, 446 446 network_id: ?[]const u8 = null, 447 + network_nick: ?[]const u8 = null, 447 448 name: ?[]const u8 = null, 448 449 tls: bool = true, 449 450 lua_table: i32, ··· 523 524 if (self.config.network_id) |id| self.alloc.free(id); 524 525 if (self.config.name) |name| self.alloc.free(name); 525 526 527 + if (self.config.network_nick) |nick| self.alloc.free(nick); 528 + 526 529 for (self.channels.items) |channel| { 527 530 channel.deinit(self.alloc); 528 531 } ··· 541 544 self.alloc.free(key.*); 542 545 } 543 546 batches.deinit(); 547 + } 548 + 549 + pub fn nickname(self: *Client) []const u8 { 550 + return self.config.network_nick orelse self.config.nick; 544 551 } 545 552 546 553 pub fn ack(self: *Client, cap: []const u8) void {