Channel modes proper are skipped by design — backend/irc.rs:817-820 says +m, +t and bans "carry no nick to re-rank" and rank_from_mode returns None for them. So moho cannot show or change whether a channel is moderated, invite-only, keyed or limited, and cannot see or edit ban/quiet/invite-exception lists.
Also absent: /mode in any form, /invite and inbound INVITE handling, and /list — JoinPanel.tsx offers a bare "#channel" field with no way to discover one.
Done looks like: channel mode state in the buffer header, a ban-list view for ops, /invite, and a LIST-backed channel browser.
Channel modes proper are skipped by design — `backend/irc.rs:817-820` says `+m`, `+t` and bans "carry no nick to re-rank" and `rank_from_mode` returns `None` for them. So moho cannot show or change whether a channel is moderated, invite-only, keyed or limited, and cannot see or edit ban/quiet/invite-exception lists.
Also absent: `/mode` in any form, `/invite` and inbound INVITE handling, and `/list` — `JoinPanel.tsx` offers a bare "#channel" field with no way to discover one.
**Done looks like:** channel mode state in the buffer header, a ban-list view for ops, `/invite`, and a LIST-backed channel browser.
Channel modes. A MODE with no nick attached was being dropped on the floor — the arm that read MODE only looked for ones that re-rank somebody — so a channel going moderated was invisible until a message bounced off it. The channel now carries its own modes: tracked letter by letter as they change, replaced wholesale when the server answers a bare MODE, and reported on the buffer so the header can show them. They are titled with what they mean, since the letters are only obvious to somebody who already knew.
Modes taking an argument are deliberately not in that string: +k without the key says nothing a reader can act on, and bans have their own list.
/mode is raw. Channel modes are a small language with per-network extensions, and a client that only forwards the ones it recognises cannot set the one this network has. The server is the authority and says so itself when it is not. With no argument it asks instead — which is also how /mode #chan b reads the ban list.
Ban lists arrive as 367/368 and are shown in the channel they govern, alongside ban exceptions (348) and invite exceptions (346). That is where a ban list is read, and it needs no panel of its own.
/invite and /unban join the command set, and an inbound INVITE is announced in the server buffer instead of being silently discarded. /ban someone still becomes someone!*@*, but a mask already containing ! or @ is left alone — wrapping *!*@example.com again banned nobody while appearing to work.
The channel browser is a button, not something that happens on opening the page: a LIST answers with tens of thousands of channels and some servers throttle or refuse it. The daemon gathers the numerics, sorts busiest-first and hands the whole list over in one event; filtering is local, because a server-side filter would mean a fresh LIST per keystroke against something that just rate-limited you.
Not included: WHOIS, and netsplit collapsing. Both are real gaps but neither is a mode or a list, and they want their own tickets.
Finished — https://git.salastil.com/Salastil/nobilis/commit/043df9b and https://git.salastil.com/Salastil/moho/commit/5b98a1b
**Channel modes.** A MODE with no nick attached was being dropped on the floor — the arm that read MODE only looked for ones that re-rank somebody — so a channel going moderated was invisible until a message bounced off it. The channel now carries its own modes: tracked letter by letter as they change, replaced wholesale when the server answers a bare MODE, and reported on the buffer so the header can show them. They are titled with what they mean, since the letters are only obvious to somebody who already knew.
Modes taking an argument are deliberately not in that string: `+k` without the key says nothing a reader can act on, and bans have their own list.
**`/mode` is raw.** Channel modes are a small language with per-network extensions, and a client that only forwards the ones it recognises cannot set the one this network has. The server is the authority and says so itself when it is not. With no argument it asks instead — which is also how `/mode #chan b` reads the ban list.
**Ban lists** arrive as 367/368 and are shown in the channel they govern, alongside ban exceptions (348) and invite exceptions (346). That is where a ban list is read, and it needs no panel of its own.
**`/invite` and `/unban`** join the command set, and an inbound INVITE is announced in the server buffer instead of being silently discarded. `/ban someone` still becomes `someone!*@*`, but a mask already containing `!` or `@` is left alone — wrapping `*!*@example.com` again banned nobody while appearing to work.
**The channel browser** is a button, not something that happens on opening the page: a LIST answers with tens of thousands of channels and some servers throttle or refuse it. The daemon gathers the numerics, sorts busiest-first and hands the whole list over in one event; filtering is local, because a server-side filter would mean a fresh LIST per keystroke against something that just rate-limited you.
Not included: WHOIS, and netsplit collapsing. Both are real gaps but neither is a mode or a list, and they want their own tickets.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Channel modes proper are skipped by design —
backend/irc.rs:817-820says+m,+tand bans "carry no nick to re-rank" andrank_from_modereturnsNonefor them. So moho cannot show or change whether a channel is moderated, invite-only, keyed or limited, and cannot see or edit ban/quiet/invite-exception lists.Also absent:
/modein any form,/inviteand inbound INVITE handling, and/list—JoinPanel.tsxoffers a bare "#channel" field with no way to discover one.Done looks like: channel mode state in the buffer header, a ban-list view for ops,
/invite, and a LIST-backed channel browser.Finished — https://git.salastil.com/Salastil/nobilis/commit/043df9b and https://git.salastil.com/Salastil/moho/commit/5b98a1b
Channel modes. A MODE with no nick attached was being dropped on the floor — the arm that read MODE only looked for ones that re-rank somebody — so a channel going moderated was invisible until a message bounced off it. The channel now carries its own modes: tracked letter by letter as they change, replaced wholesale when the server answers a bare MODE, and reported on the buffer so the header can show them. They are titled with what they mean, since the letters are only obvious to somebody who already knew.
Modes taking an argument are deliberately not in that string:
+kwithout the key says nothing a reader can act on, and bans have their own list./modeis raw. Channel modes are a small language with per-network extensions, and a client that only forwards the ones it recognises cannot set the one this network has. The server is the authority and says so itself when it is not. With no argument it asks instead — which is also how/mode #chan breads the ban list.Ban lists arrive as 367/368 and are shown in the channel they govern, alongside ban exceptions (348) and invite exceptions (346). That is where a ban list is read, and it needs no panel of its own.
/inviteand/unbanjoin the command set, and an inbound INVITE is announced in the server buffer instead of being silently discarded./ban someonestill becomessomeone!*@*, but a mask already containing!or@is left alone — wrapping*!*@example.comagain banned nobody while appearing to work.The channel browser is a button, not something that happens on opening the page: a LIST answers with tens of thousands of channels and some servers throttle or refuse it. The daemon gathers the numerics, sorts busiest-first and hands the whole list over in one event; filtering is local, because a server-side filter would mean a fresh LIST per keystroke against something that just rate-limited you.
Not included: WHOIS, and netsplit collapsing. Both are real gaps but neither is a mode or a list, and they want their own tickets.