a terminal client for Lurker, written in Rust


on this page

status.lua

The status bar. This is the status table in the config.

The bar is built from templates, one per line, so it can be as tall and say as much as you like. Leave lines out and it follows the layout's own default.

Templates

A template is literal text with fields in braces. Anything that is not a field is printed as written.

Syntax Does
{field} Replaced by the field's current value
{|} Pushes everything after it to the right-hand edge
{?field} ... {/} Drops everything between the two when field is empty
{{ and }} A literal { and }

The {?field} group is what keeps a bar tidy. On its own, [Lag: {lag}ms] reads [Lag: ms] until the first reading arrives. Written as {?lag}[Lag: {lag}ms] {/}, it leaves nothing behind until there is something to show.

A field luir does not know is drawn as nothing, so a template written for a later version degrades quietly rather than showing its own source.

Fields

Most fields are empty when there is nothing to say, which is what {?field} ... {/} tests for. Unless plain is on, several are drawn in a colour from the theme that says what they mean.

Field Shows
time The local time, as 14:28
date The local date, as 2026-09-09
buffer The name of the buffer you are in, in the accent colour
network The name of that buffer's network
server The host of the server that network is connected to
nick Your nick on that network
umodes Your user modes on that network, without the +
cmodes The channel's modes, without the +
away Your away message, while you are away
lag The latest lag reading, in milliseconds, as a bare number
lagchart A braille chart of recent lag readings. Empty until the first reading
sendrate A braille chart of frames going out, one reading a second. Empty while nothing is being sent
unread The unread count for this buffer, when there is one. On the luir row it includes Lurker's system messages, while merge_system_row puts them there
highlights How many messages in this buffer mention you, when any do. Counted the same way as unread on the luir row
members How many people are in the channel
topic The channel's topic
scroll How far back you are scrolled, while you are
typing Who is typing in this buffer: avery is typing…, then avery and kestrel are typing…, then 3 people are typing…
state connecting or reconnecting 5s while not connected, and empty once connected
flash A short notice, such as config reloaded, for six seconds
activity The sidebar numbers of buffers with unread traffic, as 4,5, with any that mention you called out in the highlight colour
joined not joined in a channel you have left but kept open

A name in typing goes stale eight seconds after its last notice, and drops as soon as that person actually says something.

The two charts share chart_width. The lag chart's height follows the tallest reading on screen, down to chart_floor_ms, and its colour follows the reading. The send-rate chart is coloured against luir's own sending limit, so it turns red as a large paste reaches the point where luir holds frames back.

The defaults

With lines left out, the modern layout draws:

 [{time}] [{nick}{?umodes}(+{umodes}){/}] {?lag}[Lag: {lag}ms{?lagchart} {lagchart}{/}] {/}[{buffer}@{network}] {?typing}· {typing} {/}{?flash}· {flash} {/}{|}{?sendrate}[tx {sendrate}] {/}{?activity}[Act: {activity}]{/} 

And the classic layout:

 [{time}] [{nick}{?umodes}(+{umodes}){/}{?away}/away{/}] [{buffer}{?cmodes}(+{cmodes}){/}@{network}] {?lag}[Lag: {lag}ms] {/}{?typing}[{typing}] {/}{?flash}· {flash} {/}{?activity}[Act: {activity}]{/}

Options

lines list of strings

One template for each line of the bar. The bar is as tall as this list. Leave it out to use the layout's default, shown above.

background colour, optional

The bar's background. Unset, it follows the theme's status_bg. Takes any value a theme colour does.

foreground colour, optional

The bar's text colour. Unset, it follows the theme's status_fg.

backgrounds list of colours

A background for each line, so a two-line bar can shade its lines apart. The list is cycled when it is shorter than lines, and wins over background for the lines it covers.

plain boolean, default false

Draw every field in the line's own colour, instead of colouring nicks, lag, unread counts and activity by what they mean.

chart_width integer, default 12

How many cells wide the lagchart and sendrate charts are. Braille fits two readings into a cell, so a chart shows twice this many. 0 hides both, and a template that wraps them in {?lagchart} and {?sendrate} groups closes up around the gap.

chart_floor_ms integer, default 200

The lowest the lag chart's scale will go, in milliseconds. The scale otherwise follows the tallest reading on screen, so that a bad link uses the full height. Without a floor, a millisecond of jitter on a good connection would look like a mountain range.

Examples

A second line for the topic, under the default first line:

return {
  lines = {
    " [{time}] [{nick}{?umodes}(+{umodes}){/}] {?lag}[Lag: {lag}ms{?lagchart} {lagchart}{/}] {/}[{buffer}@{network}] {?typing}· {typing} {/}{?flash}· {flash} {/}{|}{?sendrate}[tx {sendrate}] {/}{?activity}[Act: {activity}]{/} ",
    " {?topic}{topic}{/}",
  },
  backgrounds = { "#1c2030", "#141824" },
}

A short bar of your own, with the charts on either side:

return {
  lines = { " {nick} {?lagchart}{lagchart} {/}{|} {?sendrate}{sendrate}{/} " },
}

The lag as a number only, without its chart: drop the {?lagchart} group from the default.

return {
  lines = { " [{time}] [{nick}] {?lag}[Lag: {lag}ms] {/}[{buffer}@{network}]{|}{?activity}[Act: {activity}]{/} " },
}