Fork 0

rest of the ~rewrite?

git-svn-id: http://svn.irssi.org/repos/irssi/trunk@172 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2000-04-26 08:10:09 +00:00 committed by cras
parent c95034c6de
commit d29ca0b107
32 changed files with 2049 additions and 1536 deletions

View File

@ -23,9 +23,6 @@ if HAVE_GNOME
desktopdir = $(datadir)/gnome/apps/Internet
desktop_DATA = irssi.desktop
corbadir = $(sysconfdir)/CORBA/servers
corba_DATA = irssi.gnorba
@ -33,6 +30,8 @@ endif
confdir = $(sysconfdir)/irssi
conf_DATA = config colorless.theme split.theme
noinst_HEADERS = irssi-version.h
autogen.sh \
@ -40,9 +39,8 @@ EXTRA_DIST = \
file2header.sh \
irssi.spec \
$(conf_DATA) \
$(pixmaps_DATA) \
$(corba_DATA) \
irssi.gnorba \
## make rpms
rpm: Makefile

View File

@ -1,8 +1,14 @@
v0.7.90 2000-04-xx Timo Sirainen <tss@iki.fi>
* On the way to 0.8.0 .. Major rewriting/rearranging code. There's
some changes in behaviour because I'm trying to make Irssi a bit
more compatible with EPIC.
some changes in behaviour because I'm trying to make Irssi
compatible with EPIC as much as possible (except the scripting,
perl should be enough?)
* Irssi isn't anymore IRC specific client, you could easily take the
whole IRC part away and use some other chat protocol instead, or
use both at the same time. Currently however, only IRC protocol
is supported. See docs/design.txt for more information.
* libPropList isn't needed anymore - I'm using my own configuration
library. This is mostly because different proplists worked a bit
@ -32,16 +38,125 @@ v0.7.90 2000-04-xx Timo Sirainen <tss@iki.fi>
And finally I'm also using `const' all over the place.
* Signal handlers changed - you don't anymore return value 0 if you
wish to stop signal. Instead use signal_stop() or
+ Flood protection when sending commands to server works now better.
It allows sending first 5 messages immediately, but after that
only one message is sent every 2.2 seconds.
This is the same flood protection that most IRC servers use, so
the only affect this protection has is that when sending a lot of
commands to server you won't get kicked out from server because of
"excessive flood".
This can be changed from settings `cmd_max_at_once' and
`cmd_queue_speed'. If you want to disable this for some reason, use
/SET cmd_queue_speed 0
+ /EVAL <commands> - Expand all the special variables from string and
run it. Commands can be split with ; character. See
docs/SPECIAL_VARS for more info.
docs/special_vars.txt for more info.
+ Aliases are parsed just like /EVAL - arguments are in $0..$9.
+ Text formats are also parsed like /EVAL, arguments used to be in
$1..$9, now they're in $0..$8 so it messes up existing themes..
+ /SET [key [value]] - no more the '=' character. Boolean values
also need to be changed with ON/OFF/TOGGLE values (not yes/no).
Settings aren't saved to disk until you use /SAVE.
+ /SAVE [<filename>] - saves the settings to disk.
/REHASH [<filename>] - re-read the configuration file on the fly
+ /TOGGLE <key> [ON/OFF] - same as /SET <key> TOGGLE
+ /ALIAS [-]<alias> [<command>], /UNALIAS <alias>
Show, add or remove aliases. /ALIAS -alias = /UNALIAS alias
+ /NOTIFY [-list] [-away] [-idle [minutes]] <mask> [ircnet [ircnet...]]
-away notifies about away-status changes
-idle notifies if idle time is first larger than `minutes'
(default is hour) and then it drops down.
-list lists the notify list entries with all their settings
/UNNOTIFY <mask>
/NOTIFY without any arguments displays if the people in notify
list are online or offline.
+ /HILIGHT [-nick | -regexp | -word] [-color <color>]
[-level <level>] [-channels <channels>] <text>
-nick: match only for nick
-regexp: `text' is a regular expression
-word: `text' must match to full words
-color: print the reply with `color' - color can be a bold (^B),
underline (^_) etc. too
-level: match only for `level' messages, default is
-channels: match only in `channels'
/DEHILIGHT <ref#> | <text>
+ /LASTLOG [-] [-new] [-regexp | -word] [-<level> [...]]
[<pattern>] [<count> [<start>]]
-: don't print the "Lastlog:" and "End of Lastlog" messages.
-new: show only lines since last /LASTLOG
-regexp: `text' is a regular expression
-word: `text' must match to full words
-level: what levels to check, like -public -msgs (default is all)
<pattern>: text to search for, or all if empty
<count>: maximum number of lines to show
<start>: skip the last `start' lines
+ /IGNORE [-regexp | -word] [-pattern <pattern>] [-except]
[-channels <channel>] <mask> <levels> <^levels>
-regexp: `pattern' is a regular expression
-word: `pattern' must match to full words
-pattern: <pattern> must match to the message's text
-except: *DON'T* ignore
-channels: ignore only in channels
<mask>: either a nick mask or list of channels
<levels>: list of levels to ignore
<^levels>: list of levels to NOT ignore
(/ignore -except nick notices = /ignore nick ^notices)
/UNIGNORE <ref#> | <mask>
The best match always wins, so you can have:
/IGNORE -except *!*@host.org CTCPS
+ /LOG OPEN [-noopen] [-autoopen] [-channels <channels>] [-window]
[-rotate hour|day|month] <filename> [<levels>]
-noopen: create the entry to log list, but don't start logging
-autoopen: automatically open this log file at startup
-channels: log only in specified channels/nicks
-window: Log this window
-rotate: Reopen the log file every hour, day or month. This
makes only sense if you specify date/time formats
to file name.
<filename>: File name where to log, it is parsed with strftime(),
so %d=day, etc. see "man strftime" for more info.
<levels>: Defaults to ALL
/LOG CLOSE <ref#> | <fname> - close log and remove from log list
/LOG START <ref#> | <fname> - start logging to file
/LOG STOP <ref#> | <fname> - stop logging to file
/LOG - display the log list
NOTE: Log files are locked after opened, so two irssi's can't
accidentally try to write to same log file.
+ /WINDOW LOG ON|OFF|TOGGLE [<filename>]
Start/stop logging window, same as /LOG OPEN -window. If file name
isn't given, it defaults to ~/irc.log.<windowname> or
~/irc.log.Window<ref#> if window doesn't have name.
/WINDOW LOGFILE <filename>
Creates the entry to log list, same as /LOG OPEN -window -noopen.
Also, if /WINDOW LOG ON is used it starts logging to this file.
/SET AUTOLOG_PATH <path> - expandos can be used, $0 is the target.
Enables automatic logging, files are automatically created as
needed and after some time of inactivity, they are closed. If you
are using multiple servers, it makes sense to use the server tag
as part of the file name, for example ~/irclogs/$tag/$0.log (this
is the default).
+ /SET window_auto_change - if enabled, irssi will automatically
change to automatically created windows (like queries). It will
also clear your command line and put it to command history so that
you don't accidentally write anything to wrong window. You'll get
the command back by pressing up arrow.
+ /SET show_quit_once - show quit message only once instead of in
all channel windows the nick was joined.
+ Server reconnections work better. It will now automatically set
your previous user mode and away message (and rejoin the channels,
which it already did before) after reconnected. If you use /SERVER
to connect to different IRC network, none of this will be done.
v0.7.28 2000-03-11 Timo Sirainen <tss@iki.fi>

View File

@ -94,6 +94,7 @@ There's also some others, you can get a full list with ./configure --help
--port -p <port> - specify port
--noconnect -! Don't autoconnect to any servers at startup
--nick -n Specify what nick to use
--hostname -h Specify what host name to use

View File

@ -1,40 +1,34 @@
- notifylist ei toimi, /ALIAS, /IGNORE
- g_strndup() !!!!! auttaa varmaan vaikka missä
- server-specific source_host
- rikki:
- dcc
- gnome versio..
- pluginit, perlskriptit
- teemat (toimiiko ne edes?)
- teeman vaihto tekstiversiolla, tekstien muuttaminen tekstiversiolla
- teemoihin tee jotain pientä selitystä edes!
- irssi can't find new themes in ~/.irssi/ while running - scan for new
themes when opening themes dialog? irssi-text also needs to be restarted
to use new themes..
- use different themes in different channels/queries?
- logi voisi käyttää omaa teemaa
- mites se awaylogi?
- /WALL, ja sen replyt
- /ON
- /CAT
- servereiden ja ircnettien asetusten käpistelyyn jotkut käskyt
- curses sijainti jotain rikkoo
Day changed to 30-26 2000
[00:10] .. [00:20]
- "away mode changed"
- dcc on särki
- /server +blah tekis uuden ikkunan.
- /msg =dcc_chatti,#kanava .. ei pelaa tollanen. voisi laittaa coreen tuon
ja jotain hookkeja et eri chattiprotoille voisi vaikka mennä se teksti..
ctcp:lle sama?
- who ja listiin ne eri vipuset
[17:37] -!- Magi [^magi@magi.yok.utu.fi] has quit IRC [Killed (Uni-Stuttgart.DE ((^magi@magi.yok.utu.fi)GMD.DE <- (.@vipek-IV.vip.net.pl)*.pl[ircd@hub.irc.pl]))]
:Magi!^magi@magi.yok.utu.fi QUIT :
Kalled (gart.DE ((^magi@magi.yok.utu.fi)GMD.DE <- (.@vipek-IV.vip.net.pl)*.pl[ircd@hub.irc.pl]))
-teemoihin tee jotain pientä selitystä edes!
- alt+left/right vaihtaa kanavaa..
- checkkaa miten ne autojoin_channelsit nyt meni.. että vapautetaan ym.
- raiseta ikkuna jossa on tekstiä mut ei over aktiivisen päälle
- line-split.c: varmista että se 64k limitti toimii eikä esim. kaada!
- vaihda /set nimet järkevimmiksi
- optio että vaihtaa automaagisesti sinne autocreatettuun ikkunaan. tyhjennä
entry (laita historyyn) ettei uusi rivi mene query ikkunaan suoraan vahingossa.
- "älä näytä n. sekunttia pienempää lagia"
- cmd line switchi source hostille
- autojoinikaan ei tunnu oikein pelaavan..? vain kun vaihtuu serveri
- quit näytettäisiin vaan yhdessä ikkunassa.
- /exec
- optionaalisesti voisi niitä logeja ajella siinä toisessa irssisessiossa
- msg:issä kun tulee sitä away viestiä näyttäisi vaan kerran..
- logrotate
- ignoroida tietyt ctcpt. regexpit. ignorettaa tekstiä ..
egopallo/#tv.fi CANAL|MAFIA|...
- autorun.ircnet
- flood protectionia paremmaksi
- bottipluginiin tms. .. channel not available tms. rejoini
*** Bugs
@ -44,11 +38,9 @@ entry (laita historyyn) ettei uusi rivi mene query ikkunaan suoraan vahingossa.
channels that were joined in previous server. If IRC network is different
than in previous server it shouldn't join the channels..
- some problems when using multiple windows with focus being all the time in
one of the windows and it can't be changed to different window?!
one of the windows and it can't be changed to different window?! Probably
has something to do with click to focus.
- split windows are buggy, destroying them doesn't really work well..
- irssi can't find new themes in ~/.irssi/ while running - scan for new
themes when opening themes dialog? irssi-text also needs to be restarted
to use new themes..
- mirc ctcp togglemenuitem isn't updated right
- multiple dcc connections from different irc networks from same nick
doesn't work. Maybe create "server nick" and "refer nick" variables to
@ -62,18 +54,9 @@ entry (laita historyyn) ettei uusi rivi mene query ikkunaan suoraan vahingossa.
activity for example .. make some generic flag for items to use.
- "you have new mail"
- active server tag somewhere in window
- word wrapping doesn't work perfectly, if colors/bolds/etc are used, they're
treated as spaces. So things like (<newline>blah blah) can happen (/who)
*** Big things
- Complete modularisation of everything, split irc-extra, ui-common and
gui-* (gui especially) into separate logical components. The modules would
have init(), deinit(), save_state() and restore_state() - save/restore
should save as much as possible so that it would be possible to restart the
whole base system. Like when upgrading to newer version you wouldn't need
to quit irc at all :)
- session saving thing.. specify what channels/queries/dcc chats to open in
which window (real/tabbed/in same window with some other), what irc net
channels goes to where, what channels/queries to open at startup, etc.
@ -107,30 +90,13 @@ entry (laita historyyn) ettei uusi rivi mene query ikkunaan suoraan vahingossa.
*** Needs rethinking ..
* Logging, check how ircii logging works and try to do everything that it
can do ;) currently logging is done by directly writing to disk things
that are displayed in screen, it could instead (optionally) print things
simply as "JOIN #blah nick (a@b.c)".
... just make a different theme for logging to use? ..
- log option: add the open/close time to log
- log directory, automatically log all channels and queries there
- overwrite/append
- all windows, just queries, only the channels in channel list
- you can be joined to same channels in different irc networks (or even
the same ircnet!) - create the logs to different directiories/names
- logging: longer format dd.mm.yy hh:mm:ss (configurable?)
* Notify list, join the two different dialogs, ability to track changes in
gone flag
* Notify list, join the two different dialogs
- _one_ popup dialog could open which lists all nicks in notifylist, maybe
sorted by arrival time, display the dates, latest joined could be with
different color? etc.
- nick-specific options:
- check for gone-flag changes (use userhosts instead of isons)
- nick-specific options:
- pop up the dialog
- run some command (like /exec as soon as I get that done :)
- dialog: keep track of hosts/realnames so after closing and opening the
dialog again they would show up..
* common api for statusbar handling
- it should work just as well in text mode and gui, colors could be done
@ -144,11 +110,9 @@ entry (laita historyyn) ettei uusi rivi mene query ikkunaan suoraan vahingossa.
*** Little things
- reload configuration file on the fly
- /savewindows - save the current channel/query positions to file and
load them at startup.
- multi-DCC - open multiple sockets to transfer the file
- re-set away message when reconnecting to server
- autoaway when idling
- nickserv support (automatic /msg nickserv identify password)
- /exec
@ -168,25 +132,19 @@ entry (laita historyyn) ettei uusi rivi mene query ikkunaan suoraan vahingossa.
who are away and who are not.. optionally it could instead just watch if
someone hasn't written anything to channel in n minutes and mark it "away"
to nicklist.
- use different themes in different channels/queries?
- /connect ircnet could connect to ircnet
- change some GLists to GHashTables, aliases at least
- check new irssi versions with http rather than with irssibot..
- implement requesting files with DCC GET from remote client for dcc file
servers. good for people behind firewalls.
- use different nicks/realnames in different irc networks
- gnome statubar:
- clock?
- dcc transfer meter (gtk progressbar)
- you could configure which events (whois, notify, etc.) to show in what
windows (all, current, status, msgs)
- gui for configuring plugin specific theme format texts
- dcc send: allow selection of multiple files to send (also for dnd from
gmc!) Allow dropping files to anywhere in irssi.
- /timer, /clones
- display net splits?
- regexp for hilighting words?
- subcommands (dcc, window, ..) could use common function instead of copy and
pasting the same function all the time and modifying just two words...
- {}|~ are same as []\^ (not in all irc networks) - does this really affect
irssi at all..?

View File

@ -14,4 +14,13 @@ PKG_NAME="Irssi"
exit 1
# get versions
version=`cat configure.in|grep AM_INIT_AUTOMAKE|sed 's/[^,]*, \([^\)]*\).*/\1/'`
version_date=`date +%Y%m%d`
echo "/* automatically created by autogen.sh */" > irssi-version.h
echo "#define IRSSI_VERSION \"$version\"" >> irssi-version.h
echo "#define IRSSI_VERSION_DATE \"$version_date\"" >> irssi-version.h
. $srcdir/macros/autogen.sh

View File

@ -9,13 +9,12 @@ setupservers = (
ircnets = (
{name = IRCNet; max_kicks = 4; max_modes = 3; max_msgs = 5;},
{name = IRCNet; max_kicks = 4; max_modes = 3; max_msgs = 5; max_whois = 4;},
{name = EFNet; max_kicks = 4; max_modes = 4; max_msgs = 3;},
{name = Undernet; max_kicks = 4; max_modes = 3; max_msgs = 3;},
{name = DALNet; max_kicks = 4; max_modes = 6; max_msgs = 3;},
{name = OPN; max_kicks = 1; max_modes = 6; max_msgs = 100;},
{name = PTlink; max_kicks = 1; max_modes = 6; max_msgs = 100;},
{name = Multichat; max_kicks = 1; max_modes = 6; max_msgs = 100;}
{name = PTlink; max_kicks = 1; max_modes = 6; max_msgs = 100;}
channels = (
@ -25,29 +24,36 @@ channels = (
autojoin = No;
aliases = (
{alias = J; command = "join";},
{alias = LEAVE; command = "part";},
{alias = BYE; command = "quit";},
{alias = WI; command = "whois";},
{alias = WII; command = "whois $0 $0";},
{alias = WW; command = "whowas";},
{alias = W; command = "who $C";},
{alias = N; command = "names $C";},
{alias = M; command = "msg";},
{alias = T; command = "topic";},
{alias = C; command = "clear";},
{alias = CL; command = "clear";},
{alias = K; command = "kick";},
{alias = KB; command = "kickban";},
{alias = KN; command = "knockout";},
{alias = B; command = "ban";},
{alias = UB; command = "unban";},
{alias = IG; command = "ignore";},
{alias = UNIG; command = "unignore";},
{alias = SB; command = "scrollback";},
{alias = UMODE; command = "mode $N";}
aliases = {
J = "join";
LEAVE = "part";
BYE = "quit";
EXIT = "quit";
SIGNOFF = "quit";
DESCRIBE = "action";
DATE = "time";
HOST = "userhost";
LAST = "lastlog";
SAY = "msg *";
WI = "whois";
WII = "whois $0 $0";
WW = "whowas";
W = "who $C";
N = "names $C";
M = "msg";
T = "topic";
C = "clear";
CL = "clear";
K = "kick";
KB = "kickban";
KN = "knockout";
B = "ban";
UB = "unban";
IG = "ignore";
UNIG = "unignore";
SB = "scrollback";
UMODE = "mode $N";
popups = (
{label = "<MULTICOMMA>Whois"; command = "/whois %s";},
{label = "DCC Send File"; command = "/dcc send %s";},

View File

@ -1,7 +1,7 @@
AM_INIT_AUTOMAKE(irssi, 0.7.28)
AM_INIT_AUTOMAKE(irssi, 0.7.90)
@ -194,7 +194,7 @@ dnl **
dnl ** just some generic stuff...
dnl **
AC_CHECK_FUNCS(mkfifo fcntl)
AC_CHECK_LIB(socket, socket, [
@ -312,7 +312,7 @@ AC_SUBST(GUI_CFLAGS)
dnl **
dnl ** gui-text checks
dnl ** fe-text checks
dnl **
AM_PATH_GLIB(1.2.0,,, gmodule)
@ -397,6 +397,22 @@ AM_CONDITIONAL(HAVE_PERL, test "$want_perl" = "yes")
dnl **
dnl ** Keep all the libraries here so each frontend doesn't need to
dnl ** keep track of them all
dnl **
CORE_LIBS="../core/libcore.la ../lib-config/libirssi_config.la"
IRC_LIBS="../irc/libirc.la ../irc/core/libirc_core.la ../irc/dcc/libirc_dcc.la ../irc/flood/libirc_flood.la ../irc/notifylist/libirc_notifylist.la"
FE_COMMON_LIBS="../fe-common/core/libfe_common_core.la ../fe-common/irc/libfe_common_irc.la ../fe-common/irc/notifylist/libfe_common_irc_notifylist.la ../fe-common/irc/dcc/libfe_common_irc_dcc.la ../fe-common/irc/flood/libfe_common_irc_flood.la"
dnl ** common libraries needed by frontends
dnl **
dnl ** memory debugging
dnl **
@ -427,18 +443,28 @@ po/Makefile.in
@ -451,8 +477,6 @@ plugins/proxy/Makefile

View File

@ -1,387 +0,0 @@
** Some definitions
"Level" usually means that you can use these words there:
CRAP - Can be almost anything
PUB - Public messages in channel
MSGS - Private messages
CHAN - Channel messages: joins, parts, quits, etc.
NOTICES - Notices
SNOTES - Notices from server
WALLOPS - Wallops
ACTIONS - Actions (/me)
DCC - DCC messages
CTCP - CTCP messages
HILIGHT - Hilighted text
CLIENTNOTICES - Irssi's notices
CLIENTERRORS - Irssi's error messages
** Server handling
CONNECT <address> [port [password [nick]]]
Connect to specified server, if there's no password set it to -
DISCONNECT <* / tag> [message]
Disconnect from server
SERVER <address> [port [password [nick]]]
Disconnect from current server and connect to new one
Display a list of servers
Remove all servers from reconnection list
** Basic IRC commands
QUIT [message]
Quit irssi
JOIN <channel> [key] [, channel...]
Join to channel(s)
PART [channel] [message]
Leave from channel
QUERY <nick>
Create query window
UNQUERY <nick>
Close query window
MSG <nick/channel> <message>
Send message to nick/channel
ME <message>
Send action to channel (/me thinks..)
NOTICE <nick/channel> <message>
Send notice to nick/channel
WHOIS [server/nick] <nick>
Send WHOIS query, you can also specify from what server to ask the
information. If you type the nick twice it will ask from the same
server what nick is using.
AWAY [message]
Sets yourself away/unaway
AWAYALL [message]
Sets yourself away/unaway to all connected servers
WHO <nick/channel>
Show WHO list
NAMES [channel]
List nicks (in channel)
** Bit more advanced commands
MODE <channel/nick> <mode>
Get/set channel/nick mode.
Get channel modes:
b - Get ban list
e - Get ban exception list
I - Get invite list
Set channel modes (use +/- before these):
b *!ban@mask - Set/remove ban
e *!ban@mask - Set/remove ban exception
I *!ban@mask - Set/remove channel invite
o nick - Set/remove op status
v nick - Set/remove voice status
l limit - Set remove max. people limit in channel
k key - Set/remove channel key
s - Secret
p - Private
m - Moderated
i - Invite only
n - No external messages
t - Only ops can change topic
User modes:
i - Invisible
w - Show wallops
s - Show server notices
TOPIC [channel] [topic]
Get/set channel topic
INVITE <nick> [channel]
Invite nick to channel
CTCP <nick/channel> <command>
Send CTCP request to nick/channel (PING, VERSION, ..)
NCTCP <nick/channel> <reply>
Send CTCP reply to nick/channel
PING <nick>
Send CTCP PING to nick and tell how long it took to receive the reply
ISON [nick [nick...]]
Ask if nicks are in IRC.
WALL [channel] <message>
Send notice message to all operators in channel.
OP, DEOP, VOICE, DEVOICE [channel] [nick [nick...]
Op/deop/voice/devoice nick(s) in channel
KICK [channel] <nick> <reason>
Kick nick from channel
KICKBAN [channel] <nick> <reason>
Kick+ban nick from channel
KNOCKOUT [secs] <nick> <reason>
Kick+ban+delay (default to 5min)+unban
BAN [channel] [nick [nick...]]
Ban nick(s) in channel
UNBAN [channel] [mask [mask...]]
Remove ban(s) from channel
BANSTAT [channel]
List bans and ban exceptions in channel
BANTYPE <normal/host/domain/custom>
Set ban type:
Normal - *!user@*.domain.net
Host - *!*@host.domain.net
Domain - *!*@*.domain.net
Custom [nick] [user] [host] [domain]
eg. /bantype custom nick domain - nick!*@*.domain.net
eg. /bantype custom user host - *!user@host.domain.net
INVITELIST [channel]
List invites (+I) in channel
VERSION [server]
Displays irssi version and asks IRC server's version
VER [nick/channel]
Sends CTCP VERSION request to nick/channel
SV [nick/channel]
Sends irssi version text to nick/channel
KILL <nick> <message>
Kill nick from irc network. [irc ops only]
WALLOPS <message>
Write wallops message. [irc ops only]
QUOTE <message>
Send raw data to irc server - DON'T USE THIS unless you really know
what you're doing!
** DCC handling
List DCC connections (same as DCC LIST)
DCC CHAT <nick>
Open DCC chat
DCC SEND <nick> <filename>
Send file to nick
DCC GET <nick> [filename]
Get file offered by nick
DCC RESUME <nick> [filename]
(MIRC) Resume getting file offered by nick
DCC CLOSE <type> <nick> [filename]
Close DCC connection
List DCC connections
Set MIRC style CTCPs on/off
** User interface handling
Create new window (in tab)
Close the current window
SERVER <tag>
Change which server to use in current window
Go to previous/next/Nth window
LEVEL <[+/-]pub/msgs/...>
Change window level, eg.
/window level msgs - creates messages window
/window level all -msgs - creates status window
Clear screen
ECHO <text>
Print text to screen
Open channel modes dialog (GTK/GNOME version)
GWHOIS <nick>
Display WHOIS information in dialog (GTK/GNOME version)
LAST [-pub -msgs...] <text>
Display (only public/msgs/..) lines where <text> appears
(Text version only)
** Configuration
SET [key [value]]
Get/set configuration. Boolean values also need to be changed
with ON/OFF/TOGGLE values (not yes/no). Settings aren't saved
to disk until you use /SAVE.
Same as /SET <key> TOGGLE, or if ON or OFF parameter is given
it will work just like /SET.
Save configuration to disk.
ALIAS, UNALIAS <alias> [command]
Set/remove alias, /unalias is the same as /alias without command
Typing extra / before /command (//command) ignores any aliases
IGNORE, UNIGNORE <mask> [level [level..]]
Ignore/unignore specified level(s) or everything from nick
NOTIFY <mask> [ircnet [ircnet..]]
Add mask (nick) to notify list for specified ircnets..
Remove mask from notify list.
CREATE <filename> [<+/->level ...] [#channel/nick [
[<+/->level ...] ...]
Create and start logging to file
Example: /log create mylog -all +msgs #linux +chan +public
(or simply #linux +all logs everything that appears in #linux
CLOSE <filename>
Close log and remove from configuration
START <filename>
Start logging to file
STOP <filename>
Stop logging to file
List logs.
LOAD <plugin> [arguments]
Load plugin
UNLOAD <plugin>
Unload plugin

View File

@ -1,33 +0,0 @@
Getting bored at work.. so I decided to start writing this FAQ :)
Q: Why can't I change channel topic from the topic entry widget?
A: You need to doubleclick it first, this is because the focus gets there
too easily and I got tired of accidentally changing topic all the time :)
Q: What are the grey nicks in nicklist?
A: People who are away, this list is updated every now and then with sending
USERHOST commands to server, no nick is updated more frequently than once
per 5 minutes (except when doing WHO, WHOIS, etc. commands irssi
automatically updates the list)
Q: Can I switch the channels with keyboard?
A: Yes, with Alt-1..0 for channels 1-10 and Alt-Q..P for channels 11-20 or
Ctrl-N to next window and Ctrl-P to previous window
Q: Can I use bolds/underlines/reverses/bells/colors?
A: Sure, even while they don't get displayed in the entry line:
Ctrl-B = bold, Ctrl-G = bell, Ctrl-- = underline, Ctrl-V = reverse,
Ctrl-C = color
Q: What does the "Join to #channel was synced in xx secs" mean?
A: After joined to channel, irssi asks the server for channel's mode,
who list, bans, ban exceptions and invite list (the later two only with
servers that support it (ircnet)). After all this is got, it displays the
sync message.
Q: Is there any way to get WHOIS (etc.) replies to be displayed in the
current window instead of status window?
A: Just stop using the status window (take it off from preferences). But if
you still prefer to use the status window.. nope, not possible yet, but
it's been in TODO for a while to let the user decide what events to
display in what windows (status, msgs, current, all).

View File

@ -1,19 +0,0 @@
text text background
%k %K %0 black bold black black
%r %R %1 red bold red red
%g %G %2 green bold green green
%y %Y %3 yellow bold yellow yellow
%b %B %4 blue bold blue blue
%m %M %5 magenta bold magenta magenta
%p %P magenta (think: purple)
%c %C %6 cyan bold cyan cyan
%w %W %7 white bold white white
%n All colors turned off
%U Underline on/off
%8 Reverse on/off
%9 %_ Bold on/off
%: Insert newline
%| Marks the indentation position
%% A single %

View File

@ -1,621 +0,0 @@
Running Perl scripts
Place new scripts to ~/.irssi/scripts/, or /usr/lib/irssi/scripts/
directory and run then with /RUN script. Or you could also run the
script from another place by specifying the whole path to it. Scripts
in ~/.irssi/scripts/autorun/ directory are automatically run at
Using /PERLFLUSH closes and reopens the perl interpreter removing all
Perl scripts from memory. There's currently no way to unload a single Perl
script. Also, Irssi doesn't check if you run the same script twice or
different scripts use signal_add() for the same named function - it will
probably crash or do some weird things then.
Irssi's signals
Irssi is pretty much based on sending and handling different signals.
Like when you receive a message from server, say,
":nick!user@there.org PRIVMSG you :blahblah". Irssi will first send a
"server incoming" signal with the raw line as it's first parameter. You
probably don't want to use this signal. Next thing Irssi does is to
interpret the header and send a "server event" signal with arguments
"PRIVMSG you...", server, "nick", "user@there.org". You probably don't
want to use this either, since next irssi will send an "event privmsg"
signal with the "you :blahblah" as it's argument. You can at any point
grab the signal, do whatever you want to do with it and optionally stop
it from going any further by returning from the function with value 1.
For example:
sub event_privmsg {
# $data = "nick/#channel :text"
my ($data, $server, $nick, $address) = @_;
my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
return 1 if ($text =~ /free.*porn/);
return 1 if ($nick =~ /idiot/);
Irssi::signal_add("event privmsg", "event_privmsg")
This will hide all public or private messages that match the regexp
"free.*porn" or the sender's nick contain the word "idiot".
You can also use signal_add_last() if you wish to let the Irssi's internal
functions be run before yours.
A list of signals that irssi send can be found from SIGNALS file.
Message levels
Several functions expect message levels. Sometimes numeric and sometimes
alphabetic. Yes, it's stupid, will fix it :) For now you can use
Irssi::level2bits() function to convert the level string to numeric. Here's
all the levels that irssi supports currently:
(and NOHILIGHT if you don't want the message to be hilighted ever..)
For example:
$server->printtext("#channel", Irssi::level2bits('clientcrap'), 'Hello, world');
Writes text to #channel window with clientcrap level.
Functions that you can use in Irssi's Perl scripts
This is just my very first implementation and things will probably change.
Commands marked with (!!) mean that you shouldn't use it unless you
know what you're doing..
If there's a "Xxxx::" text before the command, it means that it belongs to
that package. Like "Server::command" means that you should either call it as
Irssi::Server::command($server, $cmd);
or more easily:
Commands that don't have the Xxxx prefix are called as Irssi::command();
*** General
Channel cur_channel() - return current channel
Server cur_server() - return current server
channels() - return list of all channels
servers() - return list of all servers
commands() - return list of all commands
dccs() - return list of all dcc connections
logs() - return list of all log files
plugins() - return list of all plugins
Print `str' to current window as "Irssi notice".
command(cmd, [Server server, [Channel channel]])
Send a command `cmd' (in current channel). This will work just as if you
had typed `cmd' in command line, so you'll need to use /COMMANDS or the
text will be sent to the channel.
Server::command(cmd, [Channel channel])
Just like above, except different calling method.
Just like above, except different calling method.
Server::printtext(channel, level, str)
Print `str'.
Get value of `option' from setup and return it.
*** Message levels
Level string -> number
Level number -> string
combine_level(level, str)
Combine level number to level string ("+level -level").
Return new level number.
*** Signals / timeouts
signal_emit(signal, ...)
Send signal `signal'
signal_add(signal, func)
Bind `signal' to function `func'
signal_add_last(signal, func)
Bind `signal' to function `func'. Call `func' as late as possible.
signal_remove(signal, func)
Unbind `signal' from function `func'
tag timeout_add(msecs, func, data)
Call `func' every `msecs' milliseconds (1000 = 1 second) with
parameter `data'. Returns tag which can be used to stop the timeout.
Remove timeout with tag.
*** Commands
Get some information about command. This function returns a reference to
hash table. Hash table has keys:
"cmd" - Command
"category" - Category
command_bind(cmd, category, func)
Bind command `cmd' to call function `func'. `category' is the
category where the command is displayed in /HELP.
command_unbind(cmd, func)
Unbind command `cmd' from function 'func.
Server::irc_send_cmd_split(cmd, arg, max_nicks)
Split the `cmd' into several commands so `arg' argument has only
`max_nicks' number of nicks.
Example: $server->irc_send_cmd_split("KICK #channel nick1,nick2,nick3 :byebye", 2, 2);
Irssi will send commands "KICK #channel nick1,nick2 :byebye" and
"KICK #channel nick3 :byebye" to server.
*** Server Connects
This is a record where we keep connection information. All Servers and
Reconnects records have pointer to one of these.
Get some information about connect. This function returns a reference to
hash table. Hash table has keys:
"address" - Address where we connected (irc.blah.org)
"port" - Port where we connected
"password" - Password we used in connection.
"ircnet" - IRC network
"wanted_nick" - Nick which we would prefer to use
"alternate_nick" - Alternate nick which we would prefer to use
"username" - User name
"realname" - Real name
Connect server_create_conn(address, [port=6667, [password='', [nick='', [channels='']]]])
Create new server connection.
*** Server functions
Get some information about server. This function returns a reference to
hash table. Hash table has keys:
"address" - Address where we connected (irc.blah.org)
"port" - Port where we connected
"password" - Password we used in connection.
"ircnet" - IRC network
"wanted_nick" - Nick which we would prefer to use
"alternate_nick" - Alternate nick which we would prefer to use
"username" - User name
"realname" - Real name
"tag" - Unique server tag.
"real_address" - Who the server thinks it is (irc1.blah.org)
"nick" - Current nick
"usermode" - Current user mode
"usermode_away" - Are we marked as away? 1|0
"away_reason" - Away reason
"connected" - Is connection finished? 1|0
"connection_lost" - Did we lose the connection (1) or was
the connection meant to be disconnected (0)
%server_info = %{Irssi::cur_server->values()};
Irssi::print("Current server = ".$server_info{'address'});
Server Connect::connect()
Connect to server.
Disconnect from server.
Server server_find_tag(tag)
Find server with tag
Server server_find_ircnet(ircnet)
Find first server that is in `ircnet'
Channel channel_find(channel)
Find `channel' from any server
Channel Server::channel_find_level(level)
Find channel with level `level' preferably from specified server, but
fallbacks to any channel the matching level.
Send raw message to server, it will be flood protected so you
don't need to worry about it.
Send CTCP reply. This will be "CTCP flood protected" so if there's too
many CTCP requests in buffer, this reply might not get sent.
*** Server redirections
WARNING: It's easy to mess up the Irssi's internal server expectations with
these commands!
This is a powerful feature of Irssi that I can't seen in other IRC clients.
You can EASILY grab the server's reply for a command you send to server
without any horrible kludges.
Server::redirect_init(command, last, ...)
Initialize redirection for specified command. This needs to be done only
once. Irssi already initializes commands "WHOIS", "WHO", "LIST" and "ISON".
`command' is the whole name of the signal, like "command whois".
`last' specifies how many of the items in `...' is considered as the
"last event" from the command.
Example: $server->redirection_init('command who',
2, # 2 first events will finish the command
'event 401', # unknown nick (finished)
'event 315', # end of who (finished)
'event 352'); # who line (wait..)
Server::redirect_event(arg, last, ...)
Add redirection. `arg' is a space separated list of arguments that should
match before Irssi will redirect the event (think of /WHOIS nick nick and
doing another to different nick immediately after it, there's no way of
knowing which will return first. so, arg would be in this case 'nick').
`last' specifies how many of the following events are considered as
"last event" from command - just like in redirect_init().
`...' is `event, signal, argpos, ...`, where
`event' is the event we're waiting from server.
`signal' is the signal we will send after receiving the event. It should
always start with 'redir ' so that Irssi's perl handler knows to
send correct arguments to signal handler.
`argpos' is the argument position in event's data or -1 if it
should be ignored.
$server->send_raw('WHOIS :cras');
$server->redirect_event('cras', 2,
"event 318", "redir end_of_whois", -1,
"event 402", "redir no_such_server", -1,
"event 401", "redir no_such_nick", 1,
"event 311", "redir whois", 1,
"event 301", "redir whois_away", 1,
"event 312", "redir whois_server", 1,
"event 313", "redir whois_oper", 1,
"event 317", "redir whois_idle", 1,
"event 319", "redir whois_channels", 1);
In the 402-case we tried "/WHOIS nick nick" but nick didn't exist..
group Server::redirect_single_event(arg, last, group, event, signal, argpos)
Same as redirect_event() except you can set it up in pieces.
If `group' is 0, it will create new group and return it's id.
*** IRC masks
irc_mask_match(mask, nick, user, host)
Return 1 if `mask' matches nick!user@host.
irc_mask_match_address(mask, nick, address)
Return 1 if `mask' matches nick!address.
irc_masks_match(masks, nick, address)
Return 1 if any mask in the `masks' (string separated with spaces)
matches nick!address.
irc_get_mask(nick, host, flags)
Create IRC mask from nick!host.
flags = you need to combine these:
(FIXME: export the IRC_xxx defines to perl (or something))
*** Channels
Get some information about channel. This function returns a reference to
hash table. Hash table has keys:
"server" - Server of the channel
"name" - Channel name
"type" - Channel type ("channel", "query", "dcc chat", "empty")
"topic" - Channel topic
"key" - Channel key (password)
"limit" - Max. users in channel (+l mode)
"level" - Channel's level number.
"new_data" - 0=no new data, 1=text, 2=msg, 3=msg for you
"synced" - Channel is synchronized
"wholist" - Channel has received /WHO list
"names_got" - Channel has received /NAMES list
"chanop" - You are channel operator
"left" - You just left the channel (for "channel destroyed" event)
"kicked" - You was just kicked out of the channel (for
"channel destroyed" event)
Channel Server::channel_create(channel, type, automatic)
Create new channel with name `channel'. `type' is one of:
(FIXME: export these to perl somehow)
`automatic' means that channel is created "automatically" and
Irssi will NOT change the active window to it.
Destroy channel.
Change channel's name
Return channel's mode
Channel Server::channel_find(channel)
Find `channel' in server.
Channel Server::channel_find_closest(channel, level)
Find `channel' or if not found, some other channel that has
level `level' (number).
Channel channel_find_level(level)
Find channel with level `level'.
*** Channel modes
Get some information about ban. This function returns a reference to
hash table. Hash table has keys:
"ban" - The ban
"setby" - Nick of who set the ban
"time" - Timestamp when ban was set
Ban Channel::ban_add(ban, nick, time)
Add new ban. (!!)
Remove ban. (!!)
Ban Channel::ban_exception_add(ban, nick, time)
Add ban exception (!!)
Remove ban exception (!!)
Add invite (!!)
Remove invite (!!)
Channel::modes_parse_channel(setby, modestr)
Parse mode string (!!)
Get ban mask for `nick'.
Channel::modes_set(data, mode)
Set mode `mode' ("+o", "-o", etc.) to all nicks in `data'
separated with spaces.
*** Nick list
Get some information about nick. This function returns a reference to
hash table. Hash table has keys:
"nick" - Plain nick
"host" - Host (blah@there.org)
"name" - Real name
"hops" - Hop count to the server nick is using
"op", "voice", "gone", "ircop" - 1 or 0
"last_check" - timestamp when last checked gone/ircop status.
"send_massjoin" - Waiting to be sent in a "massjoin" signal - 1 or 0
Nick Channel::nicklist_insert(nick, op, voice, send_massjoin)
Add nick to nicklist. (!!)
Remove nick from nicklist. (!!)
Nick Channel::nicklist_find(mask)
Find nick from nicklist.
Return a list of all nicks (Nick packages) in channel.
*** DCC
Destroy DCC connection. (!!)
DCC type number to string
DCC type string to number
Dcc dcc_find_item(type, nick, arg)
Find DCC connection.
Dcc dcc_find_by_port(nick, port)
Find DCC connection by port.
*** Reconnects
Get some information about reconnect. This function returns a reference to
hash table. Hash table has keys:
"tag" - Unique numeric tag
"next_connect" - Unix time stamp when the next connection occurs
"address" - Address where we connected (irc.blah.org)
"port" - Port where we connected
"password" - Password we used in connection.
"ircnet" - IRC network
"wanted_nick" - Nick which we would prefer to use
"alternate_nick" - Alternate nick which we would prefer to use
"username" - User name
"realname" - Real name
*** Netsplits
Get some information about netsplit. This function returns a reference to
hash table. Hash table has keys:
"nick" - Nick
"address" - Nick's host
"server" - The server nick was in
"destserver" - The other server where split occured.
"destroy" - Timestamp when this record should be destroyed
/*FIXME: add list of channels the nick was in;*/
Netsplit Server::netsplit_find(nick, address)
Check if nick!address is on the other side of netsplit. Netsplit records
are automatically removed after 30 minutes (current default)..
Nick Server::netsplit_find_channel(nick, address, channel)
Find nick record for nick!address in channel `channel'.
*** Notify list
notifylist_add(nick, ircnet)
Add `nick' to notify list in irc network `ircnet'
Server notifylist_ison(nick, ircnets)
Check if `nick' is in IRC. `ircnets' is a space separated
list of irc networks. If it's empty string, all servers will be checked.
Check if `nick' is on IRC server.
*** Rawlog
Send `str' to raw log as input text. (!!)
Send `str' to raw log as output text. (!!)
Send `str' to raw log as redirection text. (!!)
*** Ignores
Get some information about autoignore. This function returns a reference to
hash table. Hash table has keys:
"nick" - Ignored nick
"timeleft" - Seconds left to ignore
"level" - Ignoring level number
ignore_add(mask, level)
Ignore `mask' with level string
ignore_remove(mask, level)
Unignore level string from `mask'
Server::ignore_check(nick, host, type)
Return 1 if nick!host is ignored with level number `type'.
Server::autoignore_add(type, nick)
Autoignore `nick' in server with level number `type'.
Server::autoignore_remove(mask, level)
Remove autoignoring `nick' from server. `level' is a string.
*** Logging
Get some information about log. This function returns a reference to
hash table. Hash table has keys:
"fname" - Log file name
"autoopen_log" - Automatically open log at startup
"last" - Timestamp when last write occured.
"level" - Global logging level.
/*FIXME: add list of Logitems;*/
Get some information about logitem. This function returns a reference to
hash table. Hash table has keys:
"name" - Log item name.
"level" - Logging level number.
Log log_create(fname, data)
Create log file. `data' = logging level ("-all #channel +public")
Log log_create_with_level(fname, level)
Create log file with level number.
Log log_file_find(fname)
Find log file.
Destroy log file
Start logging
Stop logging
Log::append_item(name, level)
Append log item with level number `level' to log file. (!!)
Log::remove_item(log, name)
Remove log item. (!!)
*** Plugins
Get some information about plugin. This function returns a reference to
hash table. Hash table has keys:
"name" - Plugin name
"description" - Plugin description
plugin_load(name, args)
Load plugin.
Get plugin description string.
Plugin plugin_find(name)
Find plugin.

