|
NAMEsrain - Srain DocumentationWelcome to Srain documentation! Latest version: version-latest. The source code of this documentation is hosted on GitHub. If you found any mistake, feel free to file issue or pull request. ALL PAGESSrainci-status doc-status channelModern IRC client written in GTK. Home | Documentation | Source code [image] Packaging StatuspkgstatFeatures
Need Help?Frequently Asked Questions may be helpful.Feel free to contact us if you have any question about Srain.
LicenseGNU General Public License Version 3Quick Start
NOTE: For your information, the following screenshots are taken
under GNOME 3.34.4 with Wayland backed with Arc GTK theme and Breeze
icon theme.
Start SrainAfter the install of Srain, you will find Srain in your applications list, if not, just type srain in your shell to run it. Then you will see Srain's initial interface.[image]
Connect to IRC serverfreenode is a famous IRC network, the official channel of Srain #srain is also hosted on it. Let's start by connecting to freenode.Predefined ServerSrain has a predefined list of commonly used IRC servers, freenode is one of it. If you want to add server into this list, refer to config.Click the connection button on the Srain header bar, select the page "Quick Mode", select the item "freenode" from candidate box with label "Server", enter your nickname, then click the "Connect" button: [image]
If everything goes well, Srain should connected to freenode, then your would see some message from freenode's server: [image]
Custom ServerWhile the server your want to connect to is not listed in the predefined list, switch to the page "Advanced Mode", enter the hostname, port, and etc.NOTE:
Then click the "Connect" button: [image]
Using CommandRefer to commands-server and commands-connect.If you want to automatically execute commands at each time Srain starts, please refer to commands-playground. Join ChannelAfter connecting to freenode, now let's try to join #srain, the official channel of Srain.Directly JoinWhile your has a clear channel to join, such as #srain, just click the join button, select the page "Join Channel", enter the channel name in the input entry with label "Channel", then click the "Join" button:[image]
Now you should joined the channel: [image]
Search ChannelWhile you don't know the exact name of the channel, click the join button, switch to page "Search Channel", click the button with "refresh" icon, Srain should start receiving channel list from server.Then you can enter the keyword or specify the filter conditions to search channel. For example we enter "#s", select the channel you want to join from channe list, then click "Join" button to join it. [image]
NOTE: If the channel requires a join password, try double click
the row of channel.
Using CommandRefer to commands-join.InstallationSrain is available on GNU/Linux, Windows, macOS and BSD.
Dependencies
BuildingYou should install the aboved Dependencies on your platform before the following steps.Firstly, download source code of srain, you can get source code of latest release: $ wget https://github.com/SrainApp/srain/archive/1.3.1.tar.gz $ tar -xvzf 1.3.1.tar.gz $ cd srain-1.3.1 Or get git version: $ git clone https://github.com/SrainApp/srain.git $ cd srain Play with MesonSrain use Meson with ninja backend as its build system. You can build it via the following commands:$ meson setup builddir $ cd builddir $ ninja Install(root privileges required): $ cd builddir # ninja install HTML documentation and manpage are built and installed by default, if you don't need them, just set meson option doc_builders to an empty array when setup: $ meson setup -Ddoc_builders=[] builddir Makefile HelperWe also provide a simple Makefile helper to simplify meson commands. It is convenient for development.$ make # Build srain $ make build # Same as above $ make install # Install srain to prefix under project root $ make run # Run srain with isolated $HOME and XDG Directory $ make debug # Same as `make run`, but with GDB attached $ make inspect # Same as `make run`, but with GtkInspector $ make clean # Remove all compilation and installation result $ make doc # View installed HTML documentation Distribution PackagesGNU/LinuxArch LinuxPackages srain and srain-git (git version) are available on AUR, it is quite easy to install using AUR helper(yay as an example):$ yay -S srain $ yay -S srain-git # git version If you are the user of Arch Linux CN Repository, try: # pacman -S archlinuxcn/srain # pacman -S archlinuxcn/srain-git # git version DebianThere is no srain package in the official repository yet.Pre-built packageWe provide pre-built deb package that you can get it from Github release page.Build byselfCopy the debian folder on srain-contrib to srain folder. Then type following command on your terminal:$ dpkg-buildpackage -b -us -uc Note that the dependencies mentioned above also should be installed. The details could be found on debian/crontrol file. Then install the package (replace package name with the name of your package): $ sudo apt-get install -f ../srain_1.3.1-1_amd64.deb FedoraSrain now in offical repository of fedora, use dnf to install it.# dnf install srain Flatpakcpba is maintaining Flatpak manifest for Srain and The built package is available on Flathub, just execute the following commands to install if you already have flatpak installed: $ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo $ flatpak install flathub im.srain.Srain GentooPlease refers to gentoo portage overlays.openSUSEalois is maintaining openSUSE package for Srain, following this link to install it.WindowsSrain requires Windows 7 or later.Pre-built packageAfter version-1.1.2, we provide Windows portable binary that you can get it from Github release page.Build byselfIf you want to build Srain on Windows youself, you should use the toolchains provided by MSYS2 project.Firstly install MSYS2, then open a MSYS2 shell, install the basic build tools: $ pacman -S base-devel $ pacman -S mingw-w64-i686-toolchain # For 32-bit Windows $ pacman -S mingw-w64-x86_64-toolchain # For 64-bit Windows Then download the package script from MinGW PKGBUILD for Srain, run the following commands at the directory of PKGBUILD: $ MINGW_INSTALLS=mingw32 makepkg-mingw -fsi # For 32-bit Windows $ MINGW_INSTALLS=mingw64 makepkg-mingw -fsi # For 64-bit Windows If everything goes well, Srain is installed under your MinGW prefix. NOTE: If you suffer the "error while loading shared
libraries: xxxx.dll: cannot open shared object file: No such file or
directory" problem when running, please run it in cmd but not msys2
shell, and it will show you real missing library. [1]
macOSWARNING:macOS support of Srain is still experimental.
There is not a distribution package or package script for Srain on macOS, you should build Srain by yourself. Firstly install Homebrew, run the following commands to install dependencies: $ brew install coreutils gcc pkg-config # building $ brew install gettext glib-networking gtk+3 libsoup libconfig openssl adwaita-icon-theme Next, tell pkg-config where to find the libraries we just installed: export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:"/usr/local/opt/icu4c/lib/pkgconfig" export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:"/usr/local/opt/openssl@3/lib/pkgconfig" Then follow the steps in Building. BSDOpenBSDPlease refers to OpenBSD Ports.Commands Manual
PlaygroundUser can run commands in two ways, the one way is typing them into the input entry of chat buffer.The another way is writing the commands to the server.auto-run and chat.auto-run configuration items. For more details, please refer to config. SyntaxA command is a line of string that has the following format, different elements are separated by whitespace:/<name|alias> [subcommand] [<option> [value]]... [argument]... User should use name to invoke a command. The command's name starts with a slash / and doesn't contain any whitespace, such as: /join. Some commands have alias that can be used instead of name, for example, user can use /j instead of /join. NOTE: When you want to send a message starts with a slash,
please prepend another slash to the message. For example, you want to send
"/this is a slash prefixed message", you need to type "//this
is a slash prefixed message".
A subcommand is a instruction behind the command name, it is optional. An option, as its name, is optional too, starts with a hyphen - and may has a value. option is often used as the switch of a flag or a way to change some default values. For example, The command /connect -tls -port 6697, option -tls is just a flag that tells srain use secure connections with TLS. And -port requires a value, if -port is not specified, program will use the default value 6667. Check /connect for more details. If a value starts with a hyphen - or contains whitespaces, it should be enclosed by single quotation mark '. NOTE: All option should appear behind subcommand
(If any), and before argument.
An argument is similar to value, but commonly it doesn't have a default value so it can not be omitted (actually it depends on the implement of the command). If the first argument starts with a hyphen -, it should be enclosed by single quotation mark '. If an argument contains whitespaces, it should be quoted too. Specially, the last argument can contain whitespace without quoted. If you want to use a single quotation mark in a quoted text, use backslash \ to escape it. For backslash itself, use double backslash \\. Available Commands/reloadUsage:/reload Reload user configuration. /serverUsage:/server [connect|disconnect|list] <name> Predefined IRC server management. Sub commands:
Arguments:
/connectUsage:/connect [-port <port>] [-pwd <password>] [-tls] [-tls-noverify] [-user <username>] [-real <realname>] <host> <nick> Create a IRC server and connect to it immediately. Options:
Arguments:
Example: /connect -real 'I am srainbot' -tls -port 6697 chat.freenode.org srainbot /connect 127.0.0.1 srainbot /ignore & /unignoreUsage:/ignore [-cur] <nick> /unignore [-cur] <nick> Ignore/unignore somebody's message. Options:
/query & /unqueryUsage:/query|q <nick> /unquery [nick] Start/stop private chat with somebody. For /unquery , If no nick is specified, it stops the current private chat. /joinUsage:/join|j <channel>[,<channel>]... [<passwd>[,<passwd>]]... Join specified channel(s), channels are separated by commas ,. Example: /join #archinux-cn,#gzlug,#linuxba /join #channel1,#channe2 passwd1 /partUsage:/part|leave [<channel>[,<channel>]]... [<reason>] Leave specified channel(s) with optional reason, channels are separated by commas ,. If no channel is specified, it leaves the current channel. Example: /part #archinux-cn Zzz... /part #archlinux-cn,#tuna /part /quitUsage:/quit [reason] Quit current server with optional reason. /topicUsage:/topic [-rm|<topic>] Set the current channel's topic. If no topic specified, it just displays the current channel's topic.
Example: # Just view the topic /topic # Set the topic to "Welcome to Srain!" /topic Welcome to Srain! # Clear the topic /topic -rm /msgUsage:/msg|m <target> <message> Send message to a target, the target can be channel or somebody's nick. If you want to send a message to channel, you should /join it first. /meUsage:/me <message> Send an action message to the current target. /nickUsage:/nick <new_nick> Change your nickname. /whoisUsage:/whois <nick> Get somebody's information on the server. /inviteUsage:/invite <nick> [channel] Invite somebody to join a channel. If no channel is specified, it falls back to current channel. /kickUsage:/kick <nick> [channel] [reason] Kick somebody from a channel, with optional reason. If no channel is specified, it falls back to current channel. /modeUsage:/mode <target> <mode> Change target 's mode. /ctcpUsage:/ctcp <target> <command> [message] Send a CTCP request to target. The commonly used commands are: CLIENTINFO, FINGER, PING, SOURCE, TIME, VERSION, USERINFO. For the detail of each command, please refer to https://modern.ircdocs.horse/ctcp.html . If you send a CTCP PING request without message, you will get the latency between the target. NOTE: DCC is not yet supported.
/patternUsage:/pattern add <name> <pattern> /pattern rm <name> /pattern list Regular expression pattern management. The added pattern can be used elsewhere in the application, such as /filter & /unfilter and /render & /unrender. Sub commands:
Arguments:
/filter & /unfilterUsage:/filter [-cur] <pattern> /unfilter [-cur] <pattern> Filter message whose content matches specified pattern. Options:
Arguments:
Example: This filter message that content is "Why GTK and not Qt?": /pattern add troll ^Why GTK and not Qt\?$ /filter troll To cancel the filter of these kind of message, use: /unfilter troll NOTE: Pattern NO NEED to consider the case where the
mIRC color code is included in the message.
/render & /unrenderUsage:/render [-cur] <nick> <pattern> /unrender [-cur] <nick> <pattern> Render message of specific user via specific pattern. The given pattern should contains specific Named Subpatterns used for capturing message fragment from original message content and become part of rendered message. There are list of available named subpatterns:
Arguments:
Options:
Example: We assume that there is a IRC bot named "xmppbot". It forwards message between XMPP and IRC. On IRC side, the forwarded message looks like "<xmppbot> [xmpp_user] xmpp_message", you can render it to a more easy-to-read format via the following commands: /pattern add xmpp \[(?<sender>[^:]+?)\] (?<content>.*) /render xmppbot xmpp The forwarded meessage will look like "<xmpp_user> xmpp_message", and the original message sender "xmppbot" will be displayed as message remark. Please refer to faq-relay-message-transform see its effect. NOTE: Pattern SHOULD consider the case where the mIRC
color code is included in the message.
/quoteUsage:/quote <raw message> For sending special IRC commands. New in version 1.2.0. Obsoleted Commands/rignore & /unrignoreThis command has been dropped since version-1.0.0rc5, please use /filter & /unfilter instead./relay & /unrelayThis command has been dropped since version-1.0.0rc5, please use /render & /unrender instead.Configuration ManualSrain uses Libconfig to process configuration file.
Configuration FileThe path of system wide configuration file builtin.cfg depends on the compile flag --sysconfdir, default to be /etc/srain.The path of user wide configuration file srain.cfg is $XDG_CONFIG_HOME/srain, usually it is ~/.config/srain (~/.var/app/im.srain.Srain for flatpak installs). The difference between system wide and user wide configuration file is the priority, The user wide configuration always overwrite the one in system wide configuration. For more details about priority, refer to Priority and Fallback. SyntaxFor the syntax of configuration file, please refer to Libconfig's documentation: Configuration FilesFor an example configuration, refer to All Configurable Items. Priority and FallbackA group is a collection of configurations. The same group in different place have different priority.server: { # A top level ``server`` group # ... user = {} default-messages = {} irc = {} chat = { } # A ``chat`` group directly in ``server`` chat-list = ( { }, # A ``chat`` group in ``chat-list`` # ... ) } server-list: ( { }, # A ``server`` group in ``server-list`` # ... ) For example, A server group contains the information(not all) of connection to IRC servers. server group can appear at the top level of configuration file, or be an element of server-list list with a unique name. The top level server is often used to specify the global configuration, and server-list is used to specify specified IRC servers. The configuration in server-list can overwrite the top level server, and if an option is not specified in server-list, It will fallback to server. Another similar group is chat, chat contains configuration of chat panel, such as whether to show topic, whether to save chat log and etc. Every server group can contain a chat group and a chat-list list. Elements in chat-list are also identified with an unique name. As same as the relationship between top level server and server-list, chat-list is used to specify a specified chat and has higher priority. As mentioned above, The priority of user configuration is always higher than system's, so we can get the priority sorting of server and chat group: server-list(user) > top level server(user) > server-list(system) > top level server(system) chat-list in server-list(user) > chat in server-list(user) > chat-list in top level server(user) > chat in top level server(user) > chat-list in server-list(system) > chat in server-list(system) > chat-list in top level server(system) > chat in top level server(system) All Configurable ItemsHere is the default system wide configuration file used by Srain, all configurable items are already listed here. you can make a copy as your user configuration file, but note:
# Srain built-in configuration file # Application configuration. version = "1.0.0rc5" # String; Every configuration file should have a # version, altough it is not used yet # id = "im.srain.Srain" # The identifier for Srain theme = "default-bubble" # String; Theme; Available values: default csd = true # Bool; Whether enable Client-Side Decoration send-on-ctrl-enter = false # Bool; Send messsage on CTRL+Enter pressed exit-on-close = false # Bool; Exit program on main window closed auto-connect = [] # String array; Servers that are auto connected # after startup # If you want to report/fix a bug, terminal log will be helpful. log = { prompt-color = true # Bool; Colorful output prompt-file = false # Bool; Display the filename of the file which log # statement is located prompt-function = true # Bool; As aboved, function name prompt-line = false # Bool; As aboved, line number # String array; Specify the log level of a group of files debug-targets = [] # Files with debug log level info-targets = [] # Files with information log level warn-targets = [""] # Files with warning log level error-targets = [] # Files with error" log level } # Global IRC Server configuration, this group can also appear in server-list. server = { auto-join = [] # String array; Chats that are auto joined after server # is created auto-run = [] # String array; Commands that are auto run after server # is created user = { nickname = "SrainUser" username = "Srain" realname = "Can you can a can?" login: { method = "none" # String; Login method; Available values: # - none: No login method, default value # - nickserv: Login with NICKSERV command # - msg-nickserv: Login with /msg NickServ identify # - sasl-plain: Login with SASL PLAIN mechanism # - sasl-ecdsa: Login with SASL # ECDSA-NIST256P-CHALLENGE mechanism # For method "sasl-ecdsa" # certificate = "" # String; Path to login certificate file } # Default messages for performing specified action part-message = "Leaving." kick-message = "Kick." away-message = "Away from keyboard." quit-message = "El Psy Congroo." } # Chat configuration, this group can also appear in chat-list. chat = { log = true # Bool; Persistent chat log to storage notify = true # Bool; Send notification when you are # mentioned by others or receiving any # ERROR message notify-all = true # Bool; Send notification when receiving # any PRIVMSG/ACTION/NOTIFY/ERROR message show-topic = true # Bool; Show topic show-avatar = false # Bool; Show user avater show-user-list = true # Bool; Show user list render-mirc-color = true # Bool; Render mirc color nick-completion-suffix = ":" # String; Suffix of completed nick name # e.g. "nick: msg" preview-url = true # Bool; Show previewer for every URL auto-preview-url = true # Bool; Automatically preview supported URL auto-run = [] # String array; Commands that are auto run after # chat is created } # Specified chat configuration, every element in list should have a unique # ``name``. chat-list = ( { # ``name`` is necessary for a ``chat`` group in ``chat-list``. name = "#srain" show-topic = true } ) } # Specified server configuration, every element in list should have a unique # "name". server-list = ( { # ``name``, ``addresses`` are necessary for a ``server`` group # in ``server-list``, otherwise you can not connect to it. name = "Libera Chat" # String; The unique name of server addresses = [ "irc.libera.chat:6697" ] # String array; Addresses of IRC server, # each address follows the format of # <host>[:<port>]. The port can be omitted, # default 6667 for non-TLS and 6697 for TLS tls = true # Bool; Connect with TLS encryption # tls-noverify = false # Bool; Connect with TLS encryption but without # certificate verification, only used while # connecting to a self-signed certificate # verified server encoding = "utf-8" # String; Encoding of IRC server, to get # all available value of encoding, check the # output of ``iconv --list`` # ipv6 = false # Use IPv6 connection, not yet supported }, { name = "GIMPNet" addresses = ["irc.gimp.org:6697", "irc.gnome.org:6697"] tls = true encoding = "utf-8" }, { name = "OFTC" addresses = ["irc.oftc.net:6697"] tls = true encoding = "utf-8" }, { name = "hackint" addresses = ["irc.hackint.org:6697"] tls = true encoding = "utf-8" }, { name = "Rizon" addresses = ["irc.rizon.net:6697"] tls = true encoding = "utf-8" }, { name = "DALnet" addresses = [ "irc.dal.net:6697", "agility.nl.eu.dal.net:6697", "bifrost.ca.us.dal.net:6697", "bitcoin.uk.eu.dal.net:6697", "choopa.nj.us.dal.net:6697", "diamond.hub.dal.net:6697", "fidelity.tx.us.dal.net:6697", "foxtrot.hub.dal.net:6697", "halcyon.il.us.dal.net:6697", "hash.ix.nl.dal.net:6697", "hoon.ix.au.dal.net:6697", "istana.ix.sg.dal.net:6697", "jingo.ix.us.dal.net:6697", "karsk.ix.eu.dal.net:6697", "kiwi.ix.nz.dal.net:6697", "koala.vc.au.dal.net:6697", "laud.ix.us.dal.net:6697", "loyalty.ix.us.dal.net:6697", "merlin.hub.dal.net:6697", "midnight.hub.dal.net:6697", "ninja.hub.dal.net:6697", "nonstop.ix.me.dal.net:6697", "oi.ix.au.dal.net:6697", "oper-e.dal.net:6697", "paradigm.hub.dal.net:6697", "powertech.no.eu.dal.net:6697", "punch.wa.us.dal.net:6697", "rangers.ix.us.dal.net:6697", "redemption.ix.us.dal.net:6697", "renew.hub.dal.net:6697", "smurf.hub.dal.net:6697", "underworld.se.eu.dal.net:6697", "uworld.hub.dal.net:6697" ] tls = true encoding = "utf-8" }, { name = "EFnet" addresses = [ "irc.efnet.fr:6667", "efnet.port80.se:6697", "efnet.portlane.se:6667", "irc.du.se:6667", "irc.homelien.no:6667", "irc.inet.tele.dk:6667", "irc.nordunet.se:6667", "irc.underworld.no:6667", "irc.choopa.net:6697", "irc.colosolutions.net:6667", "irc.mzima.net:6667", "irc.prison.netirc.servercentral.net:6667" ] tls = false encoding = "utf-8" }, { name = "IRCnet" addresses = [ "irc.ssl.ircnet.com:6697", "irc.ircnet.com:6667", "irc.at.ircnet.com:6667", "irc.be.ircnet.com:6667", "irc.cz.ircnet.com:6667", "irc.dk.ircnet.com:6667", "irc.ee.ircnet.com:6667", "irc.fi.ircnet.com:6667", "irc.fr.ircnet.com:6667", "irc.de.ircnet.com:6667", "irc.hu.ircnet.com:6667", "irc.it.ircnet.com:6667", "irc.jp.ircnet.com:6667", "irc.nl.ircnet.com:6667", "irc.no.ircnet.com:6667", "irc.pl.ircnet.com:6667", "irc.si.ircnet.com:6667", "irc.se.ircnet.com:6667", "irc.us.ircnet.com:6667" ] tls = false encoding = "utf-8" }, { name = "Undernet" addresses = [ "irc.undernet.org:6667", "ix1.undernet.org:6667", "ix2.undernet.org:6667", "ashburn.va.us.undernet.org:6667", "bucharest.ro.eu.undernet.org:6667", "budapest.hu.eu.undernet.org:6667", "chicago.il.us.undernet.org:6667" ] tls = false encoding = "utf-8" }, { name = "QuakeNet" addresses = [ "irc.quakenet.org:6667", "dreamhack.se.quakenet.org:6667", "euroserv.fr.quakenet.org:6667", "irc.ipv6.quakenet.org:6667", "port80a.se.quakenet.org:6667", "port80b.se.quakenet.org:6667", "port80c.se.quakenet.org:6667", "portlane.se.quakenet.org:6667", "servercentral.il.us.quakenet.org:6667", "underworld1.no.quakenet.org:6667" ] tls = false encoding = "utf-8" }, { name = "freenode" addresses = [ "irc.freenode.net:6697", "chat.freenode.net:6697", "irc.freenode.org:6697", "chat.freenode.org:6697" ] tls = true encoding = "utf-8" }, { name = "localhost" addresses = ["localhost:6667", "127.0.0.1:6667"] tls = false } # TODO: More predefined servers ) Development Specificationint bus_count = 1; Codeing Style
MiscellaneousHot Keys
NOTE: Customized hot keys will be supported in the
future.
Chat LogsChat logs is enabled by default, log files are located at $XDG_DATA_HOME/srain/logs, usually it is ~/.local/share/srain/logs.Insert EmojisClick the emoji button or use shortcuts Ctrl+. or Ctrl+;.[image] Emoji button.UNINDENT
New in version 1.3. Frequently Asked QuestionsFrequently asked questions are listed here, you can visit issue page to see more questions that asked by our users.
Does Srain support Windows?Yes, please refer to install-packages-windows.What is relay message transform ?There are many relay bots forward messages from other IM to IRC network, "Relay message transform" make these messages easier to read.For example, there is a telegram bot named "telegram", the words in brackets is the named of the telegram user. [image]
Run command /pattern add normal-relay \[(?<sender>[^:]+?)\] (?<content>.*) and /render telegram normal-relay, you get: [image]
For more details, please refer to commands-pattern and commands-render. Where are the log files?Refer to misc-chat-logs.How can I send message which has a slash("/") prefixed?Please prepend another slash to the message.Refer to commands-syntax. How can I remove my stored password?Just leave the password entry empty and check the "Remember password" checkbox before connect to server or join channel, the corresponding password will be removed.Or you can use secret-tool (provided by libsecret) to manage all your stored passwords. How can I hide JOIN/PART messages of channel?So far, Srain has not yet a specialized option for hiding such messages. You can use write regular expression to filter them:/pattern add filter-join ^\w+ has joined$ /filter filter-join /pattern add filter-part ^\w+ has left: .*$ /filter filter-part NOTE: The content of regular expression depends on your
language.
Why can't I login to my ZNC server?According ZNC's FAQ, way 2, supply your "user@phone/network:pass" (without quotes) in the server password field. Other as usual.NOTE: Way 1 in ZNC's FAQ requires username field can be
set via connection panel, which will be supported by Srain in the
future.
Change Log
2021-12-18 Version 1.3.1
2021-09-23 Version 1.3.0
2021-07-18 Version 1.2.4
2021-06-26 Version 1.2.3
2021-05-30 Version 1.2.2
2021-04-02 Version 1.2.1
2021-02-28 Version 1.2.0
2020-10-01 Version 1.1.3
2020-08-10 Version 1.1.2NOTE:This release contains only improvement for MS Windows,
user of other platform can ignore it.
2020-06-27 Version 1.1.1
2020-05-24 Version 1.1.0
2020-04-11 Version 1.0.2
2020-03-14 Version 1.0.1
2020-02-24 Version 1.0.0
NOTE: 1.0.0 is the first stable release of Srain, enjoy!
2019-10-07 Version 1.0.0rc9999
2019-06-14 Version 1.0.0rc5
2019-05-13 Version 1.0.0rc4
2019-04-14 Version 1.0.0rc32019-01-24 Version 1.0.0rc22018-09-10 Version 1.0.0rc12018-02-28 Version 0.06.4
2017-12-22 Version 0.06.3
2017-09-12 Version 0.06.2
2017-08-18 Version 0.06.1
2017-07-29 Version 0.06
2016-09-19 Version 0.05.1
2016-08-27 Version 0.05
2016-04-30 Version 0.03
NOTE: 0.03 is a pre-release, some functions are no completed
yet. it also has some undetected bugs.
2016-04-13 Version 0.02
NOTE: 0.02 is a pre-release, some functions are no completed
yet. it also has some undetected bugs.
2016-04-07 Version 0.01
NOTE: 0.01 is a pre-release, some functions are no completed
yet. it also has some undetected bugs.
Support Tables
Basic IRC Client Support
Client-to-Client Protocol (CTCP) Support
IRCv3 Client Support
INDICES AND TABLES
AUTHORShengyu ZhangCOPYRIGHT2021, Shengyu Zhang
Visit the GSP FreeBSD Man Page Interface. |