{"id":14008339,"url":"https://github.com/glguy/irc-core","last_synced_at":"2025-05-15T14:06:37.449Z","repository":{"id":27989428,"uuid":"31483452","full_name":"glguy/irc-core","owner":"glguy","description":"Haskell IRC library and console client - Join us on libera.chat #glirc","archived":false,"fork":false,"pushed_at":"2025-04-03T22:51:03.000Z","size":6394,"stargazers_count":164,"open_issues_count":16,"forks_count":28,"subscribers_count":11,"default_branch":"v2","last_synced_at":"2025-05-08T01:45:29.189Z","etag":null,"topics":["haskell","irc","znc"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/glguy.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-03-01T01:46:34.000Z","updated_at":"2025-04-25T09:40:53.000Z","dependencies_parsed_at":"2023-12-13T19:06:19.520Z","dependency_job_id":"3631d6eb-2152-460a-befd-b0ecaa5f5929","html_url":"https://github.com/glguy/irc-core","commit_stats":{"total_commits":1319,"total_committers":16,"mean_commits":82.4375,"dds":0.2084912812736922,"last_synced_commit":"1bada1c534a7c085077a4cc34ad691f474f8ce00"},"previous_names":[],"tags_count":136,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glguy%2Firc-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glguy%2Firc-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glguy%2Firc-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glguy%2Firc-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/glguy","download_url":"https://codeload.github.com/glguy/irc-core/tar.gz/refs/heads/v2","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254355335,"owners_count":22057354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["haskell","irc","znc"],"created_at":"2024-08-10T11:01:36.046Z","updated_at":"2025-05-15T14:06:32.428Z","avatar_url":"https://github.com/glguy.png","language":"Haskell","funding_links":[],"categories":["Haskell"],"sub_categories":[],"readme":"GLIRC - Advanced Console IRC Client\n=============\n\n\u003ca href=\"https://repology.org/project/glirc/versions\"\u003e\n    \u003cimg src=\"https://repology.org/badge/vertical-allrepos/glirc.svg?exclude_unsupported=1\" alt=\"Packaging status\" align=\"right\"\u003e\n\u003c/a\u003e\n\n* **glirc** [![Hackage](https://img.shields.io/hackage/v/glirc.svg)](https://hackage.haskell.org/package/glirc)\n* **irc-core** [![Hackage](https://img.shields.io/hackage/v/irc-core.svg)](https://hackage.haskell.org/package/irc-core)\n* **hookup** [![Hackage](https://img.shields.io/hackage/v/hookup.svg)](https://hackage.haskell.org/package/hookup)\n\nClient Features\n---------------\n\n* Support for [a wide variety of IRCv3 capabilities](https://ircv3.net/software/clients#desktop-clients).\n* Joins, parts, and quits fold into one line to save space without sacrificing context.\nDetailed view (F2) shows additional info, such as part/quit messages.\n* Ignore support that folds ignored messages into the joins and parts. Detailed view shows the messages.\n* Searchable channel list, who and names list, and list modes (beqI) views separate from chat messages.\n* Dynamic, in-place message and list view searching using `/grep`.\n* View and open long URLs with `/url`.\n* Context-sensitive tab completion and command hints.\n* WYSIWYG mIRC formatting input.\n* Multi-line editing; Enter sends one line at a time.\n* Atheme-flavored-ChanServ integration.\n* Nicknames in chat messages are colored to match messages from that nickname.\n* Correct handling of [STATUSMSG](https://modern.ircdocs.horse/#statusmsg-parameter), including CTCP ACTIONs.\n* Command macros.\n* Support for a wide variety of SASL authentication mechanisms, including `ECDSA-NIST256P-CHALLENGE`.\n* Split-screen view.\n* Configurable color palette.\n* Desktop notifications on important messages while unfocused. Can run arbitrary commands instead (or turn them off).\n* Extensions, a Lua plugin system, and trivial piping of IRC messages to arbitrary commands with `/exec`.\n* Plenty more, but this list is getting a bit long.\n\n![](https://raw.githubusercontent.com/wiki/glguy/irc-core/images/screenshot.png)\n\nBuilding\n========\n\n[![Build Status](https://github.com/glguy/irc-core/actions/workflows/haskell-ci.yml/badge.svg)](https://github.com/glguy/irc-core/actions/workflows/haskell-ci.yml)\n\nglirc uses recent versions of packages, make sure your package databases are\nup-to-date:\n\n```\n$ cabal update\n```\n\nTo install the latest version from Hackage using cabal-install:\n\n```\n$ cabal install glirc\n```\n\nBuilding with cabal-install from source checkout\n\n```\n$ cabal install --dep\n$ cabal build\n```\n\nStartup\n=======\n\n```\nglirc [FLAGS] INITIAL_NETWORKS...\n  -c PATH  --config=PATH    Configuration file path\n  -!       --noconnect      Disable autoconnecting\n  -h       --help           Show help\n           --config-format  Show configuration file format\n  -v       --version        Show version\n           --full-version   Show version and versions of all linked Haskell libraries\n```\n\nEnvironment variables\n```\nUSER=\u003cdefault nickname and username\u003e\nIRCPASSWORD=\u003cyour irc password\u003e\n```\n\nConfiguration file\n=================\n\nMost of glirc's settings are specified using a configuration file.\nThe file format is [config-value](http://hackage.haskell.org/package/config-value),\nan indentation-sensitive format that resembles YAML.\nIt has macros which are documented\n[here](https://hackage.haskell.org/package/config-value/docs/Config-Macro.html).\n\nThe default configuration file path is `~/.config/glirc/config`.\nRelative paths are relative to the home directory.\n\nTo view the full list of configuration variables,\nrun `glirc --config-format | less`.\nIf any variable is unspecified, a default value will be used instead.\n\n```\n-- vim: filetype=config-value\n-- Grab the Vim syntax highlighting file from the config-value package\n\n-- Defaults used when not specified on command line\ndefaults:\n  nick:            \"yournick\"\n  username:        \"yourusername\"\n  realname:        \"Your real name\"\n  tls:             yes -- or: no, or: starttls\n                       -- enabling tls automatically uses port 6697\n\n-- Override the defaults when connecting to specific servers\nservers:\n  * name: \"libera\"\n    hostname:   \"irc.libera.chat\"\n    sasl:\n      username: \"someuser\"\n      password: \"somepass\"\n    log-dir:    \"/home/myuser/ircLogs\"\n    connect-cmds:\n      * \"join #glirc,#someotherchannel\"\n\n  * name: \"znc\"\n    hostname:        \"znc.example.com\"\n    port:            7000 -- Override the default port\n    password:        \"IRC server password\"\n    tls-verify:      no\n    message-hooks:   [\"buffextras\"] -- Use this when using ZNC's \"buffextra\" module to get correct playback\n    flood-penalty:   -1 -- Disable flood controls\n    flood-threshold: -1\n\nmacros:\n  * name: \"wipe\"\n    commands:\n      * \"clear\"\n      * \"znc *status clearbuffer $channel\"\n\n  * name: \"mysplits\"\n    commands:\n      * \"splits libera:#haskell libera:#haskell-offtopic\"\n\n  -- Example use of macro in combination with an extension\n  * name: \"extra\"\n    commands:\n      * \"extension Lua somecommand $network $channel\"\n\nextra-highlights: [\"glirc\", \"hello\"]\n\nnick-padding:\n   side: left -- Try \"right\" if you don't like left padding\n   width: 13\n\nurl-opener: \"open\" -- This works on macOS; use \"xdg-open\" for most Linuxes\n\nkey-bindings:\n  * bind: \"C-M-b\"\n    command: \"masks b\"\n\npalette:\n  line-marker: yellow\n  time:\n    fg: [10,10,10] -- RGB values for color for timestamps\n    bg: blue\n  identifier-colors: -- Used for nicknames and channel names\n    [ cyan, magenta, green, yellow, blue\n    , bright-cyan, bright-magenta, bright-green, bright-blue\n    , 218,  88,  89, 124, 160, 205, 212, 224 -- reds\n    ,  94, 130, 166, 172, 208, 214, 216, 180 -- oranges\n    ,  58, 226, 229, 184, 187, 100, 142, 220 -- yellows\n    ,  22,  34,  40,  82,  70,  64,  48,  85 -- greens\n    ,  25,  27,  33,  39,  51,  80,  81,  75 -- blues\n    ,  69,  61,  56,  54, 129,  93,  99, 147 -- purples\n    ]\n\nnotifications: terminal-notifier -- Use terminal-notifier for nicer notifications (macOS only)\n```\n\nCommands\n========\n\nglirc has built-in documentation for all of its commands.\nTo view the full list of commands and what they do, use `/help`.\nTo view help on a specific command, use `/help \u003ccommand\u003e`.\n\nUnlike some other clients, glirc does not send unknown commands to the server.\nUse `/quote` to send arbitrary IRC commands.\n\nThe following is a curated list of commands for basic use:\n\n* `/help [command]` - Show in-client help\n* `/exit` - Terminate the client\n* `/reload [path]` - Load a new configuration file (optional path)\n* `/palette` - Show the client palette\n* `/url [n]` - Execute url-opener on the nth URL in the current window (defaults to first)\n* `/toggle-activity-bar` - toggle channel names in activity bar\n* `/toggle-detail` - toggle full detail view of messages\n* `/toggle-metadata` - toggle visibility of channel metadata (joins, parts, quits, nick changes, etc)\n\nConnection\n\n* `/connect \u003cname\u003e` - Connect to the given server\n* `/quit [message]` - Gracefully terminate connection to the current server\n* `/reconnect` - Reconnect to the current server\n* `/nick \u003cnick\u003e` - Change nickname\n* `/away [message]` - Set away status; no message removes away status\n\nWindow management\n\n* `/windows [filter]` - List all open windows (filters: networks, channels, users)\n* `/setname [letter]` - Assign a one-letter name to the given window.\n* `/channel \u003cchannel\u003e` - Change focus to channel/user on current network (alias: `/c`)\n* `/channel \u003cnetwork\u003e:[channel]` - Change focus to channel/user on the specified network (alias: `/c`)\n* `/clear [network] [channel]` - Clear contents of current or specified window\n* `/splits [focuses...]` - Enable split-screen view. Focuses should be space delimited list of NETWORK:CHANNEL\n* `/splits+ [focuses...]` - Incremental addition to splits\n* `/splits- [focuses...]` - Incremental removal from splits\n* `/toggle-layout` - toggle split-screen layout between 1 and 2 column view\n\nChat commands\n\n* `/join \u003cchannel\u003e` - Join a channel (alias: `/j`)\n* `/part [msg]` - Part from current channel\n* `/query \u003ctarget\u003e [msg]` - Switch focus to target window on current server, optionally send message (alias: `/q`)\n* `/msg \u003ctarget\u003e \u003cmsg\u003e` - Send a message on the current server to target\n* `/me \u003cmsg\u003e` - Send action message to channel\n* `/say \u003cmsg\u003e` - Send normal message to channel; useful for macros and messages starting with a slash\n* `/ignore \u003cmask\u003e...` - Toggle ignore status on a list of masks\n* `/topic [msg]` - Display or set the current topic of a channel\n\nViews\n\n* `/channelinfo` - Show channel topic, creation, url\n* `/grep [flags] \u003cregex\u003e` - Filter using a regular expression\n* `/ignore` - Show all ignore masks\n* `/list` - View the list of public channels on the network\n* `/masks \u003cmode\u003e` - Show channel bans(b), quiets(q), exempts(e), or invex(I)\n* `/mentions` - Show all the highlighted lines across all windows\n* `/names` - Show the user list for the current channel\n* `/who [channel] [options]` - Perform WHO query, sending options to the server, or show the results of the previous query.\n\nZNC-specific\n\n* `/znc \u003cmodule\u003e \u003cparameters\u003e` - send command to ZNC module without echoing to all clients\n* `/znc-playback` - ZNC playback module - play everything\n* `/znc-playback \u003ctime\u003e` - ZNC playback module - play everything start at the given time today\n* `/znc-playback \u003cdate\u003e \u003ctime\u003e` - ZNC playback module - play everything start at the given time\n\nMiscellaneous\n\n* `/dump \u003cfilename\u003e` - Dump current window to file\n* `/extension \u003cextension name\u003e \u003cparams...\u003e` - Send the given params to the named extension\n* `/exec [-n network] [-c channel] \u003ccommand\u003e \u003carguments...\u003e` - Execute a command; if no network or channel are provided send output to client window, if network and channel are provided send output as messages, if network is provided send output as raw IRC messages.\n* `/quote \u003craw command\u003e` - Send a raw IRC command to the server\n\nKeyboard Shortcuts\n==================\n\nNote that these keybindings are using *Emacs* syntax. `C-a` means \"hold\ncontrol and press A\". `M-a` means \"hold meta key and press A\". On most\nmodern keyboards the *Meta* key is labeled *Alt* or *Option*.\n\nTo view the full list of keybindings and what they do,\nuse `/keymap` from within glirc.\n\nThe following is a curated list of default keybinds for basic use:\n\nNavigation\n\n* `Page Up` scroll up\n* `Page Down` scroll down\n* `C-n` next window\n* `C-p` previous window\n* `C-x` next network window\n* `M-\u003cname\u003e` jump to window with the given one-letter name\n* `M-a` jump to activity\n* `M-s` jump to previous window\n* `ESC` return to messages view (from userlist, masklist, help, etc)\n\nEditing\n\n* `C-b` bold\n* `C-c` color\n* `C-v` invert foreground/background\n* `C-_` underline\n* `C-]` italic\n* `C-o` reset formatting\n\n* `Tab` autocompletion\n* `M-k` replace 2 characters before the cursor with a character specified in `/digraphs`\n\n* `C-a` beginning of line\n* `C-e` end of line\n* `C-k` delete to end\n* `C-u` delete to beginning\n* `C-d` delete at cursor\n* `C-w` delete word backwards\n* `C-y` paste from yank buffer\n* `C-t` swap characters at cursor\n* `M-f` forward word\n* `M-b` backward word\n* `M-Right` forward word\n* `M-Left` backward word\n* `M-Backspace` delete word backwards\n* `M-d` delete word forwards\n* `M-Enter` insert newline\n\nClient settings\n\n* `F2` toggle detailed view\n* `F3` toggle detailed activity bar\n* `F4` toggle metadata visibility\n* `F7` toggle Enter key lock\n\nMacros\n======\n\nThe `macros` configuration section allows you to define\nsequences of commands. These commands can contain expansions.\n\nConfiguration\n-------------\n\n* `name` - text - name of macro\n* `arguments` - text - space separated list of argument names (suffix name with `?` when optional)\n* `commands` - list of text - commands to send after expansion\n\nMacro Expansions\n----------------\n\nVariable names and integer indexes can be used when defining commands.\nVariables are specified with a leading `$`. For disambiguation a variable\nname can be surrounded by `{}`. `$channel` and `${channel}` are\nequivalent. Default values can be provided following a pipe: `${var|default}`.\n\n* `channel` - current channel\n* `network` - current network name\n* `nick` - current nickname\n\nThe arguments to a command will be mapped to integer indexes.\n\n* `0` - first argument\n* `1` - second argument (etc.)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglguy%2Firc-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglguy%2Firc-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglguy%2Firc-core/lists"}