View File

@ -1,224 +0,0 @@
IRC base
* Requires to work properly:
"gui exit"
"gui channel open", CHANNEL_REC
"send command", char *command, SERVER_REC, CHANNEL_REC
* Provides signals:
"send command", char *args, SERVER_REC
"command "<cmd>, char *args, SERVER_REC, CHANNEL_REC
"default command", char *args, SERVER_REC, CHANNEL_REC
"server event", char *data, SERVER_REC, char *sender_nick, char *sender_address
"event "<cmd>, char *args, SERVER_REC, char *sender_nick, char *sender_address
"default event", char *data, SERVER_REC, char *sender_nick, char *sender_address
"server incoming", SERVER_REC, char *data
(for perl parser..)
"redir "<cmd>, char *args, SERVER_REC, char *sender_nick, char *sender_address
"ban new", BAN_REC
"ban remove", BAN_REC
"ban exception new", BAN_REC
"ban exception remove", BAN_REC
"ban type changed", char *bantype
"commandlist new", COMMAND_REC
"commandlist remove", COMMAND_REC
"channel created", CHANNEL_REC
"channel destroyed", CHANNEL_REC
"channel name changed", CHANNEL_REC
"channel topic changed", CHANNEL_REC
"channel server changed", CHANNEL_REC, SERVER_REC *oldserver
"channel query", CHANNEL_REC
"channel wholist", CHANNEL_REC
"channel sync", CHANNEL_REC
"ctcp msg "<cmd>, char *args, SERVER_REC, char *nick, char *addr, char *target
"default ctcp msg", char *args, SERVER_REC, char *nick, char *addr, char *target
"ctcp reply "<cmd>, char *args, SERVER_REC, char *nick, char *addr, char *target
"default ctcp reply", char *args, SERVER_REC, char *nick, char *addr, char *target
"server lag", SERVER_REC
"server lag disconnect", SERVER_REC
"lag", char *server, int lag
"invitelist new", CHANNEL_REC, char *mask
"invitelist remove", CHANNEL_REC, char *mask
"channel mode changed", CHANNEL_REC
"user mode changed", SERVER_REC
"nick mode changed", CHANNEL_REC, NICK_REC
"netsplit add", NETSPLIT_REC
"netsplit remove", NETSPLIT_REC
"nicklist new", CHANNEL_REC, NICK_REC
"nicklist remove", CHANNEL_REC, NICK_REC
"nicklist changed", CHANNEL_REC, NICK_REC, char *oldnick
"nick gone changed", CHANNEL_REC, NICK_REC
"nick ircop changed", CHANNEL_REC, NICK_REC
"server nick changed", SERVER_REC
"massjoin", CHANNEL_REC, GSList of NICK_RECs
"rawlog", SERVER_REC, char *data
"server connect failed", SERVER_REC
"server connected", SERVER_REC
"server connecting", SERVER_REC, ulong *ip
"server looking", SERVER_REC
"server disconnected", SERVER_REC
"event connected", SERVER_REC
"server reconnect new", RECONNECT_REC
"server reconnect remove", RECONNECT_REC
"server reconnect not found", char *tag
"signal", char *name, ...
"last signal", char *name, ...
IRC extra
* Requires to work properly:
"print text stripped", SERVER_REC, char *channel, int level, char *text
"plugin add menu", char *menuitem, void (*func) (gpointer, PLUGIN_REC), PLUGIN_REC
* Provides signals:
"dcc ctcp "<cmd>, char *args, DCC_REC
"default dcc ctcp", char *args, DCC_REC
"dcc unknown ctcp", char *args, char *sender, char *sendaddr
"dcc reply "<cmd>, char *args, DCC_REC
"default dcc reply", char *args, DCC_REC
"dcc unknown reply", char *args, char *sender, char *sendaddr
"dcc chat message", DCC_REC, char *msg
"dcc created", DCC_REC