an experimental irc client

ui: show real name on nick hover

Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>

+24 -3
+21 -2
src/app.zig
··· 445 445 _ = iter.next() orelse continue :loop; // host 446 446 _ = iter.next() orelse continue :loop; // server 447 447 const nick = iter.next() orelse continue :loop; // nick 448 - const flags = iter.next() orelse continue :loop; // nick 448 + const flags = iter.next() orelse continue :loop; // flags 449 449 450 450 const user_ptr = try client.getOrCreateUser(nick); 451 451 if (mem.indexOfScalar(u8, flags, 'G')) |_| user_ptr.away = true; ··· 460 460 try channel.addMember(user_ptr, .{ .prefix = prefix }); 461 461 }, 462 462 .RPL_WHOSPCRPL => { 463 - // syntax: <client> <channel> <nick> <flags> 463 + // syntax: <client> <channel> <nick> <flags> :<realname> 464 464 var iter = msg.paramIterator(); 465 465 _ = iter.next() orelse continue; 466 466 const channel_name = iter.next() orelse continue; // channel ··· 468 468 const flags = iter.next() orelse continue; 469 469 470 470 const user_ptr = try client.getOrCreateUser(nick); 471 + if (iter.next()) |real_name| { 472 + if (user_ptr.real_name) |old_name| { 473 + self.alloc.free(old_name); 474 + } 475 + user_ptr.real_name = try self.alloc.dupe(u8, real_name); 476 + } 471 477 if (mem.indexOfScalar(u8, flags, 'G')) |_| user_ptr.away = true; 472 478 var channel = try client.getOrCreateChannel(channel_name); 473 479 ··· 1278 1284 const result_win = sender_win.child(.{ .width = .{ .limit = sender_result.col } }); 1279 1285 if (result_win.hasMouse(self.state.mouse)) |_| { 1280 1286 self.vx.setMouseShape(.pointer); 1287 + // If we have a realname we print it 1288 + if (user.real_name) |real_name| { 1289 + _ = try sender_win.printSegment( 1290 + .{ 1291 + .text = real_name, 1292 + .style = .{ .italic = true, .dim = true }, 1293 + }, 1294 + .{ 1295 + .wrap = .none, 1296 + .col_offset = sender_result.col + 1, 1297 + }, 1298 + ); 1299 + } 1281 1300 } 1282 1301 1283 1302 // Go up one more line to print the next message
+3 -1
src/irc.zig
··· 223 223 nick: []const u8, 224 224 away: bool = false, 225 225 color: vaxis.Color = .default, 226 + real_name: ?[]const u8 = null, 226 227 227 228 pub fn deinit(self: *const User, alloc: std.mem.Allocator) void { 228 229 alloc.free(self.nick); 230 + if (self.real_name) |realname| alloc.free(realname); 229 231 } 230 232 }; 231 233 ··· 771 773 channel.in_flight.who = true; 772 774 const who = try std.fmt.bufPrint( 773 775 &write_buf, 774 - "WHO {s} %cnf\r\n", 776 + "WHO {s} %cnfr\r\n", 775 777 .{channel.name}, 776 778 ); 777 779 try self.queueWrite(who);