Add wIRC main scrollback, route services to it, remember window bounds, bump to 0.1.7
wIRC main scrollback - The main window now has a "Server messages" scrollback using the same rendering and stick-to-bottom code as channel windows (extracted from ChannelScreen into a shared MessageScrollback composable). - MOTD, numerics, errors, connection status, user modes, INVITE, ERROR, non-ACTION CTCP requests and notices/messages from services (NickServ, ChanServ, *Serv, Global, ...) and the server go there. Its history persists like any other buffer (history/wirc-main__main.json). - Unread indicator: lines arriving while the main window is unfocused show as "N new" next to the label and in the window title/taskbar. Private messages and /whois - A PM or notice from a real user opens its query window, and reopens it if it was closed. Services and the server no longer open windows. - /whois <nick> sends WHOIS and shows the formatted reply in the window it was typed in, or in wIRC main if that window has since closed. - /me now sends a proper CTCP ACTION (the \x01 wrapper was missing). Window position and size - Main, channel and PM windows remember position and size in window_prefs.json under the existing "<serverId>__<name>" key (main uses "wirc-main__main"). The new windowX/windowY/windowWidth/ windowHeight fields are optional, so older files still load. - A saved position is only used if the window's title strip is on a connected monitor; otherwise, and for windows with no saved position, windows cascade from the primary screen's top-left with a 32dp offset. - window_prefs.json is now written via a temp file + atomic move. Cleanup - Remove the TEMP DEBUG aliasDebug tracing, ServerRepository.upsert printlns and connmgr-debug printlns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
242d7a7c42
commit
807903fe0f
@@ -47,6 +47,35 @@ data class IrcMessage(
|
||||
/** Buffer key: server id + channel/query name (channel names include '#'). */
|
||||
data class BufferKey(val serverId: String, val name: String)
|
||||
|
||||
/**
|
||||
* wIRC main's own buffer: server messages (MOTD, numerics, errors, whois fallback) and
|
||||
* services/server notices from every connected server. Server ids are built from the host
|
||||
* with every non-alphanumeric character replaced by '_' (see ServerEditDialog), so one can
|
||||
* never contain '-' - this id can't collide with a real server. Also used as the
|
||||
* window_prefs.json key ("wirc-main__main") for the main window's saved position and size.
|
||||
*/
|
||||
val MAIN_BUFFER_KEY = BufferKey("wirc-main", "main")
|
||||
|
||||
// Nicks that are network services rather than people. Their PRIVMSGs and NOTICEs go to
|
||||
// wIRC main instead of opening a query window. Anything ending in "serv" is also treated
|
||||
// as a service, which covers the less common ones (MemoServ, HostServ, SaslServ, ...).
|
||||
private val KNOWN_SERVICE_NICKS = setOf("nickserv", "chanserv", "global", "alis", "q", "x")
|
||||
|
||||
fun isServiceNick(nick: String): Boolean {
|
||||
val lower = nick.lowercase()
|
||||
return lower in KNOWN_SERVICE_NICKS || lower.endsWith("serv")
|
||||
}
|
||||
|
||||
/**
|
||||
* True when a message's source is a service or the server itself rather than a real user.
|
||||
* A user prefix always has the "nick!user@host" form; a missing prefix or one without '!'
|
||||
* is a server name (e.g. "irc.rizon.io").
|
||||
*/
|
||||
fun isServiceOrServerPrefix(prefix: String?): Boolean {
|
||||
if (prefix == null || !prefix.contains('!')) return true
|
||||
return isServiceNick(prefix.substringBefore('!'))
|
||||
}
|
||||
|
||||
data class ChannelUser(
|
||||
val nick: String,
|
||||
val isOp: Boolean = false,
|
||||
|
||||
Reference in New Issue
Block a user