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