dotfiles

<-- duh.
Log | Files | Refs | LICENSE

commit a47341bf2461699b53df1f67d31bde9a63534a36
parent a53e9a5e720410da00030ad4bb6afe4fd716a2bf
Author: hhvn <dev@hhvn.uk>
Date:   Sun, 31 Oct 2021 23:10:32 +0000

.c/irssi/: remove

I will probably be using my own IRC client soon.
This config is a *mess* so I'm just removing it.

Diffstat:
D.config/irssi/config | 895-------------------------------------------------------------------------------
D.config/irssi/default.theme | 833-------------------------------------------------------------------------------
D.config/irssi/fctcplist | 9---------
D.config/irssi/keepnick | 11-----------
D.config/irssi/log2ansi.pl | 412-------------------------------------------------------------------------------
D.config/irssi/modules/libtheme_indent.so | 0
D.config/irssi/pipeline.theme | 705-------------------------------------------------------------------------------
D.config/irssi/saved_nick_colors | 11679-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/README | 21---------------------
D.config/irssi/scripts/autorun/adv_windowlist.pl | 2954-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/ascii.pl | 405-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/autonickprefix.pl | 39---------------------------------------
D.config/irssi/scripts/autorun/cmdind.pl | 61-------------------------------------------------------------
D.config/irssi/scripts/autorun/ctcpspoof.pl | 277-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/dim_nicks.pl | 431-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/escape.pl | 58----------------------------------------------------------
D.config/irssi/scripts/autorun/hilightwin.pl | 86-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/history.pl | 146-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/keepnick.pl | 458-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/lastspoke.pl | 46----------------------------------------------
D.config/irssi/scripts/autorun/ls.pl | 51---------------------------------------------------
D.config/irssi/scripts/autorun/nickcolor.pl | 1120-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/nm2.pl | 546-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/nojointext.pl | 35-----------------------------------
D.config/irssi/scripts/autorun/pwp.pl | 109-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/servercomplete.pl | 86-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/special_complete.pl | 30------------------------------
D.config/irssi/scripts/autorun/tmux-nicklist-portable.pl | 432-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/trackbar.pl | 606-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/trigger.pl | 1257-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/uberprompt.pl | 774-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/vim_mode.pl | 3781-------------------------------------------------------------------------------
D.config/irssi/scripts/autorun/window_switcher.pl | 146-------------------------------------------------------------------------------
D.config/irssi/scripts/printlevel.pl | 19-------------------
D.config/irssi/startup | 2--
D.config/irssi/triggers | 59-----------------------------------------------------------
36 files changed, 0 insertions(+), 28579 deletions(-)

diff --git a/.config/irssi/config b/.config/irssi/config @@ -1,895 +0,0 @@ -servers = ( - { address = "irc.rizon.net"; chatnet = "rizon"; port = "6667"; }, - { - address = "irc.freenode.net"; - chatnet = "freenode"; - port = "6667"; - }, - { - address = "irc.nebulacentre.net"; - chatnet = "nebulacentre"; - port = "6667"; - }, - { - address = "irc.haydenvh.com"; - chatnet = "hlircnet"; - port = "6697"; - use_tls = "yes"; - tls_verify = "no"; - }, - { address = "efnet.port80.se"; chatnet = "efnet"; port = "6667"; }, - { address = "irc.sdf.org"; chatnet = "sdf"; port = "6667"; }, - { address = "irc.unix.chat"; chatnet = "unix"; port = "6667"; }, - { address = "irc.oscss.eu"; chatnet = "oscss"; port = "6667"; }, - { - address = "irc.cyberia.is"; - use_tls = "yes"; - chatnet = "cyberia"; - port = "6697"; - }, - { address = "genoce.org"; chatnet = "genoce"; port = "6667"; }, - { - address = "irc.dataswamp.org"; - chatnet = "dataswamp"; - port = "6697"; - use_tls = "yes"; - }, - { - address = "localhost"; - chatnet = "bitlbee-matrix"; - port = "6667"; - use_tls = "no"; - tls_verify = "no"; - }, - { - address = "localhost"; - chatnet = "matrix.haydenvh.com"; - port = "15558"; - password = "W3YLmjluCiO"; - use_tls = "no"; - tls_verify = "no"; - } -); -chatnets = { - Rizon = { - type = "IRC"; - nick = "hhvn"; - autosendcmd = "/exec - -msg NickServ dpass irc.rizon.net identify; /mode hhvn -x; wait 5000"; - }; - hlircnet = { type = "IRC"; autosendcmd = "/oper haydenh !!!"; }; - sdf = { type = "IRC"; }; - efnet = { type = "IRC"; nick = "hhvn"; alternative_nick = "h_hvn"; }; - unix = { type = "IRC"; }; - nebulacentre = { type = "IRC"; }; - cyberia = { type = "IRC"; }; - genoce = { type = "IRC"; }; - freenode = { - nick = "fr3en0de"; - alternate_nick = "fr3e-estn0de"; - type = "IRC"; - autosendcmd = "/exec - -msg NickServ dpass irc.freenode.net identify haydenh; wait 10000"; - }; - oscss = { type = "IRC"; }; - dataswamp = { type = "IRC"; }; - hlircnettor = { type = "IRC"; }; - "bitlbee-matrix" = { type = "IRC"; }; - "matrix.haydenvh.com" = { type = "IRC"; }; -}; -aliases = { - ATAG = "WINDOW SERVER"; - ADDALLCHANS = "SCRIPT EXEC foreach my \\$channel (Irssi::channels()) { Irssi::command(\"CHANNEL ADD -auto \\$channel->{name} \\$channel->{server}->{tag} \\$channel->{key}\")\\;}"; - ACMSG = "/action"; - B = "BAN"; - BACK = "AWAY"; - BANS = "BAN"; - BYE = "QUIT"; - C = "CLEAR"; - CALC = "EXEC - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi"; - CHAT = "DCC CHAT"; - CUBES = "SCRIPT EXEC Irssi::active_win->print(\"%_bases\", MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print( do { join '', map { \"%x0\\${_}0\\$_\" } '0'..'9','A'..'F' }, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print(\"%_cubes\", MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print( do { my \\$y = \\$_*6 \\; join '', map { my \\$x = \\$_ \\; map { \"%x\\$x\\$_\\$x\\$_\" } @{['0'..'9','A'..'Z']}[\\$y .. \\$y+5] } 1..6 }, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) for 0..5 \\; Irssi::active_win->print(\"%_grays\", MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print( do { join '', map { \"%x7\\${_}7\\$_\" } 'A'..'X' }, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) \\; Irssi::active_win->print(\"%_mIRC extended colours\", MSGLEVEL_CLIENTCRAP) \\; my \\$x \\; \\$x .= sprintf \"\00399,%02d%02d\",\\$_,\\$_ for 0..15 \\; Irssi::active_win->print(\\$x, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) \\; for my \\$z (0..6) { my \\$x \\; \\$x .= sprintf \"\00399,%02d%02d\",\\$_,\\$_ for 16+(\\$z*12)..16+(\\$z*12)+11 \\; Irssi::active_win->print(\\$x, MSGLEVEL_NEVER | MSGLEVEL_CLIENTCRAP) }"; - DATE = "TIME"; - DEHIGHLIGHT = "DEHILIGHT"; - DHL = "DEHILIGHT"; - EXEMPTLIST = "MODE $C +e"; - EXIT = "try //exit"; - GOTO = "SCROLLBACK GOTO"; - HIGHLIGHT = "HILIGHT"; - HL = "HILIGHT"; - HOST = "USERHOST"; - IDENTIFY = "msg NickServ identify"; - INVITELIST = "MODE $C +I"; - J = "JOIN"; - K = "KICK"; - KB = "KICKBAN"; - KN = "KNOCKOUT"; - LAST = "LASTLOG"; - LEAVE = "PART"; - M = "MSG"; - MUB = "UNBAN *"; - N = "NAMES"; - NMSG = "^MSG"; - P = "PART"; - Q = "QUERY"; - RESET = "SET -default"; - RUN = "SCRIPT LOAD"; - SAY = "MSG *"; - SB = "SCROLLBACK"; - SBAR = "STATUSBAR"; - SIGNOFF = "QUIT"; - T = "TOPIC"; - UB = "UNBAN"; - UMODE = "MODE $N"; - UNSET = "SET -clear"; - W = "WHO"; - WC = "WINDOW CLOSE"; - WG = "WINDOW GOTO"; - WJOIN = "JOIN -window"; - WI = "WHOIS"; - WII = "WHOIS $0 $0"; - WL = "WINDOW LIST"; - WN = "WINDOW NEW HIDDEN"; - WQUERY = "QUERY -window"; - WW = "WHOWAS"; - 1 = "WINDOW GOTO 1"; - 2 = "WINDOW GOTO 2"; - 3 = "WINDOW GOTO 3"; - 4 = "WINDOW GOTO 4"; - 5 = "WINDOW GOTO 5"; - 6 = "WINDOW GOTO 6"; - 7 = "WINDOW GOTO 7"; - 8 = "WINDOW GOTO 8"; - 9 = "WINDOW GOTO 9"; - 10 = "WINDOW GOTO 10"; - 11 = "WINDOW GOTO 11"; - 12 = "WINDOW GOTO 12"; - 13 = "WINDOW GOTO 13"; - 14 = "WINDOW GOTO 14"; - 15 = "WINDOW GOTO 15"; - 16 = "WINDOW GOTO 16"; - 17 = "WINDOW GOTO 17"; - 18 = "WINDOW GOTO 18"; - 19 = "WINDOW GOTO 19"; - 20 = "WINDOW GOTO 20"; - 21 = "WINDOW GOTO 21"; - 22 = "WINDOW GOTO 22"; - 23 = "WINDOW GOTO 23"; - 24 = "WINDOW GOTO 24"; - 25 = "WINDOW GOTO 25"; - 26 = "WINDOW GOTO 26"; - 27 = "WINDOW GOTO 27"; - 28 = "WINDOW GOTO 28"; - 29 = "WINDOW GOTO 29"; - 30 = "WINDOW GOTO 30"; - 31 = "WINDOW GOTO 31"; - 32 = "WINDOW GOTO 32"; - 33 = "WINDOW GOTO 33"; - 34 = "WINDOW GOTO 34"; - 35 = "WINDOW GOTO 35"; - 36 = "WINDOW GOTO 36"; - 37 = "WINDOW GOTO 37"; - 38 = "WINDOW GOTO 38"; - 39 = "WINDOW GOTO 39"; - 40 = "WINDOW GOTO 40"; - 41 = "WINDOW GOTO 41"; - 42 = "WINDOW GOTO 42"; - 43 = "WINDOW GOTO 43"; - 44 = "WINDOW GOTO 44"; - 45 = "WINDOW GOTO 45"; - 46 = "WINDOW GOTO 46"; - 47 = "WINDOW GOTO 47"; - 48 = "WINDOW GOTO 48"; - 49 = "WINDOW GOTO 49"; - 50 = "WINDOW GOTO 50"; - 51 = "WINDOW GOTO 51"; - 52 = "WINDOW GOTO 52"; - 53 = "WINDOW GOTO 53"; - 54 = "WINDOW GOTO 54"; - 55 = "WINDOW GOTO 55"; - 56 = "WINDOW GOTO 56"; - 57 = "WINDOW GOTO 57"; - 58 = "WINDOW GOTO 58"; - 59 = "WINDOW GOTO 59"; - 60 = "WINDOW GOTO 60"; - 61 = "WINDOW GOTO 61"; - 62 = "WINDOW GOTO 62"; - 63 = "WINDOW GOTO 63"; - 64 = "WINDOW GOTO 64"; - 65 = "WINDOW GOTO 65"; - 66 = "WINDOW GOTO 66"; - 67 = "WINDOW GOTO 67"; - 68 = "WINDOW GOTO 68"; - 69 = "WINDOW GOTO 69"; - 70 = "WINDOW GOTO 70"; - 71 = "WINDOW GOTO 71"; - 72 = "WINDOW GOTO 72"; - 73 = "WINDOW GOTO 73"; - 74 = "WINDOW GOTO 74"; - 75 = "WINDOW GOTO 75"; - 76 = "WINDOW GOTO 76"; - 77 = "WINDOW GOTO 77"; - 78 = "WINDOW GOTO 78"; - 79 = "WINDOW GOTO 79"; - 80 = "WINDOW GOTO 80"; - 81 = "WINDOW GOTO 81"; - 82 = "WINDOW GOTO 82"; - 83 = "WINDOW GOTO 83"; - 84 = "WINDOW GOTO 84"; - 85 = "WINDOW GOTO 85"; - 86 = "WINDOW GOTO 86"; - 87 = "WINDOW GOTO 87"; - 88 = "WINDOW GOTO 88"; - 89 = "WINDOW GOTO 89"; - 90 = "WINDOW GOTO 90"; - 91 = "WINDOW GOTO 91"; - 92 = "WINDOW GOTO 92"; - 93 = "WINDOW GOTO 93"; - 94 = "WINDOW GOTO 94"; - 95 = "WINDOW GOTO 95"; - 96 = "WINDOW GOTO 96"; - 97 = "WINDOW GOTO 97"; - 98 = "WINDOW GOTO 98"; - 99 = "WINDOW GOTO 99"; - ADDALLCHANNELS = "script exec foreach my $$channel (Irssi::channels()) { Irssi::command(\"channel add -auto $$channel->{name} $$channel->{server}->{tag} $$channel->{key}\") }"; - night = "/away -all sleeping"; - day = "back"; - gone = "away -all somewhere"; - wave = "/SAY \\ 0/;SAY /|;SAY / \\\\"; - admin = "/mode * +a $0"; - super = "/mode * +q $0"; - desuper = "/mode * -q $0"; - deadmin = "/mode * -a $0"; - save = "/layout save; /ADDALLCHANS; /save -formats"; - halfop = "/mode * +h $0"; - dehalfop = "/mode * -h $0"; - vm_add = " /^statusbar prompt add -after input -alignment right more; /^statusbar prompt add -after input -alignment right vim_cmd_mode"; - vm_del = "/^statusbar prompt remove vim_cmb_mode; /^statusbar prompt remove more"; - chanhold = "^msg chanhold"; - boxx = "say \\ _\\ \\ \\ _\\ \\ \\ _\\ \\ \\ _\\ \\ \\ _; say |_| |_| |_| |_| |_|"; - kline = "quote KLINE"; - gline = "quote GLINE"; - zline = "quote ZLINE"; - gzline = "quote GZLINE"; - bet = "/say I bet $0 hlirccens (imaginary moneys) $1 $2 $3 $4 $5 $6 $7 $8 $9"; - theme = "/set theme"; - retheme = "/set theme default; /set theme $0"; - reply = "/msg $, $*"; - rep = "/reply"; - helpop = "/quote helpop"; - cycle = "/cycle cycling"; - replay = " "; - saumode = "/quote saumode"; - "runauto;" = "/script load autorun/$0"; - runauto = "/script load autorun/$0"; - dns = "/quote dns"; - clones = "/quote clones"; - ttime = "/exec - -out date +%H:%M:%S"; - arep = "/ACMSG $, $*"; - AAAA = "SAY \\\\0/;SAY |;SAY / \\\\"; - matrix = "SAY I'd like to interject for a moment, what you're referring to as Matrix, is in fact GNU/matrix, or as I've recently taken to calling it, GNU+matrix. Matrix is not an ideology unto itself, but rather another free component of a fully functioning method of thought."; - rules = "/quote rules"; - mkpasswd = "/quote mkpasswd"; - vhost = "/quote vhost"; - sanick = "/quote sanick"; - chghost = "/quote chghost"; - v = "voice"; - reputation = "/quote reputation"; - ircops = "/quote ircops"; - module = "/quote module"; - marvvin = "/^msg marvvin"; - ALLLASTLOG = "script exec foreach (Irssi::windows()) {Irssi::command(lastlog -window \\$_->{refnum} $*)\\;}"; - TAG = "script exec Irssi::server_find_tag(‘$0′)->command(‘$1-’);"; - CONNECTIONUPTIME = "script exec \\$a=`date +%s` – Irssi::active_win->{‘active_server’}->{‘connect_time’}\\; Irssi::print( int(\\$a/3600/24).”d “.int(\\$a/3600%24).”h “. int(\\$a/60%60).”m “. int(\\$a%60).”s”)\\;"; - smotd = "/quote smotd"; - sadmin = "/quote admin"; - ping = "/quote ping"; - awl_nosbar = "/script load autorun/adv_windowlist; /format awl_display_nokey %N$$H$$C$$S %N$$N; /format awl_display_key %N$$H$$C$$S%N %mM-$$Q; /format awl_display_nokey_active %N%K>%N$$C %N$$N; /format awl_display_key_active %N%K>%N$$C %mM-$$Q; /format awl_display_header %1 %Y$$C ($${N}); /format awl_display_nokey_visible %N%K<%N$$C %N$$N; /format awl_display_key_visible %N%K<%N$$C %mM-$$Q; /rm_awl_sbar"; - sajoin = "/quote sajoin"; - chgident = "/quote chgident"; - shrug = "/SAY . _0_ .; SAY \\ ` | `; SAY \\ \\ \\ |; SAY \\ \\ / \\\\"; - plop = "/SAY | \\ \\ \\ \\ |; SAY |~~-.-|; SAY | 0 \\ .|; SAY |o \\ . |; SAY |_____|"; - ll = "/lastlog"; - llc = "/lastlog -clear"; - quickconn = "/connect unix; /connect dataswamp; /connect sdf; /connect freenode; /connect hlircnet; /connect cyberia; /connect nebulacentre; /connect efnet"; - "expose-self" = "/mode $N -x"; - rm_awl_sbar = "/sbar modify -disable awl_0; sbar modify -disable awl_1; sbar modify -disable awl_2; sbar modify -disable awl_3; sbar modify -disable awl_4; sbar modify -disable awl_5"; - decloak = "mode $N -x"; - 2say = "SAY $*; SAY $*"; - 4say = "2say $*; 2say $*"; - 8say = "4say $*; 4say $*"; - 16say = "8say $*; 8say $*"; - 32say = "16say $*; wait 5000; 16say $*"; - 64say = "32say $*; wait 20000; 32say $*"; - 2colsay = "colsay $*; colsay $*"; - 4colsay = "2colsay $*; 2colsay $*"; - 8colsay = "4colsay $*; 4colsay $*"; - 16colsay = "8colsay $*; 8colsay $*"; - 32colsay = "16colsay $*; wait 5000; 16colsay $*"; - 64colsay = "32colsay $*; wait 20000; 32say $*"; - winhilight = "/window show 4; /window size 8"; - art = "/exec - -out cat /srv/storage/art.tmp"; - quit = "/echo no"; - net = "/echo $chatnet"; - wh0 = "who 0"; - alright = "/exec - -out echo Alright, I $$(shuf < /usr/share/dict/british-english 2>/dev/null | grep -v 'ed$$' 2>/dev/null | head -n 1 2>/dev/null)."; -}; -statusbar = { - items = { - barstart = "{sbstart}"; - ibarstart = "{isbstart}"; - barend = "{sbend}"; - user = "{sb $P$N +$usermode{sbaway $A}{opered $O}}"; - winref = "{sb $winname$itemname{sbmode $M}}{sb3 $winref}"; - server = "{sb {sbservertag $tag}}"; - prompt = "{prompt $[.15]itemname}"; - prompt_empty = "{prompt $winname}"; - topic = "{sb_topic $topic}"; - topicend = "%0 "; - vim_cmd_mode = "{sb3 $vim_cmd_mode}"; - lag = "{sb Lag: $0-}"; - act = "{sb Act: $0-}"; - more = "{sb3 {sbmore}}"; - end = "%N%K%_──────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"; - inact = "%N%G%_──────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"; - none = " "; - }; - default = { - window_inact = { - type = "window"; - placement = "bottom"; - position = "1"; - visible = "never"; - items = { inact = { alignment = "left"; priority = "100"; }; }; - disabled = "yes"; - }; - window = { - items = { - end = { alignment = "left"; priority = "0"; }; - time = { priority = "10"; }; - user = { priority = "20"; }; - winref = { priority = "35"; }; - lag = { priority = "40"; }; - server = { priority = "50"; }; - }; - type = "window"; - position = "0"; - visible = "active"; - }; - topic = { - type = "window"; - position = "0"; - visible = "always"; - items = { - topic = { priority = "1"; }; - topicend = { alignment = "right"; }; - }; - }; - awl_2 = { - items = { - barstart = { priority = "100"; }; - awl_2 = { }; - barend = { priority = "100"; alignment = "right"; }; - }; - disabled = "yes"; - }; - awl_3 = { - items = { - barstart = { priority = "100"; }; - awl_3 = { }; - barend = { priority = "100"; alignment = "right"; }; - }; - disabled = "yes"; - }; - awl_4 = { - items = { - barstart = { priority = "100"; }; - awl_4 = { }; - barend = { priority = "100"; alignment = "right"; }; - }; - disabled = "yes"; - }; - awl_5 = { - items = { - barstart = { priority = "100"; }; - awl_5 = { }; - barend = { priority = "100"; alignment = "right"; }; - }; - disabled = "yes"; - }; - awl_6 = { - items = { - barstart = { priority = "100"; }; - awl_6 = { }; - barend = { priority = "100"; alignment = "right"; }; - }; - disabled = "yes"; - }; - prompt = { - items = { - uberprompt = { priority = "-1"; }; - input = { priority = "10"; }; - vim_cmd_mode = { alignment = "right"; }; - }; - position = "100"; - }; - awl_0 = { - items = { - barstart = { priority = "100"; }; - awl_0 = { }; - barend = { priority = "100"; alignment = "right"; }; - }; - disabled = "yes"; - }; - }; -}; -settings = { - core = { - real_name = "gopher://haydenvh.com"; - user_name = "h"; - nick = "hhvn"; - recode_transliterate = "no"; - timestamp_format = "%H:%M:%S"; - hostname = ""; - quit_message = "pain is temporary"; - STATUS_OPER = "yes"; - resolve_prefer_ipv6 = "no"; - awaylog_file = "~/.cache/irc/away.log"; - chanmode_expando_strip = "yes"; - server_reconnect_time = "2m"; - server_connect_timeout = "20secs"; - rawlog_lines = "10000"; - }; - "fe-text" = { - actlist_sort = "refnum"; - colors_ansi_24bit = "yes"; - scrollback_lines = "2500"; - scrollback_time = "5days"; - }; - "fe-common/core" = { - theme = "pipeline"; - autolog = "yes"; - completion_char = ","; - emphasis_italics = "no"; - beep_msg_level = "msgs hilight dccmsgs"; - show_names_on_join = "no"; - window_check_level_first = "yes"; - autocreate_own_query = "no"; - autocreate_windows = "yes"; - use_msgs_window = "no"; - autocreate_query_level = "NONE"; - emphasis = "yes"; - emphasis_multiword = "yes"; - emphasis_replace = "no"; - window_default_level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - autolog_path = "~/.cache/irclogs/$tag-$0/%d-%m-%y.log"; - autolog_level = "all"; - autolog_colors = "yes"; - completion_keep_privates = "50"; - }; - "perl/core/scripts" = { - ascii_figlet_path = "/usr/bin/figlet"; - nickcolor_coltag = "4 8 9 10 11 12 13 14 15"; - nicklist_width = "21"; - nicklist_height = "46"; - dim_nicks_color = "r"; - awl_shared_sbar = "OFF"; - awl_block = "25"; - awl_sort = "active/server/tag"; - trackbar_string = "──────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"; - trackbar_style = "%g%_"; - trackbar_print_timestamp = "no"; - uberprompt_load_hook = "/^vm_add"; - uberprompt_unload_hook = "/^vm_del"; - cmdind_warn_text = "%G%_MSG?"; - cmdind_text = "%g%_CMD: "; - tmux_away_window = ""; - tmux_away_message = "(set away by a script)"; - neat_colors = "X40RX4CX5CX6CX5EX3CX2DX2JX3PX1CGcX1ZBX3HX2TX3MX25X2BX4NX6AX3AX4GX42X63X6BX6HX6NX51"; - hilightwin_show_network = "yes"; - hilightwin_showprivmsg = "no"; - neat_history = "10000000"; - neat_truncate_nick = "yes"; - title_screen_window = "yes"; - vim_mode_map_leader = ";"; - dim_nicks_ignore_hilights = "no"; - awl_maxcolumns = "1"; - awl_viewer = "yes"; - awl_path = "/tmp/_windowlist"; - awl_placement = "bottom"; - ascii_default_font = "small"; - ascii_default_kickreason = "irssi script :)"; - trackbar_ignore_windows = "[control-panel] [hilights]"; - hilightwin_ignore_targets = "#users #service"; - awl_height_adjust = "0"; - }; - "irc/core" = { - alternate_nick = "h_hvn"; - ctcp_version_reply = "UNIVERSE v42"; - ctcp_userinfo_reply = "gopher://haydenvh.com:73"; - part_message = "pain is temporary"; - split_line_start = ""; - usermode = "+iw"; - join_auto_chans_on_invite = "yes"; - cmd_queue_speed = "790msec"; - auto_whowas = "no"; - }; - proxy = { - irssiproxy_password = "awDhuK15^"; - irssiproxy_ports = "?=22"; - irssiproxy = "yes"; - irssiproxy_bind = "0.0.0.0"; - }; -}; -logs = { }; -keyboard = ( - { key = "meta-u"; id = "change_window"; data = "17"; }, - { key = "meta-i"; id = "change_window"; data = "18"; }, - { key = "^i"; id = "command"; data = "nicklist scroll -10"; }, - { key = "meta-j"; id = "change_window"; data = "27"; }, - { key = "meta-k"; id = "change_window"; data = "28"; }, - { key = "^s"; id = "command"; data = "away -all away"; }, - { key = "meta-s"; id = "change_window"; data = "22"; }, - { key = "meta-b"; id = "change_window"; data = "34"; }, - { key = "meta-n"; id = "change_window"; data = "35"; }, - { key = "^Z"; id = "next_window_item"; data = ""; }, - { key = "meta-o"; id = "change_window"; data = "19"; }, - { key = "meta-p"; id = "change_window"; data = "20"; }, - { key = "meta-a"; id = "change_window"; data = "21"; }, - { key = "meta-z"; id = "change_window"; data = "30"; }, - { key = "meta-d"; id = "change_window"; data = "23"; }, - { key = "meta-f"; id = "change_window"; data = "24"; }, - { key = "meta-g"; id = "change_window"; data = "25"; }, - { key = "meta-h"; id = "change_window"; data = "26"; }, - { key = "meta-l"; id = "change_window"; data = "29"; }, - { key = "meta-x"; id = "change_window"; data = "31"; }, - { key = "meta-c"; id = "change_window"; data = "32"; }, - { key = "meta-v"; id = "change_window"; data = "33"; }, - { key = "^A"; }, - { key = "^R"; id = "command"; data = "history_search "; }, - { key = "^G"; id = "multi"; data = "erase_line;insert_text /ws "; }, - { key = "^K"; id = "scroll_backward"; data = ""; }, - { key = "^J"; id = "scroll_forward"; data = ""; }, - { key = "^j"; id = "scroll_forward"; data = ""; }, - { key = "^k"; id = "scroll_backward"; data = ""; }, - { key = "meta-m"; id = "change_window"; data = "36"; }, - { key = "meta-,"; id = "change_window"; data = "37"; }, - { key = "meta-."; id = "change_window"; data = "38"; }, - { key = "meta-/"; id = "change_window"; data = "39"; }, - { key = "^I"; id = "key"; data = "tab"; }, - { - key = "^Y"; - id = "command"; - data = "script unload adv_windowlist"; - }, - { key = "^T"; id = "command"; data = "awl_nosbar "; }, - { key = "meta-;"; id = "change_window"; data = "40"; }, - { key = "meta-'"; id = "change_window"; data = "41"; }, - { key = "meta-\\"; id = "change_window"; data = "42"; }, - { key = "meta-["; id = "change_window"; data = "43"; }, - { key = "meta-]"; id = "change_window"; data = "44"; }, - { key = "meta-="; id = "change_window"; data = "45"; }, - { key = "meta--"; id = "change_window"; data = "46"; }, - { - key = "^X"; - id = "multi"; - data = "erase_line;insert_text /window server "; - }, - { key = "^D"; id = "scroll_forward"; data = ""; }, - { key = "^U"; } -); -hilights = ( - { text = "haydenh"; nick = "yes"; word = "yes"; }, - { text = "hayden"; nick = "yes"; word = "yes"; }, - { text = "hhvn"; nick = "yes"; word = "yes"; }, - { text = "fr3en0de"; nick = "yes"; word = "yes"; } -); -channels = ( - { name = "#hlircnet"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#GNU/matrix"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#help"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#gopher"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#vhosts"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#opers"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#users"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#service"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#darkscience"; chatnet = "darkscience"; autojoin = "yes"; }, - { name = "#asciiart"; chatnet = "efnet"; autojoin = "yes"; }, - { name = "#unix"; chatnet = "unix"; autojoin = "yes"; }, - { name = "#/g/technology"; chatnet = "Rizon"; autojoin = "yes"; }, - { name = "#uk"; chatnet = "Rizon"; autojoin = "yes"; }, - { name = "#/tech/"; chatnet = "Rizon"; autojoin = "yes"; }, - { name = "#8chan"; chatnet = "Rizon"; autojoin = "yes"; }, - { name = "#books"; chatnet = "genoce"; autojoin = "yes"; }, - { name = "#general"; chatnet = "genoce"; autojoin = "yes"; }, - { name = "#general"; chatnet = "nebulacentre"; autojoin = "yes"; }, - { name = "#gopher"; chatnet = "sdf"; autojoin = "yes"; }, - { name = "#sdf"; chatnet = "sdf"; autojoin = "yes"; }, - { name = "#helpdesk"; chatnet = "sdf"; autojoin = "yes"; }, - { name = "#dataswamp"; chatnet = "dataswamp"; autojoin = "yes"; }, - { name = "#political"; chatnet = "efnet"; autojoin = "yes"; }, - { name = "#LRH"; chatnet = "efnet"; autojoin = "yes"; }, - { name = "#thepiratebay.org"; chatnet = "efnet"; autojoin = "yes"; }, - { name = "#2f30"; chatnet = "cyberia"; autojoin = "yes"; }, - { name = "#shadow"; chatnet = "hlircnet"; autojoin = "yes"; }, - { name = "#cyberia"; chatnet = "cyberia"; autojoin = "yes"; } -); -completions = { - hubus = { value = "hub.us.hlircnet."; }; - iarea51 = { value = "irc.area51.haydenvh.com"; }; - hubeu = { value = "hub.eu.hlircnet."; }; - chhlirc = { value = "chanhold.hlircnet."; }; - torhlirc = { value = "tor.hlircnet."; }; - morn = { value = "Morning"; }; - aftn = { value = "Afternoon"; }; - aft = { value = "Afternoon"; }; -}; -ignores = ( - { mask = "ARS"; level = "NOTICES"; }, - { mask = "[control-panel]"; level = "NO_ACT ALL"; }, - { mask = "[hilights]"; level = "NO_ACT ALL"; }, - { mask = "BASHy2-EU"; level = "MSGS"; }, - { mask = "freenode-connect"; level = "ALL"; }, - { mask = "P80drone"; level = "ALL"; }, - { mask = "dmonp80"; level = "ALL"; }, - { level = "NO_ACT ALL"; channels = ( "#service" ); }, - { level = "NO_ACT ALL"; channels = ( "#users" ); }, - { mask = "BASHy2"; level = "MSGS"; } -); -notifies = { "creep^ltx!*" = { ircnets = ( "freenode" ); }; incal = { }; }; -windows = { - 1 = { - immortal = "yes"; - name = "[control-panel]"; - level = "CRAP PUBLICS JOINS PARTS QUITS KICKS MODES TOPICS NICKS CLIENTNOTICES CLIENTCRAP CLIENTERRORS"; - }; - 2 = { - immortal = "yes"; - name = "[notices]"; - servertag = "hlircnet"; - level = "SNOTES WALLOPS"; - }; - 3 = { - immortal = "yes"; - name = "[msgs]"; - level = "MSGS NOTICES CTCPS ACTIONS KICKS TOPICS INVITES NICKS DCC DCCMSGS"; - }; - 4 = { name = "[hilights]"; servertag = "hlircnet"; level = "HILIGHTS"; }; - 5 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#2f30"; - tag = "cyberia"; - } - ); - }; - 6 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#cyberia"; - tag = "cyberia"; - } - ); - }; - 7 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#gopher"; - tag = "sdf"; - } - ); - }; - 8 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#sdf"; - tag = "sdf"; - } - ); - }; - 9 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#helpdesk"; - tag = "sdf"; - } - ); - }; - 10 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#hlircnet"; - tag = "hlircnet"; - } - ); - }; - 11 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#GNU/matrix"; - tag = "hlircnet"; - } - ); - }; - 12 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#help"; - tag = "hlircnet"; - } - ); - }; - 13 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#gopher"; - tag = "hlircnet"; - } - ); - }; - 14 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#vhosts"; - tag = "hlircnet"; - } - ); - }; - 15 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#opers"; - tag = "hlircnet"; - } - ); - }; - 16 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#users"; - tag = "hlircnet"; - } - ); - }; - 17 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#service"; - tag = "hlircnet"; - } - ); - }; - 18 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#unix"; - tag = "unix"; - } - ); - }; - 19 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#dataswamp"; - tag = "dataswamp"; - } - ); - }; - 20 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#general"; - tag = "nebulacentre"; - } - ); - }; - 21 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#asciiart"; - tag = "efnet"; - } - ); - }; - 22 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#political"; - tag = "efnet"; - } - ); - }; - 23 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#LRH"; - tag = "efnet"; - } - ); - }; - 24 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#thepiratebay.org"; - tag = "efnet"; - } - ); - }; - 25 = { - level = "PUBLICS NOTICES CTCPS ACTIONS JOINS PARTS QUITS KICKS MODES TOPICS NICKS"; - items = ( - { - type = "CHANNEL"; - chat_type = "IRC"; - name = "#shadow"; - tag = "hlircnet"; - } - ); - }; -}; -mainwindows = { - 1 = { - first_line = "0"; - lines = "90"; - first_column = "0"; - columns = "349"; - }; -}; diff --git a/.config/irssi/default.theme b/.config/irssi/default.theme @@ -1,833 +0,0 @@ -# When testing changes, the easiest way to reload the theme is with /RELOAD. -# This reloads the configuration file too, so if you did any changes remember -# to /SAVE it first. Remember also that /SAVE overwrites the theme file with -# old data so keep backups :) - -# TEMPLATES: - -# The real text formats that irssi uses are the ones you can find with -# /FORMAT command. Back in the old days all the colors and texts were mixed -# up in those formats, and it was really hard to change the colors since you -# might have had to change them in tens of different places. So, then came -# this templating system. - -# Now the /FORMATs don't have any colors in them, and they also have very -# little other styling. Most of the stuff you need to change is in this -# theme file. If you can't change something here, you can always go back -# to change the /FORMATs directly, they're also saved in these .theme files. - -# So .. the templates. They're those {blahblah} parts you see all over the -# /FORMATs and here. Their usage is simply {name parameter1 parameter2}. -# When irssi sees this kind of text, it goes to find "name" from abstracts -# block below and sets "parameter1" into $0 and "parameter2" into $1 (you -# can have more parameters of course). Templates can have subtemplates. -# Here's a small example: -# /FORMAT format hello {colorify {underline world}} -# abstracts = { colorify = "%G$0-%n"; underline = "%U$0-%U"; } -# When irssi expands the templates in "format", the final string would be: -# hello %G%Uworld%U%n -# ie. underlined bright green "world" text. -# and why "$0-", why not "$0"? $0 would only mean the first parameter, -# $0- means all the parameters. With {underline hello world} you'd really -# want to underline both of the words, not just the hello (and world would -# actually be removed entirely). - -# COLORS: - -# You can find definitions for the color format codes in docs/formats.txt. - -# There's one difference here though. %n format. Normally it means the -# default color of the terminal (white mostly), but here it means the -# "reset color back to the one it was in higher template". For example -# if there was /FORMAT test %g{foo}bar, and foo = "%Y$0%n", irssi would -# print yellow "foo" (as set with %Y) but "bar" would be green, which was -# set at the beginning before the {foo} template. If there wasn't the %g -# at start, the normal behaviour of %n would occur. If you _really_ want -# to use the terminal's default color, use %N. - -############################################################################# - -# default foreground color (%N) - -1 is the "default terminal color" -default_color = "-1"; - -# print timestamp/servertag at the end of line, not at beginning -info_eol = "false"; - -# these characters are automatically replaced with specified color -# (dark grey by default) -replaces = { "[]=" = "%K$*%n"; }; - -abstracts = { - ## - ## generic - ## - - # text to insert at the beginning of each non-message line - line_start = "%B-%n!%B-%n "; - - # timestamp styling, nothing by default - timestamp = "$*"; - - # any kind of text that needs hilighting, default is to bold - hilight = "%_$*%_"; - - # any kind of error message, default is bright red - error = "%R$*%n"; - - # channel name is printed - channel = "%_$*%_"; - - # nick is printed - nick = "%_$*%_"; - - # nick host is printed - nickhost = "[$*]"; - - # server name is printed - server = "%_$*%_"; - - # some kind of comment is printed - comment = "[$*]"; - - # reason for something is printed (part, quit, kick, ..) - reason = "{comment $*}"; - - # mode change is printed ([+o nick]) - mode = "{comment $*}"; - - ## - ## channel specific messages - ## - - # highlighted nick/host is printed (joins) - channick_hilight = "%C$*%n"; - chanhost_hilight = "{nickhost %c$*%n}"; - - # nick/host is printed (parts, quits, etc.) - channick = "%c$*%n"; - chanhost = "{nickhost $*}"; - - # highlighted channel name is printed - channelhilight = "%c$*%n"; - - # ban/ban exception/invite list mask is printed - ban = "%c$*%n"; - - ## - ## messages - ## - - # the basic styling of how to print message, $0 = nick mode, $1 = nick - msgnick = "%K<%n$0$1-%K>%n %|"; - - # message from you is printed. "ownnick" specifies the styling of the - # nick ($0 part in msgnick) and "ownmsgnick" specifies the styling of the - # whole line. - - # Example1: You want the message text to be green: - # ownmsgnick = "{msgnick $0 $1-}%g"; - # Example2.1: You want < and > chars to be yellow: - # ownmsgnick = "%Y{msgnick $0 $1-%Y}%n"; - # (you'll also have to remove <> from replaces list above) - # Example2.2: But you still want to keep <> grey for other messages: - # pubmsgnick = "%K{msgnick $0 $1-%K}%n"; - # pubmsgmenick = "%K{msgnick $0 $1-%K}%n"; - # pubmsghinick = "%K{msgnick $1 $0$2-%n%K}%n"; - # ownprivmsgnick = "%K{msgnick $*%K}%n"; - # privmsgnick = "%K{msgnick %R$*%K}%n"; - - # $0 = nick mode, $1 = nick - ownmsgnick = "{msgnick $0 $1-}"; - ownnick = "%_$*%n"; - - # public message in channel, $0 = nick mode, $1 = nick - pubmsgnick = "{msgnick $0 $1-}"; - pubnick = "%N$*%n"; - - # public message in channel meant for me, $0 = nick mode, $1 = nick - pubmsgmenick = "{msgnick $0 $1-}"; - menick = "%Y$*%n"; - - # public highlighted message in channel - # $0 = highlight color, $1 = nick mode, $2 = nick - pubmsghinick = "{msgnick $1 $0$2-%n}"; - - # channel name is printed with message - msgchannel = "%K:%c$*%n"; - - # private message, $0 = nick, $1 = host - privmsg = "[%R$0%K(%r$1-%K)%n] "; - - # private message from you, $0 = "msg", $1 = target nick - ownprivmsg = "[%r$0%K(%R$1-%K)%n] "; - - # own private message in query - ownprivmsgnick = "{msgnick $*}"; - ownprivnick = "%_$*%n"; - - # private message in query - privmsgnick = "{msgnick %R$*%n}"; - - ## - ## Actions (/ME stuff) - ## - - # used internally by this theme - action_core = "%_ * $*%n"; - - # generic one that's used by most actions - action = "{action_core $*} "; - - # own action, both private/public - ownaction = "{action $*}"; - - # own action with target, both private/public - ownaction_target = "{action_core $0}%K:%c$1%n "; - - # private action sent by others - pvtaction = "%_ (*) $*%n "; - pvtaction_query = "{action $*}"; - - # public action sent by others - pubaction = "{action $*}"; - - - ## - ## other IRC events - ## - - # whois - whois = "%# $[8]0 : $1-"; - - # notices - ownnotice = "[%r$0%K(%R$1-%K)]%n "; - notice = "%K-%M$*%K-%n "; - pubnotice_channel = "%K:%m$*"; - pvtnotice_host = "%K(%m$*%K)"; - servernotice = "%g!$*%n "; - - # CTCPs - ownctcp = "[%r$0%K(%R$1-%K)] "; - ctcp = "%g$*%n"; - - # wallops - wallop = "%_$*%n: "; - wallop_nick = "%n$*"; - wallop_action = "%_ * $*%n "; - - # netsplits - netsplit = "%R$*%n"; - netjoin = "%C$*%n"; - - # /names list - names_prefix = ""; - names_nick = "[%_$0%_$1-] "; - names_nick_op = "{names_nick $*}"; - names_nick_halfop = "{names_nick $*}"; - names_nick_voice = "{names_nick $*}"; - names_users = "[%g$*%n]"; - names_channel = "%G$*%n"; - - # DCC - dcc = "%g$*%n"; - dccfile = "%_$*%_"; - - # DCC chat, own msg/action - dccownmsg = "[%r$0%K($1-%K)%n] "; - dccownnick = "%R$*%n"; - dccownquerynick = "%_$*%n"; - dccownaction = "{action $*}"; - dccownaction_target = "{action_core $0}%K:%c$1%n "; - - # DCC chat, others - dccmsg = "[%G$1-%K(%g$0%K)%n] "; - dccquerynick = "%G$*%n"; - dccaction = "%_ (*dcc*) $*%n %|"; - - ## - ## statusbar - ## - - # default background for all statusbars. You can also give - # the default foreground color for statusbar items. - sb_background = "%4%w"; - window_border = "%4%w"; - - # default backround for "default" statusbar group - #sb_default_bg = "%4"; - # background for prompt / input line - sb_prompt_bg = "%n"; - # background for info statusbar - sb_info_bg = "%8"; - # background for topicbar (same default) - #sb_topic_bg = "%4"; - - # text at the beginning of statusbars. "sb" already puts a space there, - # so we don't use anything by default. - sbstart = ""; - # text at the end of statusbars. Use space so that it's never - # used for anything. - sbend = " "; - - topicsbstart = "{sbstart $*}"; - topicsbend = "{sbend $*}"; - - prompt = "[$*] "; - - sb = " %c[%n$*%c]%n"; - sbmode = "(%c+%n$*)"; - sbaway = " (%GzZzZ%n)"; - sbservertag = ":$0 (change with ^X)"; - sbnickmode = "$0"; - - # activity in statusbar - - # ',' separator - sb_act_sep = "%c$*"; - # normal text - sb_act_text = "%c$*"; - # public message - sb_act_msg = "%W$*"; - # hilight - sb_act_hilight = "%M$*"; - # hilight with specified color, $0 = color, $1 = text - sb_act_hilight_color = "$0$1-%n"; -}; -formats = { - "fe-common/irc/notifylist" = { - notify_join = "{nick $0} [$1@$2] [{hilight $3}] has joined to $4"; - notify_part = "{nick $0} has left $4"; - notify_away = "{nick $0} [$5] [$1@$2] [{hilight $3}] is now away: $4"; - notify_unaway = "{nick $0} [$4] [$1@$2] [{hilight $3}] is now unaway"; - notify_online = "On $0: {hilight $1}"; - notify_offline = "Offline: $0"; - notify_list = "$0: $1 $2"; - notify_list_empty = "The notify list is empty"; - }; - "fe-common/core" = { - line_start = "{line_start}"; - line_start_irssi = "{line_start}{hilight Irssi:} "; - timestamp = "{timestamp $Z} "; - servertag = "[$0] "; - daychange = "Day changed to %%d %%b %%Y"; - talking_with = "You are now talking with {nick $0}"; - refnum_too_low = "Window number must be greater than 1"; - error_server_sticky = "Window's server is sticky and it cannot be changed without -unsticky option"; - set_server_sticky = "Window's server set sticky"; - unset_server_sticky = "Window's server isn't sticky anymore"; - window_name_not_unique = "Window names must be unique"; - window_level = "Window level is now $0"; - window_set_immortal = "Window is now immortal"; - window_unset_immortal = "Window isn't immortal anymore"; - window_immortal_error = "Window is immortal, if you really want to close it, say /WINDOW IMMORTAL OFF"; - windowlist_header = "%#Ref Name Active item Server Level"; - windowlist_line = "%#$[4]0 %|$[20]1 $[15]2 $[15]3 $4"; - windowlist_footer = ""; - windows_layout_saved = "Layout of windows is now remembered"; - windows_layout_reset = "Layout of windows reset to defaults"; - window_info_header = ""; - window_info_footer = ""; - window_info_refnum = "%#Window : {hilight #$0}"; - window_info_refnum_sticky = "%#Window : {hilight #$0 (sticky)}"; - window_info_name = "%#Name : $0"; - window_info_history = "%#History : $0"; - window_info_immortal = "%#Immortal: yes"; - window_info_size = "%#Size : $0x$1"; - window_info_level = "%#Level : $0"; - window_info_server = "%#Server : $0"; - window_info_server_sticky = "%#Server : $0 (sticky)"; - window_info_theme = "%#Theme : $0$1"; - window_info_bound_items_header = "%#Bounds : {hilight Name Server tag}"; - window_info_bound_item = "%# : $[!30]0 $[!15]1 $2"; - window_info_bound_items_footer = ""; - window_info_items_header = "%#Items : {hilight Name Server tag}"; - window_info_item = "%# $[7]0: $[!30]1 $2"; - window_info_items_footer = ""; - looking_up = "Looking up {server $0}"; - connecting = "Connecting to {server $0} [$1] port {hilight $2}"; - reconnecting = "Reconnecting to {server $0} [$1] port {hilight $2} - use /RMRECONNS to abort"; - connection_established = "Connection to {server $0} established"; - cant_connect = "Unable to connect server {server $0} port {hilight $1} {reason $2}"; - connection_lost = "Connection lost to {server $0}"; - lag_disconnected = "No PONG reply from server {server $0} in $1 seconds, disconnecting"; - disconnected = "Disconnected from {server $0} {reason $1}"; - server_quit = "Disconnecting from server {server $0}: {reason $1}"; - server_changed = "Changed to {hilight $2} server {server $1}"; - unknown_server_tag = "Unknown server tag {server $0}"; - no_connected_servers = "Not connected to any servers"; - server_list = "{server $0}: $1:$2 ($3)"; - server_lookup_list = "{server $0}: $1:$2 ($3) (connecting...)"; - server_reconnect_list = "{server $0}: $1:$2 ($3) ($5 left before reconnecting)"; - server_reconnect_removed = "Removed reconnection to server {server $0} port {hilight $1}"; - server_reconnect_not_found = "Reconnection tag {server $0} not found"; - setupserver_added = "Server {server $0} saved"; - setupserver_removed = "Server {server $0} removed"; - setupserver_not_found = "Server {server $0} not found"; - your_nick = "Your nickname is {nick $0}"; - join = "{channick_hilight $0} {chanhost_hilight $1} has joined {channel $2}"; - part = "{channick $0} {chanhost $1} has left {channel $2} {reason $3}"; - kick = "{channick $0} was kicked from {channel $1} by {nick $2} {reason $3}"; - quit = "{channick $0} {chanhost $1} has quit {reason $2}"; - quit_once = "{channel $3} {channick $0} {chanhost $1} has quit {reason $2}"; - invite = "{nick $0} invites you to {channel $1}"; - not_invited = "You have not been invited to a channel!"; - new_topic = "{nick $0} changed the topic of {channel $1} to: $2"; - topic_unset = "Topic unset by {nick $0} on {channel $1}"; - your_nick_changed = "You're now known as {nick $1}"; - nick_changed = "{channick $0} is now known as {channick_hilight $1}"; - talking_in = "You are now talking in {channel $0}"; - not_in_channels = "You are not on any channels"; - current_channel = "Current channel {channel $0}"; - names = "{names_users Users {names_channel $0}}"; - names_prefix = "%#{names_prefix $0}"; - names_nick_op = "{names_nick_op $0 $1}"; - names_nick_halfop = "{names_nick_halfop $0 $1}"; - names_nick_voice = "{names_nick_voice $0 $1}"; - names_nick = "{names_nick $0 $1}"; - endofnames = "{channel $0}: Total of {hilight $1} nicks {comment {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal}"; - chanlist_header = "%#You are on the following channels:"; - chanlist_line = "%#{channel $[-10]0} %|+$1 ($2): $3"; - chansetup_not_found = "Channel {channel $0} not found"; - chansetup_added = "Channel {channel $0} saved"; - chansetup_removed = "Channel {channel $0} removed"; - chansetup_header = "%#Channel Network Password Settings"; - chansetup_line = "%#{channel $[15]0} %|$[10]1 $[10]2 $3"; - chansetup_footer = ""; - own_msg = "{ownmsgnick $2 {ownnick $0}}$1"; - own_msg_channel = "{ownmsgnick $3 {ownnick $0}{msgchannel $1}}$2"; - own_msg_private = "{ownprivmsg msg $0}$1"; - own_msg_private_query = "{ownprivmsgnick {ownprivnick $2}}$1"; - pubmsg_me = "{pubmsgmenick $2 {menick $0}}$1"; - pubmsg_me_channel = "{pubmsgmenick $3 {menick $0}{msgchannel $1}}$2"; - pubmsg_hilight = "{pubmsghinick $0 $3 $1}$2"; - pubmsg_hilight_channel = "{pubmsghinick $0 $4 $1{msgchannel $2}}$3"; - pubmsg = "{pubmsgnick $2 {pubnick $0}}$1"; - pubmsg_channel = "{pubmsgnick $3 {pubnick $0}{msgchannel $1}}$2"; - msg_private = "{privmsg $0 $1}$2"; - msg_private_query = "{privmsgnick $0}$2"; - no_msgs_got = "You have not received a message from anyone yet"; - no_msgs_sent = "You have not sent a message to anyone yet"; - query_start = "Starting query in {server $1} with {nick $0}"; - query_stop = "Closing query with {nick $0}"; - no_query = "No query with {nick $0}"; - query_server_changed = "Query with {nick $0} changed to server {server $1}"; - hilight_header = "%#Highlights:"; - hilight_line = "%#$[-4]0 $1 $2 $3$4"; - hilight_footer = ""; - hilight_not_found = "Highlight not found: $0"; - hilight_removed = "Highlight removed: $0"; - alias_added = "Alias $0 added"; - alias_removed = "Alias $0 removed"; - alias_not_found = "No such alias: $0"; - aliaslist_header = "%#Aliases:"; - aliaslist_line = "%#$[10]0 $1"; - aliaslist_footer = ""; - log_opened = "Log file {hilight $0} opened"; - log_closed = "Log file {hilight $0} closed"; - log_create_failed = "Couldn't create log file {hilight $0}: $1"; - log_locked = "Log file {hilight $0} is locked, probably by another running Irssi"; - log_not_open = "Log file {hilight $0} not open"; - log_started = "Started logging to file {hilight $0}"; - log_stopped = "Stopped logging to file {hilight $0}"; - log_list_header = "%#Logs:"; - log_list = "%#$0 $1: $2 $3$4$5"; - log_list_footer = ""; - windowlog_file = "Window LOGFILE set to $0"; - windowlog_file_logging = "Can't change window's logfile while log is on"; - no_away_msgs = "No new messages in awaylog"; - away_msgs = "{hilight $1} new messages in awaylog:"; - module_header = "%#Module Type Submodules"; - module_line = "%#$[!20]0 $[7]1 $2"; - module_footer = ""; - module_already_loaded = "Module {hilight $0/$1} already loaded"; - module_not_loaded = "Module {hilight $0/$1} is not loaded"; - module_load_error = "Error loading module {hilight $0/$1}: $2"; - module_version_mismatch = "{hilight $0/$1} is ABI version $2 but Irssi is version $abiversion, cannot load"; - module_invalid = "{hilight $0/$1} isn't Irssi module"; - module_loaded = "Loaded module {hilight $0/$1}"; - module_unloaded = "Unloaded module {hilight $0/$1}"; - command_unknown = "Unknown command: $0"; - command_ambiguous = "Ambiguous command: $0"; - option_unknown = "Unknown option: $0"; - option_ambiguous = "Ambiguous option: $0"; - option_missing_arg = "Missing required argument for: $0"; - not_enough_params = "Not enough parameters given"; - not_connected = "Not connected to server"; - not_joined = "Not joined to any channel"; - chan_not_found = "Not joined to such channel"; - chan_not_synced = "Channel not fully synchronized yet, try again after a while"; - illegal_proto = "Command isn't designed for the chat protocol of the active server"; - not_good_idea = "Doing this is not a good idea. Add -YES option to command if you really mean it"; - invalid_number = "Invalid number"; - invalid_time = "Invalid timestamp"; - invalid_level = "Invalid message level"; - invalid_size = "Invalid size"; - invalid_charset = "Invalid charset: $0"; - invalid_choice = "Invalid choice, must be one of $0"; - eval_max_recurse = "/eval hit maximum recursion limit"; - program_not_found = "Could not find file or file is not executable"; - no_server_defined = "No servers defined for this network, see /help server for how to add one"; - theme_saved = "Theme saved to $0"; - theme_save_failed = "Error saving theme to $0: $1"; - theme_not_found = "Theme {hilight $0} not found"; - theme_changed = "Now using theme {hilight $0} ($1)"; - window_theme = "Using theme {hilight $0} in this window"; - window_theme_default = "No theme is set for this window"; - window_theme_changed = "Now using theme {hilight $0} ($1) in this window"; - window_theme_removed = "Removed theme from this window"; - format_title = "%:[{hilight $0}] - [{hilight $1}]%:"; - format_subtitle = "[{hilight $0}]"; - format_item = "$0 = $1"; - ignored = "Ignoring {hilight $1} from {nick $0}"; - ignored_options = "Ignoring {hilight $1} from {nick $0} {comment $2}"; - unignored = "Unignored {nick $0}"; - ignore_not_found = "{nick $0} is not being ignored"; - ignore_no_ignores = "There are no ignores"; - ignore_header = "%#Ignore List:"; - ignore_line = "%#$[-4]0 $1: $2 $3 $4"; - ignore_footer = ""; - not_channel_or_query = "The current window is not a channel or query window"; - conversion_added = "Added {hilight $0}/{hilight $1} to conversion database"; - conversion_removed = "Removed {hilight $0} from conversion database"; - conversion_not_found = "{hilight $0} not found in conversion database"; - conversion_no_translits = "Transliterations not supported in this system"; - recode_header = "%#Target Character set"; - recode_line = "%#%|$[!30]0 $1"; - unknown_chat_protocol = "Unknown chat protocol: $0"; - unknown_chatnet = "Unknown chat network: $0 (create it with /NETWORK ADD)"; - not_toggle = "Value must be either ON, OFF or TOGGLE"; - perl_error = "Perl error: $0"; - bind_header = "%#Key Action"; - bind_list = "%#$[!20]0 $1 $2"; - bind_command_list = "$[!30]0 $1"; - bind_footer = ""; - bind_unknown_id = "Unknown bind action: $0"; - config_saved = "Saved configuration to file $0"; - config_reloaded = "Reloaded configuration"; - config_modified = "Configuration file was modified since irssi was last started - do you want to overwrite the possible changes?"; - glib_error = "{error $0} $1"; - overwrite_config = "Overwrite config (y/N)?"; - set_title = "[{hilight $0}]"; - set_item = "$[-!32]0 %_$1"; - set_unknown = "Unknown setting $0"; - set_not_boolean = "Setting {hilight $0} isn't boolean, use /SET"; - no_completions = "There are no completions"; - completion_removed = "Removed completion $0"; - completion_header = "%#Key Value Auto"; - completion_line = "%#$[10]0 $[!40]1 $2"; - completion_footer = ""; - capsicum_enabled = "Capability mode enabled"; - capsicum_disabled = "Capability mode not enabled"; - capsicum_failed = "Capability mode failed: $0"; - tls_ephemeral_key = "EDH Key: {hilight $0} bit {hilight $1}"; - tls_ephemeral_key_unavailable = "EDH Key: {error N/A}"; - tls_pubkey = "Public Key: {hilight $0} bit {hilight $1}, valid from {hilight $2} to {hilight $3}"; - tls_cert_header = "Certificate Chain:"; - tls_cert_subject = " Subject: {hilight $0}"; - tls_cert_issuer = " Issuer: {hilight $0}"; - tls_pubkey_fingerprint = "Public Key Fingerprint: {hilight $0} ({hilight $1})"; - tls_cert_fingerprint = "Certificate Fingerprint: {hilight $0} ({hilight $1})"; - tls_protocol_version = "Protocol: {hilight $0} ({hilight $1} bit, {hilight $2})"; - }; - "fe-common/irc/dcc" = { - own_dcc = "{dccownmsg dcc {dccownnick $1}}$2"; - own_dcc_action = "{dccownaction_target $0 $1}$2"; - own_dcc_action_query = "{dccownaction $0}$2"; - own_dcc_ctcp = "{ownctcp ctcp $0}$1 $2"; - dcc_msg = "{dccmsg dcc $0}$1"; - action_dcc = "{dccaction $0}$1"; - action_dcc_query = "{dccaction $0}$1"; - own_dcc_query = "{ownmsgnick {dccownquerynick $0}}$2"; - dcc_msg_query = "{privmsgnick $0}$1"; - dcc_ctcp = "{dcc >>> DCC CTCP {hilight $1} received from {hilight $0}: $2}"; - dcc_chat = "{dcc DCC CHAT from {nick $0} [$1 port $2]}"; - dcc_chat_channel = "{dcc DCC CHAT from {nick $0} [$1 port $2] requested in channel {channel $3}}"; - dcc_chat_not_found = "{dcc No DCC CHAT connection open to {nick $0}}"; - dcc_chat_connected = "{dcc DCC CHAT connection with {nick $0} [$1 port $2] established}"; - dcc_chat_disconnected = "{dcc DCC lost chat to {nick $0}}"; - dcc_send = "{dcc DCC SEND from {nick $0} [$1 port $2]: $3 [$4]}"; - dcc_send_channel = "{dcc DCC SEND from {nick $0} [$1 port $2]: $3 [$4 bytes] requested in channel {channel $5}}"; - dcc_send_exists = "{dcc DCC already sending file {dccfile $0} for {nick $1}}"; - dcc_send_no_route = "{dcc DCC route lost to nick {nick $0} when trying to send file {dccfile $1}}"; - dcc_send_not_found = "{dcc DCC not sending file {dccfile $1} to {nick $0}}"; - dcc_send_file_open_error = "{dcc DCC can't open file {dccfile $0}: $1}"; - dcc_send_connected = "{dcc DCC sending file {dccfile $0} for {nick $1} [$2 port $3]}"; - dcc_send_complete = "{dcc DCC sent file {dccfile $0} [{hilight $1}] for {nick $2} in {hilight $3} [{hilight $4kB/s}]}"; - dcc_send_aborted = "{dcc DCC aborted sending file {dccfile $0} for {nick $1}}"; - dcc_get_not_found = "{dcc DCC no file offered by {nick $0}}"; - dcc_get_connected = "{dcc DCC receiving file {dccfile $0} from {nick $1} [$2 port $3]}"; - dcc_get_complete = "{dcc DCC received file {dccfile $0} [$1] from {nick $2} in {hilight $3} [$4kB/s]}"; - dcc_get_aborted = "{dcc DCC aborted receiving file {dccfile $0} from {nick $1}}"; - dcc_get_write_error = "{dcc DCC error writing to file {dccfile $0}: {comment $1}"; - dcc_unknown_ctcp = "{dcc DCC unknown ctcp {hilight $0} from {nick $1} [$2]}"; - dcc_unknown_reply = "{dcc DCC unknown reply {hilight $0} from {nick $1} [$2]}"; - dcc_unknown_type = "{dcc DCC unknown type {hilight $0}}"; - dcc_invalid_ctcp = "{dcc DCC received CTCP {hilight $0} with invalid parameters from {nick $1}}"; - dcc_connect_error = "{dcc DCC can't connect to {hilight $0} port {hilight $1}}"; - dcc_cant_create = "{dcc DCC can't create file {dccfile $0}: $1}"; - dcc_rejected = "{dcc DCC $0 was rejected by {nick $1} [{hilight $2}]}"; - dcc_request_send = "{dcc DCC $0 request sent to {nick $1}: $2"; - dcc_close = "{dcc DCC $0 close for {nick $1} [{hilight $2}]}"; - dcc_lowport = "{dcc Warning: Port sent with DCC request is a lowport ({hilight $0, $1}) - this isn't normal. It is possible the address/port is faked (or maybe someone is just trying to bypass firewall)}"; - dcc_list_header = "{dcc DCC connections}"; - dcc_list_line_chat = "{dcc $0 $1}"; - dcc_list_line_file = "{dcc $0 $1: %|$2 of $3 ($4%%) - $5kB/s - ETA $7 - $6}"; - dcc_list_line_queued_send = "{dcc - $0 $2 (queued)}"; - dcc_list_footer = ""; - dcc_list_line_server = "{dcc $0: Port($1) - Send($2) - Chat($3) - Fserve($4)}"; - dcc_server_started = "{dcc DCC SERVER started on port {hilight $0}}"; - dcc_server_closed = "{dcc DCC SERVER on port {hilight $0} closed}"; - }; - "fe-common/irc" = { - netsplit = "{netsplit Netsplit} {server $0} <-> {server $1} quits: $2"; - netsplit_more = "{netsplit Netsplit} {server $0} <-> {server $1} quits: $2 (+$3 more, use /NETSPLIT to show all of them)"; - netsplit_join = "{netjoin Netsplit} over, joins: $0"; - netsplit_join_more = "{netjoin Netsplit} over, joins: $0 (+$1 more)"; - no_netsplits = "There are no net splits"; - netsplits_header = "%#Nick Channel Server Split server"; - netsplits_line = "%#$[9]0 $[10]1 $[20]2 $3"; - netsplits_footer = ""; - network_added = "Network $0 saved"; - network_removed = "Network $0 removed"; - network_not_found = "Network $0 not found"; - network_header = "%#Networks:"; - network_line = "%#$0: $1"; - network_footer = ""; - setupserver_header = "%#Server Port Network Settings"; - setupserver_line = "%#%|$[!20]0 $[5]1 $[10]2 $3"; - setupserver_footer = ""; - sasl_success = "SASL authentication succeeded"; - sasl_error = "Cannot authenticate via SASL ($0)"; - cap_req = "Capabilities requested: $0"; - cap_ls = "Capabilities supported: $0"; - cap_ack = "Capabilities acknowledged: $0"; - cap_nak = "Capabilities refused: $0"; - cap_list = "Capabilities currently enabled: $0"; - cap_new = "Capabilities now available: $0"; - cap_del = "Capabilities removed: $0"; - joinerror_toomany = "Cannot join to channel {channel $0} (You have joined to too many channels)"; - joinerror_full = "Cannot join to channel {channel $0} (Channel is full)"; - joinerror_invite = "Cannot join to channel {channel $0} (You must be invited)"; - joinerror_banned = "Cannot join to channel {channel $0} (You are banned)"; - joinerror_bad_key = "Cannot join to channel {channel $0} (Bad channel key)"; - joinerror_bad_mask = "Cannot join to channel {channel $0} (Bad channel mask)"; - joinerror_unavail = "Cannot join to channel {channel $0} (Channel is temporarily unavailable)"; - joinerror_duplicate = "Channel {channel $0} already exists - cannot create it"; - channel_rejoin = "Channel {channel $0} is temporarily unavailable, this is normally because of netsplits. Irssi will now automatically try to rejoin back to this channel until the join is successful. Use /RMREJOINS command if you wish to abort this."; - inviting = "Inviting {nick $0} to {channel $1}"; - channel_created = "Channel {channelhilight $0} created $1"; - url = "Home page for {channelhilight $0}: $1"; - topic = "Topic for {channelhilight $0}: $1"; - no_topic = "No topic set for {channelhilight $0}"; - topic_info = "Topic set by {nick $0} {nickhost $2} {comment $1}"; - chanmode_change = "mode/{channelhilight $0} {mode $1} by {nick $2}"; - server_chanmode_change = "{netsplit ServerMode}/{channelhilight $0} {mode $1} by {nick $2}"; - channel_mode = "mode/{channelhilight $0} {mode $1}"; - bantype = "Ban type changed to {channel $0}"; - no_bans = "No bans in channel {channel $0}"; - banlist = "$0 - {channel $1}: ban {ban $2}"; - banlist_long = "$0 - {channel $1}: ban {ban $2} {comment by {nick $3}, $4 secs ago}"; - ebanlist = "{channel $0}: ban exception {ban $1}"; - ebanlist_long = "{channel $0}: ban exception {ban $1} {comment by {nick $2}, $3 secs ago}"; - no_invitelist = "Invite list is empty in channel {channel $0}"; - invitelist = "{channel $0}: invite {ban $1}"; - invitelist_long = "{channel $0}: invite {ban $1} {comment by {nick $2}, $3 secs ago}"; - no_such_channel = "{channel $0}: No such channel"; - channel_synced = "Join to {channel $0} was synced in {hilight $1} secs"; - usermode_change = "Mode change {mode $0} for user {nick $1}"; - user_mode = "Your user mode is {mode $0}"; - away = "You have been marked as being away"; - unaway = "You are no longer marked as being away"; - nick_away = "{nick $0} is away: $1"; - no_such_nick = "{nick $0}: No such nick/channel"; - nick_in_use = "Nick {nick $0} is already in use"; - nick_unavailable = "Nick {nick $0} is temporarily unavailable"; - your_nick_owned = "Your nick is owned by {nick $3} {comment $1@$2}"; - whois = "{nick $0} {nickhost $1@$2}%:{whois ircname $3}"; - whowas = "{nick $0} {nickhost $1@$2}%:{whois was $3}"; - whois_idle = "{whois idle %|$1 days $2 hours $3 mins $4 secs}"; - whois_idle_signon = "{whois idle %|$1 days $2 hours $3 mins $4 secs {comment signon: $5}}"; - whois_server = "{whois server %|$1 {comment $2}}"; - whois_oper = "{whois {hilight $1}}"; - whois_modes = "{whois modes $1}"; - whois_realhost = "{whois hostname $1-}"; - whois_usermode = "{whois usermode $1}"; - whois_channels = "{whois channels %|$1}"; - whois_away = "{whois away %|$1}"; - whois_special = "{whois %|$1}"; - whois_extra = "{whois account %|$1}"; - end_of_whois = "End of WHOIS"; - end_of_whowas = "End of WHOWAS"; - whois_not_found = "There is no such nick $0"; - who = "%#{channelhilight $[-10]0} %|{nick $[!9]1} $[!3]2 $[!2]3 $4@$5 {comment {hilight $6}}"; - end_of_who = "End of /WHO list"; - own_notice = "{ownnotice notice $0}$1"; - own_action = "{ownaction $0}$1"; - own_action_target = "{ownaction_target $0 $2}$1"; - own_ctcp = "{ownctcp ctcp $0}$1 $2"; - notice_server = "{servernotice $0}$1"; - notice_public = "{notice $0{pubnotice_channel $1}}$2"; - notice_private = "{notice $0{pvtnotice_host $1}}$2"; - action_private = "{pvtaction $0}$2"; - action_private_query = "{pvtaction_query $0}$2"; - action_public = "{pubaction $0}$1"; - action_public_channel = "{pubaction $0{msgchannel $1}}$2"; - ctcp_reply = "CTCP {hilight $0} reply from {nick $1}: $2"; - ctcp_reply_channel = "CTCP {hilight $0} reply from {nick $1} in channel {channel $3}: $2"; - ctcp_ping_reply = "CTCP {hilight PING} reply from {nick $0}: $1.$[-3.0]2 seconds"; - ctcp_requested = "{ctcp {hilight $0} {comment $1} requested CTCP {hilight $2} from {nick $4}}: $3"; - ctcp_requested_unknown = "{ctcp {hilight $0} {comment $1} requested unknown CTCP {hilight $2} from {nick $4}}: $3"; - online = "Users online: {hilight $0}"; - pong = "PONG received from $0: $1"; - wallops = "{wallop WALLOP {wallop_nick $0}} $1"; - action_wallops = "{wallop WALLOP {wallop_action $0}} $1"; - kill = "You were {error killed} by {nick $0} {nickhost $1} {reason $2} {comment Path: $3}"; - kill_server = "You were {error killed} by {server $0} {reason $1} {comment Path: $2}"; - error = "{error ERROR} $0"; - unknown_mode = "Unknown mode character $0"; - default_event = "$1"; - default_event_server = "[$0] $1"; - silenced = "Silenced {nick $0}"; - unsilenced = "Unsilenced {nick $0}"; - silence_line = "{nick $0}: silence {ban $1}"; - ask_oper_pass = "Operator password:"; - accept_list = "Accepted users: {hilight $0}"; - }; - "fe-common/perl" = { - script_not_found = "Script {hilight $0} not found"; - script_not_loaded = "Script {hilight $0} is not loaded"; - script_loaded = "Loaded script {hilight $0}"; - script_unloaded = "Unloaded script {hilight $0}"; - no_scripts_loaded = "No scripts are loaded"; - script_list_header = "%#Loaded scripts:"; - script_list_line = "%#$[!15]0 $1"; - script_list_footer = ""; - script_error = "{error Error in script {hilight $0}:}"; - }; - "Irssi::Script::ctcpspoof" = { - fctcp_info = " # ctcpitem ctcpreply"; - fctcp_empty = "%R>>%n %_FCTCP:%_ Your fake ctcp list is empty."; - fctcp_added = "%R>>%n %_FCTCP:%_ Added %_$0%_ ($1) to the fake ctcp list."; - fctcp_replaced = "%R>>%n %_FCTCP:%_ Replaced the old fake reply %_$0%_ with the new one ($1)"; - fctcp_delled = "%R>>%n %_FCTCP:%_ Deleted %_$0%_ from the fake ctcp list."; - fctcp_nfound = "%R>>%n %_FCTCP:%_ Can't find $0 in the fake ctcp list."; - fctcp_delusage = "%R>>%n %_FCTCP:%_ Usage: /FCTCP -del <ctcp-item>"; - fctcp_usage = "%R>>%n %_FCTCP:%_ Usage: /FCTCP -add <ctcp-item> <ctcp-reply>"; - fctcp_repusage = "%R>>%n %_FCTCP:%_ Usage: /FCTCP -replace <ctcp-item> <ctcp-reply>"; - fctcp_nload = "%R>>%n %_FCTCP:%_ Could not load the fake ctcp list."; - fctcp_request = "%R>>%n %_FCTCP:%_ Used the fake reply %_$1%_ on %_$0%_"; - fctcp_loaded = "%R>>%n %_FCTCP:%_ The fake reply %_$0%_ already exists, use %_/FCTCP -del $0%_ to remove it from the list."; - fctcp_print = "$[!-2]0 $[20]1 $2"; - fctcp_help = "$0"; - loaded = "%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2."; - }; - "Irssi::Script::tmux_away" = { - tmux_away_crap = "{line_start}{hilight tmux_away:} $0"; - }; - "Irssi::Script::ascii" = { - ascii_not_connected = "%_$0:%_ You're not connected to server"; - ascii_not_window = "%_$0:%_ Not joined to any channel or query window"; - ascii_not_chanwindow = "%_$0:%_ Not joined to any channel"; - ascii_not_chanop = "%_$0:%_ You're not channel operator in {hilight $1}"; - ascii_figlet_notfound = "%_Ascii:%_ Cannot execute {hilight $0} - file not found or bad permissions"; - ascii_figlet_notset = "%_Ascii:%_ Cannot find external program %_figlet%_, usign /SET ascii_figlet_path [path], to set it"; - ascii_cmd_syntax = "%_$0:%_ $1, usage: $2"; - ascii_figlet_error = "%_Ascii: Figlet returns error:%_ $0-"; - ascii_fontlist = "%_Ascii:%_ Available fonts [in $0]: $1 ($2)"; - ascii_empty_fontlist = "%_Ascii:%_ Cannot find figlet fonts in $0"; - ascii_unknown_fontdir = "%_Ascii:%_ Cannot find figlet fontdir"; - ascii_show_line = "$0-"; - }; - "Irssi::Script::trackbar" = { - trackbar_loaded = "%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2."; - trackbar_wrong_version = "%R>>%n %_Trackbar:%_ Please upgrade your client to 0.8.17 or above if you would like to use this feature of trackbar."; - trackbar_all_removed = "%R>>%n %_Trackbar:%_ All the trackbars have been removed."; - trackbar_not_found = "%R>>%n %_Trackbar:%_ No trackbar found in this window."; - }; - "Irssi::Script::adv_windowlist" = { - awl_display_nokey = "$N${cumode_space}$H$C$S"; - awl_display_key = "$Q${cumode_space}$H$C$S"; - awl_display_nokey_visible = "%2$N${cumode_space}$H$C$S"; - awl_display_key_visible = "%2$Q${cumode_space}$H$C$S"; - awl_display_nokey_active = "%1$N${cumode_space}$H$C$S"; - awl_display_key_active = "%1$Q${cumode_space}$H$C$S"; - awl_display_header = "%8$C|${N}"; - awl_name_display = "$0"; - awl_separator = " "; - awl_separator2 = ""; - awl_abbrev_chars = "~〜"; - awl_viewer_item_bg = "%0"; - awl_title = "\\Vawl\\:"; - }; - "Irssi::Script::trigger" = { - trigger_header = "Triggers:"; - trigger_line = "%#$[-4]0 $1"; - trigger_added = "Trigger $0 added: $1"; - trigger_not_found = "Trigger {hilight $0} not found"; - trigger_saved = "Triggers saved to $0"; - trigger_loaded = "Triggers loaded from $0"; - }; - "fe-text" = { - lastlog_too_long = "/LASTLOG would print $0 lines. If you really want to print all these lines use -force option."; - lastlog_count = "{hilight Lastlog}: $0 lines"; - lastlog_start = "{hilight Lastlog}:"; - lastlog_end = "{hilight End of Lastlog}"; - lastlog_separator = "--"; - lastlog_date = "%%F "; - refnum_not_found = "Window number $0 not found"; - window_too_small = "Not enough room to resize this window"; - cant_hide_last = "You can't hide the last window"; - cant_hide_sticky_windows = "You can't hide sticky windows (use /SET autounstick_windows ON)"; - cant_show_sticky_windows = "You can't show sticky windows (use /SET autounstick_windows ON)"; - window_not_sticky = "Window is not sticky"; - window_set_sticky = "Window set sticky"; - window_unset_sticky = "Window is not sticky anymore"; - window_info_sticky = "%#Sticky : $0"; - window_info_scroll = "%#Scroll : $0"; - window_scroll = "Window scroll mode is now $0"; - window_scroll_unknown = "Unknown scroll mode $0, must be ON, OFF or DEFAULT"; - window_hidelevel = "Window hidden level is now $0"; - statusbar_list_header = "%#Name Type Placement Position Visible"; - statusbar_list_footer = ""; - statusbar_list = "%#$[30]0 $[6]1 $[9]2 $[8]3 $4"; - statusbar_info_name = "%#Statusbar: {hilight $0}"; - statusbar_info_type = "%#Type : $0"; - statusbar_info_placement = "%#Placement: $0"; - statusbar_info_position = "%#Position : $0"; - statusbar_info_visible = "%#Visible : $0"; - statusbar_info_item_header = "%#Items : Name Priority Alignment"; - statusbar_info_item_footer = ""; - statusbar_info_item_name = "%# : $[35]0 $[9]1 $2"; - statusbar_not_found = "Statusbar is disabled: $0"; - statusbar_item_not_found = "Statusbar item doesn't exist: $0"; - statusbar_unknown_command = "Unknown statusbar command: $0"; - statusbar_unknown_type = "Statusbar type must be 'window' or 'root'"; - statusbar_unknown_placement = "Statusbar placement must be 'top' or 'bottom'"; - statusbar_unknown_visibility = "Statusbar visibility must be 'always', 'active' or 'inactive'"; - paste_warning = "Pasting $0 lines to $1. Press Ctrl-K if you wish to do this or Ctrl-C to cancel."; - paste_prompt = "Hit Ctrl-K to paste, Ctrl-C to abort?"; - irssi_banner = " ___ _%:|_ _|_ _ _____(_)%: | || '_(_-<_-< |%:|___|_| /__/__/_|%:Irssi v$J - https://irssi.org"; - welcome_firsttime = "- - - - - - - - - - - - - - - - - - - - - - - - - - - -\012Hi there! If this is your first time using Irssi, you%:might want to go to our website and read the startup%:documentation to get you going.%:%:Our community and staff are available to assist you or%:to answer any questions you may have.%:%:Use the /HELP command to get detailed information about%:the available commands.%:%:For Debian specific help type \"/connect OFTC\" and%:\"/join #debian\" (without the quotes) and ask your%:question.%:- - - - - - - - - - - - - - - - - - - - - - - - - - - -"; - welcome_init_settings = "The following settings were initialized"; - }; - "Irssi::Script::keepnick" = { - keepnick_crap = "{line_start}{hilight Keepnick:} $0"; - keepnick_add = "{line_start}{hilight Keepnick:} Now keeping {nick $0} on [$1]"; - keepnick_remove = "{line_start}{hilight Keepnick:} Stopped trying to keep {nick $0} on [$1]"; - keepnick_hold = "{line_start}{hilight Keepnick:} Nickkeeping deactivated on [$1]"; - keepnick_unhold = "{line_start}{hilight Keepnick:} Nickkeeping reactivated on [$1]"; - keepnick_list_empty = "{line_start}{hilight Keepnick:} No nicks in keep list"; - keepnick_list_header = ""; - keepnick_list_line = "{line_start}{hilight Keepnick:} Keeping {nick $0} in [$1] ($2)"; - keepnick_list_footer = ""; - keepnick_got_nick = "{hilight Keepnick:} Nickstealer left [$1], got {nick $0} back"; - }; - "Irssi::Script::nm2" = { - neat_style = " , , p , , c , t , , , "; - neat_action_style = " , p , , t , "; - neat_pad_char = "%K."; - neat_truncate_char = "%m+"; - neat_notruncate_char = ""; - neat_custom_modes = "&%B&%n | @%g@%n | +%y+%n"; - }; -}; diff --git a/.config/irssi/fctcplist b/.config/irssi/fctcplist @@ -1,9 +0,0 @@ -time Time to get a watch -hitthisoneifyouareaflooder fuck off -away I dunno - might be away, might not be... you know, these aren't programmable they're just a string, heheheh -ping ~1958345676742784768726452647 -whoami Why would I know? -fuckoff no you -advert Server: irc.hlirc.net, port: 6667, 6697 -version Something better than what you have -clientinfo PING VERSION TIME CLIENTINFO WHOAMI ADVERT AWAY FUCKOFF diff --git a/.config/irssi/keepnick b/.config/irssi/keepnick @@ -1,11 +0,0 @@ -cyberia hhvn -dataswamp hhvn -efnet hhvn -freenode fr3en0de -genoce hhvn -hlircnet hhvn -nebulacentre hhvn -rizon hhvn -sdf hhvn -unix hhvn -unrealircd hhvn diff --git a/.config/irssi/log2ansi.pl b/.config/irssi/log2ansi.pl @@ -1,412 +0,0 @@ -#! /usr/bin/perl -# -# Copyright (C) 2002-2019 by Peder Stray <peder.stray@gmail.com> -# -# This is a standalone perl program and not intended to run within -# irssi, it will complain if you try to... - -use strict; -use Getopt::Long; -use Encode; -use Pod::Usage; - -use vars qw(%ansi %base %attr %old); -use vars qw(@bols @nums @mirc @irssi @mc @mh @ic @ih @cn); -use vars qw($class $oldclass); - -use vars qw{$VERSION %IRSSI}; -($VERSION) = '$Revision: 1.10 $' =~ / (\d+\.\d+) /; -%IRSSI = ( - name => 'log2ansi', - authors => 'Peder Stray', - contact => 'peder.stray@gmail.com', - url => 'https://github.com/pstray/irssi-log2ansi', - license => 'GPL', - description => 'Convert various color codes to ANSI colors, useful for log filtering and viewing.', - ); - -if (__PACKAGE__ =~ /^Irssi/) { - # we are within irssi... die! - Irssi::print("%RWarning:%n log2ansi should not run from within irssi"); - die "Suicide to prevent loading\n"; -} - -my $opt_clear = 0; -my $opt_html = 0; -my $opt_utf8 = 0; -my $opt_help = 0; - -GetOptions( - 'c|clear!' => \$opt_clear, - 'h|html!' => \$opt_html, - 'u|utf8!' => \$opt_utf8, - 'help' => sub { $opt_help = 1 }, - 'full-help' => sub { $opt_help = 2 }, - ) or pod2usage(2); - -# show some help if stdin is a tty and no files -$opt_help = 1 if !$opt_help && -t 0 && !@ARGV; - -pod2usage(-verbose => $opt_help, - -exitval => 0, - ) if $opt_help; - -for (@ARGV) { - if (/\.xz$/) { - $_ = "unxz < '$_' |"; - } - elsif (/\.bz2$/) { - $_ = "bunzip2 < '$_' |"; - } - elsif (/\.gz$/) { - $_ = "gunzip < '$_' |"; - } - elsif (/\.lzma$/) { - $_ = "unlzma < '$_' |"; - } -} - -my($n) = 0; -%ansi = map { $_ => $n++ } split //, 'krgybmcw'; - -@bols = qw(bold underline blink reverse fgh bgh); -@nums = qw(fgc bgc); - -@base{@bols} = qw(1 4 5 7 1 5); -@base{@nums} = qw(30 40); - -@mirc = split //, 'WkbgRrmyYGcCBMKw'; -@irssi = split //, 'kbgcrmywKBGCRMYW'; - -@mc = map {$ansi{lc $_}} @mirc; -@mh = map {$_ eq uc $_} @mirc; - -@ic = map {$ansi{lc $_}} @irssi; -@ih = map {$_ eq uc $_} @irssi; - -@cn = qw(black dr dg dy db dm dc lgray dgray lr lg ly lb lm lc white); - -sub defc { - my($attr) = shift || \%attr; - $attr->{fgc} = $attr->{bgc} = -1; - $attr->{fgh} = $attr->{bgh} = 0; -} - -sub defm { - my($attr) = shift || \%attr; - $attr->{bold} = $attr->{underline} = - $attr->{blink} = $attr->{reverse} = 0; -} - -sub def { - my($attr) = shift || \%attr; - defc($attr); - defm($attr); -} - -sub setold { - %old = %attr; -} - -sub emit { - my($str) = @_; - my(%elem,@elem); - - if ($opt_clear) { - # do nothing - } - else { - - if ($opt_html) { - my %class; - - for (@bols) { - $class{$_}++ if $attr{$_}; - } - - for (qw(fg bg)) { - my $h = delete $class{"${_}h"}; - my $n = $attr{"${_}c"}; - next unless $n >= 0; - $class{"$_$cn[$n + 8 * $h]"}++; - } - - $class = join " ", sort keys %class; - - print qq{</span>} if $oldclass; - print qq{<span class="$class">} if $class; - $oldclass = $class; - } - else { - my(@clear) = ( (grep { $old{$_} > $attr{$_} } @bols), - (grep { $old{$_}>=0 && $attr{$_}<0 } @nums) - ); - - $elem{0}++ if @clear; - - for (@bols) { - $elem{$base{$_}}++ - if $attr{$_} && ($old{$_} != $attr{$_} || $elem{0}); - } - - for (@nums) { - $elem{$base{$_}+$attr{$_}}++ - if $attr{$_} >= 0 && ($old{$_} != $attr{$_} || $elem{0}); - } - - @elem = sort {$a<=>$b} keys %elem; - - if (@elem) { - @elem = () if @elem == 1 && !$elem[0]; - printf "\e[%sm", join ";", @elem; - } - } - } - - if ($opt_html) { - for ($str) { - s/&/&amp;/g; - s/</&lt;/g; - s/>/&gt;/g; - } - } - - print $str; - - setold; -} - -if ($opt_html) { - print qq{<div class="loglines">\n}; -} - -if ($opt_utf8) { - binmode STDIN, ':bytes'; #encoding(cp1252)'; - binmode STDOUT, ':utf8'; -} - -while (<>) { - if ($opt_utf8) { - my $line; - while (length) { - $line .= decode("utf8", $_, Encode::FB_QUIET); - $line .= substr $_, 0, 1, ""; - } - $_ = $line; - } - - chomp; - - def; - setold; - - if ($opt_html) { - printf qq{<div class="logline">}; - } - - while (length) { - if (s/^\cB//) { - # toggle bold - $attr{bold} = !$attr{bold}; - - } elsif (s/^\cC//) { - # mirc colors - - if (/^[^\d,]/) { - defc; - } else { - - if (s/^(\d\d?)//) { - $attr{fgc} = $mc[$1 % 16]; - $attr{fgh} = $mh[$1 % 16]; - } - - if (s/^,//) { - if (s/^(\d\d?)//) { - $attr{bgc} = $mc[$1 % 16]; - $attr{bgh} = $mh[$1 % 16]; - } else { - $attr{bgc} = -1; - $attr{bgh} = 0; - } - } - } - - } elsif (s/^\cD//) { - # irssi format - - if (s/^a//) { - $attr{blink} = !$attr{blink}; - } elsif (s/^b//) { - $attr{underline} = !$attr{underline}; - } elsif (s/^c//) { - $attr{bold} = !$attr{bold}; - } elsif (s/^d//) { - $attr{reverse} = !$attr{reverse}; - } elsif (s/^e//) { - # indent - } elsif (s/^f([^,]*),//) { - # indent_func - } elsif (s/^g//) { - def; - } elsif (s/^h//) { - # cleol - } elsif (s/^i//) { - # monospace - } else { - s/^(.)(.)//; - my($f,$b) = map { ord($_)-ord('0') } $1, $2; - if ($f<0) { -# $attr{fgc} = -1; $attr{fgh} = 0; - } else { - # c>7 => bold, c -= 8 if c>8 - $attr{fgc} = $ic[$f]; - $attr{fgh} = $ih[$f]; - } - if ($b<0) { -# $attr{bgc} = -1; $attr{bgh} = 0; - } else { - # c>7 => blink, c -= 8 - $attr{bgc} = $ic[$b]; - $attr{bgh} = $ih[$b]; - } - } - - } elsif (s/^\cF//) { - # blink - $attr{blink} = !$attr{blink}; - - } elsif (s/^\cO//) { - def; - - } elsif (s/^\cV//) { - $attr{reverse} = !$attr{reverse}; - - } elsif (s/^\c[\[([^m]*)m//) { - my(@ansi) = split ";", $1; - my(%a); - - push @ansi, 0 unless @ansi; - - for my $code (@ansi) { - if ($code == 0) { - def(\%a); - } elsif ($code == $base{bold}) { - $a{bold} = 1; - } elsif ($code == $base{underline}) { - $a{underline} = 1; - } elsif ($code == $base{blink}) { - $a{underline} = 1; - } elsif ($code == $base{reverse}) { - $a{reverse} = 1; - } elsif ($code => 30 && $code <= 37) { - $a{fgc} = $code - 30; - } elsif ($code => 40 && $code <= 47) { - $a{bgc} = $code - 40; - } else { - $a{$code} = 1; - } - } - - if ($a{fgc} >= 0 && $a{bold}) { - $a{fgh} = 1; - $a{bold} = 0; - } - - if ($a{bgc} >= 0 && $a{blink}) { - $a{bgh} = 1; - $a{blink} = 0; - } - - for my $key (keys %a) { - $attr{$key} = $a{$key}; - } - - } elsif (s/^\c_//) { - $attr{underline} = !$attr{underline}; - - } else { - s/^(.[^\cB\cC\cD\cF\cO\cV\c[\c_]*)//; - emit $1; - } - } - - def; - emit ""; - if ($opt_html) { - print "</div>"; - } - print "\n"; -} - -if ($opt_html) { - print "</div>\n"; -} - -__END__ - -=head1 NAME - -log2ansi - Convert foo various color escape codes to ANSI (or strip them) - -=head1 SYNOPSIS - -B<log2ansi> -[B<-c>|B<--clear>] -[B<-h>|B<--html>] -[B<-u>|B<--utf8>] -[B<--help>] -[I<logfile ...>] - -=head1 OPTIONS - -=over - -=item B<-c>, B<--clear> - -Instructs B<log2ansi> to clear all formatting and output plain text logs. - -=item B<-h>, B<--html> - -Instructs B<log2ansi> to output a HTML fragment instead of ANSI text. - -The whole log will be wrapped in a div with class C<loglines>, each line -of the log in a div with class C<logline>. Colors are wrapped in spans, -with a class name consisting of C<fg> or C<bg>, concatenated with the -color name, either C<black> or C<white>, or C<r>, C<g>, C<b>, C<c>, -C<m>, C<y>, or C<gray> prefixed with either C<l> for light, or C<d> for -dark. - -You have to include appropriate CSS yourself to get any colors at all -when viewing the log. - -=item B<-u>, B<--utf8> - -This forces output to be UTF-8, and does input decoding of UTF-8 with -fallback to ISO-8859-1. Use this if your input logs have mixed UTF-8 -and ISO-8859-1. - -=item B<--help>, B<--full-help> - -Show help, either just option descriptions or a full man page. - -=back - -=head1 DESCRIPTION - -Use B<log2ansi> to convert logfiles from Irssi with internal escape -codes, mIRC color codes or ANSI escapes to plain text with ANSI -formatted color codes for viewing in a terminal. - -Use the B<--clear> option to strip all formatting escapes and output -just plain text. - -You can supply input on standard input, or as filenames on the command -line. Any file ending in B<.gz>, B<.bz2>, B<.xz> or B<.lzma> will be -uncompressed automatically before processing. - -=head1 AUTHORS - - Peder Stray <peder.stray@gmail.com> - -=cut diff --git a/.config/irssi/modules/libtheme_indent.so b/.config/irssi/modules/libtheme_indent.so Binary files differ. diff --git a/.config/irssi/pipeline.theme b/.config/irssi/pipeline.theme @@ -1,705 +0,0 @@ -#!/bin/bash -# -# pipeline2 -# -# Inspired by the original pipeline theme -# Created by: Hayden Hamilton <hayden@haydenvh.com> -# License: wtfpl - -replaces = { "/[]=" = "%K$*%n"; "*@+." = "%W$*%n"; }; - -#replaces = { "!@+" = "%r$*%n"; }; -info_eol = "false"; - -abstracts = { - # abstracts that do not take arguments - only for replicating certain text - line_start = ""; - timestamp = "%G%%H:%%M%b "; - pad = " "; - - # usage agnostic text hilighting - hilight = "%_$*%_"; - error = "%R$*%n"; - channel = "%_$*%_"; - server = "%R%_$*%_"; - comment = "%b$*%n"; - reason = "{comment $*}"; - mode = "%b$*%n"; - channelhilight = "%R$*%n"; - ban = "%r$*%n"; - msgchannel = "%b:$*%n"; - ownnick = "%y$*"; - dcc = "%b$*%n"; - dccfile = "%_$*%_"; - - # kept for compatibility - nick = "$*"; - nickhost = "$*"; - action = "{action_core $*} "; - - # hilighting with nickcolor-expando.pl - pubnick = "%w$nickcolor$*"; - # constructs for basic message - msgnick = "$0$1%K %_│%_%N "; - himsg = "$0$1%M %_#%_%N "; - nticenick = "$0$1%K %_:%_%N "; - askctcp = "$0$1%K %_?%_%N%_ "; - ansctcp = "$0$1%M %_A%_%N%_ "; - - # msgs - ownmsgnick = "{msgnick $0 $1-}"; - pubmsgnick = "{msgnick $0 $1}"; - pubmsgmenick = "{himsg $0 $1}"; - ownprivmsgnick = "{msgnick $*}"; - privmsgnick = "{msgnick $*}"; - privmsg = "{himsg %R<---$0}$1}"; - ownprivmsg = "{msgnick %K--->$1}$2}"; - ownprivnick = "%W$0%n%w"; - - # used internally for actions - action_core = "{pad}%w*%w %K│ %_$0%_ $1"; - action_nsp = "%w*%w%_$0%_ $1"; - - # actions - pvaction = "%R<---{action_nsp $0 $1}"; - ownaction_target = "%K--->$1{action_nsp $0}"; - - # notices - ownnotice = "{nticenick %K--->$1}$2}"; - notice = " {nticenick $nickcolor$*}%N"; - servernotice = "%w!$*%n "; - - # CTCPs - ownctcp = "{askctcp %K--->$0}$1"; - ctcp = "{ansctcp %R<---$1}$0:%_ $2-"; - rctcp = "{askctcp %R<---$0}$1"; - - # wallops - wallop = "%n[%WWALLOP%n] $*"; - - # netsplits - netsplit = "%GSplit: %N$0 %R<-> $1 %N%_Quits:%_ {nick $2} ($3 more)"; - netjoin = "%WSplit over: %N%_joins:%_ {nick $0} ($1 more)"; - - # /names list - names_nick = "%_$0%_$1 "; - names_users = "%b$*%n:"; - names_channel = "%W$*%n"; - - # I don't use dcc, someone else can figure this stuff out - dccownmsg = "{ownprivmsg $*}"; - dccownnick = "{ownnick $*}"; - dccownaction = "{action_core $*}"; - dccownaction_target = "{action_core $0}%K:%b$1%n "; - dccmsg = "[%W$1-%K(%b$0%K)%n] "; - dccquerynick = "%W$*%n"; - dccaction = "%W (*dcc*) $*%n %|"; - - # statusbar - sb_background = "%N"; - isbstart = "%N"; - opered = " (ircop: $*)"; - sb = "%N%K%_──[%_%G$*%K]"; - sb2 = "%m[%G$*%m]%n"; - sb3 = "%N%K%_[%_%G$*%K]"; - sb_awl = "$*"; - sbmode = " %b+%G$*"; - sbaway = " (away: $*)"; - sbservertag = "$0"; - sbmore = "%_+more+%_"; - sblag = "{sb L: %W$*}"; - sbmail = "{sb M: $*}"; - sbact_det = " D: $*"; - sb_usercount = "{sb %W$0%n $1-}"; - sb_uc_ircops = "%_.*%_%G/%G$*%n"; - sb_uc_ops = "%_.@%_%G/%G$*%n"; - sb_uc_halfops = "%_.=%_%G/%g$*%n"; - sb_uc_voices = "%_.+%_%G/%Y$*%n"; - sb_uc_normal = "%_.%_%G/%W$*%n"; - sb_uc_space = " "; - sb_act_hilight = "%M%_X%_%N$*"; - sb_act_hilight_color = "%M%%%N$*"; - sb_act_sep = "%N$*"; - sb_act_text = "%c-%N$*"; - sb_act_msg = "%W*%N$*"; - sb_act_none = " $*"; - sb_topic = "%0$* "; - - # other - whois_begin = ".-WHOIS----.--------------------------------->"; - whois = "| $[8]0 : $1-"; - whowas_begin = "|-WHOWAS---:-------------------------->"; - who___end = "'----------'-------------------------->"; - # keepnick - keepnick = "{line_start} {hilight Keepnick} %K│%N $*"; - - # indent (https://github.com/irssi-import/modules/blob/master/theme-indent.c) - indent_default = " {pad} %K│ "; - level_hilight = " {pad} %M# "; -}; - -# %r%n%_$0%_$1%K |%n %| -formats = { - "fe-common/core" = { - # excuse the ugly as hell formats here, blame nm2.pl - pubmsg = "$nickalign{pubmsgnick %G$2 {pubnick $[.9]0}$nicktrunc}$1"; - join = "{pad}%_%W+ %K│ {pubnick %_$0%_}!$1"; - part = "{pad}%_%G-%_ %K│ {pubnick %_$0%_}!$1 {reason $3}"; - kick = "{pad}%_%G!%_ %K│ $0 %n%wby {pubnick $2}, {reason $3}, from $1"; - quit = "{pad}%_%G<%_ %K│ {pubnick %_$0%_}!$1 {reason $2}"; - own_msg = "$nickalign{ownmsgnick %G$2 {ownnick $[.10]0}$nicktrunc}$1"; - own_msg_channel = "$nickalign{ownmsgnick %G$3 {ownnick $[.10]0}$nicktrunc{msgchannel $1}}$2"; - pubmsg_me = "$nickalign{pubmsgmenick %G$2 {pubnick $[.9]0}$nicktrunc}$1"; - pubmsg_me_channel = "$nickalign{pubmsgmenick %G$3 {pubnick $[.9]0}$nicktrunc{msgchannel $1}}$2"; - pubmsg_hilight = "$nickalign{pubmsgmenick %G$3 {pubnick $[.9]1}$nicktrunc}$2"; - pubmsg_channel = "$nickalign{pubmsgnick %G$4 {pubnick $[.9]0}$nicktrunc{msgchannel $1}}$2"; - - chanmode_change = " {$channel $1} {nick $2} %nsets mode %W{$mode $1}"; - channel_mode = " {$channel $0} {nick $2} %nsets mode %W{$mode $1}"; - nick_changed = "{pad} %K│ {pubnick $0}%w %_-->%_ $1"; - - # names - endofnames = "{channel $0}: {hilight $1} nicks ({comment @/{hilight $2} +/{hilight $3} -/{hilight $4}})"; - - # random - timestamp = "%G%%H:%%M%b "; - line_start = "{line_start}"; - line_start_irssi = "{hilight}"; - servertag = "[$0] "; - daychange = " {pad} %K│ %_----%_ %%d %%b %%Y %_----%_"; - talking_with = "You are now talking with {nick $0}"; - - # windows - refnum_too_low = "Window number must be greater than 1"; - error_server_sticky = "Window's server is sticky and it cannot be changed without -unsticky option"; - set_server_sticky = "Window's server set sticky"; - unset_server_sticky = "Window's server isn't sticky anymore"; - window_name_not_unique = "Window names must be unique"; - window_level = "Window level is now $0"; - window_set_immortal = "Window is now immortal"; - window_unset_immortal = "Window isn't immortal anymore"; - window_immortal_error = "Window is immortal, if you really want to close it, say /WINDOW IMMORTAL OFF"; - windows_layout_saved = "Layout of windows is now remembered"; - windows_layout_reset = "Layout of windows reset to defaults"; - - windowlist_header = ",-Ref---Name-------------------Active item-------Server------------Level-------------------------------->"; - windowlist_line = "| $[3]0 | %|$[20]1 | $[15]2 | $[15]3 | $4"; - windowlist_footer = "'------------------------------------------------------------------------------------------------>"; - - window_info_header = ""; - window_info_footer = ""; - window_info_refnum = "%#Window : {hilight #$0}"; - window_info_refnum_sticky = "%#Window : {hilight #$0 (sticky)}"; - window_info_name = "%#Name : $0"; - window_info_history = "%#History : $0"; - window_info_immortal = "%#Immortal: yes"; - window_info_size = "%#Size : $0x$1"; - window_info_level = "%#Level : $0"; - window_info_server = "%#Server : $0"; - window_info_server_sticky = "%#Server : $0 (sticky)"; - window_info_theme = "%#Theme : $0$1"; - window_info_bound_items_header = "%#Bounds : {hilight Name Server tag}"; - window_info_bound_item = "%# : $[!30]0 $[!15]1 $2"; - window_info_bound_items_footer = ""; - window_info_items_header = "%#Items : {hilight Name Server tag}"; - window_info_item = "%# $[7]0: $[!30]1 $2"; - window_info_items_footer = ""; - - # servers - looking_up = "Looking up {server $0}"; - connecting = "Connecting to {server $0} [$1] port {hilight $2} -- Remember: on irc nobody knows you're a dog"; - reconnecting = "Reconnecting to {server $0} [$1] port {hilight $2} - use /RMRECONNS to abort"; - connection_established = "Connection to {server $0} established"; - cant_connect = "Unable to connect server {server $0} port {hilight $1} {reason $2}"; - connection_lost = "Connection lost to {server $0}"; - lag_disconnected = "No PONG reply from server {server $0} in $1 seconds, disconnecting"; - disconnected = "Disconnected from {server $0} {reason $1}"; - server_quit = "Disconnecting from server {server $0}: {reason $1}"; - server_changed = "Changed to {hilight $2} server {server $1}"; - unknown_server_tag = "Unknown server tag {server $0}"; - no_connected_servers = "Not connected to any servers"; - server_reconnect_removed = "Removed reconnection to server {server $0} port {hilight $1}"; - server_reconnect_not_found = "Reconnection tag {server $0} not found"; - setupserver_added = "Server {server $0} saved"; - setupserver_removed = "Server {server $0} removed"; - setupserver_not_found = "Server {server $0} not found"; - - server_list = "$[15]0 {server $[25]1} %b$[6]2 $[15]3"; - server_lookup_list = "$[15]0 {server $[25]1} %b$[6]2 $[15]3 (connecting...)"; - server_reconnect_list = "$[20]0 {server $[25]1} %b$[6]2 $[15]3 ($5 left before reconnecting)"; - - your_nick = "Your nickname is {nick $0}"; - quit_once = "{channel $3} {channick $0} {chanhost $1} has quit {reason $2}"; - invite = "{nick $0} invites you to {channel $1}"; - not_invited = "You have not been invited to a channel!"; - new_topic = "{nick $0} changed the topic of {channel $1}: $2"; - topic_unset = "Topic unset by {nick $0} on {channel $1}"; - your_nick_changed = "{ownnick $0}%w %_-->%_ {ownnick $1}"; - talking_in = "You are now talking in {channel $0}"; - not_in_channels = "You are not on any channels"; - current_channel = "Current channel {channel $0}"; - names = "{names_users Users {names_channel $0}}"; - names_prefix = "%#{names_prefix $0}"; - names_nick_op = "{names_nick_op $0 $1}"; - names_nick_halfop = "{names_nick_halfop $0 $1}"; - names_nick_voice = "{names_nick_voice $0 $1}"; - names_nick = "{names_nick $0 $1}"; - chanlist_header = ""; - chanlist_line = "%#{channel $[-10]0} %|+$1 ($2): $3"; - chansetup_not_found = "Channel {channel $0} not found"; - chansetup_added = "Channel {channel $0} saved"; - chansetup_removed = "Channel {channel $0} removed"; - chansetup_header = "%#Channel Network Password Settings%:------------------------------------------------------"; - chansetup_line = "%#{channel $[15]0} | %|$[12]1 | $[10]2 | $3"; - chansetup_footer = ""; - own_msg_private = "{ownprivmsg {ownnick $N} {pubnick $0} $1}"; - own_msg_private_query = "{ownprivmsgnick {ownprivnick $2}}$1"; - pubmsg_hilight_channel = "$nickalign{pubmsgmenick %G$4 {pubnick $[.9]1$nicktrunc{msgchannel $2}}$3"; - msg_private = "{privmsg {pubnick $0}}$2"; - msg_private_query = "{privmsgnick $0}$2"; - no_msgs_got = "You have not received a message from anyone yet"; - no_msgs_sent = "You have not sent a message to anyone yet"; - query_start = "Starting query in {server $1} with {nick $0}"; - query_stop = "Closing query with {nick $0}"; - no_query = "No query with {nick $0}"; - query_server_changed = "Query with {nick $0} changed to server {server $1}"; - hilight_header = "%#Highlights:"; - hilight_line = "%#$[-4]0 $1 $2 $3$4"; - hilight_footer = ""; - hilight_not_found = "Highlight not found: $0"; - hilight_removed = "Highlight removed: $0"; - - # alias' - alias_added = "Alias $0 added"; - alias_removed = "Alias $0 removed"; - alias_not_found = "No such alias: $0"; - - aliaslist_header = ",-Alias------,-Action------------------------------>"; - aliaslist_line = "| $[10]0 | $1"; - aliaslist_footer = "'------------'------------------------------>"; - - # logging - log_opened = "Log file {hilight $0} opened"; - log_closed = "Log file {hilight $0} closed"; - log_create_failed = "Couldn't create log file {hilight $0}: $1"; - log_locked = "Log file {hilight $0} is locked, probably by another running Irssi"; - log_not_open = "Log file {hilight $0} not open"; - log_started = "Started logging to file {hilight $0}"; - log_stopped = "Stopped logging to file {hilight $0}"; - log_list_header = ",-Path-----------------------------------------------,----Chan & net-----------------------,----Levels-------------->"; - log_list = "| $[50]1 | $[32]2 | $3$4$5"; - log_list_footer = "'------------------------------------------------------------------------------------------------------------>"; - - windowlog_file = "Window LOGFILE set to $0"; - windowlog_file_logging = "Can't change window's logfile while log is on"; - no_away_msgs = "No new messages in awaylog"; - away_msgs = "{hilight $1} new messages in awaylog:"; - module_header = "%#Module Type Submodules"; - module_line = "%#$[!20]0 $[7]1 $2"; - module_footer = ""; - module_already_loaded = "Module {hilight $0/$1} already loaded"; - module_not_loaded = "Module {hilight $0/$1} is not loaded"; - module_load_error = "Error loading module {hilight $0/$1}: $2"; - module_version_mismatch = "{hilight $0/$1} is ABI version $2 but Irssi is version $abiversion, cannot load"; - module_invalid = "{hilight $0/$1} isn't Irssi module"; - module_loaded = "Loaded module {hilight $0/$1}"; - module_unloaded = "Unloaded module {hilight $0/$1}"; - command_unknown = "Unknown command: $0"; - command_ambiguous = "Ambiguous command: $0"; - option_unknown = "Unknown option: $0"; - option_ambiguous = "Ambiguous option: $0"; - option_missing_arg = "Missing required argument for: $0"; - not_enough_params = "Not enough parameters given"; - not_connected = "Not connected to server"; - not_joined = "Not joined to any channel"; - chan_not_found = "Not joined to such channel"; - chan_not_synced = "Channel not fully synchronized yet, try again after a while"; - illegal_proto = "Command isn't designed for the chat protocol of the active server"; - not_good_idea = "Doing this is not a good idea. Add -YES option to command if you really mean it"; - invalid_number = "Invalid number"; - invalid_time = "Invalid timestamp"; - invalid_level = "Invalid message level"; - invalid_size = "Invalid size"; - invalid_charset = "Invalid charset: $0"; - invalid_choice = "Invalid choice, must be one of $0"; - eval_max_recurse = "/eval hit maximum recursion limit"; - program_not_found = "Could not find file or file is not executable"; - no_server_defined = "No servers defined for this network, see /help server for how to add one"; - theme_saved = "Theme saved to $0"; - theme_save_failed = "Error saving theme to $0: $1"; - theme_not_found = "Theme {hilight $0} not found"; - theme_changed = "Now using theme {hilight $0} ($1)"; - window_theme = "Using theme {hilight $0} in this window"; - window_theme_default = "No theme is set for this window"; - window_theme_changed = "Now using theme {hilight $0} ($1) in this window"; - window_theme_removed = "Removed theme from this window"; - format_title = "%:[{hilight $0}] - [{hilight $1}]%:"; - format_subtitle = "[{hilight $0}]"; - format_item = "$0 = $1"; - ignored = "Ignoring {hilight $1} from {nick $0}"; - ignored_options = "Ignoring {hilight $1} from {nick $0} {comment $2}"; - unignored = "Unignored {nick $0}"; - ignore_not_found = "{nick $0} is not being ignored"; - ignore_no_ignores = "There are no ignores"; - ignore_header = "%#Ignore List:"; - ignore_line = "%#$[-4]0 $1: $2 $3 $4"; - ignore_footer = ""; - not_channel_or_query = "The current window is not a channel or query window"; - conversion_added = "Added {hilight $0}/{hilight $1} to conversion database"; - conversion_removed = "Removed {hilight $0} from conversion database"; - conversion_not_found = "{hilight $0} not found in conversion database"; - conversion_no_translits = "Transliterations not supported in this system"; - recode_header = "%#Target Character set"; - recode_line = "%#%|$[!30]0 $1"; - unknown_chat_protocol = "Unknown chat protocol: $0"; - unknown_chatnet = "Unknown chat network: $0 (create it with /NETWORK ADD)"; - not_toggle = "boolean - ON/OFF only"; - perl_error = "Perl error: $0"; - bind_header = "%#Key Action"; - bind_list = "%#$[!20]0 $1 $2"; - bind_command_list = "$[!30]0 $1"; - bind_footer = ""; - bind_unknown_id = "Unknown bind action: $0"; - config_saved = "Saved configuration to file $0"; - config_reloaded = "Reloaded configuration"; - config_modified = "Configuration file was modified since irssi was last started - do you want to overwrite the possible changes?"; - glib_error = "{error $0} $1"; - overwrite_config = "Overwrite config (y/N)?"; - set_title = "[{hilight $0}]"; - set_item = "$[-!32]0 %_$1"; - set_unknown = "Unknown setting $0"; - set_not_boolean = "Setting {hilight $0} isn't boolean, use /SET"; - no_completions = "There are no completions"; - completion_removed = "Removed completion $0"; - completion_header = "%#Key | Value | Auto%:--------------------------------------------------------------"; - completion_line = "%#$[10]0 | $[!40]1 | $2"; - completion_footer = ""; - capsicum_enabled = "Capability mode enabled"; - capsicum_disabled = "Capability mode not enabled"; - capsicum_failed = "Capability mode failed: $0"; - tls_ephemeral_key = "EDH Key: {hilight $0} bit {hilight $1}"; - tls_ephemeral_key_unavailable = "EDH Key: {error N/A}"; - tls_pubkey = "Public Key: {hilight $0} bit {hilight $1}, valid from {hilight $2} to {hilight $3}"; - tls_cert_header = "Certificate Chain:"; - tls_cert_subject = " Subject: {hilight $0}"; - tls_cert_issuer = " Issuer: {hilight $0}"; - tls_pubkey_fingerprint = "Public Key Fingerprint: {hilight $0} ({hilight $1})"; - tls_cert_fingerprint = "Certificate Fingerprint: {hilight $0} ({hilight $1})"; - tls_protocol_version = "Protocol: {hilight $0} ({hilight $1} bit, {hilight $2})"; - }; - "fe-common/text" = { window_info_sticky = "%# Sticky : $0"; }; - "fe-common/irc" = { - chanmode_change = " {nick $2} %nsets mode %b{$mode $1} %non {$channelhilight $0}"; - whois = "{whois_begin}%:{whois nick %|{hilight $0}}%:{whois host %|$2}%:{whois ident $|$1}%:{whois comment %|$3}"; - server_chanmode_change = "%RServermode: {mode $1} by {server $2}"; - whois_server = "{whois server %|$1 ({comment $2})}"; - own_action = "{action_core {ownnick $0$nicktrunc}}$1"; - action_public = "{action_core {pubnick $0$nicktrunc}}$1"; - away = "%_%G----->"; - unaway = "%_%W<-----"; - end_of_whois = "{who___end}"; - whois_idle_signon = "{whois idle %|$1 days $2 hours $3 mins $4 secs}%:{whois signon %|$5}"; - whois_oper = "{whois oper %|$1}"; - whois_realhost = "{whois realhost %|$1-}"; - whois_special = "{whois info %|$1}"; - whois_extra = "{whois extra %|$1}"; - whois_not_found = "$0 doesn't exist"; - netsplit = "{netsplit {server $0} {server $1} $2 0}"; - netsplit_more = "{netsplit {server $0} {server $1} $2 $3}"; - netsplit_join = "{netjoin $0 0}"; - netsplit_join_more = "{netjoin Netsplit} over, joins: $0 (+$1 more)"; - no_netsplits = "There are no net splits"; - netsplits_header = "%#Nick Channel Server Split server"; - netsplits_line = "%#$[9]0 $[10]1 $[20]2 $3"; - netsplits_footer = ""; - network_added = "Network $0 saved"; - network_removed = "Network $0 removed"; - network_not_found = "Network $0 not found"; - network_header = "%#Networks:"; - network_line = "%#$0: $1"; - network_footer = ""; - setupserver_header = "%#Server Port Network Settings"; - setupserver_line = "%#%|$[!20]0 $[5]1 $[10]2 $3"; - setupserver_footer = ""; - sasl_success = "SASL authentication succeeded"; - sasl_error = "Cannot authenticate via SASL ($0)"; - cap_req = "Capabilities requested: $0"; - cap_ls = "Capabilities supported: $0"; - cap_ack = "Capabilities acknowledged: $0"; - cap_nak = "Capabilities refused: $0"; - cap_list = "Capabilities currently enabled: $0"; - cap_new = "Capabilities now available: $0"; - cap_del = "Capabilities removed: $0"; - joinerror_toomany = "Cannot join to channel {channel $0} (You have joined to too many channels)"; - joinerror_full = "Cannot join to channel {channel $0} (Channel is full)"; - joinerror_invite = "Cannot join to channel {channel $0} (You must be invited)"; - joinerror_banned = "Cannot join to channel {channel $0} (You are banned)"; - joinerror_bad_key = "Cannot join to channel {channel $0} (Bad channel key)"; - joinerror_bad_mask = "Cannot join to channel {channel $0} (Bad channel mask)"; - joinerror_unavail = "Cannot join to channel {channel $0} (Channel is temporarily unavailable)"; - joinerror_duplicate = "Channel {channel $0} already exists - cannot create it"; - channel_rejoin = "Channel {channel $0} is temporarily unavailable, this is normally because of netsplits. Irssi will now automatically try to rejoin back to this channel until the join is successful. Use /RMREJOINS command if you wish to abort this."; - inviting = "Inviting {nick $0} to {channel $1}"; - channel_created = "Channel {channelhilight $0} created $1"; - url = "Home page for {channelhilight $0}: $1"; - topic = "Topic for {channelhilight $0}: $1"; - no_topic = "No topic set for {channelhilight $0}"; - topic_info = "Topic set by {pubnick $0} {nickhost $2} {comment $1}"; - channel_mode = "mode/{channelhilight $0} {mode $1}"; - bantype = "Ban type changed to {channel $0}"; - no_bans = "No bans in channel {channel $0}"; - banlist = "$0 - {channel $1}: ban {ban $2}"; - banlist_long = "$0 - {channel $1}: ban {ban $2} {comment by {nick $3}, $4 secs ago}"; - ebanlist = "{channel $0}: ban exception {ban $1}"; - ebanlist_long = "{channel $0}: ban exception {ban $1} {comment by {nick $2}, $3 secs ago}"; - no_invitelist = "Invite list is empty in channel {channel $0}"; - invitelist = "{channel $0}: invite {ban $1}"; - invitelist_long = "{channel $0}: invite {ban $1} {comment by {nick $2}, $3 secs ago}"; - no_such_channel = "{channel $0}: No such channel"; - channel_synced = "Join to {channel $0} was synced in {hilight $1} secs"; - usermode_change = "Mode change {mode $0} for user {nick $1}"; - user_mode = "Your user mode is {mode $0}"; - nick_away = "{nick $0} is away: $1"; - no_such_nick = "{nick $0}: No such nick/channel"; - nick_in_use = "Nick {nick $0} is already in use"; - nick_unavailable = "Nick {nick $0} is temporarily unavailable"; - your_nick_owned = "Your nick is owned by {nick $3} {comment $1@$2}"; - whowas = "{whowas_begin}%:{whois nick %|{hilight $0}}%:{whois host %|$2}%:{whois ident $|$1}%:{whois comment %|$3}"; - whois_idle = "{whois idle %|$1 days $2 hours $3 mins $4 secs}"; - whois_modes = "{whois modes $1}"; - whois_usermode = "{whois usermode $1}"; - whois_channels = "{whois channels %|$1}"; - whois_away = "{whois away %|$1}"; - end_of_whowas = "{who___end}"; - who = "%#{channelhilight $[-10]0} %|{nick $[!9]1} $[!3]2 $[!2]3 $4@$5 {comment {hilight $6}}"; - end_of_who = "End of /WHO list"; - own_notice = "{ownnotice {ownnick $N} {pubnick $0}}$1"; - own_action_target = "{ownaction_target {ownnick $0} {pubnick $2}}$1"; - own_ctcp = "{ownctcp $0 $1}"; - notice_server = "{servernotice $0}$1"; - notice_public = "{notice $0}$2"; - notice_private = "{notice $0}$2"; - action_private = "{pvaction {pubnick $0}}$2"; - action_private_query = "{pvaction {pubnick $0}}$2"; - action_public_channel = "{action_core {pubnick $0}}$2"; - ctcp_reply = "{ctcp $0 {pubnick $1} $2}"; - ctcp_reply_channel = "{ctcp $0 {pubnick $1} $2}"; - ctcp_ping_reply = "{ctcp PING {pubnick $0} $1-}"; - ctcp_requested = "{rctcp {pubnick $0} $2}"; - ctcp_requested_unknown = "{rctcp {pubnick $0} $2}"; - online = "Users online: {hilight $0}"; - pong = "PONG received from $0: $1"; - wallops = "{wallop {pubnick $0} %K| $1}"; - action_wallops = "{wallop {action_core {pubnick $0}} $1}"; - kill = "You were {error killed} by {nick $0} {nickhost $1} {reason $2} {comment Path: $3}"; - kill_server = "You were {error killed} by {server $0} {reason $1} {comment Path: $2}"; - error = "{error ERROR} $0"; - unknown_mode = "Unknown mode character $0"; - default_event = "$1"; - default_event_server = "[$0] $1"; - silenced = "Silenced {nick $0}"; - unsilenced = "Unsilenced {nick $0}"; - silence_line = "{nick $0}: silence {ban $1}"; - ask_oper_pass = "Operator password:"; - accept_list = "Accepted users: {hilight $0}"; - }; - "Irssi::Script::adv_windowlist" = { - awl_display_nokey = "%N$H$C$S %N$N"; - awl_display_key = "%N$H$C$S%N %mM-$Q"; - awl_display_nokey_active = "%N%K>%N$C %N$N"; - awl_display_key_active = "%N%K>%N$C %mM-$Q"; - awl_display_header = "%1 %Y$C (${N})"; - awl_display_nokey_visible = "%N%K<%N$C %N$N"; - awl_display_key_visible = "%N%K<%N$C %mM-$Q"; - awl_name_display = "$0"; - awl_separator = " "; - awl_separator2 = ""; - awl_abbrev_chars = "~〜"; - awl_viewer_item_bg = "%0"; - awl_title = "\\Vawl\\:"; - }; - "fe-common/irc/notifylist" = { - notify_join = "{nick $0} [$1@$2] [{hilight $3}] has joined to $4"; - notify_part = "{nick $0} has left $4"; - notify_away = "{nick $0} [$5] [$1@$2] [{hilight $3}] is now away: $4"; - notify_unaway = "{nick $0} [$4] [$1@$2] [{hilight $3}] is now unaway"; - notify_online = "On $0: {hilight $1}"; - notify_offline = "Offline: $0"; - notify_list = "$0: $1 $2"; - notify_list_empty = "The notify list is empty"; - }; - "fe-common/irc/dcc" = { - own_dcc = "{dccownmsg dcc {dccownnick $1}}$2"; - own_dcc_action = "{dccownaction_target $0 $1}$2"; - own_dcc_action_query = "{dccownaction $0}$2"; - own_dcc_ctcp = "{ownctcp $0 $1}"; - dcc_msg = "{dccmsg dcc $0}$1"; - action_dcc = "{dccaction $0}$1"; - action_dcc_query = "{dccaction $0}$1"; - own_dcc_query = "{ownmsgnick {dccownquerynick $0}}$2"; - dcc_msg_query = "{privmsgnick $0}$1"; - dcc_ctcp = "{dcc >>> DCC CTCP {hilight $1} received from {hilight $0}: $2}"; - dcc_chat = "{dcc DCC CHAT from {nick $0} [$1 port $2]}"; - dcc_chat_channel = "{dcc DCC CHAT from {nick $0} [$1 port $2] requested in channel {channel $3}}"; - dcc_chat_not_found = "{dcc No DCC CHAT connection open to {nick $0}}"; - dcc_chat_connected = "{dcc DCC CHAT connection with {nick $0} [$1 port $2] established}"; - dcc_chat_disconnected = "{dcc DCC lost chat to {nick $0}}"; - dcc_send = "{dcc DCC SEND from {nick $0} [$1 port $2]: $3 [$4]}"; - dcc_send_channel = "{dcc DCC SEND from {nick $0} [$1 port $2]: $3 [$4 bytes] requested in channel {channel $5}}"; - dcc_send_exists = "{dcc DCC already sending file {dccfile $0} for {nick $1}}"; - dcc_send_no_route = "{dcc DCC route lost to nick {nick $0} when trying to send file {dccfile $1}}"; - dcc_send_not_found = "{dcc DCC not sending file {dccfile $1} to {nick $0}}"; - dcc_send_file_open_error = "{dcc DCC can't open file {dccfile $0}: $1}"; - dcc_send_connected = "{dcc DCC sending file {dccfile $0} for {nick $1} [$2 port $3]}"; - dcc_send_complete = "{dcc DCC sent file {dccfile $0} [{hilight $1}] for {nick $2} in {hilight $3} [{hilight $4kB/s}]}"; - dcc_send_aborted = "{dcc DCC aborted sending file {dccfile $0} for {nick $1}}"; - dcc_get_not_found = "{dcc DCC no file offered by {nick $0}}"; - dcc_get_connected = "{dcc DCC receiving file {dccfile $0} from {nick $1} [$2 port $3]}"; - dcc_get_complete = "{dcc DCC received file {dccfile $0} [$1] from {nick $2} in {hilight $3} [$4kB/s]}"; - dcc_get_aborted = "{dcc DCC aborted receiving file {dccfile $0} from {nick $1}}"; - dcc_get_write_error = "{dcc DCC error writing to file {dccfile $0}: {comment $1}"; - dcc_unknown_ctcp = "{dcc DCC unknown ctcp {hilight $0} from {nick $1} [$2]}"; - dcc_unknown_reply = "{dcc DCC unknown reply {hilight $0} from {nick $1} [$2]}"; - dcc_unknown_type = "{dcc DCC unknown type {hilight $0}}"; - dcc_invalid_ctcp = "{dcc DCC received CTCP {hilight $0} with invalid parameters from {nick $1}}"; - dcc_connect_error = "{dcc DCC can't connect to {hilight $0} port {hilight $1}}"; - dcc_cant_create = "{dcc DCC can't create file {dccfile $0}: $1}"; - dcc_rejected = "{dcc DCC $0 was rejected by {nick $1} [{hilight $2}]}"; - dcc_request_send = "{dcc DCC $0 request sent to {nick $1}: $2"; - dcc_close = "{dcc DCC $0 close for {nick $1} [{hilight $2}]}"; - dcc_lowport = "{dcc Warning: Port sent with DCC request is a lowport ({hilight $0, $1}) - this isn't normal. It is possible the address/port is faked (or maybe someone is just trying to bypass firewall)}"; - dcc_list_header = "{dcc DCC connections}"; - dcc_list_line_chat = "{dcc $0 $1}"; - dcc_list_line_file = "{dcc $0 $1: %|$2 of $3 ($4%%) - $5kB/s - ETA $7 - $6}"; - dcc_list_line_queued_send = "{dcc - $0 $2 (queued)}"; - dcc_list_footer = ""; - dcc_list_line_server = "{dcc $0: Port($1) - Send($2) - Chat($3) - Fserve($4)}"; - dcc_server_started = "{dcc DCC SERVER started on port {hilight $0}}"; - dcc_server_closed = "{dcc DCC SERVER on port {hilight $0} closed}"; - }; - "fe-common/perl" = { - script_not_found = "Script {hilight $0} not found"; - script_not_loaded = "Script {hilight $0} is not loaded"; - script_loaded = "Loaded script {hilight $0}"; - script_unloaded = "Unloaded script {hilight $0}"; - no_scripts_loaded = "No scripts are loaded"; - script_list_header = ",-----------------Name-,-Location----------------------------------------->"; - script_list_line = "| $[-20]0 | $1"; - script_list_footer = "'----------------------'------------------------------------------->"; - script_error = "{error Error in script {hilight $0}:}"; - }; - "Irssi::Script::ascii" = { - ascii_not_connected = "%_$0:%_ You're not connected to server"; - ascii_not_window = "%_$0:%_ Not joined to any channel or query window"; - ascii_not_chanwindow = "%_$0:%_ Not joined to any channel"; - ascii_not_chanop = "%_$0:%_ You're not channel operator in {hilight $1}"; - ascii_figlet_notfound = "%_Ascii:%_ Cannot execute {hilight $0} - file not found or bad permissions"; - ascii_figlet_notset = "%_Ascii:%_ Cannot find external program %_figlet%_, usign /SET ascii_figlet_path [path], to set it"; - ascii_cmd_syntax = "%_$0:%_ $1, usage: $2"; - ascii_figlet_error = "%_Ascii: Figlet returns error:%_ $0-"; - ascii_fontlist = "%_Ascii:%_ Available fonts [in $0]: $1 ($2)"; - ascii_empty_fontlist = "%_Ascii:%_ Cannot find figlet fonts in $0"; - ascii_unknown_fontdir = "%_Ascii:%_ Cannot find figlet fontdir"; - ascii_show_line = "$0-"; - }; - "Irssi::Script::trackbar" = { - trackbar_loaded = "%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2."; - trackbar_wrong_version = "%R>>%n %_Trackbar:%_ Please upgrade your client to 0.8.17 or above if you would like to use this feature of trackbar."; - trackbar_all_removed = "%R>>%n %_Trackbar:%_ All the trackbars have been removed."; - trackbar_not_found = "%R>>%n %_Trackbar:%_ No trackbar found in this window."; - }; - "Irssi::Script::trigger" = { - trigger_header = "Triggers:"; - trigger_line = "%#$[-4]0 $1"; - trigger_added = "Trigger $0 added: $1"; - trigger_not_found = "Trigger {hilight $0} not found"; - trigger_saved = "Triggers saved to $0"; - trigger_loaded = "Triggers loaded from $0"; - }; - "fe-text" = { - # lastlog - lastlog_too_long = "/LASTLOG would print $0 lines. If you really want to print all these lines use -force option."; - lastlog_count = ""; - lastlog_start = " %b---------LASTLOG--------------------------------->"; - lastlog_end = " %b--END OF LASTLOG-------------------------->"; - lastlog_separator = "--"; - lastlog_date = "%%F "; - - refnum_not_found = "Window number $0 not found"; - window_too_small = "Not enough room to resize this window"; - cant_hide_last = "You can't hide the last window"; - cant_hide_sticky_windows = "You can't hide sticky windows (use /SET autounstick_windows ON)"; - cant_show_sticky_windows = "You can't show sticky windows (use /SET autounstick_windows ON)"; - window_not_sticky = "Window is not sticky"; - window_set_sticky = "Window set sticky"; - window_unset_sticky = "Window is not sticky anymore"; - window_info_sticky = "%#Sticky : $0"; - window_info_scroll = "%#Scroll : $0"; - window_scroll = "Window scroll mode is now $0"; - window_scroll_unknown = "Unknown scroll mode $0, must be ON, OFF or DEFAULT"; - window_hidelevel = "Window hidden level is now $0"; - - # statusbar - statusbar_list_header = ",-Name---------------------------,-Type---,-Placement-,-Position-,-Visible-------------->"; - statusbar_list = "| $[30]0 | $[6]1 | $[9]2 | $[8]3 | $4"; - statusbar_list_footer = "'--------------------------------'--------'-----------'----------'--------------->"; - - statusbar_info_name = "%#Statusbar: {hilight $0}"; - statusbar_info_type = "%#Type : $0"; - statusbar_info_placement = "%#Placement: $0"; - statusbar_info_position = "%#Position : $0"; - statusbar_info_visible = "%#Visible : $0"; - statusbar_info_item_header = "%#Items : Name Priority Alignment"; - statusbar_info_item_footer = ""; - statusbar_info_item_name = "%# : $[35]0 $[9]1 $2"; - statusbar_not_found = "Statusbar is disabled: $0"; - statusbar_item_not_found = "Statusbar item doesn't exist: $0"; - statusbar_unknown_command = "Unknown statusbar command: $0"; - statusbar_unknown_type = "Statusbar type must be 'window' or 'root'"; - statusbar_unknown_placement = "Statusbar placement must be 'top' or 'bottom'"; - statusbar_unknown_visibility = "Statusbar visibility must be 'always', 'active' or 'inactive'"; - paste_prompt = "%GPasting: %g{hilight ^Cancel ^Kontinue}"; - paste_warning = ""; - irssi_banner = " "; - welcome_firsttime = " "; - welcome_init_settings = "The following settings were initialized"; - }; - "Irssi::Script::ctcpspoof" = { - fctcp_request = "{rctcp {pubnick $0} $1}"; - fctcp_info = " # ctcpitem ctcpreply"; - fctcp_empty = "%R>>%n %_FCTCP:%_ Your fake ctcp list is empty."; - fctcp_added = "%R>>%n %_FCTCP:%_ Added %_$0%_ ($1) to the fake ctcp list."; - fctcp_replaced = "%R>>%n %_FCTCP:%_ Replaced the old fake reply %_$0%_ with the new one ($1)"; - fctcp_delled = "%R>>%n %_FCTCP:%_ Deleted %_$0%_ from the fake ctcp list."; - fctcp_nfound = "%R>>%n %_FCTCP:%_ Can't find $0 in the fake ctcp list."; - fctcp_delusage = "%R>>%n %_FCTCP:%_ Usage: /FCTCP -del <ctcp-item>"; - fctcp_usage = "%R>>%n %_FCTCP:%_ Usage: /FCTCP -add <ctcp-item> <ctcp-reply>"; - fctcp_repusage = "%R>>%n %_FCTCP:%_ Usage: /FCTCP -replace <ctcp-item> <ctcp-reply>"; - fctcp_nload = "%R>>%n %_FCTCP:%_ Could not load the fake ctcp list."; - fctcp_loaded = "%R>>%n %_FCTCP:%_ The fake reply %_$0%_ already exists, use %_/FCTCP -del $0%_ to remove it from the list."; - fctcp_print = "$[!-2]0 $[20]1 $2"; - fctcp_help = "$0"; - loaded = "%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2."; - }; - "Irssi::Script::tmux_away" = { tmux_away_crap = "$0"; }; - "Irssi::Script::keepnick" = { - keepnick_crap = "{line_start}{hilight Keepnick:} $0"; - keepnick_add = "{line_start}{hilight Keepnick:} Now keeping {nick $0} on [$1]"; - keepnick_remove = "{line_start}{hilight Keepnick:} Stopped trying to keep {nick $0} on [$1]"; - keepnick_hold = "{line_start}{hilight Keepnick:} Nickkeeping deactivated on [$1]"; - keepnick_unhold = "{line_start}{hilight Keepnick:} Nickkeeping reactivated on [$1]"; - keepnick_list_empty = "{line_start}{hilight Keepnick:} No nicks in keep list"; - keepnick_list_header = ""; - keepnick_list_line = "{line_start}{hilight Keepnick:} Keeping {nick $0} in [$1] ($2)"; - keepnick_list_footer = ""; - keepnick_got_nick = "{keepnick Nickstealer left [$1], got {nick $0} back}"; - }; - "Irssi::Script::nm2" = { - neat_style = " , p , , , , , t , , ,"; - neat_action_style = " , p , , t , "; - neat_pad_char = " "; - neat_truncate_char = "%m+"; - neat_notruncate_char = ""; - neat_custom_modes = "&%W&%n | @%g@%n | +%y+%n"; - }; -}; diff --git a/.config/irssi/saved_nick_colors b/.config/irssi/saved_nick_colors @@ -1,11679 +0,0 @@ -[set] -/:1Z -/408AAAAA7:4G -/408AAAAAG:3A -/92AABC12T:0A -/A0c:3H -/AAAAAAAAAAAAAAAAAAAAAAAAAA:0D -/AAAAAAAAAAAAAAAAAAAAAAAAAAAA:4C -/AAAAAAAAAAAAAAAAAAAAAAAAAAAAA:25 -/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:42 -/AAAAAAAAAAB:03 -/AAG:1U -/AARRSS:3M -/ACGZ:2T -/ADL:6C -/AG:3A -/AG15:1C -/AG4:4G -/AGG:3H -/AG_:51 -/AIM:1C -/AJ:40 -/AKP:42 -/AK_47:3A -/AL:51 -/ALAKTORN:4N -/ANCAP95:3C -/ANNA:4N -/ANNA-:3P -/ANNA_:2D -/ANNA`:4N -/ANNa:3C -/AOC:4C -/AOC_:6B -/ARS:2T -/ARSE:6C -/ARSv2:3C -/ATMOS:2D -/ATMOS|2:63 -/ATMOS|3:0A -/ATMOS|4:5E -/ATMOS|41:4N -/AV3NG3R:3H -/AYC:6H -/AYYYYYYYYYLMAO:0C -/AaThai:4N -/Aaaaand:3A -/Aakoy:6H -/Aayush:1C -/AbigailK:0A -/Absalom:3H -/Acer_:25 -/Acer__:03 -/AdDeRaLL:4N -/Adam:03 -/Addgg:3M -/Addie:1C -/Adie:1C -/Adiemus:03 -/Adle:0C -/Admin:3A -/AdminServ:2T -/AdmiraL:09 -/Adra:4G -/AdrameleK:42 -/AdrameleK_:25 -/AdrianDX:40 -/Adrian_DX:6A -/AePhi:3A -/Aecait:42 -/Aecheu:0C -/Aefeic:3C -/Aekae:51 -/Aenri:1C -/Aenri1:25 -/Aequer:6H -/Aeres:4G -/Aeres-:25 -/AfroJack:09 -/AfroNigga:42 -/AfroNukka:6C -/Afrteen:3C -/Agadashi:0A -/Agadashi_:09 -/Agarian79:4G -/Agbalu:1U -/AhHsajJAf:4N -/Ahcho:1C -/Ahgeo:25 -/AhmedDsa:1Z -/Ahmedkh:2D -/Ahmos:5E -/Ahnberg:2J -/Ahosh:6C -/Ahqui:3A -/AiChup:1C -/AiRah:0A -/Aide:6H -/AifieW:63 -/Aifiw:63 -/Aijaki:2T -/AimHere:0A -/Aipahh:3C -/Airplane:09 -/Aishah:6H -/Ajannie:0C -/Aki-lucky:5E -/AkibaDeep:6H -/AlLMfryoE:4N -/Alaura:0A -/AlbertEncode:2J -/AlbertEncode2:6B -/AlbozZ:6H -/Alchemica:09 -/Alchemical:3C -/AlexBigCheese:0D -/AlexBigCheese3:3A -/AlexBigCheese4:2J -/AlexBigCheese5:1C -/AlexBigCheese53:6C -/AlexBigCheese7:3M -/AlexBigCheese8:4N -/AlexBigCheese9:6C -/AlexBigCheese98:2D -/AlexC:1C -/AlexCato:4G -/AlexCato_:3A -/Alfah:0D -/Alga:3M -/Alhazred:42 -/Alhazred_:0D -/Alice_:51 -/Alien88:4C -/Alina25:4G -/Alives:03 -/AlkaSeltzer:4N -/AllY0urB4:51 -/Alliance1911:6B -/Aloui:5E -/AlphaChadBro:0C -/Alpherior:2T -/Alphi:0D -/Alphminster:0D -/AlrightIconcede:2T -/AltOption:5E -/AltaVista:4G -/AlterEgo_:0D -/AlterEgo__:03 -/Altey:6B -/Am:6C -/Amanda:3A -/AmandaB:1C -/AmberJ_:0C -/Amethyst:1C -/Amiga600:2D -/AmigaGod:09 -/AmorPropa:3C -/AmputatedFatGoose:4G -/Amsterdam:1C -/An01nt3d_0n3_:2D -/AnEnemySpotted:6C -/Ana:25 -/Anayx:03 -/Ancient:0A -/AndChat|479316:6H -/AndChat|730100:6H -/Andrey:3M -/AndroSyn:1C -/AndroUser:3C -/AndroUser2:0C -/AndroidHackedBy-maph3r1us:51 -/AndroidUS:63 -/AndyPratt:09 -/Anemone:5E -/Ann:4N -/Anna:0A -/AnnaCutas:4N -/AnnaDina:1C -/AnnaFiona:42 -/AnnaGames20:3C -/AnnaGr:1Z -/AnnaHater:0C -/AnnaRizona:4N -/AnnaSex:63 -/Annette:3C -/Anon-a-mo:03 -/Anon7of10:5E -/Anon7of11:5E -/AnonRadio_|43832:5E -/AnonRadio_|62947:63 -/Anon_7424:0C -/Anonamoos:63 -/Anonymoos:1Z -/Anonymou1:0D -/Anonymous:1Z -/Anselmo:4N -/Ansikteoolo:03 -/Anth0mk:2T -/Anthony:63 -/Antipeace:6C -/Anubis169:6B -/Anubis169|Away:63 -/Anymouse:3C -/Anzerfaus:6C -/Anzrael:1Z -/Aocho:3C -/Aoyagi:09 -/Aoyagi_mehtop:42 -/Aoyagi_raventop:4N -/Apenasvejo:51 -/Aph3x:4C -/Apocalypse:6B -/Apostata:4G -/Appb:3C -/April26:5E -/AqTVUxSmx:3H -/Aqua:3C -/Aragon:4C -/Arbit3r:4N -/Arbiter:1Z -/Architect:3C -/Arden:0D -/AreH:6B -/Area66:1C -/Argetlam:5E -/Ariana:09 -/Ariana16:3M -/ArianaGrande:6B -/Arirang:09 -/Arirang_:51 -/Arisu_:42 -/Arizu:4C -/Armageddon:2J -/Armando:25 -/ArmedRobbo:6B -/Armen:09 -/Armen138:09 -/Armen8:6B -/Arnie:2T -/Arohyn:0A -/Arohyn3:0D -/Arohyn42:3M -/Arohyn420:6C -/Arohyn_J2081q:0A -/Arragon:4N -/Arthas:4N -/Aruseus:6B -/As:0C -/Asds:2J -/Asg23:6B -/Ashey:09 -/AshleyMoorz:4C -/Ashura666:25 -/Ashy:3A -/Asian:3A -/AspieAdie:6C -/Asriel:3C -/AssignedMale:42 -/Assivity:2T -/Astr1:2J -/Astr1_:03 -/AstroAI:51 -/AtHKvrpAR:6N -/Ataego:03 -/Atari:3C -/Atheri:0A -/Atlantic:6C -/Atlas:2T -/Atomen:42 -/Audasity:0C -/Audasity_:42 -/Audi:09 -/AudioRCA:3C -/Audi|Away:4C -/Austin^:25 -/Austo1212:6N -/AvVW:3M -/AverageJo:6H -/Avery:6C -/AvrilLavigne:03 -/AwayLurker:3C -/AwooRallyINC:3C -/AwoooooRallyINC:42 -/Axujen:3H -/Ayirog:03 -/Ayrton:3M -/Az:1Z -/Azelphur:0A -/Azero87:4N -/Azonic:0D -/Azrael:03 -/Aztec03:1U -/Aztec03_:6C -/Azyi:42 -/B:6C -/B1GSQU1D:6C -/B1ngIt:3P -/BASEMENT:51 -/BASEMENT_:03 -/BASHy2:03 -/BASHy2-EU:3H -/BBC:6C -/BCMCCMMNX:25 -/BEASTFACE:1C -/BHnL:3A -/BIALAS:3M -/BIRTHDAYchrissy:1Z -/BLM:2J -/BLMhater:1Z -/BLkx:4C -/BOMBA-FAT:5E -/BONKSCOUT:0A -/BOSSHAWG:3C -/BOSSHAWG_:40 -/BOSSHOG:3P -/BRAGG:6H -/BRB:51 -/BSHk:0A -/BUNDT_CAKE:2D -/BUNDT_CAKE_:42 -/BaBe:51 -/BaD_BoY:03 -/BackupBackupNickname:2D -/BadASS:6H -/BadBoneMoFo:0C -/Bahpur:2T -/Bahzi:42 -/Bakersfie:63 -/BallSac:0C -/Ballz:3M -/Balthazar:0C -/Balthazar_Bath_Bazaar:51 -/Balthazar_Destoryer:3M -/Balthazar_Destroyer:4C -/Barack:5E -/Baradium:0A -/Baron:2D -/Barry:3A -/Barry_:2J -/BasedAfrican:3C -/BasedDecoyPrincessKitana:4G -/Bashout:3H -/Basilisk:4G -/Batman:25 -/Bay-Guy:1C -/BeAsTaH:09 -/Beas:63 -/Beast:4C -/Beast_:51 -/Beauty:5E -/Beck:42 -/BeeNeeZ:6B -/BeefEats:4N -/BeefMode:4G -/Bekzz:6H -/Beleth:03 -/Belial:5E -/Bella26:3M -/BelugaChan:3H -/Belzebub:6C -/Ben:2D -/BenBernanke:6C -/BenBernanke414:4C -/BenLand100:2D -/Bender:1C -/Benett:03 -/Benjamin:51 -/Beran:2J -/Berger:0D -/Berger_:4C -/Bernard:2D -/Berserker:0C -/Bertha:51 -/Bertie^Wooster:3C -/Beth:3M -/Bethany:6C -/Betrachtu:3C -/Betrayedu:25 -/Betty:09 -/BeyoundCringePubeFace:1C -/Bifrost:3C -/BigD:6H -/BigDadE:4G -/Big_M:1C -/Bigphin:4C -/Bigphin_:6B -/Bilirubin:6B -/BillGates:4G -/BingIt:1Z -/BitBot:4N -/BitSplash:3A -/Bitch:0C -/BitcoinFo:1C -/BitcoinMarkets:2D -/BitconFox:42 -/Biznz:51 -/Bizooga:63 -/BlAkDogg:3A -/Black-Mug:51 -/BlackAss`:42 -/BlackMug:3H -/BlackSails:09 -/BlackSails_:6H -/Blackhawk:51 -/Blackwhite:6B -/Blaine:2T -/Blanker:1Z -/Blanker3:1U -/Blanker37:6C -/BlinkinFl:4C -/Blode:5E -/Blossy:2J -/Blossy_:0A -/Blue:09 -/BlueOystr:6H -/Blumpkin:5E -/Blumpkin_:42 -/BoBeR:3A -/BoBeR182:1C -/Bobby:2T -/BobbyBoulders:0A -/Bobo_36_M:1Z -/Bohyi:3C -/Bolero:6H -/Bollox:0D -/Bollox_:1C -/Bollox__:42 -/BonafideL:09 -/Bones:42 -/Bones_:0A -/BonnGerm:2T -/Boolz:2J -/BootlegJo:4N -/Botnet:4N -/Botsen:2D -/BottyMcBotface:4G -/Botulf:42 -/Bourbon:09 -/Bovdin:5E -/Bowery:0C -/Bozg:63 -/BradCoom:25 -/Bradley:63 -/Brag:6H -/Brainium:4C -/BreannaTa:4G -/Brenda:2T -/BrewerKit:5E -/Brewster:0A -/Brewster_the_chicken:5E -/Briana:6H -/Broken_pi:2D -/Brooklyn:3M -/Bruce:2J -/BruceL:3C -/Bruh:4N -/BruntLIVE:4N -/Buckeyes:3P -/Bulgarian:3C -/BurnZeZ:2J -/Busterx:1Z -/ButchDeLoria:4N -/Buttercrotch:6C -/Butterscotch:03 -/Buvahf:25 -/Buzzard:3C -/Buzzard_:4C -/Buzzy:25 -/ByteLawd:4G -/ByteLord:1C -/BzbV:6H -/C0d3X:40 -/C0m|ck:42 -/C1YNkXaf:25 -/C1v1l:1Z -/C1v|l:4C -/CAP1891:6H -/CAP4567:2J -/CAPdaFLAG:0A -/CATS:6C -/CC66:1C -/CCFL_Man:6C -/CCP:4C -/CDEFG:1C -/CDPervert58:51 -/CG-Office-2:6C -/CHAN_FIX:6B -/CHARLES:3H -/CHOMODEL:09 -/CIAnigger:51 -/CMJk:2J -/CMvt:2D -/COOL_MAN_:40 -/CORVID-19:63 -/CORY^1981:03 -/COVID19:3C -/CRISPR:2J -/CRImier:5E -/CT:25 -/CYbEwznGT:3P -/C_Monster:42 -/CaNNoN:4C -/CaNNoN_:0C -/CaPiTaN:6C -/Caku:63 -/Callabro:3A -/CamVal3:09 -/Canadian:2D -/Canadoey:4G -/CannaCo:0C -/Cano:3C -/CapCIAS_:6C -/CapOOF:2J -/CapOOF_:6C -/CapOOF__:25 -/CapablePresident:4N -/Capheind:1Z -/CapitalGain:09 -/Captain4LK:3H -/CaptainJack:03 -/Captain_Homosexxor:3C -/Carbone5:42 -/Cardinal_:3C -/CarlosHe:2D -/Carp:03 -/Casey:3H -/Cassim:51 -/CatMan:6B -/CatSlayer:6H -/CatValentine:5E -/Cat_hunter:25 -/Catherine:3C -/CatoAlex:3C -/Caz81:25 -/CcOFjf4:6H -/CcxWrk:4C -/CeVVaL-c:09 -/CeeCha:6C -/CeeChu:6C -/Celebrity:6B -/Celelibi:09 -/Celine:2T -/Celine_:6B -/Cenbe:09 -/Ceq:3C -/Cequel:4G -/CertifiedRapist:2D -/Chad_Thundercock:6H -/ChanHold:51 -/ChanServ:42 -/ChanStat:2T -/Chandra:4C -/Chang:2T -/Chang_:6C -/Chang__:25 -/Chang___:6B -/Charles:3A -/ChatBottl:0C -/CheRRy218:3A -/CheRRy2fl:2D -/CheRRy2fly21:03 -/CheeseNCrackers:0D -/Cheeseman:5E -/Cherub:3A -/ChewBaka:6C -/Chewy:6H -/Chex:4N -/Chex_:3H -/Chicanx:42 -/Chickadee:1Z -/ChimpNayshYall:09 -/ChipsHandon:09 -/ChipsMusicVonTrappeHandon:25 -/Choco:63 -/ChocolateServ:4G -/Christine:3H -/Christistheway:0D -/Christopher:3C -/Chriz:42 -/Chromanin:3H -/Chuckie:6B -/Chucks:3C -/Chungos:09 -/CiaPh:0C -/Cinderella_Man:4G -/Cinderfel:1C -/Civ1l:03 -/Civil:6H -/Civil-:25 -/Civil_:0A -/Civ|l:2D -/Cjefke:2J -/ClZy:5E -/Clamkin:3H -/Clamkin-:51 -/Clarence:3A -/Claudine:6H -/Clefairy:51 -/Clevela17:2T -/Cleveland:4N -/Clockweig:3C -/ClockworkCoder:6B -/CloroxMan:2B -/ClownPoss:09 -/Co-Op:2J -/CoCaInE-:3C -/CoDeInE:25 -/CoDeInE-:2T -/CoMBo:5E -/CoViD-:3C -/CoViD_:09 -/Cockroach:6C -/Cockzilla:3A -/CodeMasta:3A -/Code_Red:1C -/Codemaste:6C -/Codexx:51 -/Codexx_:63 -/Coffee:1C -/CoffeeInc:1Z -/Cog:63 -/Cogitabun:42 -/ColDecker:4G -/Coldblack:4N -/ColeSlaw:0C -/ComfortablyDumb:3M -/ComfortablyNumb:6B -/Communist:3H -/Computer-:4N -/ComputerTech:3A -/ComputerTech_:0D -/Computer^:25 -/Computersarebadat:5E -/Computer|:63 -/ConEdison:1Z -/ConEdison2:2T -/ConEdison5:4C -/Connie:03 -/ConnorWil:25 -/ConnorWilliams:2T -/ConsmueristProvocateur:3A -/ConspiracyProof:0A -/ConsumeristProvocateur:4G -/Coonyarro:6B -/Corazoni:2D -/CorbinDallas:2D -/Core5113:3H -/CoreDuo:0D -/CoronaCri:1C -/CosmicRay:5E -/Cosmicjoker:4N -/Cosmicjoker_:4G -/Cr0no:0A -/Cr0no-:2D -/Cragnathar:0C -/Crapwrongnick:3C -/CrashTM:51 -/CrazyPal:3A -/CrazyPale:3H -/CrazyRobLolzors:2J -/CrazyRoboCrumbs:51 -/Crazyout:0A -/Creator:3H -/CrepeMake:4N -/CrimisoK:3C -/Crissy:6C -/CrocSmith:6C -/Crocodile:3M -/Cromu`:09 -/Cron0:63 -/Crono:1C -/Crono-:2T -/Crono--:2D -/Crono\:4G -/Crono_:3H -/Cronoli:1C -/Cronus:2J -/Crow:6C -/Crow-:3H -/Crow_:0C -/Crow_0:4G -/Crow_1:2D -/Crow_2:3M -/Crow_3:6C -/Crow_6:1C -/Crow_8:6B -/CrtxReavr:4G -/Crust:2D -/Crustie:4G -/Crustie_:3H -/CryMaster:6B -/Crystal:6B -/CrystalSoldier:03 -/Ctrl:2J -/Cuckoo:1Z -/Cuonee:6H -/Cyb3RALis:3M -/Cybaria:6B -/CyberBit:63 -/CyberGlo:3M -/CyberManifest:0A -/CyberOne:3A -/CyberOne_:1Z -/CyberOnne:1C -/CyberThre:6B -/CyberTrekker:4N -/CyberTwo:6B -/CyborgPerson:2D -/Cyosc:09 -/Cypher:3M -/CypherBlo:25 -/Cyrus:51 -/CythSide:2T -/Cythraul:3M -/Cythside:0D -/D:4G -/D00:6H -/D0m3r:4C -/D4nny:6N -/D8RainA:25 -/DAJlKjaXG:2D -/DASPRiD1:1C -/DBoyz:4G -/DBoyz[A]:03 -/DG:51 -/DIARRHEA_GARGLER_69:51 -/DJTrump:2T -/DJ_AA:4G -/DNX2JNLIG:2J -/DNuD:5E -/DOGWATER:63 -/DOX_SALE:25 -/DOYouNo:09 -/DPA:0C -/DPA-:0C -/DRUGS:2J -/DSyndrome:6C -/DTales:5E -/DZLFKNWZL:6H -/DZLWZL:4G -/D_A_N:2J -/D_A_N_:03 -/DaCeige:3M -/DaCe|ge:4G -/Da_KO:4C -/DadBundy:6B -/DaddyState:42 -/Daemonk:1C -/Dajjal_1:1Z -/Dak22:4C -/Daler:0C -/DanLeroux:0C -/DanMatrix:3M -/Dangelo54:1Z -/Daniel:2T -/Danny:6A -/Daria11:1Z -/Darius:1Z -/DarkCider:5E -/DarkHelp:5E -/DarkLore:03 -/DarkV3n:0A -/Darn:3H -/Darn_:4G -/Darn__:3C -/Darn___:6B -/Darnme:2T -/Darnn:1C -/Darnn_:09 -/Darnn__:3M -/Darnn___:40 -/Darnwise:0A -/DarwinElf:3A -/DasBot:4G -/DateMasamune2000:6C -/DaveCafe:0A -/Dave_2794:6A -/David:51 -/DavidDuke:25 -/Dbsy:2D -/Deadpool:2D -/Deaht_Syn:1C -/Dean:3A -/Death_Syn:03 -/Deborah:1C -/Debra:0C -/DecadePlus:3M -/DedBundy:2T -/DedBundy_:63 -/Def_Starr:3H -/DefuserKi:4G -/Deliveran:4C -/Democrat:3M -/DeppaMann:1C -/Depressionfries:1C -/DerMann:0D -/Derecho:3H -/DerpGusta:09 -/Derp_:6C -/Deryk:4G -/Desire:2J -/Dessimat0r:0C -/Destoya:4G -/DeusVult:42 -/Deus_Vult:4G -/Develon:3C -/DeviL:1C -/Deviance-:51 -/Deviancee:0A -/DevilFox:3P -/Dflp:6H -/Dgby714:2T -/Dghjjb:25 -/Dhejavu_:0C -/DiamondTiara:03 -/DiamondTiara1:3M -/Diamondtiara:3M -/Diana:6H -/Diannao:3C -/Diavolo:2J -/DickInHand:3H -/Dicksucker:2D -/DieLi:42 -/Diego:1Z -/DigDug:0D -/Digerati:5E -/DijaVooD:0C -/Dildo:6B -/Dildo_Dad:3M -/Diocletian:03 -/Dionysus:6B -/Disciple:25 -/Diviny:4G -/DoYouKno:03 -/DoYouKnow:1Z -/DoYouNo:4G -/DoctorGoatLips:4G -/DoctorKit:2J -/DoctorROBotnik:0D -/Doctor_Balthazar_Bath_Bazaar:4C -/Dog:2T -/Dog_slayer:1C -/Dog_slayer13:3M -/Doggo:3M -/Dojo:6B -/DolphinKun:0D -/Dominator:4G -/DonQuixot:2J -/Donald:3C -/Donger:2D -/Dongrito:51 -/Donnie:63 -/Doo:3C -/Doo___:51 -/DoomSquirrel:1Z -/Doonald:42 -/Doopool:1C -/Doormat:2D -/Dora28:1C -/Dorian:25 -/Doris10:3A -/Doris14:25 -/Dorothy:03 -/DosAmp:3M -/DoubleT7:2D -/Douglas:3C -/DpEpsilon:2D -/DpyXkevhG:63 -/Dr-G:3H -/Dr00:3C -/DrBovdin:4C -/DrD33M:6B -/DrD33M_:2J -/DrDixzzle:0A -/DrDizle:3H -/DrDizzle:4N -/DrGod:1C -/DrGood:2J -/DrNizzle:2J -/DrTooCool:1C -/DrToronto:6H -/DrTucker:1Z -/DrTucler:09 -/Dr_Rebec:5C -/Dragon:3H -/DragonEyes:0C -/DragonGeo2:09 -/DragonGlo:2T -/DreadPirateRoberts:3A -/Dreda:4N -/DrestGlas:6H -/Drew:09 -/Drew`:0C -/Drewsh:42 -/Droz:5E -/DrunkKit:6C -/Duailibe:3A -/DudeBruh:25 -/Dude_:2T -/Dude__:4C -/Dugnuts:3H -/DunkinDKNY:5E -/Duranix:2T -/Durvin:51 -/DustinFea:1C -/DvineLord:4C -/Dwaine:1U -/Dwaine_:3A -/Dwarf:3H -/Dworin:1C -/DxaQJGzTC:6C -/Dyke_:25 -/DynamiteDan:0A -/DzHH:42 -/EARS:51 -/EC:09 -/EChoh:3M -/EGH:4N -/EKcryptor:2J -/ERR_NOPRIVILEGES:3C -/ETtpRAi:3H -/ET|ufo:51 -/E_Martin:4G -/Earth:5C -/Easymone-:42 -/Easymoney:2T -/EatL0de:0A -/EaterofCuteKittens:2D -/Eboj:4C -/EcOB:6C -/EcStAsY:1C -/EcStAsY-:25 -/EcToPlAsM:2J -/Ecchan:3M -/EchoShun:09 -/Echo_C:3C -/Echo_Chidori:0C -/Ediyeu:3H -/Eefasa:3A -/Eewigo:4C -/EghFNgF:6C -/Egyptian_Revolutionary:25 -/EiLSEL:1C -/EicooV:3A -/Eilahs:0A -/Eingua:51 -/Eismc2:2T -/El3ktra:3C -/ElHumppa:2D -/ElRatonAzul:25 -/El_Zilcho:1C -/Elara:3P -/ElectRo`:03 -/Eliza:25 -/Elizabeth:03 -/Ellen:2T -/Elusiv3:3A -/Elusive:6B -/Eman:6H -/Emi:4N -/Emi_:0A -/Emily:3P -/Emily____:09 -/Emma:5E -/Emma03:2D -/Emma17:3C -/EmmaHater:09 -/EmmaL:25 -/EmmaLouise:2D -/EmmaYuh:2T -/Emmaa38:6B -/Emmaa61:25 -/Emmae:3C -/EmoFear:25 -/Emsixteen:2T -/End3r:3M -/EndItAll:0C -/EndaEnDag:3P -/Eneerge:1U -/Eneerge_:0C -/Engai:3A -/Entitlement:4G -/Enton:0C -/Enui:3C -/Enui_:3C -/Era:3C -/Era_:63 -/Eri:1Z -/EricYuzo:3H -/Eric_Blair:4G -/Eric_Blair2:3A -/Erik:4N -/Erika11:2D -/Erika_16:0D -/ErisX:4N -/ErkanINNE:6C -/Esa__:3C -/Estella:03 -/Estella-:09 -/Etamin:3M -/Etamin_:51 -/Eternal_Blizzard:4C -/Eunice^44:6H -/Euroob:2D -/Euthanizer:6B -/Euyee:2T -/EvAs:3C -/Evelyn:0A -/Evil0ne:3M -/EvilB:42 -/Evil_Bob:5E -/Ewmr:25 -/Excelium:42 -/Excellsio:2D -/Extreme25:3M -/ExtremelyOldPerson:2T -/Extynct:0C -/F-ck_NKJ:4G -/F0FFF0:4N -/F0FFFF:6H -/FAT-BOMBA:3H -/FAXn:2J -/FBI:42 -/FBIGov:4N -/FBIServ:2T -/FBIpedos:42 -/FFoD:6C -/FGhuorfiu:4C -/FJD:3C -/FKKCyprus:2D -/FREAKUser:2T -/FSgX:0C -/FUCK:2D -/FUCK_SWEDEN:2D -/FUPA:09 -/FUPA-:0C -/F_JUNK_DUMP:4N -/Fabio:3M -/Fabulous:3M -/FactorOfX:25 -/FaggotHunter:6C -/FahTe:4N -/FairsAreDumb:6H -/FalconKirtaran:2T -/Fallinglights:3A -/Fallinglights4:09 -/Fallinglights7:1Z -/Fallinglights8:63 -/FarAway:5E -/FarAway-:3A -/FarAway`:6C -/FarmerKit:2T -/Fasiha:4N -/FatBob:2D -/Fatphin_:2J -/Fatty:1C -/FbmBdgkHC:3C -/FeNTaNyL:4C -/FeNTaNyL-:1Z -/Fear:1C -/Fear-:09 -/Fear--:3A -/FearIsMAD:1C -/FearKild:2T -/FearUSA_:2B -/Fearf:42 -/Fearful:4G -/Fearkille:1U -/Fearl:6A -/Fearsum:03 -/Fear|:1C -/FederalReserve:3H -/Feero:2T -/Ferris:5E -/Fez:2D -/FiErYGT:51 -/FiErYGT-:09 -/FiReYGT:3H -/Fiegaa:6C -/Fierak:51 -/Fierra200:51 -/Fighting:03 -/FiloDough:2T -/FilthNSW:2T -/FinalX:4G -/Finger:51 -/FinnaDeli:2D -/Firefox_:3H -/Fishmongering:3H -/Fiver:0A -/FiyoC:63 -/Fjear:6H -/Fjr1dcCP:4C -/Flattie:3P -/Flo56456:1Z -/Flo6786:2D -/Floyd:1C -/Fly:25 -/FlynnTaggart:3A -/FlynnTaggart41:25 -/FlynnTaggart55:2D -/FncyPnts:51 -/FncyPnts_:1C -/Forest:6C -/ForexT:4N -/ForexTrad:3H -/Fortex:2D -/FoundingF:51 -/Four20:51 -/Four20gottalight:25 -/FoxSteals:6C -/Fox_:1C -/Foxie__:0C -/Foxtrot:4C -/Foxy:51 -/Foxy`:5E -/FqKM:3A -/Fr0stina:4G -/Fr0sty:0D -/Fr0styy:0D -/Fragile:09 -/Fragile_:5E -/Frances:2D -/Francy:1C -/Frankencookie:0C -/Frax:6B -/Freak_:0A -/Freakish:4G -/Frederick:3A -/Freedumb:5E -/FreshColegeGirl:63 -/FreshcollegeGir:2J -/FrostRanger[m]:63 -/FuOtGMjne:40 -/FuZzCasT:1Z -/FuZzCasT1:3M -/FunkyStickman:2D -/Fusl:4N -/Fusspils:09 -/G-:09 -/G-Flex:0A -/G0D:3M -/G0jQ:51 -/GCHQ:09 -/GCY:25 -/GDX:3H -/GEORGEFLOYD:4G -/GERMANSARELAME:5E -/GG:63 -/GGMethos:0C -/GIGACHAD:25 -/GISdPSGFL:25 -/GI_Jack:4N -/GI_X_JACK:6H -/GK-Deacon:4N -/GOD:1Z -/GOD_:1C -/GRNRJJD:51 -/GTAXL:3H -/G_Love:6H -/GaAdaNama:6B -/GaMbiTo:1Z -/GaMbiTo-:2T -/GaMbiTo_:0C -/Gabriel:03 -/Gabriel3:4N -/Gabriel30:3H -/Gabriel53:0A -/Gabriel62:6H -/Gabriel67:6H -/Gabriel76:6H -/Gabriel79:6H -/Gabriel84:5E -/Gadzooki:03 -/Galactic:3A -/Galactic_:63 -/Galeliw:5E -/Gamayun:5E -/Gandhi:0C -/Gandoon:2D -/GarcaMan611548282:3A -/GarcaMan6115482821:3A -/GarcaMan6115482826:0C -/GarcaMan61154828264:03 -/GarcaMan611548282643:3C -/GarcaMan6115482826434:1C -/GarcaMan61154828264340:03 -/GarcaMan61154828264341:2D -/GarcaMan61154828264342:4N -/GarcaMan61154828264343:25 -/GarcaMan61154828264344:6B -/GarcaMan61154828264345:3C -/GarcaMan61154828264346:1Z -/GarcaMan611548282643460:0C -/GarcaMan611548282643461:3M -/GarcaMan611548282643462:42 -/GarcaMan611548282643463:25 -/GarcaMan611548282643464:2D -/GarcaMan611548282643465:3C -/GarcaMan611548282643466:4C -/GarcaMan611548282643467:1Z -/GarcaMan611548282643468:3C -/GarcaMan611548282643469:1Z -/GarcaMan61154828264349:5E -/GarcaMan61154828265:1C -/GarcaMan61154828267:3A -/GarcaMan61154828268:3A -/GarcaMan6115482828:4C -/Gargoyle:6C -/Garr:3H -/Garry94:03 -/GaryGranite:2T -/Gary`Oak:0A -/Gasoline:5E -/Gaspar:2T -/GavinCool:25 -/GavinK00l:51 -/GavinWool:03 -/Gavriel:6B -/GavrielK:2T -/Gavrl:4N -/GayRage:09 -/GayestYeen:51 -/Gbyo:4C -/Geeze:40 -/Gemini:2T -/GenTsoChk:09 -/Genesis`:51 -/GenomeX:2J -/GensENVY:6H -/Gentleman:1U -/GentlyCaressedYouth:2T -/Gentlye10net:0A -/Gentoo:3H -/Gentoo_:25 -/George:03 -/George42:2D -/GermanWra:1Z -/German_aryan:2T -/Germania:6B -/Gerula:51 -/GhoGl:09 -/GholG:2D -/GholG_:6C -/Gholg:4N -/GhosT_:2D -/Ghoul:42 -/Ghoul_:5E -/Ghoul|bbl:0C -/GideonShimshelewitz:09 -/GilesCorey:63 -/Gilgamesh:1C -/Gilli:3M -/Gin:63 -/Girl44_:09 -/GirlScout:4C -/Glenn:51 -/Glider-IR:40 -/Glider_IR:4G -/Gloria:2J -/GnuPlusLinux:0A -/GoCommitSuicide:6B -/GoCommitSuicideFaggot:3C -/GoLdShLaG:3C -/GodDr:2J -/God_:40 -/Godmau5:0C -/GodokaHomuHomu:3M -/Gof:3H -/GoldState:6C -/GoodSir:03 -/GoogleMother:1C -/Googlebot:1Z -/GooseTheDuck:2D -/Gordan_Proprietary_Man:3C -/GorillaDr:3C -/Goriya:42 -/Goriyafixd:2D -/Gosha:4C -/GothAlice:3C -/Gottem:3C -/Gough:2J -/Governador:3C -/Goyo:3C -/Goyo_:09 -/Gq:2T -/Gqbriele:0C -/Grahm:6B -/Grande:3H -/Grapejuice:6B -/Grav2:3C -/Grav2_:51 -/GravitaZ3:2T -/Gravitas:3A -/GreasyBob:3A -/Greatest:6C -/GreenArch:63 -/GretaThunberg:4N -/GreyBeard:6N -/Grimmgrey:2T -/Grizo:63 -/Gron:09 -/Grounded0:6B -/GsC_RuL3Z:3M -/Gudey:0A -/Guest:0C -/Guest0000:3M -/Guest10:5E -/Guest1000:3C -/Guest10184:2J -/Guest10223:3A -/Guest10671:2J -/Guest10849:2T -/Guest10963:6B -/Guest11087:42 -/Guest12:0D -/Guest12122:2T -/Guest12335:03 -/Guest12714:42 -/Guest13:4G -/Guest13211:51 -/Guest13899:42 -/Guest14060:2T -/Guest14144:6B -/Guest14711:0D -/Guest1497:6C -/Guest15:6B -/Guest15653:0A -/Guest15656:03 -/Guest1665:3M -/Guest17191:2T -/Guest1731:5E -/Guest17367:4G -/Guest17981:51 -/Guest20010:63 -/Guest20154:5E -/Guest21270:2T -/Guest22129:0C -/Guest2249:03 -/Guest22875:25 -/Guest23695:25 -/Guest24875:42 -/Guest25:0D -/Guest25036:6B -/Guest25083:6B -/Guest25125:3C -/Guest25232:0C -/Guest25281:2D -/Guest25614:09 -/Guest25944:3M -/Guest25989:2T -/Guest26728:3M -/Guest26868:0A -/Guest2687:3C -/Guest27:63 -/Guest27254:6C -/Guest27913:51 -/Guest28:6B -/Guest28225:63 -/Guest28409:51 -/Guest28567:25 -/Guest28734:5E -/Guest29:2T -/Guest29069:6H -/Guest29184:3C -/Guest29251:63 -/Guest29606:3C -/Guest29675:3M -/Guest3:3M -/Guest30024:2D -/Guest30558:2D -/Guest31448:3C -/Guest31663:3M -/Guest31889:3H -/Guest32:42 -/Guest32429:2J -/Guest32951:3H -/Guest33156:09 -/Guest33287:63 -/Guest3350:1Z -/Guest33840:3M -/Guest34098:42 -/Guest34254:2J -/Guest34328:2T -/Guest34857:4G -/Guest35081:3C -/Guest35098:3C -/Guest35447:25 -/Guest35500:51 -/Guest35998:0D -/Guest36062:09 -/Guest36634:6C -/Guest36954:6C -/Guest36970:1C -/Guest3732:4N -/Guest37403:3H -/Guest38002:6B -/Guest38339:42 -/Guest38656:6H -/Guest3875:3A -/Guest39435:3M -/Guest3970:2D -/Guest39750:42 -/Guest39835:2D -/Guest40011:25 -/Guest40085:2D -/Guest40699:2J -/Guest40971:1Z -/Guest41151:25 -/Guest41342:25 -/Guest42243:4G -/Guest4246:09 -/Guest42783:42 -/Guest42937:3H -/Guest43:0C -/Guest43271:3A -/Guest43871:4G -/Guest43995:5E -/Guest44017:0A -/Guest44200:3M -/Guest44347:3C -/Guest44388:3M -/Guest44597:5E -/Guest44638:4G -/Guest44817:03 -/Guest45311:03 -/Guest4556:4G -/Guest45699:2T -/Guest45737:3M -/Guest45920:2J -/Guest46535:5E -/Guest46659:63 -/Guest46883:4G -/Guest47:25 -/Guest47029:2T -/Guest47501:2J -/Guest47709:3M -/Guest47829:09 -/Guest49205:4G -/Guest49765:6C -/Guest50163:6C -/Guest50388:09 -/Guest5047:6B -/Guest51478:3C -/Guest51526:03 -/Guest51921:4N -/Guest52145:4C -/Guest52914:25 -/Guest53046:09 -/Guest53501:3H -/Guest53651:2T -/Guest53930:63 -/Guest55056:51 -/Guest55331:42 -/Guest55812:1C -/Guest55842:4G -/Guest55858:1Z -/Guest56:1U -/Guest57:5E -/Guest57478:2D -/Guest5780:09 -/Guest57867:63 -/Guest57923:3C -/Guest58502:1C -/Guest58741:3M -/Guest59883:0A -/Guest6:5E -/Guest60108:1C -/Guest60528:09 -/Guest606:3C -/Guest60916:3C -/Guest60940:2T -/Guest61126:42 -/Guest61706:3M -/Guest61815:51 -/Guest61820:63 -/Guest6184:4N -/Guest62193:63 -/Guest62256:2D -/Guest62562:09 -/Guest62896:63 -/Guest62903:3M -/Guest63433:6B -/Guest63556:1Z -/Guest64:5E -/Guest64207:5E -/Guest64609:6C -/Guest64762:2T -/Guest6538:0D -/Guest6730:3A -/Guest68:0A -/Guest6969:4N -/Guest7:25 -/Guest72:2D -/Guest7288:4C -/Guest7340:4N -/Guest7529:03 -/Guest77:3P -/Guest78:6C -/Guest80:6C -/Guest8014:4G -/Guest82:2D -/Guest8387:25 -/Guest85:1Z -/Guest8539:6B -/Guest92:3A -/Guest924:03 -/Guest9273:2T -/Guest9338:3C -/Guest969:1C -/Guest98:1Z -/Guest989:3C -/Gumbie:5E -/Gun_Bunny:2D -/GunnerJon:51 -/GuntherDW:1C -/Gus:0C -/GuyCornoa:0C -/Guyver2:1C -/Guyver2_:1C -/GwooLad:03 -/H0m3r:63 -/HAILSATAN:4N -/HAL_7000:3P -/HAPM:42 -/HARLIE-shelden:0C -/HAUAH:3A -/HAUAH3d1n:0C -/HAUAH6bjd:4G -/HAUAH7664:4C -/HAUAH9uh0:1C -/HAUAHbu6p:6H -/HAUAHcqo6:6B -/HAUAHcv97:3M -/HAUAHdaye:51 -/HAUAHegvu:3H -/HAUAHewnu:2T -/HAUAHgc2k:63 -/HAUAHi4pv:0A -/HAUAHirfo:3M -/HAUAHjv6l:6B -/HAUAHkple:3H -/HAUAHmboq:4G -/HAUAHpl7v:3C -/HAUAHpp3y:3A -/HAUAHtb2n:1C -/HAUAHtztj:0C -/HAUAHueg5:1Z -/HAUAHx5b8:25 -/HAUAHzhcz:3C -/HAUAHzle9:51 -/HGM:3C -/HGMic:6H -/HHHMMMHHH:63 -/HIVlntin-:63 -/HIVlntine:4G -/HKM:4G -/HLiwsYRMI:40 -/HNRMR:1C -/HRMKTH:2T -/HRNRMTY:3H -/HSH:42 -/HTML5CAR:25 -/HTYTTMKR:5E -/HWWIS:3C -/Hachi-chan:3A -/HackerII:3A -/Hackerpc1:2T -/Hackerpcs:3A -/HaeB:0C -/HaeKie:6H -/Haeloi:3H -/Hafera:03 -/Hahsh:51 -/Hairy:03 -/HairyLegs:51 -/Haiti:3C -/Hajmola:5E -/Hal`d`Hal:09 -/HamAdams:2J -/Hamburger:2T -/Han`:09 -/Hana:0C -/Hank_Hill:2J -/HanyuuChama:3H -/HappyTime:0C -/Happy_Dog:3A -/Hard-Sexpalace:5E -/HardDisk:6H -/Harold:4N -/Harry:4C -/HaruKid:4C -/Haruhiro:4N -/Harzilein:4G -/HasanAbi:4N -/HashNuke:5E -/Havok:5E -/Hawk:6C -/Haxxor:4N -/Hayro:25 -/Hazbyn:3A -/Hazel:0C -/HeIs0x:6H -/HeLLsOwN:3M -/HeeSha:25 -/Hefohp:2T -/HelderHeid:1Z -/Helenah:63 -/HellSpaw-:1Z -/HellSpawn:0C -/Hellbilly:09 -/Hellor:09 -/Helsinki:4C -/Henry151:42 -/Henry151_:0C -/Hero101:2D -/Hextor:0D -/Hexx:6C -/Hexxx:2D -/HeyHackers:25 -/Heyy:6B -/Hi_tler:3C -/Hi_tler25:2D -/Hi_tler39:3M -/Hide:1C -/Hideki:03 -/Hideki_:6C -/Highdra1:3M -/Highdra1`:1C -/Hillbilly:6C -/Himmler:63 -/Hitten:25 -/HlloGrlz:2D -/Hobbyboy:3M -/HoloIRCUser:03 -/Holo|server:2J -/HolySog:6H -/Holz:1C -/Homura_:1Z -/Honky:6C -/HonkyKill:3C -/HonkyStom:5E -/Hoosilon:4G -/Hora:2D -/HornyCow:3A -/HorzA:3C -/HorzA_:4C -/HotPacket:3M -/HotStud4u:3H -/Howard:6H -/Hp_:51 -/Huff:03 -/Huntyz:1Z -/Hush:40 -/Hydrastra:25 -/Hydraxis:6C -/Hyperjag:3A -/Hz0:2T -/I017OBt0l:2D -/IBBR:42 -/IDoNotKnow:0C -/IGQN:4G -/III111II-:2T -/IRCStat41:3H -/IRS:63 -/IRSGov:4G -/IRSSucks:4N -/IRSSux:4N -/IRS_CDC:0C -/ISIS:0C -/ISIS_GENERAL:3A -/ITechGeek:4C -/IWJe0rCGJ:1C -/IX:25 -/I`im`a`guest:3M -/Iajea:2J -/IamJustTooSmart:51 -/IamNotGayIswearPleaseDontRape:2D -/IamVerySmart:2D -/IamVerySmart22:6H -/IamVerySmart30:51 -/IamVerySmart49:63 -/IamVerySmart86:3H -/IamVerySmart89:3M -/Iamum:4C -/Iblis:6N -/Ice:6C -/IceCold2000:03 -/IceMan66:0D -/Ice_Dragon:3C -/Ice`:3M -/Iciest`:2J -/IdUS:25 -/Idywild:2D -/Iebuci:25 -/IfADog:2T -/IfaDog:3H -/IgnatiousIgneous:3H -/Ikeing:1Z -/Ikon:2J -/Ikoru:3M -/Ikoru1:1C -/Ikoru3:3C -/Ikoru6:3A -/IlIlIllllIIIIllIIIllIIl:3A -/IlikeTHISsuperLONGnick:6B -/IllusiveM:63 -/Illusive_:3H -/IloveMYsIster:3H -/Immortal-Crypto-Boomer:03 -/Imperator:2D -/Implant:2T -/Impulsief:63 -/Impulsif:1C -/IndexMatch:4G -/IndexMatch56:4G -/IndianBoss:1C -/Indian_Boss:0A -/Induus:3C -/IneedHelp:63 -/Innmntvs:03 -/Innmntvs_:3A -/Inspiral:3C -/Inspiral_:2D -/Internet:6H -/InternetBestFriend:5E -/Internets:0D -/IoZuwe:4N -/IocQ:2D -/Ionizer:3M -/Irish:3M -/Irkutsk:6B -/Isabel25:4C -/Isimud:1Z -/Iskander:0C -/Iskander_:09 -/Isuzu:09 -/It:2T -/Ithah:5E -/Iushu:4N -/Ivan:51 -/Iyeole:0C -/Iz:4G -/J-yd-n:09 -/J0P3YE:5E -/J3rsey:6H -/JAMIE{1977}:1C -/JAMy:3M -/JAPX4556:2J -/JAzy:6C -/JCwEWXj:3A -/JEWS:0A -/JFK:2J -/JGR:0A -/JJH:03 -/JManalFatty:6C -/JNmO8I:4G -/JWST_:42 -/JaVa_:3C -/Jack4ss:2T -/Jack_:42 -/Jack__:2T -/Jake_:4N -/JamalCoal:3M -/James:0C -/JamesDeSanta:42 -/James_F:6C -/Jamezz:2T -/Jan:4G -/JanBrady:0A -/Jan_:5E -/Janet:03 -/Jaquilah:6C -/Jaquilahs_dog:25 -/Jarsto:1Z -/Jason:25 -/Jason3456:5E -/Jasons:1Z -/Jasons7:3C -/Jasper[m]:3C -/Jax:3A -/JaxOff:0C -/JayCe:0C -/Jayden:2T -/Jayden,aldcor:2D -/Jayden04966912:4G -/Jayden12:6H -/JediM:1C -/JediM_:4N -/JediM__:42 -/Jefreymon:1C -/JekuTheSneku:2T -/Jekuthesneku:0D -/Jellis:0D -/Jenetrix:42 -/Jenetrizx:0A -/Jennifer:0D -/Jenny:1C -/Jenny-:0D -/Jenova:25 -/Jerome:09 -/Jerry^:6B -/Jesseca:3H -/Jessica:4G -/JessicaP:3H -/JessicaTurino:6B -/Jestua_becha:42 -/JewB1rd:4G -/Jew_Bird:1C -/Jibbler:4N -/JigBooze:0C -/Jigsaw:1C -/Jigsaw_:6A -/Jigsaww:4C -/Jigsaww__:5E -/Jim:3H -/JimBrass:2T -/Jimbeazy:4N -/Jimboskee:4G -/Jimmy:63 -/JimmyHoffa:09 -/Jimster480-W10:6B -/Jinx:0C -/JkI5_:03 -/Jmtrix:1C -/JntPtAKjj:42 -/Joan:2J -/Jobe:3H -/Jobe1986:51 -/JochanMahlzan93:0C -/Joe-Biden:4G -/JoeAverag:6H -/JoeBiden:03 -/JoeBidenn:4N -/JoeHiden:6H -/JoeTheRapist:25 -/Joe_Biden:6N -/Joelixny:51 -/Joey:3C -/JoeyBiden:0C -/JofTrades:6H -/JohnDerp:6B -/JohnDerp_:0C -/JohnGalt:1C -/John^:6H -/Johnny:03 -/JohnnyBon:42 -/Jokk55:2D -/Jokkelol:1Z -/JollyRoge:03 -/Jonas:3M -/Jonaz:42 -/Jordan:25 -/Jordan_:51 -/Jordan_0:0C -/Jordan_0_:6C -/Jordan_O:4G -/Jordizle:4N -/Jorduck:6B -/Jose:4G -/JoseAlPaca:4C -/Joseph:4N -/JuanSoup:63 -/Jubi:3A -/Jubileu:6C -/Juchi:0C -/Judenras:1Z -/Julian:2D -/Juliet14:3M -/Julius5_1:4G -/Julius6_1:09 -/Julius6_2:2D -/Jupey:63 -/JustAPerson:3A -/Justasperg:1Z -/Justin:63 -/JustinBaeverRompeSkraever:03 -/Justin_T:3H -/JuttyMire:09 -/K0ISS3R:3C -/K0mpromat:3H -/K1smet:6H -/K8wb8zOd:6H -/KAMALA:3M -/KAREN:2T -/KB:3A -/KFC:3C -/KForKende:4N -/KGWo:6B -/KING_JAFFE_JOFFER:2T -/KKK:51 -/KKKman:6C -/KLaus:2T -/KLwu:0C -/KN1FE:2J -/KO:09 -/KOKOKO:4G -/KO_:0D -/KXTgYW:63 -/Kabe:3M -/Kabewaki:6B -/Kaffeine:6C -/KaiLikesLinux:4G -/KaitoDaumoto:2J -/Kaivo:6H -/Kaivo_:6H -/Kale:03 -/Kali:0A -/KaliEMO:2D -/Kaliuna:6B -/Kamping_Kaiser:0A -/Kanabit:2T -/Kaorub:03 -/Karen:0C -/Kasm279:51 -/Katou:6C -/Kcznsk:6C -/Kcznsk1:09 -/Keb:51 -/Kebo:3A -/Kebolio:42 -/Kebolio_:63 -/Kefka:2B -/KeiCha:4G -/Keik0s:3C -/KeiraT:0C -/Keivi:25 -/Keiya:3H -/Kemwer:03 -/Kenneth_Andersson:3M -/Ketchup901:1Z -/Kettering:2T -/Keven:2D -/Kevlar_Noir:0D -/Khaotic:0D -/KhashayaR:3A -/Khea:6C -/Khea_:3C -/KiGv:1C -/Kiitt:2J -/Kijt:0C -/KillMePlease:25 -/KillaH:6B -/KindOne:5E -/KindOne_:1C -/KindTwo:42 -/KineticUser-1729:63 -/King:63 -/King20:51 -/KingNick:3H -/KingNickl:42 -/KingOfKings:2J -/KingTuT:3A -/Kirakishou:3C -/Kirakishou_:4N -/Kirk:1Z -/Kirkland_Signature:51 -/Kirtaner:0C -/Kirtide:0D -/Kirtide_:0C -/Kiss:0D -/Kiss_:6H -/Kiss__:3A -/Kit:1Z -/KitAgain:63 -/KitFlamin:3M -/KitMega:25 -/KitPro:3H -/KitSet:4N -/KitSet_:51 -/KitSn00p:63 -/KitTheMer:0C -/KitUltima:3M -/KitWisdom:42 -/Kitt:09 -/Kitty:51 -/KittyKatt:51 -/Kitu:51 -/Kiva:2J -/Klaatu:25 -/Klaus:1C -/Kliment:1Z -/KnVnpWRXL:0C -/Knackwurst:0D -/Knicks-Fan:4G -/Knobio:40 -/KnuX:5E -/KnuX[absent]:2J -/Kobe-24:0D -/Kobe1Keno:3A -/Koduck:0C -/Koi:0D -/Kompromat:2T -/Konox1337:3M -/Koragg:6C -/KornKage:1Z -/Korthrun:0C -/Kotomi:0C -/KravMAGA:42 -/Kristal:63 -/Kristin:6C -/Kritnich:6C -/Krunge:42 -/KrysGaleh:0C -/KtDarwin:3H -/Kujata:25 -/KuluBot:0D -/Kumool:3C -/KuppyKeKs:0A -/Kuro-chan:2J -/Kuro-chan_:4N -/Kuroi:3H -/Kurokin:25 -/Kutgebruiker9000:1C -/Kye:1C -/Kyle:3H -/Kyoon:1C -/Kzer-Za:6C -/L0DESCLIT:25 -/L0deStink:42 -/L0j1k:6C -/L0j1k_:3A -/L1CABA:3A -/L4MvgGh:63 -/LB:25 -/LEB1969:0A -/LEB2000:2D -/LHI:6B -/LHI[AFK]:1C -/LOL_WUT:63 -/LOQUILLO:03 -/LOQUILLO_:2J -/LOVE:3C -/LOVE-:3H -/LOVESCiENCE:0C -/LOVESHAC1:0C -/LOVESHACK:63 -/LUKS:42 -/LaRose_Bleu:5E -/Lab:5E -/Laceless:09 -/Lacer:5E -/Lad-Russo:0C -/Lady_D:1Z -/Laegha:42 -/Laekon:1Z -/Lahey:6H -/Lahey-:0A -/Lakereke:0C -/Lama^jo:3H -/LambastMo:3M -/Lamontcol:2D -/Laphroaig:3H -/Laris:3M -/Laris-:4C -/Lasall:5E -/LaserEyess:1C -/LatinLover:03 -/Laurie:2D -/LaydGirLL:63 -/LazyMouse:6A -/Le:6C -/LeBlueMice:3M -/Le_Coyote:6C -/Lebbe:40 -/Lebluemice:4N -/Lebluemouse:3M -/Leeloo:2D -/Left`ie:3C -/Leila:3A -/Leissi:3C -/Leissi_:09 -/Leito:0C -/Lemon__:25 -/Lenore_Nevermore:3M -/Leslie:2J -/Leslie_:0D -/Lestat:25 -/LestatC6:2D -/LestatCap:6C -/LetsDie:25 -/LetsLive:5E -/LetsSolve:3C -/LiCeUser1:0D -/LiCeUser4:0D -/LiL-FeLLa:40 -/LiQWuD:03 -/Libram:6B -/Librarian:3C -/Libre___:4G -/LieNdre:42 -/LiftLeft:6B -/LikMYoung:63 -/LilNigBoy:03 -/LilNikita:4G -/LimitServ:1C -/Linda:1Z -/Link:2J -/LinoYeen:51 -/Lions:25 -/Lions_:2D -/Liothen:51 -/LiqWuD:6N -/LisaPregg:3M -/LittleWytch:3H -/Livestradamus:2J -/Llllllllll:1C -/LloydC88:51 -/Lm4:4G -/LmaoPubeBoyFailedStartup:3H -/Lmouse:09 -/LoKii:0D -/LoKii_:4G -/LoL-BooBs:09 -/LoLa_BuNNy:63 -/Lolipop:0D -/LoneWolf367:3A -/Loner:25 -/Long_distance_M:09 -/Lord255:2T -/Lord255_:0A -/LordKing:09 -/LordOfValhalla:2D -/LordToValhalla:25 -/Lord_KO:3C -/Lorn:6C -/LostBiT:4G -/Louella:2J -/Loyalist:63 -/Lthere:25 -/LuShang:2J -/Lucas:4G -/Lucas_:51 -/Lucifer:6B -/Lucifer_:25 -/Lucille:2J -/Ludax:63 -/Lue:3H -/Lukah:42 -/Lukin:1C -/Lukin_:03 -/Lukin_HAL:2B -/LukrBtyan:2T -/Lulzy:0D -/Lumez:4N -/Luxmem:4G -/LvQbrKxjXuAnErzV:4G -/LwXhpMetC:4N -/Lynn:4C -/Lyphe0:42 -/Lypheo:5E -/Lznj:0C -/M-Cburton:51 -/M16:2D -/M4riu5:4N -/MAGA2020:6C -/MAGIC:2J -/MALMM:3C -/MC-SharP:09 -/MCUIRCClient:3H -/MCWEENY:0C -/MDMA-:1Z -/MDMA_:3C -/MGTOW:1Z -/MGpOH8SEl:25 -/MGree:6C -/MIKEJONEZ:6B -/MISTERCOINBLATT:51 -/MKULTRA:2B -/MK_Delta:3M -/MK_Naomi:6H -/MK_Ultra:6H -/MNKU:03 -/MNXa:03 -/MRMET:42 -/MRNFN80:4G -/MTCan__:03 -/MTcan_:5E -/MTcan__:51 -/MTcan___:4N -/MTv:0C -/M_epshee2:09 -/M_epsheep:4G -/MaL-E:6B -/MaLi:6B -/Mac101:3C -/MacYET2:63 -/Macedonia:42 -/Macrotech:3H -/MadDecent:51 -/Mad_Love_Modus:3M -/Maestral:1C -/MagicBot:3H -/MagicPencil:3A -/Magneto:6H -/Magnolia:4N -/MagnuzMaximuz:0A -/Magoggles:2J -/Mahjong:1U -/Mahjong1:2J -/Mai:3H -/MaidenAmerica:25 -/MajMajorMajorMajor:4G -/MajorRizon:6C -/ManDick:0C -/Manhattan:42 -/Manifesst:25 -/Manny:4G -/ManofHumilty:03 -/Mantis:25 -/Mantis_:25 -/Marburg-chan:1C -/MarcLepin:3C -/Marcella:2D -/MarceloCM:2B -/MarcinWieczorek:6C -/MarcinWieczorek_:0C -/Marcus_Aurelius:3M -/Marianna:63 -/MarieLoew:0C -/MartijnBraam:3A -/Martina_i:1Z -/Martine:1C -/Martini:2J -/Mary:3M -/Maser:4N -/MasterKat:6C -/MasterOfMuppets:63 -/MasterdonX:6H -/MastrKat1:63 -/MastrKate:1U -/MathMan:1Z -/Matilde:51 -/MattG:5E -/Matt_P:63 -/Matthew:2T -/MatthewG:4G -/Matty:2T -/Matumbi:25 -/Maximus:2T -/Maxwell:6B -/Maxximus:2J -/Maxximus_:2T -/Maylay:03 -/Mbar:3H -/Mbla:09 -/McKat:51 -/McMurphy:3C -/McQueen:4C -/MeaningfulNick:1Z -/MeatStick:1Z -/Medig8r:5E -/Medih8r:4C -/MediumAbner:0A -/Medusa:0C -/Medusa-chan:1C -/Meekrab:3C -/Meepshee1:09 -/Meepsheep:51 -/Mehh:6C -/Mehh_:0D -/Mehhh:2T -/Mei:2D -/Mellowchan:1Z -/Mellowlink:1C -/Mend3s:1C -/Mentok:6H -/Mestri:6A -/Mezz:2T -/Mezz_:03 -/Mezz__:6B -/MiCulo:4C -/MiDoolo:63 -/MiMelio:3H -/Mi_92:3A -/Michael:63 -/Michael^:6C -/Michael_:63 -/Michiellll:09 -/Mickey:42 -/Micoolo:6B -/MidnightRanger:3C -/MidnightRanger_:4G -/Miep:1Z -/Miggy`:2J -/MikeBlack:42 -/MikeMurdock:03 -/MikeS:42 -/Mikollo:3H -/MikooIo:3H -/Mikoolo:51 -/MilkJug:4G -/MillerBOS:6B -/MillerBOSS:3H -/Milli:1C -/Milliway:2D -/Milliways:25 -/Milliways-:2D -/Milton:6H -/Minamo:3M -/MinimE:51 -/Minnen:0D -/Minnen|:0A -/Mirc0p:63 -/Missssy:42 -/Mista:25 -/Mister_X:0A -/Mithras:0A -/MnmJ:4N -/MoRpHiNe:2T -/MoRpHiNe-:0D -/MoX:3A -/Moab:3H -/MobileRoey:09 -/Mod:6H -/ModsToHell:2D -/ModsToHell60:6H -/ModsToHell64:1C -/ModsToHell66:3A -/ModsToVahala:1C -/ModsToVahala21:3A -/ModstoVahala:2T -/MoeIcenowy:4N -/Moeph:5E -/MohammadUddin:25 -/MojoRizon:2T -/Molly:2D -/MommyJean:2D -/MommyJeans:2D -/Monalisa:3M -/MonkeySp:5E -/Monroe:6H -/Monty5:2D -/Mooing-Bun:63 -/MoonUnit:3C -/Moone:4C -/MooseGod:0A -/Mort:2J -/Mortimer:6B -/Mortir:0D -/Morty:3H -/Mosquito:4G -/MotherSuperior:09 -/Motives:63 -/Moudi:25 -/Movieguy:0D -/Mp3S3v3r:63 -/Mpshp:5E -/Mpshp_:6B -/MrC:2T -/MrCat:6C -/MrChimp:03 -/MrDetonia:09 -/MrMW:03 -/MrMiagi:1Z -/MrMisery:25 -/MrMoose:0A -/MrOats:6H -/MrRandom:25 -/MrRandom_:0D -/MrReader:51 -/Mr_Freeman:03 -/Mr_Keyser_Soze:6B -/Mr_wh1t3:0C -/Mrox:6H -/MrsLovejoy:42 -/Mr|Dave||:6C -/Mr||Dave|:1C -/MsBIOS:2D -/MuNk:3H -/MuTao:63 -/Mufasa:2T -/Mufasa_:0C -/Muffin_Man:0C -/Mule:0A -/Mule_:0D -/MummyJean:4N -/MummyJeans:3M -/MuroAmi:4G -/Muscles_of_homosexx:3C -/MusicKing:25 -/MusicKing8:2T -/MusicKing9:2T -/MyAss:4G -/MyDickInMyHand:09 -/MyMickeyInMyHands:63 -/Myrtle:42 -/Mystic-Mac:1Z -/Mystic_Mac:1C -/Mystic_Mac_:51 -/MysticalD:51 -/N:25 -/N1XX_:4N -/N3150:4C -/N3150_:42 -/N3150__:2T -/N350:3M -/N3TFL1X:03 -/NANCY:5E -/NBA2K21PC:3H -/NC1776:25 -/NES:4N -/NHS:0A -/NIN101:2J -/NLDM:6H -/NSA:2T -/NSAGov:3M -/NSAnigger:42 -/NUGu:42 -/NX4bb:6B -/NZpF:4C -/Nabilushk:6C -/Nachlader:51 -/Nadezhda:51 -/Nadyushka:4G -/NaiGhe:4C -/Naia:3H -/NakaNaka:2D -/Nakah:25 -/Nan:5E -/Nando:03 -/Nanoha:3C -/NaomiShaniquala:6B -/Naomi_Shaniquala_Al-Baghadadi:0D -/Naomi_Shaniquala_Al-Baghdadi:5E -/Nap:0A -/Nap0:09 -/Narple:42 -/Nasrani:03 -/NatGreen:1Z -/Navi21:0C -/NcXk:2T -/NeX-:51 -/Nea:1Z -/NebulaAI:42 -/NebulaCentre:63 -/Nebula_W-:2D -/Nebula_W2081d:0A -/Nebula_W2082d:3C -/Nebula_WD40:3A -/Necrodancer:6C -/Necrodancer`:6H -/NedDigger:2J -/Ned_Digge:63 -/Negra:09 -/Neijei:03 -/Neil2:1C -/Neil_:3C -/Neil_Zaza:0C -/NejjqsJyR:2J -/Nekobot:4G -/Nekobot1:25 -/Nemesys:2D -/Nemomen:0C -/NerdCore:09 -/NerdLyfe:3A -/NerdyGirl:3H -/Nesie:2D -/Netboy3:6H -/Neutrino:6H -/New:51 -/NiKaN:03 -/Nice:42 -/Nick71:4N -/NickSerc:25 -/NickServ:3H -/Nick_Gerkiller:3M -/NigerMurderer:2D -/Nigger:51 -/Nikitis:2B -/Nikola:5E -/Nikonova:2D -/Nilfirith:2T -/Nilgeist:1C -/Nilgeist_:42 -/NimFan:4G -/NiniGeo2:4C -/Ninja3047:42 -/NinjaMast:40 -/Nintenuen:4C -/Nipun:4N -/Nka:3C -/Nl3avE:1Z -/NoLivesMatter:1Z -/NoStepOn:0C -/NoXPhasma:1Z -/No_One:0A -/Noemi:4C -/Nognosis:4G -/Nol888:4N -/Nomkid:6B -/Non-ICE:6H -/Nora11:42 -/Norsemen:63 -/Norvegia:2J -/NotALawyer:0C -/NotAnna:3M -/Not_Beast:1U -/NotnotOutOfGum:42 -/Noxturnix:09 -/Nrk:3C -/Nslobz:3H -/NuSpike:1C -/Nuclear:3M -/Nugem:6H -/NukesTop5:0A -/Null_:2D -/Nuotoh:42 -/Nyx:0C -/N|GG0R:6C -/O:6B -/OCCLNkjkK:2B -/OKIU:4N -/OMg74:4N -/OMg747:3A -/ONhB:3C -/ORIENTAL:4N -/ORIENTAL16:42 -/OXaku:42 -/O_od:42 -/ObLQ:42 -/Obama:5E -/Obl1vion:51 -/Oblivion:03 -/Obunga:6C -/Ofelia:6B -/Ogre:0C -/Ohfah:2J -/Ohfai:5E -/Ohgac:1C -/Ohkaa:3C -/Oksana:25 -/Oksana_:63 -/Oksana_Baiul:2D -/OldGnom:2J -/OldSch00l:6C -/OldSchoo1:3H -/Oluc:0A -/Omelette:6B -/OmenOvKane:3H -/OmenOvKane_:3C -/Omen_Ov_Kane:2T -/OmerAti:2J -/OnLine:0D -/OnMind:09 -/OneBTS_:09 -/OneBTS__:3H -/OneBTS___:0C -/OneVision:4C -/OodieT:3H -/Oongia:2T -/OpaAdolf:5E -/OperServ:2J -/OperatorR:6H -/OpiSIS:4N -/OpiSIS_:0C -/Oprah:09 -/OrGoN3:3A -/OrcaKun:5E -/Orelob:6B -/Ori_B:51 -/OriginalAntiHustler:5E -/Orillion:1Z -/Orval:3M -/Osama:6B -/Oscar:0C -/Oshkosh:51 -/Osloane:1Z -/Osloanie:1Z -/Othermeats:3M -/OttoYukie:5E -/OutOfGum:6C -/OutOfGum_:0C -/OutOfGum__:4G -/Outlaw:3A -/Outlawed:4G -/OutlawedOutlaw:4C -/OverFiend:3M -/OverMind:2J -/Ovular:51 -/Owl:1C -/OxYCoNtiN:0D -/Oxdeadbeef:3H -/OyashiroChama:09 -/OzRat:5E -/OzRat_:6C -/P00Pstink:51 -/PATTY:0C -/PC__:0C -/PEDOMETER:42 -/PEEgwvviG:6A -/PG13:1Z -/PHPWoman:1C -/PIES_:42 -/PIba:2T -/PKFraudster:6C -/PKsimp:3C -/PLSk:3A -/PPA:51 -/PPs:0C -/PQLe:2D -/PR0PH3T:2T -/PRETEXTATO:2D -/PSyMASA:1C -/PXPYxI3:42 -/P_B:6C -/Paddy:5E -/Palaver_:2D -/PaleHorseGiddyUp:2D -/PaleHorseGiddyup:09 -/Pali:6B -/Palmon:3A -/Pamela:2J -/Pantheistic:03 -/Parf:4G -/Parf_:51 -/Parfing:25 -/Parfingto:3H -/Parfington:42 -/Parfol:3P -/Passcor:4N -/Passivit1:6B -/Passivity:5E -/Passivity2:5E -/Patch:1C -/Patch_:5E -/Patrese:51 -/Patrick:3A -/Patrick^:6H -/Paul:42 -/Paula:6B -/PbiipxD:0A -/PdTMmFv:4C -/Pe2WVOhlb:1C -/PeGaSuS:5E -/PeacefulDeath:3M -/Pear:03 -/Peebs:0A -/Peggy:0D -/Pelos:3C -/PepeLopez:1Z -/PepePains:3M -/PeptoBismark:0C -/Peregrinus_:09 -/Peregrinus__:5E -/Perineum:3A -/Perkele:3H -/Perv4chat:0D -/PervFag:6B -/Petar_:3C -/PeteyPebbles:2J -/PhahH:3H -/Phallus:42 -/Philas:25 -/Phish:3C -/PhoneOwner:6B -/Phy:3A -/PiOjitoh:3C -/Piba:42 -/PicantePaavo:6C -/Pikachu:1Z -/Pillus:03 -/Pinco:4C -/Pineapple:42 -/PingPong`:4G -/Pinguo:3H -/Pinkisjustnumber:51 -/Pinklady:6C -/Piojo:03 -/Pipel:42 -/PissWizard:3C -/Pistachio:51 -/Pixi:6B -/Pixi_:0A -/Pixi__:0C -/Pixi`:2J -/Pizza_:4N -/PlanBinc:2T -/Plas:2J -/Plas_:6B -/Platinum_:42 -/PleXus:0C -/PleaseSuckMyDick:5E -/Ploks:6H -/Ploo:1Z -/PmIS:0C -/PoPp:03 -/Poirot:3C -/Pol_Haddad:09 -/Police:09 -/Politik:2T -/Pontuzz:3C -/Pontuzz_:4N -/Ponyo:5E -/PonzoSporrigan:2J -/PooftersFroth:4C -/PoolShark:42 -/Poorchop:4C -/Poot:1Z -/Popper:2J -/Porco:3H -/PornStar:63 -/PostKode:4N -/Potardo:3A -/PrOZaC:3M -/PrOZaC-:42 -/Prendar:51 -/PriVEHTqK:1Z -/PrimalP67:1C -/PrimalP76:6B -/PrimalP92:1Z -/PrimalPuppy:1Z -/PrinceUSA:3C -/PrincessEmmaOfNorway:25 -/PrincessKitanaEliteDarkWhite:3A -/Prinsessa:51 -/ProfesionalRapist:3C -/ProfessionalRapist:4G -/ProfessionalRapistTT:25 -/ProgressiveRapist:2T -/Proklantis:2J -/Proleeh:4G -/Prometheus:4G -/PrometheusRising:42 -/Protestant:25 -/ProtoType:3A -/ProudBoy`:6H -/Provic:3C -/Przemek92_:0A -/PsYcHoPaT:4N -/Psion:3C -/PsyChoop:1C -/PsyChoopa:4N -/PsyMassa:3A -/PsyMaster:42 -/PsyMastre:63 -/Psymaster:4C -/PubesGrowGrowGrow:1C -/Publios:6N -/Pucker:0D -/PuertoRoc:6H -/PumpSlut:4N -/PumpSlut`:0D -/PuntGathrr:4N -/Punter:0A -/PureTryOut[m]:3H -/Purpl:6C -/Purple:3C -/Purpleb0w:2T -/Purplebow:2D -/PussyHater:03 -/PussyKiller:63 -/PyR3X:1U -/PyR3X_:4G -/Pzex:63 -/Q2M0xl:2J -/Q91:42 -/QANON:5E -/QAnon:1Z -/QDX45:6C -/QJoP:1Z -/QKnown:0A -/Q\ANON:03 -/Qnorsten:1Z -/Qnus:09 -/Qoggis:3C -/QuadRTX:3C -/QuadRow:42 -/Quallure:51 -/Quandall:6H -/Quanemmi:4C -/Quantum_Alpha:2D -/Queer91:25 -/QueiDa:6C -/Qui_Sum:3H -/Quindall:2T -/Quinii:6B -/Quixo:2J -/Quotes:03 -/R:09 -/R0ckSh0x:6B -/R0nnie:1Z -/R2D2:5E -/R3D3:1Z -/R4D4:63 -/R4Rfw:0D -/RABIA[45]:4G -/RAPISTofficial:51 -/RASHIDA^wolfgang:63 -/RAlex:03 -/RDyLzgdMp:4G -/RJ45:3H -/RJ45_:2J -/RMOTAO:3M -/RPG:3H -/RTB:5E -/RTB_:0C -/RTFT:0D -/RTX3090:3M -/R_Reagan:2J -/Raaku:2B -/Rabid_Masochist:6B -/Raccoon:3H -/Raccoon`:3C -/Rachael:4N -/RacistBat:0C -/RackSmurf:0D -/Radio:2T -/Rafaela:1C -/RaginCajun92:6H -/Ragone:2D -/Raina:3M -/Raina_:3A -/Ran:3M -/RanchIsla:3C -/Rando:3M -/Random:6C -/Random024:09 -/Random024A:3A -/Random1:4G -/Random420:1Z -/Random4200:25 -/Random42000:2D -/RandomPir49:3C -/Randy:1Z -/Randy-:2D -/Randy_:3H -/Randy__:4G -/Raoknar:2T -/RapStar:1C -/RapeIsaRight:25 -/RapistLifeMatters:09 -/RareDCOMC:1Z -/RaySting:4G -/Raya:0C -/RayaMew:2J -/Rayaa:6C -/Raymond:4N -/Rayvyn:03 -/ReThan:4G -/Reader:0A -/Ready:51 -/Ready_:09 -/RealJew:2J -/RealKit:4C -/RealSatoshiNakamoto:4N -/Rebecca^:4N -/Red:25 -/Red14:3A -/RedW:6C -/Reed39:1C -/Reed_Solomon:0C -/Regor:51 -/Relena:4G -/Relih_:51 -/Relis:4G -/Relis7:6C -/RemyV:09 -/Rena_Ryugu:3M -/RepairManManMan:1C -/Requit:4G -/Retalin:4G -/RhinoBeetle:1C -/RhinoCodes:2T -/Rhum-blan:2D -/Rhumblanc:0C -/Rhvs:0C -/Rhvs_:0D -/RiTaLiN:3A -/RiTaLiN-:09 -/RiTaLiN_:0A -/Ricardus:4N -/Ricardus_:0C -/Ricardus__:0D -/Richard^:63 -/RickJames009:4G -/RickyRocks:4G -/Riddrib:42 -/Riefie:3H -/RigelStar:3M -/RiggedHorror:03 -/RindFrost:2D -/Ringo-:09 -/Ritche:25 -/Rizo98469:6B -/Rjx:0A -/RoBiN:6H -/RoSe:3C -/RobBond:3C -/RobanovThomaski:3A -/Robby:0A -/Robert:4C -/Robin:51 -/RobinHood:5E -/RobotoneX:3H -/RockShox:25 -/RockinRobin:51 -/Rodney:3H -/Roedy:2D -/Roffles:51 -/Roliga:6C -/Rome:0D -/Romer:3H -/RonaldKof:03 -/RootA:51 -/RootB:2J -/Rowan:25 -/RowdyFun:03 -/Royal:5E -/Royce:3A -/Ru:0D -/Rue:4N -/Rue_:0C -/Ruemu:2J -/Ruin:4C -/Ruint:0A -/Ruint-:63 -/Rukus:3M -/Rukusz:3A -/Rum:4G -/RumpHurl:5C -/Rusalka:5E -/Russell:3C -/Russell-:4G -/Ruth:0C -/Ruthless:6C -/Rwiz:3M -/Ryan_Evans:1C -/Rytord:1C -/Ryuuguu:3H -/S2AmgpXFp:2D -/S2N2:51 -/S3N7IN3L:2T -/S3xyL1nux:63 -/SBG:0C -/SBn00b109:3H -/SBn00b156:09 -/SBn00b157:1C -/SBn00b176:51 -/SBn00b192:40 -/SBn00b200:2J -/SBn00b240:40 -/SBn00b245:0A -/SBn00b269:2J -/SBn00b29:4N -/SBn00b324:5E -/SBn00b328:09 -/SBn00b361:4C -/SBn00b376:1Z -/SBn00b377:5E -/SBn00b389:51 -/SBn00b398:6B -/SBn00b412:09 -/SBn00b420:5C -/SBn00b469:40 -/SBn00b528:03 -/SBn00b551:6N -/SBn00b579:6N -/SBn00b589:2D -/SBn00b631:2D -/SBn00b668:0C -/SBn00b671:1Z -/SBn00b678:3P -/SBn00b724:6H -/SBn00b735:40 -/SBn00b773:6A -/SBn00b823:63 -/SBn00b826:40 -/SBn00b85:3H -/SBn00b852:3M -/SBn00b86:5C -/SBn00b872:2B -/SBn00b911:2J -/SBn00b979:0C -/SBn00b987:09 -/SBn00b994:2B -/SCHAPiE:2J -/SD:3A -/SDCHN:03 -/SDr:1C -/SE:1C -/SEEN:3H -/SENebula_W2081d:1C -/SEPassivity:3H -/SERGE90:3A -/SEX:51 -/SH3RM:2J -/SHEENY:4C -/SINOHAWK:0C -/SLAAAPP_YUA`-:42 -/SLAAPP_CORP`-:4G -/SLAAP_CORP`-:6B -/SLAPP_ASS`-:1C -/SLAPP_BAN`-:1Z -/SLAPP_CEO`:03 -/SLAPP_CEO`-:3A -/SLAPP_CON`-:1Z -/SLAPP_COR:1C -/SLAPP_CORP:4C -/SLAPP_CORP`-:4N -/SLAPP_CO`:51 -/SLAPP_CO`-:2D -/SLAPP_CUM`-:2T -/SLAPP_DOCTOR`-:5E -/SLAPP_DUDE`-:09 -/SLAPP_INC`-:6B -/SLAPP_IT`:03 -/SLAPP_IT`-:42 -/SLAPP_NET:6H -/SLAPP_NET`-:4G -/SLAPP_NOW`-:51 -/SLAPP_NO`-:2D -/SLAPP_ON`-:63 -/SLAPP_PORN`-:51 -/SLAPP_U`-:63 -/SLAPP_YOU`-:0C -/SLAPP_`-:42 -/SLAP_CORP`-:0C -/SLAP_INC`-:42 -/SLAP_PRO`-:63 -/SLAP_TV`-:6H -/SLu7:2T -/SNIFF:40 -/SOMTA:1Z -/SP3:4N -/SP9002Alu:5E -/SPOON:4N -/SRBLuka:3M -/SRBLuka_:2T -/SRidc32t:0C -/SSI_bux:1C -/SS_CORP`-:51 -/STARY_FON:3C -/STUPID:3M -/SWEJ:6C -/SWL:03 -/SXL:4G -/SYF_:6C -/S_Co`-:2D -/Sagara1:25 -/Saidu:1C -/Saifxin:5E -/Saitan:42 -/Sakuyak:0C -/Salvadori:4N -/SamHyde:0C -/SamIam:2J -/Sam_:6C -/Samantha^:3M -/Samhain:51 -/Samy:4N -/Samy^ZzZz:6C -/SandFlow:6H -/SandPower:6C -/Sander:6C -/Sandflow:25 -/Sandra:0C -/SanePerson:25 -/Saneperson:4C -/Sanguine:2D -/Santiago38:09 -/Santiago38_2:4N -/Santiago38_3:03 -/Sapphirus:1C -/Sarah^:2D -/SatanX:1C -/Sathurion:5E -/SaylrMoon:2J -/Scalia:1Z -/SchwarzeLocke:2D -/Scientist578:4G -/Sciuro:6B -/ScoobsMcD:3A -/Scopes:0A -/Scotteh:1Z -/Scrappy:25 -/Scub:4C -/Sd:3A -/Se8v:4C -/Searbo:6H -/Secondary:42 -/Secondary1:1C -/SeeRob:25 -/Seepei:5E -/Seerbo:2D -/SeiZe:0A -/Seirdy:0C -/Seirdy0:3H -/Self-Love:3C -/SelfDJ:2D -/Semilevel:0D -/SendInTheFeds:1C -/SendInTheMeds:4N -/Sentient:2D -/Serah:42 -/Seran:63 -/SereneBea:63 -/SereneSwan:3C -/Seres:0D -/Seresu:0D -/Serh:3H -/Serh_:6B -/SeriousCouching:1Z -/Server-Rooted-By-CSH-Members:6C -/ServiceBot:09 -/Seshat:3M -/Seshat`:03 -/SethRCooper:4N -/SethRCooper78:2T -/SethRyanCooper:51 -/Seth__:09 -/Sexton-Hardcastle:51 -/Sexton-Hardcastle5:63 -/Seyaryuki:42 -/Sh3r1ff:6H -/Sh3rP:0C -/Sh3rP_:3H -/Sh4rP:63 -/Shadowmm:2D -/Shadowmm-:0C -/Shadowmm_:1Z -/Shahid:4G -/Shane:2J -/ShannoW:42 -/SharP-:4G -/SharP0ink:5E -/SharP99:1Z -/SharP_:25 -/SharP_X9:2J -/SharP_x3:0D -/SharP_x5:2J -/SharP`:63 -/SharkB0lz:09 -/Shark_CHX:2D -/Shark_YDQ:1Z -/Sharky:3C -/Sharon:5E -/Shawn:4C -/Sheep:4G -/Shelly:42 -/Shillos:2T -/Shine-j2me:03 -/Shinku_:4C -/ShinyRice:09 -/Shipp:25 -/Shirakawa:40 -/ShitTierSpaghettiCoder:0C -/Shm00:3M -/Shooxo:0C -/Shuqu:1C -/Siberian_Shaman:2J -/Silence:42 -/SilentAnime:3M -/SilentMES:63 -/SillyGoose:5E -/Silver4K:63 -/SilverSpoon:3A -/Silverbac:2B -/Simping:63 -/Sinusoid:3C -/Siousxie:4C -/Siouxsie:6C -/SirVerII:2D -/Sirdon:3H -/Sithlord:25 -/SixNein:3A -/Skaface82:4N -/SkinFlute:63 -/Skrillex:03 -/Sky-Wizard:3C -/SkyDad:1C -/Sky_Wizard:3C -/SlaSerX:63 -/SleepyMokou:6C -/Slimey:0A -/Slugs:6B -/Slumlord:2J -/SlyTheDog:6C -/Smagigy:0C -/Smaque:4G -/Smaque_:3P -/Smaque|2:03 -/Smax:09 -/Smax`:3H -/Smegma_Sandwich:09 -/Smoke:3C -/SmokeyZ:0A -/Smoque:4N -/SmutLord:63 -/SmutLord^:0C -/Smutlord:4C -/Snail:3A -/Snail_:1Z -/SnakeEyes:3A -/Sniper:3M -/SnowDrop:3M -/SoB:0D -/SoPasqyfW:0A -/Sobek:03 -/SocialistRapist:1C -/SockMonkey:1Z -/Sofiia:3A -/Sog:1C -/Sog51:4N -/SolarAqu-:0A -/SolarAquarion:6H -/Solbu:1Z -/Soldev:3A -/Solo:4G -/SoloEjo27:1C -/SomeB:4N -/Someblackguy:5E -/Sonder:51 -/Sonder_:1Z -/SoniCF242:25 -/SoniCFL:6B -/Sook:42 -/Sookie:09 -/Soosi:4G -/Sopel:2J -/Sophie:3H -/Soraya:0D -/SoreNina:6H -/Soreina:1C -/Soros:4G -/SoulCareer:5E -/Souseiseki:1Z -/Souseiseki_:03 -/Southern_B|tch:42 -/Southern_Gentlem:3H -/SouulCareer:4N -/SovereignNSW:03 -/Soviet_Soldier:09 -/SoyBot:6C -/SoyBot_v2:2D -/SoyLunafan:1Z -/SoyberManifest:4N -/SpaceDoG:3C -/SpamcyPnt:0A -/Spartacus:2J -/SpearRaven:2D -/Speario:3M -/Special-G:2J -/SpiderGwen:3C -/SpiredMoth:6B -/SpmcyPntz:6H -/SponeBob:7E -/Sponk:2D -/SponkH:4N -/Spooky:09 -/Spooky_:1Z -/Sprinkle:0C -/Spud17:25 -/Spydar007:1Z -/St0ner`:6B -/StCyber:51 -/StUcK2[S:51 -/Stalin:1C -/StanMarkov:2J -/Stanley:42 -/Starla:0C -/Starter:5E -/StaticX:1C -/Statton:0C -/Stealth:4N -/Stefan:1Z -/Stella:5E -/Stellar:3C -/StephenLynx:2D -/Steve:3C -/SteveM:2J -/SteveV6:3A -/Stewie:03 -/Stfuktx:3A -/StillCyco:0A -/Stillgerm:6B -/StinkySteve:25 -/Stoney:0D -/StoneyBark:1C -/Stormo32Piqued:2D -/Stormo32Piqued__:4N -/StormofBytes:3C -/Strasbourgs:2D -/StripleP:2D -/StrongBad:42 -/StrongGod:6C -/StrongSad:25 -/StrongTop:1Z -/Stuk:5E -/SuchWow:2T -/SuckBoiSlime:1C -/SuckMySmallDick:4N -/Suffer:51 -/Suffering:09 -/Sufo:4N -/Sugar_:3H -/Sugar__:0C -/Sugar___:25 -/Sugar____:40 -/SuicideHelper:42 -/SuicideMaster:0C -/SuicideSupport:3M -/Suigintou_:25 -/Sumbrero:6H -/Summer2020:51 -/Sun:5E -/Suntop:09 -/Suntop_:1C -/Suntop__:2T -/Superstar:3A -/Superzak:0C -/Superzak_:1C -/SurplusCamel:51 -/Susan:3M -/SuspiciousPizza:03 -/SvenG:0C -/SwampAss:3C -/Swayze:1Z -/Swayze_:51 -/Sweag:0C -/SwedishMeatball:42 -/SweetPoto:1Z -/Swin3:0D -/Swine:09 -/Sycophant:2J -/SyneRyder:0C -/Synth:6B -/Syzop:51 -/T-2:3A -/TAFKAMP:25 -/TAFKAMP_:0C -/TAS-2012v:3M -/TAS_2012v:3M -/TBNK420:2T -/TCZ:63 -/TDK:0C -/TGMC:1C -/THATFUCKN:1Z -/THEGAME:25 -/THERULES:03 -/THE_FORECASTER:3A -/THEjman:4N -/TJC2020:2D -/TJC2040:4N -/TJzaXOqQO:2D -/TK614:1C -/TKO:1Z -/TOMBRADY:3A -/TRANS:40 -/TRB143:4N -/TRUGOAT:6B -/TRUMP2020:1C -/TStark:1Z -/TUDOR^1985:0A -/TVfan69:42 -/T_D_H:2J -/TaWPgLnXV:5E -/TaZeR:0C -/TaZeR2:4G -/Tableset:4G -/Tacky:51 -/TackyTack:03 -/Taetarthe:3M -/Taetarthe1:1U -/Tagged:3H -/Tai:6H -/Taigabot:25 -/Takehiko101:4N -/Talia:0D -/Talia`:6B -/Tamaresu:1Z -/Tanami:1Z -/Tanoc:03 -/Tantivy:5E -/Tar:0C -/Taurus:1Z -/TechB:3P -/TechGuru:63 -/TechItch:63 -/TechSmurf:09 -/Techman:2J -/Techman-:1C -/Techman_:51 -/Ted:63 -/Teeed:3P -/Teenagecitry:5E -/Teeph:63 -/TekWizOne:6C -/Tekdude:3A -/Tekdude-:42 -/Tekdude2:2T -/TekdudeLT:0A -/TekdudeN:51 -/TekdudeN-:3A -/TeleType:4N -/TeleType_:51 -/Tempest:3M -/TempoFunktron:51 -/Temptress:2J -/TendieQueen:2T -/Tenicu:2J -/Teridax:3M -/TerminatorOfVermin:6C -/Tero:4N -/Terofoo:2T -/Terri:63 -/TestDude:09 -/Testah:4N -/Testware:25 -/TgrS:1Z -/Th3Z0h4n:2J -/Thabtos:6H -/Thacu:09 -/Thaodan:3H -/The:0C -/TheAssassin:2D -/TheDarb:2T -/TheDoctor:51 -/TheFag:6B -/TheFalcon:25 -/TheGentleman:0C -/TheGoodMa:63 -/TheHoliestRoger:4G -/TheLegitimateMod:4C -/TheLie:3C -/TheMajesticCamel:51 -/TheMod:2D -/TheNSA:1Z -/TheNigerianPrince:51 -/TheOneAnd:3A -/TheOneAndOnlyMod:6C -/TheOnlyMod:2D -/TheQuantumAlpha:2J -/TheReader:40 -/TheRealKi:42 -/TheSashm_:3M -/TheSashmo2:3H -/TheSilentLink:4C -/TheSilentLink_:0C -/The_Blosso:4N -/The_Hanging_Flesh__of_Jcaesar1:6H -/The_Hatta:42 -/The_Myth:42 -/The_Real_Nebula:0C -/Theas:0A -/Theev:6C -/ThermZ:6C -/Thidran:25 -/Thidran3:42 -/This:1Z -/Thisisbilly:3M -/ThorDK:3C -/Thor_dk:6H -/Thorne:0C -/Thorne_:0C -/Thorne__:0C -/Thorne___:09 -/Thot_Police:3A -/ThruthHam:42 -/Thule2welt:3C -/Thunder:2D -/ThunderChicken:6H -/TiLT:3H -/TiSg:3H -/Tibsi:03 -/Tiddles:0A -/Tiddles_:6B -/TideRZ:25 -/TideRZ2:6B -/Tiefling:6B -/TigerbotHesh:3C -/TimWolla:42 -/TimWolla_:0D -/Time:3C -/TimeWolf:4G -/Timorousness:0A -/Timorousness1:0A -/Timorousness2:0A -/Timorousness3:0A -/Timorousness4:0A -/Timorousness5:0A -/Timothy:2D -/TimothyT:0C -/TimothyWT:0D -/Timourousness:0A -/Timourousness1:0A -/Timourousness2:0A -/Timourousness3:0A -/Timourousness4:0A -/Timourousness5:0A -/TirMcdhol:4G -/TirMcdhol2:4G -/Tjark:3M -/TlrPrkGrl:6B -/TnwR:0A -/ToUsMiC:2T -/ToWL:2T -/Toastmaster124:6C -/TohPiD:63 -/TokyoGringo:3M -/TomHilnig:5E -/TomatoSyn:6H -/Tomma:4N -/TommyHiln:42 -/Tomoko:51 -/TonTon:63 -/TonyL:42 -/TooCool:09 -/TooCool-:6H -/TooCool_:2T -/TooMuchX:6H -/TooPi:03 -/ToofAudit:51 -/Tools:4N -/ToonLink2:6B -/Toothless:1C -/TopBanana:4G -/Toples:4N -/Torikhtil:6C -/Torikhtil_:09 -/Torrenter:3C -/Tosiaki:4C -/TotallyNotEKcryptor:0C -/Touran:3C -/Toxic:6B -/Toyota:2T -/Tracreed:3A -/Trasp:42 -/Travis:2D -/TreeServ:25 -/Trevelyan:63 -/Trichocereus:0D -/Trickster:25 -/Trieste:1Z -/TripityDudeGuy:3C -/Tripper35303:6C -/Tristan:3H -/Trixar_za:4N -/Trollol_owo:51 -/Truenos:5E -/Trump20:42 -/Trump_202:25 -/Trumper:0C -/Truth:03 -/Tsukasa-kun:4C -/Tsutsu:3M -/TubeStake:09 -/TubeSteak:6H -/Tum:63 -/Tur:3C -/Turrent:3H -/Turrent_:4G -/Tware:4G -/TwiPrime:0C -/TwinTail:4G -/TwinTail_:3C -/TwisT:25 -/TwisTg2sb:6C -/TwisTqew3:4N -/Tyrod:6C -/Tyrone:25 -/TzepesH:1C -/TzepesH_:09 -/U1S1A1:2D -/U7v8:63 -/UBykpigKL:0C -/UD98:0A -/UFC:09 -/UFC_:5E -/UIcT:4G -/UOAM:4N -/UTC:4G -/UYLZ1:4N -/UberGoof:0C -/Uberius:25 -/Uberius_:2T -/Uberking:6C -/Ubermensc:4C -/Ugur:2D -/Uiwoo:25 -/Ultra-Far-Right:3C -/Umeeg:6B -/UmpireRewire:03 -/UnaChicaYeye:42 -/Uncled1023:03 -/Uncled1023_:25 -/Undefined_Reference:1Z -/Underdose:5E -/Undermose:0C -/UniquelyGeneric:0A -/UnrealFeeds:2J -/Upaeko:63 -/UpandDown:1Z -/UpnDown:4G -/Uranium:1U -/Uranium28:1C -/Uranium58:1U -/UrbenHulk:4N -/Urine_Bubbles:1Z -/Ursa:25 -/UserNo1:3C -/UserOO7:6C -/User_:09 -/User__:4G -/Uthes:25 -/V1nL4nD:2D -/V1nL4nD_:63 -/V1p3rBytes|`:2T -/V3n3RiX:5E -/VIKU:0C -/VLetrmx:6C -/VOiceMe:63 -/VPNmob:6N -/VZfz:51 -/VaLiuM:6B -/Vaerchi:42 -/Valyrie:25 -/VampirePonyo:6C -/VanEclair:2D -/Vanessa:4C -/Vegan:0C -/Veixe:5E -/Veldsky:3H -/Venu:42 -/Veracioux:25 -/Vernon:6B -/Vertigo1:6A -/ViCi:25 -/ViCoDiN:5E -/ViCoDiN-:0A -/ViCoDiN_:4G -/ViKU:0C -/ViaGetty:09 -/ViciousVoila:3C -/VictimToEmma:3H -/VictimtoKo:2J -/Vile:1U -/Vincent:5E -/VincentXi:25 -/Vinny666:3M -/Viper:03 -/Vipera:25 -/Virgin98:1Z -/Virginox:0C -/Virginox_:1C -/Virtual:1C -/VirtualIl:2J -/Visig0th:4G -/Visigoth:6C -/Visor:25 -/VitamineD:1C -/VitaoDoidao:5E -/ViveChat_44342:1Z -/Vizitator_8509:0C -/VoZtFOeKr:3H -/Vodka:3A -/VodkaV:6B -/Vohtee:3H -/Volentis:0C -/Vomista:25 -/Vomitus:09 -/Vortex:1Z -/Vousti:03 -/W00gaWoo:6C -/W8LPJFQnZ:0C -/WANG-HANG:1C -/WAP:1Z -/WEAKmage:1C -/WESTDAMION:42 -/WIN98SE:63 -/WOPR:3H -/WORDPRESS:3P -/WOW:0C -/WQ5aj:6C -/WU_1596487322336:0D -/WU_1600224364883:03 -/WU_1600792671750:2J -/WZOp:4C -/WZRD:3H -/WackyWolf:4C -/Wallet:2J -/Warsawio:63 -/Warss:09 -/Wasim7:51 -/Waye:51 -/Wayne:0C -/WeEatnKi1:4G -/WeEatnKid:03 -/WeGotMoreGum:2J -/WeLoveCP:6B -/WeeBo:09 -/WeeBo_:03 -/Weenished:51 -/WheelZ:3H -/WhereIsMySpoon:4N -/WhiteBoy:3M -/WhiteBull:25 -/WhiteNigs:4G -/WhiteTiger:0C -/WhiteTigerRage:03 -/Whitewolf:6B -/WhizzWarlock:3A -/WiZ:2D -/Wildstorm:4C -/Wildthang2:3C -/WillePoik:25 -/William:3A -/William^:51 -/Willux:51 -/Willux-chan:3H -/WinSock:3H -/Winddd:2D -/Windigo:6C -/Wint3r:51 -/WiseOne:6H -/WishIHadACock:51 -/Wizzup:4N -/Wnlqra:3A -/Wobbly:3M -/Wolf:3M -/Wolfy87:09 -/Wompum3:5E -/Word:0A -/Wordswort:1C -/Wordswrth:5E -/Workbench:42 -/WorkingGoose:25 -/Wrongnick:3A -/WuhanFlu:0A -/Wulfe:6H -/WyAn:6H -/Wylie:2T -/Wynton:03 -/WzDarwin:3A -/X:09 -/X-Scale:0D -/X-Scale`:3A -/XSlS:03 -/XYAZvrovp:3H -/XaNaX-:1C -/XaNaX_:4C -/Xafloc:6C -/Xakurinha32:4N -/Xavi92:3C -/XbCKzvEfB:6B -/Xea:4N -/Xen0:5E -/Xhdhc:4G -/Xibalba:6B -/Xicor:1U -/XqUr:09 -/Xylitol:2T -/Xylitol^:1Z -/Xzibath-H:1C -/Y-BOTHA:4G -/YAYOfolksYAYO:51 -/YCKWMfg:2D -/YEWKQL:5E -/YIwO:3C -/YT-info:0C -/Yaedie:2D -/Yak-san:0A -/Yakui:6B -/Yakui_:2D -/Yallqueda:6A -/Yasze:1C -/Yeji:0A -/Yeji_:3M -/Yemeni:03 -/Yendred:3H -/Yito:2T -/Yito37:3M -/Yito54:03 -/Yito9:03 -/Yitomato:0A -/Yitoo:6H -/Yndrd:3H -/YodaGnom:3C -/YogSoWhat:4G -/Yossarian:09 -/Yoursself:6B -/YtxrIxsEE:3H -/Yukiiii:3H -/Yuppie:4N -/YuwuY:2T -/YuwuY_:42 -/Z4CH3:6N -/Z4CHe:51 -/ZUB:3A -/Zach2:03 -/ZaeQue:2J -/ZahVu:1Z -/Zanthas:3A -/Zarharva:03 -/Zarharvester:1U -/ZayStorm:3C -/Zayto:3A -/ZcwM:6C -/Zed:42 -/Zeeye:1Z -/Zelda:6H -/Zerg51:4N -/Zerg_:1Z -/Zero:4C -/ZeroFux:3H -/Zeth:0C -/Zig_Zoss:0C -/Ziginox:3H -/ZipStick:4N -/Zn3s:5E -/Zoe_Pace:1U -/Zoldax_II:4G -/ZoomGuy:0A -/Zordon:3M -/Zork:0C -/Zub:6C -/Zub_:42 -/Zuppone:0D -/Zx:03 -/ZyAO:3H -/Zyll:2D -/[:5E -/[-_-]:3A -/[-{}-]:4N -/[7hC]x5h4d0w:0C -/[ARS:51 -/[BigDadE]:40 -/[CFLeX]:4C -/[CIA]:6B -/[Crow]:3M -/[E:25 -/[Harlot]:1Z -/[I-R-D-1-:3A -/[IRS]:3M -/[KGB]:4C -/[Marius]:2T -/[NSA]:2T -/[NoNameAvailable]:5E -/[RMS]:03 -/[R]:03 -/[Randall]:0D -/[TriiiX]:25 -/[_^Ne[N]o^_]:2T -/[`:51 -/[`voidhlwm_:3C -/[d-_-b]:2T -/[haydenh]:7H -/[k00l]zducuck:6B -/[k]:4C -/[k]LtKWR:03 -/[k]LtKWRI:09 -/[k]WATLTL:1C -/[k]bed:3M -/[k]beerIn:2J -/[k]doogh:0D -/[k]habib:25 -/[k]inBED:1Z -/[k]inBar:3C -/[k]itbs:3A -/[k]mbp:4C -/[k]mbpINb:4G -/[k]sunbat:6B -/[k]walk:6C -/[k]work:6B -/[k]workpc:2T -/[m]:03 -/[m]_:2T -/[mezmur]:6C -/[mz]:4C -/[roar]:3H -/[roar]_:3H -/[twat]:4G -/[vae]:42 -/[vlad]:5E -/[werejag]:0D -/[x]:0C -/\:1Z -/\0:42 -/\\:6H -/\\Mr_C\\:42 -/\_:1Z -/\`\:1Z -/\g:42 -/\o:0A -/]IBF[:1C -/]R[:1C -/][_R_][:6C -/]haydenh[:7H -/^-^:6C -/^1597514^:51 -/^1597532^:1Z -/^1597546^:5E -/^1598128^:4N -/^1598151^:0D -/^1599937^:09 -/^1599966^:2J -/^1600552^:51 -/^1600570^:6H -/^1601138^:09 -/^1601146^:1C -/^1601175^:51 -/^1601204^:4C -/^1601298^:2T -/^1601756^:6H -/^1601780^:4N -/^1602971^:6C -/^1603575^:4C -/^1603577^:6H -/^1609020^:40 -/^1609034^:2D -/^1609625^:1C -/^1609639^:4G -/^Emi^^:6N -/^Emilay^:6N -/^Emily^:0A -/^Voyager:40 -/^^:6B -/^^^Emily^:4G -/^^^emi^^^:1Z -/^_Emi_^:03 -/^_^:09 -/^_^_:3M -/^__^:25 -/^___^:3H -/^______^:3A -/^_______^:4G -/^e_mily^:1C -/^emi^:4C -/^emi^^:3A -/^emi^^^:0C -/^emily^:1C -/^emma^:63 -/^i^:2J -/^neet^:4N -/^pHANTOM-:5E -/^pHANTOM^:6B -/^syn^:03 -/_:3A -/_07N1:2J -/_0N1P:1C -/_0nap:51 -/_0pan:51 -/_0x5fc3:6B -/_Biznz:51 -/_Dude_:09 -/_Leviticus_:63 -/_Parvati_:09 -/_QB:1Z -/_QB_:2T -/_Q_:1C -/_Royal:42 -/_SoniCFL:4G -/_Supersta:4G -/_Zialus_:6A -/__:3M -/___:09 -/______:42 -/__ahimsa:3C -/__minty:09 -/__poke:3M -/__sbrk:3A -/_alph4_:3A -/_benj:4G -/_blasty`:6H -/_cr4ck_b1:42 -/_d:0A -/_ghoul:4G -/_heavyarm:03 -/_insomniac:6B -/_jiggawat:2T -/_jim:63 -/_joey_:4C -/_kylef:6C -/_mak:4N -/_mak_:42 -/_minty:0A -/_ncog:3C -/_notK:2T -/_oranges_:42 -/_owo:4N -/_paranoid:2D -/_poke:40 -/_tepes:09 -/_willo_:3A -/`:3H -/`-`:5E -/`360`MM:2D -/`360`mm:5E -/`Ice:42 -/`Sprinkle:6C -/`St0ner:63 -/``:4G -/````:6B -/`````:2T -/````````````````:3C -/`nonamoos:63 -/a:0D -/a1exs:6B -/a23456789:6A -/a2m:2D -/a2m_:3A -/a3d:3H -/a7:4N -/a7_:0D -/aBiesh:3H -/aDB-[u]:0C -/aFaggot:63 -/aFaggotHunterWhosAlsoAFaggot:63 -/aFaggotHunterWhosAlsoAFaggotKi:6H -/aFaggotKiller:0C -/aGT-[e]:2T -/aGaviW:3M -/aHT-[u]:4N -/aLongNick:4N -/aLpine_:3H -/aMC-[e]:3A -/aPJ-[u]:4N -/aPV-[i]:6B -/aRV-[i]:2D -/aTD-[i]:3A -/aTurkRapingSwedes:2D -/aWC-[i]:1C -/aWT-[u]:2T -/aZM-[e]:3C -/a_:0D -/aa:3C -/aaa:3H -/aaaa:3A -/aaaaa:0C -/aaapycov:51 -/aanji:4N -/aaro:0D -/aaronmcadam:3C -/abdf9988:03 -/abe_simpson_:63 -/abeato:03 -/abecx:4N -/abecx_:6C -/aber:6C -/abigail:03 -/abq9J:0A -/abrahm:6A -/absinthe-:6H -/absinthe_:1C -/abuck05:63 -/abum:25 -/abum2:3H -/abumfone:03 -/abumpad:3A -/abumphone:51 -/abyssangel:3H -/ac1:25 -/ac1dvegas:6H -/ac2:6H -/acappell-:3M -/acappella:2D -/acbn:3A -/accuracy:1Z -/ace_kevi:03 -/acerising:51 -/acid-:2J -/acid_:51 -/acidapex:0C -/acidchik:09 -/acidified:6B -/acidjazz:4N -/acidjazz_:63 -/acidspaces:42 -/acidvegas:51 -/aclark:2J -/acrsu:25 -/activFDNY:2D -/adahn:0A -/adam:42 -/adamd:0A -/adamd_:42 -/adamr:51 -/adc:0C -/addc182:4G -/adde9708:0D -/adesas:0A -/adhn:42 -/adium:6C -/adm:0A -/admin__:63 -/admin___:2D -/adon:1Z -/adonisasu:4C -/adresas:6C -/adrien:25 -/adrien-:3A -/adrien1:6C -/adv0c4te:2J -/adventure:0C -/aeChi:51 -/aeGie:3H -/aeShe:2T -/aeZiek:03 -/aecoiG:3H -/aegis:4G -/aelien27:5E -/aempirei_:2T -/aeres:3C -/aesthetic:3H -/aesthetik:3H -/aether_:03 -/aether`:63 -/afb1:1C -/afkay:03 -/afkgoy:5E -/after8:2J -/afx:0D -/agant:6B -/aghgurqa:25 -/agmbat:1C -/agmethod_:2D -/agnahim:63 -/agsv:3M -/aguslr:0C -/ahFie:51 -/ahNgum:2D -/ahf:03 -/ahfeel:2J -/ahimsa:4C -/ahltvrlb:25 -/ahmet:0A -/ahmuT:3M -/ahplA:4C -/ahtoX:2D -/aiKuiy:5E -/aiWoKe:03 -/aidenholmes:3M -/aids:63 -/aids_:3H -/aidsbird:4N -/aidz:63 -/aims:25 -/ainoue:2T -/ainoue_:6B -/air:5E -/airconditioner:6C -/airconditioner2:42 -/aisec:51 -/aisec3:3P -/aiwahS:2D -/aj:0A -/ajace:5E -/ajax:51 -/ajcau:6H -/ajgrit_:2T -/ajguille:6C -/ajpfefj:3M -/ajpiano:3A -/ajpywlb:0A -/akaso:3M -/akejay:5E -/akejay_:2D -/akem__:2B -/akfuu:3C -/akfuu_:25 -/akitten:42 -/aku:03 -/alanna:09 -/alaskabea:3H -/alberto:6H -/albino:0C -/alchemist:4C -/alchemist0:6C -/aldKorn:51 -/aldcor:51 -/aldocr:1C -/aldroc:0A -/alex[in]chains:4G -/alexs:0D -/alexsm:63 -/alexss:1C -/alff:25 -/alfred_cockhitch:63 -/alfredo:3C -/alg0d:3A -/alhassana:6B -/alhassanaraouf:1C -/alice:2T -/alien88:63 -/alienbaby:4N -/alison:6B -/alkalinity:2D -/alkyl:09 -/all-ameri:2J -/allant4:2T -/allant40:4G -/allant401:42 -/allenp:3A -/allenwren:3A -/allfather:0C -/allison:4N -/allison_:6C -/aloeventj:3M -/alongtong:3H -/alph:42 -/alph02:6B -/alt3r3d:4N -/alt_5t5:3A -/alterego:2D -/alterego__:2J -/altomo:3H -/alts:3A -/alucardo:6C -/alucardoo:2T -/alyosha:6B -/alyosha_:0D -/alyoshaa:2D -/alz:3M -/am_an_exit:2D -/amadeus:4C -/amanda_:0A -/amar:6B -/ambrose:6B -/ambrosia:0A -/amc-:0A -/amcclure:4C -/amelian:4C -/amelian_:03 -/amez:1Z -/amino:3H -/amino-:2D -/aminoo:25 -/aminooo:5E -/aminux:42 -/aml:63 -/amlutios:1C -/ammon:2T -/amolith:3P -/amphibulu:0C -/amphibulus:3C -/amrowsell:0C -/amrowsell_:1Z -/amvoled:0D -/ana:0C -/anachron:0C -/anarchist:6C -/anarchy_1:3C -/anarchy__:4C -/anass:3C -/ancmt:03 -/andai:4G -/andai1:4N -/ando:1Z -/andonuts:03 -/andquesada:25 -/andras:63 -/andrea:4G -/andropov:3H -/andropov_:4N -/andsee:0C -/andy_:1Z -/andykof20:4G -/andyvk5:6B -/anfpilu:4C -/ang8lax:4G -/ange1:1Z -/angel_fir:03 -/angelzrkr:3H -/angieb:0C -/angular:4G -/anherop:5E -/animu:3M -/anishakar:2J -/anita_20:6H -/anjel:51 -/anjelic:0A -/anjifa:3H -/anjifa_:03 -/anlqw:5E -/annA:6C -/anna:1Z -/annaSEX:4N -/anna_:51 -/anna_\:5E -/annaa:09 -/annal:1Z -/annalena:4C -/annalisa:6H -/annamalinka:4G -/anniez:25 -/anniez-:3H -/anniez9:25 -/anniez_:4N -/annna:25 -/annnna:2D -/annon:51 -/ano^:4C -/anon:42 -/anon1:03 -/anon108:09 -/anon1312:09 -/anon2:4N -/anon4:6N -/anon623:0D -/anon9234:1C -/anon9234_:1Z -/anon987321:25 -/anon_:1C -/anon__:4G -/anonamoos:1C -/anonssssssss:4C -/anonymoos:4C -/anonymous_:1Z -/anonyxoxo:25 -/anoroc:0C -/anthis:4G -/anthis_:3C -/anthk1:09 -/anthonyg:6H -/anti-soci:51 -/antifox:4C -/antipeace:25 -/antipent:1C -/antithes_:0A -/antithesis_:3H -/antithesis__:63 -/antitype:63 -/antman:42 -/anton:4G -/anton1:2T -/anton2:6B -/antonizoon:2T -/anton|pw:0C -/anubis:09 -/anunciad:03 -/anus:42 -/anxia:1Z -/anystasia:3C -/anzzrjg:4N -/apb:0C -/apenas:4N -/apetresc:0C -/apetresc[m]:1Z -/aphrax:2D -/aphrodite:3A -/api:5E -/aporpo:42 -/apostate:3A -/apostrope:2J -/apple:6B -/apu:3C -/aqmgdxp:42 -/aqua_teh:4G -/aquinzie:2T -/aquoot_:6C -/ar:6H -/ar-:63 -/arabi:6H -/aradesh:4G -/ararouge:25 -/ararouge_:51 -/arbogt:25 -/arbogt_:3A -/archbspwm_:63 -/archwizard:0D -/arcseconds:4N -/ardoyne:2D -/ardoynne:3H -/arf20:2J -/argoss:3M -/arhoy:3A -/ariana:25 -/arianagrande:0A -/ariciu2k-:2J -/ariel:1Z -/ariel_1:51 -/arii:1U -/ario:6B -/ark:0A -/ark_:5E -/arleigh:4C -/arleigh`:25 -/armeni:42 -/armin:03 -/armin76:25 -/armoth:03 -/arnge:1Z -/aroticoz:0D -/arsekeks:0C -/arsekeks_:51 -/arsmagna:3M -/arsonal:4G -/arzael:09 -/asd123:6H -/asdadasasdqw:51 -/asdadfa:3M -/asdf__:6B -/asdfgh:6B -/asdfghjk:2T -/asdjaksdjkasdjkasdj:0C -/ash:25 -/ash9:2D -/ash_:0D -/ash___:1Z -/ashie:63 -/ashtrace:0C -/ashtrace_:09 -/ashy:6B -/ashylary:09 -/ask_anyon:09 -/askaxon:6B -/askme:3H -/asome1:40 -/ass:3A -/ass_:1C -/assboy:6B -/asscandle:3H -/assfog:2D -/assfrog:0C -/asspiringfaggot:4C -/asswhispr:0C -/asterismo:6H -/asterismo_:3M -/astr1:42 -/astra:1Z -/astra_:1C -/astro:2J -/astro_:3M -/astroid__:1C -/astron:2D -/astro|:3C -/asuka:0C -/atechad:25 -/ateppqx:51 -/ath0:4C -/atk:03 -/atlas_:42 -/atlus3:6H -/atomic:6B -/atrocityvoyeur:5E -/atunecat:09 -/aucampia:6C -/aucklan:1Z -/audemux:6H -/audioslave:1C -/aunickuser:4G -/aunickuser1:4C -/aunickuser_:6B -/aunickuser__:3H -/aurghyadip:2T -/aurghyadip0:09 -/aurghyadip3:1C -/aurghyadip4:25 -/auronite:1Z -/autism:2D -/autismnesday:51 -/autismo:3C -/autismo_:4N -/auxdemux:63 -/avalon:25 -/avast:3H -/avdb:42 -/awe:3A -/awex:25 -/awfgq3gq3:25 -/awwe:25 -/ax0l:03 -/axlwqp:0A -/axon:5E -/axu:0C -/aycanada:2B -/ayersea:25 -/ayerseas:42 -/aylamao:2J -/ayool:09 -/ayylmao:1C -/azel:09 -/azgbz:3C -/azirino:6C -/azod:3C -/azrael:4G -/azsciitec:25 -/azsclltec:0A -/azscootec:6N -/azscqqtec:09 -/azscuutec:25 -/aztec:51 -/azupoo:4N -/azurexp:09 -/azuzu:42 -/azza:3H -/b:0C -/b00bs-:2T -/b00da:5E -/b00t:4C -/b0dhi:3A -/b0dhi_:2T -/b0nk:42 -/b0redey:63 -/b0x:1C -/b0x191446253:2T -/b0za:6C -/b0za_:6H -/b17bmber:6H -/b1ackcat:2D -/b1ink:3M -/b30wulf:3H -/b333nz:03 -/b333nz_:4G -/b33nz:3H -/b3ck_2k2:03 -/b3d1n4t01:1Z -/b3d1n4t02:09 -/b3d1n4t03:2D -/b3d1n4t0r:3M -/b3enz:4N -/bBNXhE:25 -/bROG:4C -/bUTTvOMIT:1Z -/b_:2T -/babo:0D -/baby_penguin:09 -/babychaos:51 -/babyfarts:4N -/backronymman:3M -/backspace:4C -/baconshit:0A -/bacterio:0C -/badbit:3C -/badcloud_:0C -/badcmpany:2J -/bade_:63 -/badperson:4N -/bads:6C -/bads_:1Z -/badumbum:0C -/badumbum_:1C -/bafs:25 -/baguette:1Z -/baguette_:0D -/bakedpotato:0A -/bakuzan8:5E -/bakuzan87:4C -/bakuzan88:25 -/ballsweat:1C -/balters:3C -/bamdad:03 -/bamdad_:25 -/bananazur:6C -/bananstol:4C -/barby:63 -/barf:3P -/barguesto:3M -/barkl:3M -/barnie_:0C -/baruchel:2D -/based:6H -/basse:0A -/bassedul:4N -/batewolf:3C -/batman:2D -/batman-:4N -/baus:0A -/bax:5E -/bax__:6H -/baxmoke:63 -/baz_:42 -/bb:3C -/bb420:63 -/bb8:3C -/bbb:3C -/bbb1:3M -/bbbbuni:6H -/bbcereal:2D -/bbojug:1Z -/bbqnp:09 -/bbunni:6C -/bcd:6B -/bch:25 -/bchall:09 -/bcphmx:6B -/bcqgpsba:3H -/bcwcebiwb:25 -/bda:09 -/bdavey:2J -/bdna:09 -/bdotdiwd:6C -/bdown:2T -/bdz:2T -/beach:2D -/bean__curd:25 -/bean_curd:3C -/bean_curd_:2J -/bean_curl:1Z -/bear9:03 -/beard:6C -/bearmarch:4G -/beatdown-:25 -/beatdown_:25 -/beautyy:3M -/bedrolls:6H -/beeard:09 -/beebz:09 -/beeenz:51 -/beef:3P -/beefadd:51 -/beenz:1C -/beenz-:6C -/beepingwindows:6B -/beers:03 -/beez:0C -/begriffs:6N -/behold_a_great_red_dragon:2J -/behrad:0C -/bela_lago:4C -/belanthor:2T -/belcher:1Z -/belcher_:4G -/bellman:4N -/ben:3A -/ben-z_:0C -/benburwell:2J -/benburwell_:3P -/bencoh:3H -/benderRodriguez2:6C -/bendoin:5E -/benedikt:09 -/benett:51 -/beng-nl:51 -/bengt:6B -/benharri:5E -/benj:4N -/benna831:40 -/benvenuto:3H -/beoli999:03 -/bep:1Z -/bergur_:1C -/bero:25 -/bertiger:3A -/bestmusic:3H -/beta-:42 -/betaboy25uk:51 -/betatester:2T -/bex:09 -/bex-:63 -/bex_:2T -/bex__:4G -/bexiled:3C -/bexit:5C -/bextra:2D -/bexxx:6C -/bfnhyu:2J -/bfot:51 -/bg_:2T -/bg__:3H -/bhavesh:3M -/bheekie:6B -/bhkor:4C -/bhp:3H -/biePha:1C -/bigBelly:3A -/bigV:2D -/bigVplaya:2J -/big_dad_e:3M -/big_t:42 -/bigbird:1C -/bigbob:3M -/bigboss:25 -/bigboy42:51 -/bigchungus:2J -/bigdave:0C -/bigdouche:3A -/biggus:5E -/biggus_diccus:4G -/bigjohn:1Z -/bigman1337420:0D -/bigman645886:1C -/bigman789420:2J -/bigmark:0C -/bigrichie:4G -/biheoad:4C -/bikr:0C -/bilbo991:2T -/bildramer:09 -/bilegeek:6B -/bills:42 -/billyb0b:3H -/bin:03 -/binary_:51 -/binbasti:0C -/binfu:03 -/biniar:6C -/binky:3A -/binwiederhier:09 -/bionic:4N -/bionic_:1Z -/bionicpup:1Z -/birkoff:6B -/birth:0D -/birth_:3A -/biscoro:09 -/bitatem:1Z -/bitch:2J -/bitchass:2T -/bitchlor-:6C -/bitchlord:63 -/bitco:6H -/bithov:0C -/bitrot:1Z -/bitrush:5E -/bixnood:42 -/bj0rg:2B -/bj0rn:6C -/bjongo:25 -/bk:25 -/bkhl:2T -/bkjxkaxg:2D -/bkyy:6B -/bla:3C -/blaag:3H -/blaag1:2T -/blackbea-:4N -/blackbea|:5C -/blackbird:2J -/blackbit:1C -/blackdev-:4C -/blackdevl:0C -/blackest_mamba:3M -/blackest_mamba_:03 -/blackjid:0C -/blackntan:51 -/blackout:1Z -/blackpape:3A -/blackrose1:3A -/blacktie:3P -/blackwhale:2D -/blah:0C -/blakange-:4N -/blakem:2T -/blank:6C -/blass:0A -/blass_:63 -/blaxthos_:6H -/bleach:0C -/bleb:2T -/bletch:2D -/blfyah:6B -/bling:63 -/blink:3M -/blink_:5E -/blip:03 -/blippy:03 -/blitzen:3H -/blmbm:3C -/blocked:1Z -/blocko:0C -/blode:09 -/bloeree:2T -/blogbird:2T -/blogging:2B -/bloodyMurder:25 -/blowfish:3A -/blowmeok^:1C -/bludfurst:63 -/blue:25 -/blue_:3H -/blue__:3H -/bluefourier:4C -/bluerose:2D -/blumpkin:4C -/bmlnpw:63 -/bnozliee:3M -/bo-:2T -/bob:6C -/bobMarley:0C -/bobafett:3M -/bobpp_:6C -/bobsonofb:0A -/bogo_lode:3A -/bohCh:09 -/boii:4N -/bollocks:25 -/bomas:4G -/bombluje:2T -/bomct:4C -/bonfacemu:2D -/bong:6B -/bono_nob:0A -/bono_nob_:25 -/bonz060:0C -/boo:3H -/boobtube:3H -/boof:25 -/boof_:2T -/boogaloo:3C -/booger_:63 -/boopingwindows:09 -/bootleg:3M -/bootrom:1C -/bootydoom:6H -/bopadoo:2D -/borliz:3A -/bot22:1C -/bothadeez:42 -/bothofthosearethesame:42 -/botulf:3C -/boubou:4G -/bougyman:3C -/bovpxdb:1C -/box1:25 -/boxer:0C -/boxrick:6C -/boxrick_:0D -/boza:51 -/bozozcur:6B -/bozozocur:3A -/br1dg:4G -/br377:0C -/brabo:3M -/bradley:3P -/brah:40 -/braixenirl:4C -/braixenirl0:6C -/braixenirl2:1Z -/braixenirl6:4N -/branden:3A -/brandfilt:3A -/brandi_:4N -/branefawt:2T -/branon:3H -/brap:6H -/braplord:25 -/brayden:3C -/brea:03 -/bree33:2J -/brendantcc:3C -/brendantcc1:3C -/brendo:2J -/brian__:1U -/bricks:3C -/bricks_:03 -/briesss:0D -/brite:3A -/brite19:6B -/brite41:0A -/brite49:2T -/brite50:2D -/brite90:4G -/brobird:1Z -/brocashelm:0C -/brokenrecord:42 -/brolin_empey:03 -/bronzie94:2D -/brooklyn:5E -/broski:3C -/bruh:1C -/brujomemin:6C -/brule:3M -/brutex:0C -/bruv:2J -/bryce:2D -/bryno:03 -/bs719:3H -/bsd:1C -/bsteel:2J -/bteeer:2D -/buZz:3M -/bubble26111989:0D -/bubbles:4C -/buck_lanc:2J -/buckhardp:0C -/bugtester:2J -/buh:3M -/buinb:1C -/buinb_:6H -/buinb__:6C -/bulldozer:1Z -/bullet:6C -/bullet_:0C -/bullmark:3C -/bullmark-:09 -/bullmark_:3H -/bully:6B -/bumfuck:0A -/bunbun:3H -/bungo:25 -/bunkerrr:09 -/burak:1C -/burn:1U -/burn_:6H -/burnmjd:03 -/burnout:6C -/burntjew:1Z -/burntkale:03 -/bushwhack:3M -/bushwhacker:0D -/bushwhacker_:3C -/buss:5E -/bustghost:4C -/butcha:09 -/butcha-:03 -/buttercup:0A -/buttercup^:4C -/buttertoast:42 -/butth0le:2D -/butthash:3M -/butts:09 -/buttvomit:2J -/buyer__:1C -/bwkyurrl:6B -/bx:5E -/byoung:3H -/bysizngp:51 -/byte1032:63 -/bzed:6C -/bzed_:5E -/bzeld:42 -/bzjakq:2D -/bzzp:3C -/c041:51 -/c0nker:42 -/c0ntempt:1C -/c0ntempt`:4G -/c1v1l:09 -/c2cCJSRl:4N -/c5n:2D -/c64:3A -/cBQW:3A -/cDpY:2T -/cGSmNYyQw:4G -/c__bmxlkb:0C -/c_hi3:0A -/c_hi3-:4G -/cabat:42 -/cable_:4G -/cacco:4N -/cactus:1C -/caeTh:4N -/caesar:51 -/caesar-:3A -/caesar_:25 -/caesium:3M -/caffeinatedcode:6C -/cahXee:03 -/cahlosspl:4N -/caitlynn:51 -/calaf:3H -/calafRPG:2J -/callcc:4C -/callow:6B -/calma:5E -/calsonic:2T -/calsonic28:51 -/calsonic58:40 -/camSF:09 -/camus:2D -/canada420:6C -/candy:63 -/candyman:6H -/cant_chat:6H -/cantstop_:0A -/capheind:51 -/capt_zap:25 -/capt_zap_:42 -/captian_c:4N -/carciofino:3M -/carciofino68:2D -/careet:1C -/carly:63 -/carradine:0D -/cartier:03 -/cartman:0C -/casanostr:5E -/cashstir:1Z -/casimir:51 -/caskd:1Z -/caskd-dev:2J -/caskd-uir:5E -/caskd-uirc:1Z -/cassim:6B -/cassim-:42 -/cat:3M -/catacomb1:3C -/catacombs:3C -/catalase:42 -/catalase_:03 -/catatoni-:0D -/catatonic:3M -/catatoni|:1C -/catdad:3H -/catman:0C -/catman370:03 -/catpeach:51 -/cau0:25 -/caubert:2T -/caubert_afk:63 -/cave:2T -/cazpxqw:51 -/cbdoll:1C -/cbmsfdwh:25 -/cbmuser:3P -/cbtgr:4C -/ccanw:0A -/ccjqudw:25 -/cdBr:25 -/cdb:6H -/cdma:4G -/cdolan22:3C -/ceasar:0C -/ceaser:4N -/cecilb:4C -/ced117:1Z -/ceene:63 -/ceibal:4C -/ceibal_:4G -/cel:6C -/cephalus:63 -/cerulean:2D -/cews:51 -/cfongyyf:0C -/cgixyyms:42 -/ch:2D -/ch00m:4C -/ch3mist:5E -/ch4ff:03 -/chEEKie:2B -/chaff:0C -/challah:6C -/chals:4G -/champ:5E -/changO-:4N -/changeme:4C -/changoXPR:5E -/chanhold:42 -/chanhold.hlircnet.:0C -/chanhold@chanhold:0A -/chanhold@chanhold.hlircnet.:03 -/chano:42 -/chano0:5E -/chano2:6H -/chano3:2J -/chano4:2J -/chano5:4G -/chano6:0D -/chano7:2D -/chano8:3C -/chano9:5E -/chanserv:0A -/chapi:09 -/charles_bottle_popper:0D -/charles_bottle_popper_with_che:25 -/charliebrownau:3H -/chartreuse:25 -/chase_:09 -/chatStroker:0C -/chc4:6H -/cheapie:6A -/checho:63 -/cheeNe:5E -/cheeseburger:4N -/cheesemonk:6B -/cheesemonk-:6B -/cheesemonk_:1Z -/cheez_:51 -/cheiBu:25 -/cheller:09 -/chelmzy:0A -/chelmzy8:2D -/chemicalgraft:42 -/chemist:09 -/chemtrail:0C -/chendo_:25 -/cheno1115:09 -/chernobyl:25 -/chewbacca:4G -/chewy:42 -/chicane:03 -/chicane_:3C -/chicken_nugger:1C -/chik:2J -/chik_:2T -/chiklet:6C -/chiku:4C -/chill:4G -/chill_:2D -/chill__:63 -/chinaski:5E -/chinatown:1C -/chioLa:6H -/chipolux:6C -/chippah:0D -/chitao:2T -/chiyou:03 -/chiyou-:09 -/chiyou3:6H -/chiyou_:4C -/chkrr00k:6C -/chmuri:4N -/choob_:63 -/choom:63 -/choom_:5C -/chopchop1:1C -/chowder:63 -/chown-:6C -/chown_:3C -/chown__:03 -/chrippa:1C -/chris39:63 -/chris3915:3M -/chris_40:2D -/chrisfagd:1Z -/chrisgayd:25 -/chrissy:6C -/christistheway:2T -/chromis:4C -/chron:6B -/chrono:1Z -/chrono-:09 -/chrono_:1C -/chrono__:1U -/chuchu:09 -/chucky_d:25 -/chxeizpr:6H -/cidal:03 -/cidal_:3P -/cil:1C -/cilla:6H -/cipher:3M -/ciprian_:25 -/circuitbone:09 -/cismq:4G -/cities:25 -/cjg:42 -/cjglyefa:4N -/cjmtyx:6B -/cjrroevm:1C -/ck:3A -/ckat:2J -/ckejsdib:3A -/claire:63 -/clam_:4C -/clamkin:6C -/clamkin-:0C -/clamkin|:4C -/clams:3H -/clapback:3A -/clarux:5E -/classhole:5E -/clavichords:3A -/cleaningwindows:6B -/cleantwat:1C -/clitboner:6C -/clort:2D -/clotrim:3C -/clownUSA:2D -/clownboy:2T -/clownprty:63 -/cm:25 -/cmang_:6H -/cmccabe:42 -/cmos:2J -/cmx:63 -/cncfi:6H -/cnr:6C -/cobra_:40 -/cockroach:2D -/cocks:0C -/coderobe:3H -/codestr0m:6C -/codez:4G -/cody-:0C -/coffeeiazo:1C -/cogitase:0A -/cohen:0A -/colbertin:25 -/coldwheels:4G -/colombus:0C -/colonials:0A -/coltseavers:2J -/coltseavers_:0D -/commodus:6H -/commodus_:1C -/communist:3C -/comnsense:51 -/comod0:6H -/comodo:0C -/comp4:42 -/compTECH:3C -/compTECH-:3A -/computer:4C -/computers:0C -/comrade:1Z -/comrade-:09 -/comstud:6H -/conf_t:09 -/conno:4G -/connor332:4N -/conrad:63 -/constructed:4C -/contained:42 -/contrail:0A -/convict:4G -/convolution:1C -/cooey:51 -/cooey-:25 -/cooey^:63 -/cookie:6H -/coolacid:25 -/coolbeens:6C -/cooldude:3M -/coolio:09 -/coolmandude:51 -/coolmandudebro:6B -/coolmandudebroguy:4N -/coolomb:0A -/coontach:25 -/cope:0C -/copypasta:25 -/copypaste:03 -/copypasteque:0D -/corelax:25 -/coreleade:4G -/corey1:4G -/corey2:2D -/coreys:1C -/coreystephan:4G -/corn:3A -/cornfeedhobo:2J -/cornflake:4G -/coronadetona:1C -/corosiv:40 -/corr64:25 -/corvex:3C -/cosa:4N -/costin:5E -/coughsyru:42 -/covid19:2T -/covid19_:0C -/covid19__:63 -/cow0w:4N -/cow0w_:4N -/cozen:1Z -/cp_veneto:3C -/cprez:2J -/cpyne007:4G -/cpyne777:4C -/cqi:09 -/cr1p:5E -/cr4ck_b1t:6B -/crackfu:6C -/crackfu_:0A -/craig:1C -/craig1:4C -/craig2:2T -/craig3:2T -/craig4:3C -/craigt:0C -/cramey:5C -/cranium:03 -/cranky:3M -/crapple:42 -/crash:63 -/cray0n:63 -/crayonsandsisssors:6C -/crayonsyummy:0C -/crazy88:40 -/crazyfox:1C -/crazyfoxy:6C -/crazytypo:0C -/crdb055:0D -/creedmoot:51 -/creep^ltx:1C -/creider:3M -/crimisok:0C -/crip:2D -/crip_:03 -/cripplekike:2D -/cris10an:1Z -/crisu:42 -/crisu_:4N -/crns:25 -/crns_:0C -/cron:2J -/crono_:4C -/crono|:4G -/crossword:2T -/crushdmb:4G -/crwl:0A -/crwl_:5E -/crypt0kr1:63 -/crypt0kraken:2J -/cryptopanic:5E -/crzdfkr:0C -/crzlg:4N -/crzlg_:0D -/csadilek:63 -/csawedpo:42 -/cshrik3:2T -/csr:51 -/cstroie:3C -/ct6:42 -/ct8:6B -/ctcp:1Z -/ctone:3A -/ctt:25 -/cttechnician:25 -/ctxu:2T -/cubes:3M -/cuck:4C -/cuckadoodledoo:0C -/cuckoo:0A -/cuckoo1:6H -/cujkh:2D -/cukcyzd:1Z -/cull:2J -/cum:3C -/cumbayah:40 -/cunny:2D -/cunt:1Z -/cuntrox:6C -/cup:3A -/cupaiV:09 -/cupcake:25 -/curegodde:09 -/curiouscity:42 -/curmet:2J -/curveball:42 -/cushin:3C -/cutie:3C -/cutiepie:42 -/cutlass:2D -/cvx:1C -/cwgnmp:4N -/cx:63 -/cxp:42 -/cyb3r:0C -/cyber:2T -/cyberPUNK:6C -/cyberfr0g:03 -/cyberjunkie:3M -/cyberlard:6B -/cygnus:1Z -/cykaspy`:3M -/cylex:1Z -/cyr4x3:4N -/cyren:42 -/cyria:03 -/cyrus:03 -/cyzx400:1Z -/czaks:2J -/czarbomba:25 -/czer00:6N -/czolgosz:25 -/czolgosz_:25 -/d:3H -/d-_-:51 -/d-_-b:1C -/d0:4C -/d00dles:1C -/d0m3r:1C -/d0m3r0:6B -/d0mP33-:1C -/d0mP33_:1U -/d0ndit0:1C -/d0ze-phone:42 -/d1g1t:63 -/d3m0:25 -/d3m0nm4dn3ss:25 -/d4:6B -/d4nny:0A -/d4redevil:03 -/d9thought:0C -/dArK:03 -/dArK_:2J -/dAwUD__:4C -/dCwBDusJO:51 -/dEEMZ:3C -/dEEMZ187:63 -/dNk:4N -/dOm3r:03 -/d_rebel:4C -/d_rebel_:0C -/d`:6A -/dab21:3C -/dabUFC:3H -/dabdab:2T -/dabears:2T -/dabears_:25 -/dabguy:3A -/dabguy000:2J -/dabguy2:51 -/dabguy3:51 -/dabguy444:4G -/dabguy555:6B -/dabguy666:51 -/dabguy7:0C -/dabguy777:3M -/dabguy778:03 -/dabguy8:6B -/dabguy9:2D -/dabguy999:6B -/dabguy_:3P -/dabguyrul:0C -/dabman:09 -/dabmuslim:6C -/dabohm:42 -/dad:0A -/dad_:3H -/daddy:0C -/daed_:5E -/daedisgay:09 -/daggett:2J -/daglhx:6B -/dah-rat:4G -/dahrat:51 -/dailykenster:25 -/dailykoder:4C -/daim2k5:4C -/dakkar:51 -/dakuwan:3H -/dalasfpok:1C -/dalila:0D -/dalila_:1C -/damax452:0C -/dan:5E -/dan_:1Z -/dani:25 -/daniel_:0C -/danielinux:4G -/danielz:6H -/dann:3M -/dap:2T -/daphne:03 -/dark_tang:5E -/darka:42 -/darkdoomer:3M -/darkdoomer_:6B -/darkex:03 -/darkfade1:51 -/darkfader:3M -/darkmage:3H -/darkmage_:1U -/darkmagic:40 -/darkmask:09 -/darkmask`:2T -/darkneb5b:03 -/darknelc9:51 -/darkness:25 -/darkness1:09 -/darkness_:0A -/darkneyp8:2D -/darksage:3M -/darksnake:1Z -/darkspadez|lapto:09 -/darkwind:3H -/darkwise:3A -/darkydark:4N -/darn:5C -/darndush:1C -/dart:2J -/darwin:03 -/darwin-:6B -/darwin-el:0C -/datajerk:2J -/datalobe:25 -/datalobe_:4G -/dataman:25 -/dataman2:2D -/dataman4:09 -/datastrea:63 -/dave:6C -/dave4925:6B -/dave4925_:2J -/david:2T -/davis:51 -/davitt:6B -/daw:1C -/daww:0A -/dayid:3H -/db-:1C -/db-_:3P -/db420:4G -/dboard2:4G -/dburno:42 -/dcNY:2D -/dcamp:3H -/dcamp_:0A -/dcat:3A -/dcli:25 -/dcm3605:3A -/dcoPSnEi8:1C -/dctrud:6C -/dctrud_:25 -/dcx:25 -/ddarko:2D -/ddd:0D -/dddd5555:4N -/dddddd:1C -/ddelony:4N -/ddevault:4N -/ddfd:2T -/ddos_hard:1C -/ddos_me_h:6B -/ddosalert:0A -/ddosbird:63 -/deadcat:03 -/deaderz:4G -/deadguy:2D -/deadhomie:09 -/deadly:1C -/deadmeat:5E -/deadnigs:6C -/death5:4N -/death_to_NWO:6C -/deathbybandaid:2T -/deathbybandaid_:63 -/deceit:1C -/deceit_:5E -/decent:3C -/dee_:0A -/deeply:25 -/deerbutts:09 -/deez:42 -/def_not_s:3H -/default:3M -/defiler:09 -/defqon:63 -/deicer:3H -/deiol:09 -/delial:4N -/delisa:42 -/della3:1Z -/deltaepsilon23:4N -/demfloro:3A -/demo:4G -/demo_:3M -/demogorg1:6H -/demogorgo:5E -/demsh:6N -/demure:2J -/demure-test:2D -/denkenz:1Z -/denkenz_:25 -/denwa:51 -/denwa2:5E -/derk0pf:3A -/derr__:6N -/derwutmann:0A -/destro:51 -/desu:4N -/desu9x:63 -/deth_vege:09 -/deurzen:4N -/dev\null:2J -/developer:3C -/devi8d:03 -/devil:1Z -/devilfox:40 -/devilfoxy:63 -/devnewton:3M -/devrtz:0A -/dewbieZ:3H -/dewbieZ_:3A -/dex:25 -/deysu:51 -/dfgh_:4G -/dfghj:2J -/dfive:4G -/dfksjlfda:25 -/dflp:6A -/dfs:4N -/dfstorm:2T -/dfx:2D -/dh:51 -/dhPu:2T -/dh_:3A -/dhejavu:4G -/di0ad_:51 -/diChe:6B -/diE:1C -/dianora:4N -/dibi:3A -/dice:2D -/dick:4N -/dickey:1Z -/dickey_:0C -/dickey__:51 -/dicot:3A -/didheevenexist:6B -/didjital:0C -/didnotknowthatiusesuchalongnic:1Z -/didsle:4C -/dieforir1:2D -/dieforirc:3A -/digi_:3A -/digital:42 -/digital_:25 -/digitl:5E -/digitlaci:3A -/dijit:0C -/dijit-:4G -/dijit-hexchat:6C -/dilubxwv:0C -/dimples:4G -/ding0pryd:4N -/dingir:6B -/dingir_:4N -/dingir__:4G -/dingo:63 -/dingopryd:4C -/dinkee:3C -/dionysis:6C -/dioxide:4C -/dip:25 -/directhex:42 -/dirmaster:3A -/disc:3A -/disc9:0D -/disci:5E -/disconnected:0A -/disconz:0C -/discord:09 -/discussed:4N -/dislabled1:3A -/disobey:3H -/dispose:5E -/disturb:2T -/disturb_:4G -/diviny:63 -/diviny-csh:63 -/diviny1337:3A -/divve:0D -/dj-e:0A -/dj-rollex:4G -/djahandarie:2T -/djce:63 -/djcoby:4N -/djel:6B -/djeleas:6A -/djeleas__:0A -/djmoch:42 -/djneomxl:4G -/djordjecupic:4C -/djpeebles:6C -/djreflecc:09 -/djreflect:51 -/djste:25 -/dk56:25 -/dk57:6C -/dk58:1U -/dkcf:6B -/dklsdkl:3C -/dlan:09 -/dld630-2:3C -/dleu:4N -/dleux:4C -/dlippy:4N -/dlm92j:4C -/dm:0C -/dm9kriFkQ:1Z -/dma:4N -/dma_:03 -/dma`:6N -/dmage:6H -/dmask`:2J -/dmt:0D -/dns:1Z -/dnsk:03 -/dnsk_:63 -/dnull:1C -/dnwklin:09 -/doberty:6H -/doc:2D -/docteurfolamour:0C -/dog_whistle:4C -/dogg:0C -/dok:2D -/dokuja:4G -/dolarhyde:3H -/dolaver:09 -/dolbe:25 -/dolla:63 -/dolphin:1U -/dolrayge:2D -/dongfix:3C -/donkarr:09 -/donkey:03 -/doodles:3A -/doomas:0D -/doomer0:4C -/doomer8:63 -/doppler:2J -/dorf:0A -/dorkmage:42 -/dorkness:4C -/dorkvader:6H -/dornier:3P -/dos1:09 -/dosmap:3H -/dothacker:2D -/dotskin:0C -/dotsonskin:2J -/dotsonskin45:6B -/dottymcdotface:0A -/dottymcdots:25 -/dottys:3A -/dotzee:3H -/double-a:3P -/douche:51 -/douche-:6C -/doug:25 -/doviny:3M -/download:3H -/doyhen:2T -/doyhen_:0C -/dozer_:51 -/dpIi:3H -/dpgb:2B -/dptdrma:6C -/dptklei:25 -/dqfO:2J -/dqk:25 -/dr1p:6H -/drPrimate:0C -/dr_rce_:6C -/dr_rce__:1C -/drachen:4C -/dragnalus:3A -/dragon2:5E -/dramo:5E -/drastik:6B -/drastikbot:03 -/dratbaby:6H -/drbean:4N -/drbean_:0C -/dreadful:5C -/dreamer:51 -/dreamer_:6H -/dreamingwindows:0D -/drek:1Z -/drelcott:4G -/drelcott_:6H -/drestglas:1C -/drewlande:0A -/drewsh:4G -/drewski:25 -/drhamstuh:42 -/driver76:3C -/driver77:4C -/driver78:2J -/driver79:09 -/driz:42 -/drkcactus:1C -/drkhsh:3C -/drkmg:2T -/dromer:1U -/dropkick:0C -/droptone:3C -/dross_Phy:09 -/droud:4G -/drpepper:25 -/drulw:2D -/drum:51 -/drunk:63 -/drunkos:63 -/druqs:1C -/dsasd:1Z -/dsaxzaq:1C -/dsc_:0C -/dsp:2B -/dtwpeoc:3M -/du6w:25 -/dubb:4N -/dublord:5E -/duckhunt:03 -/duckhunt101:1C -/duckk:2D -/duckonomy:5E -/ducksauce:2D -/dude2:2J -/dude3:4G -/dude4:6C -/dudis:42 -/dudisss:1C -/dudley:6A -/duglbexg:4N -/duiLah:1Z -/duk0r:1C -/dumbergoy:09 -/dumbgoy:6H -/dumbgoy1:4C -/dumbgoy5:3C -/dumbgoy_:09 -/dumbgoyy:0C -/dumbgu:6C -/dumbguy:0A -/dumbguy-:3A -/dumbguy2:42 -/dumbguy22:2T -/dumbguy4:03 -/dumbguy5:3H -/dumbguy^:0D -/dumbguy_:6B -/dumbguy|:3H -/dumguy:6C -/dumguy2:2T -/dumvgut:0A -/dupa:6B -/duro:3M -/duroSK:4G -/dusker:3M -/dv:1C -/dvdmuckle:6B -/dvqgm:1C -/dwa:4G -/dwainbird:2D -/dwaineNOT:2D -/dwarfinyourwalls:42 -/dwarfinyourwalls_:2J -/dwayne:6H -/dwts:6A -/dwts39:1Z -/dxahv:63 -/dxsqa:1Z -/dylan:63 -/dzajs:42 -/dzho:3M -/dzjfm:42 -/dzl:3H -/dzyuflf:3A -/e:4G -/e0f:6B -/e0f_:0A -/e8narx:0A -/eCW-[a]:6B -/eDG-[a]:2J -/eFX-[u]:6H -/eKM-[a]:2J -/eLN-[a]:03 -/ePOg:4N -/eR0dicChat:25 -/eRB-[u]:3M -/eRT-[i]:09 -/eU696Bl:4N -/eWT-[a]:1Z -/eXS:6C -/eYV-[i]:6B -/e_:6B -/eaDae:2D -/eafahV:5E -/ealona:6C -/earlgrey:6C -/earne3:51 -/eastcoastweb:25 -/easy_switch:4N -/eatshit:0D -/eav:3C -/ebwaj:09 -/ece:25 -/ecelis:3H -/ecelis1:51 -/echapa:3M -/ecmo:3C -/ecmo0:3C -/ecmo1:2J -/ecmo2:0C -/ecmo3:4N -/ecmo4:6B -/ecmo5:03 -/ecmo6:6H -/ecmo7:0D -/ecmo8:3C -/ecmo9:2J -/ecs:2D -/ectomorph:25 -/ed:0D -/eddie:25 -/eddie-:3A -/eddie_:6B -/edgarfrie:63 -/edgelord:3A -/edicius:09 -/edin:3A -/ediot:42 -/edists3w:0D -/edtej:2J -/eduardas:09 -/edward:3P -/edward_:3A -/edward__:25 -/edxley:1Z -/eeDaB:6C -/eeGhee:63 -/eeHae:51 -/eeHiet:4G -/eeNgu:0C -/eePaes:1C -/eeShie:6C -/eeZahr:25 -/eeero:3M -/eeesy:25 -/eeesy_:3C -/eeesy__:1C -/eefer:51 -/eefer_:09 -/eegenolf:1C -/eegenolf1:09 -/efge:42 -/efil4cri:3M -/efil4cri1:3M -/efil4cri2:3M -/efil4cri3:3M -/efil4cri4:3M -/efil4cri5:3M -/efil4cri_:3A -/efircorg:51 -/efman:4G -/efman_:5E -/efnable:0C -/efnet.deic.eu:40 -/efnetbot:0C -/efnetbot0:3C -/efnetbot`:2J -/efriendly:03 -/efsenable:4N -/efsnable:03 -/efsneable:0D -/eggo:2T -/eggsalad:4C -/eggy:1C -/eggy1:3H -/eghkun:3H -/egito:03 -/egypcio:3C -/ehdee:4C -/ehejnej:2D -/ehioCh:42 -/eiGohx:6B -/eiLeiC:6B -/eiThi:5E -/eightChad:4N -/eightmegs1:40 -/eiruLu:4G -/eisen:03 -/ejgywfud:6B -/ejh:3C -/ejr:2B -/ekeinos:2B -/ekollof:25 -/el8:09 -/elena:3C -/elevator:6C -/elias:6C -/elioat:0A -/elita:2J -/elldvc:03 -/elle:2J -/ellie:1Z -/ells:6C -/elp:03 -/elph:3A -/elph_:25 -/elred_:63 -/els:4G -/elsimio:4G -/elusive:6B -/elw:4N -/elwisp:3M -/elx:3H -/em:6N -/emaliy:6C -/emay:6N -/emayyyy:40 -/emb:2B -/embri0n:25 -/emhcnmy:25 -/emiemi:51 -/emiemiemi:6C -/emiiiiii:5E -/emli:2T -/emllle:2T -/emma03:03 -/emma035:2J -/emmaa:0C -/emmaf:5E -/emmaloui:09 -/emmalouis:09 -/emmalouise:2D -/emmalouise11:4N -/emmalouise14:4G -/emmalouise27:51 -/emmalouise37:63 -/emmalouise42:1C -/emmalouise71:3A -/emmalouise84:42 -/emmalouise85:6H -/emmalui:1C -/emmaluigi:09 -/emmanuel_:1C -/emmaps:03 -/emmasfather:1C -/emmff:0C -/emo-effy:3C -/emoEFFY:4G -/emoguy:6C -/emojiirc:25 -/emp:03 -/emp_:2T -/emu:6A -/enderwigg:6H -/endofinte:3C -/engelbart_prickly:03 -/englishm:4G -/eni:0C -/enigma:2J -/enqcih:25 -/enrique:51 -/ent:3C -/entartet:3C -/enthd:25 -/enthdgree:2D -/enyc:0A -/eoUt:3A -/eojksem:4N -/epbzh:3A -/epd:6B -/ephemer0l:4G -/epl:25 -/epl692:63 -/epl6921:09 -/epl692_:25 -/epoch:0C -/equwal:6H -/eqxvwj:6B -/era:3A -/erase:03 -/eraser:1C -/eraser_:25 -/erazer:0C -/erf:09 -/erf-:0A -/erfenable:3C -/ergo:3C -/ergo_:3M -/erica__:4C -/ericdm:3H -/erika:2D -/erikb:4G -/erin:2T -/erin_:03 -/erin__:1C -/erocker:51 -/erockr:2D -/erockr_:3A -/erratic:6H -/erratic_:09 -/erratic__:0C -/error:6B -/eruantiensaga:09 -/erzr:1Z -/esk2mo:6B -/eskimo:5E -/eskimo_:3M -/eslowai:25 -/esql:42 -/esqws:3C -/esran:3H -/esrh:1C -/et:4C -/eta:51 -/etendard:0C -/etendard_:0A -/eti:0A -/etki:25 -/etki-b:3H -/euidzero:3C -/eurydice:6A -/evelynm:6B -/every0ne:5E -/everyone:3C -/evewasframed:6H -/eviMek:2D -/evilRails:6H -/evilgrin:2J -/evt:3H -/evulanjal:1C -/evy:42 -/ewerd:4N -/ex25:2D -/ex2525:1C -/exHc:42 -/exYG:4N -/exp0sure:25 -/expjx:2T -/expo:25 -/exposed:1Z -/extreem:1C -/exusser:0D -/eyehate_:4C -/eyehbdyd:4G -/eyenx:3H -/eyenx|m:6B -/eyersea:4C -/eyersea1:3H -/eyersea_:4G -/eyesage:5E -/eyowh:5E -/eyrsea:0A -/eysage:0C -/ezvmgk:0C -/f00k:5E -/f0zk:3A -/f13:1C -/f17needhelpwithmacbookairpls:6C -/f212e:1C -/f3bruary:5E -/f3bruary_:03 -/f3r0x:42 -/f4ggles:6A -/f6hn:3H -/fAzEr:1U -/fC:63 -/fEEUOqLHK:3C -/fLegmatik:6B -/f_:0A -/fabs:0C -/facebiter:6H -/factshurt:6C -/faeQuu:4N -/fag:4G -/fagasarus:0A -/fagg0t:3M -/faggator:3M -/faggetttss:2J -/faggles:2D -/faggot:5E -/faggot-:6C -/faggot--:1C -/faggotbot:3A -/faggots:3H -/faggtchan:25 -/fagsage:4C -/fagstag:51 -/fagstag-:63 -/failog:1C -/failtime:2J -/failure_:1Z -/fairee:3A -/fairlyhard:0C -/faith_:2D -/falcon_:4G -/falconx:6H -/family:4C -/fancsali:09 -/faqata:03 -/far0ut:2T -/fartbird:6H -/fartgang:0C -/fasibcs:3A -/fat_frog:0C -/fatalhalt:3C -/fatcor:0C -/fatcor2:1Z -/fatfag:0A -/fatman:63 -/fault:09 -/fault-:0C -/fauna:09 -/fauna_:63 -/faust:2T -/faust_:3H -/fausto:25 -/favicon:5E -/fbs:3A -/fc-:1Z -/fckd:0A -/fckd-:42 -/fckd^:5E -/fckd_:5E -/fckd`:4N -/fckda:42 -/fckd|:0D -/fcobz:2J -/fd0e:4N -/fd71:1C -/fd71_:0D -/fdckr:09 -/fdfd:3A -/feach:3H -/fearUSA:40 -/fear_:0C -/feczcei:63 -/fed:51 -/feddef:4G -/feelingsreal:25 -/feibg:6H -/feisod:2J -/felon:3M -/felon`:4G -/femi:1Z -/femy:4G -/ferminter:1Z -/fever:6C -/fever1:09 -/ffej:3H -/ffejj:3C -/ffl:1C -/ffl|lappy:0D -/fforfuck:4C -/ffucvw:09 -/ffuentes:5E -/ffuentes1:51 -/ffuentes_:6H -/fg:6H -/fgau:6H -/fgghjjkll:2T -/fgghjjkll2:42 -/fgts:2T -/fgts3:63 -/fhfjkhf:0A -/fhhj:63 -/fhrnjrjr:42 -/fiMui:3H -/fiQ:1C -/fiQ2:4C -/fiber0ps:0C -/fieryFU:6C -/fieryGT:51 -/fieryUSA:2J -/fifth:4G -/fiftysixer:3C -/fight:3M -/filostyktos:3H -/finex:4G -/finextodingo:3H -/fireaves:51 -/fireman:2D -/firewyre:09 -/fishbutt:4N -/fishe:3C -/fishe2:3A -/fishe_:2T -/fishebage:6H -/fission:6C -/fitcor:51 -/fittan:6B -/fitzgerald1337:03 -/five5:63 -/fjgkjkljn:0C -/fjmc8:3C -/fjyimwz:3M -/fkinEZ:2J -/fkinglag:63 -/fkinglag_:63 -/fkkzypern:25 -/fklnEZ:51 -/fkr:3P -/fkxpcw:2D -/flagondry:4G -/flameboi:5E -/flash67:5E -/flavoral:2D -/flewkey:42 -/flex14:6C -/flgr:0C -/flip:3M -/flipp:2T -/flippp:09 -/flipppp:4N -/flippy:4G -/flippyBOT:2D -/flippybot:4N -/flippyy:09 -/flippyyyyyyyyyyyyyyyyyy:2D -/flippyyyyyyyyyyyyyyyyyyyyyyyyy:25 -/flo:63 -/florens:0C -/florens_:2D -/flp:25 -/fluff:4N -/fluffy:2T -/fluffypony:4N -/flunky:0A -/flunky_:3C -/flurp:2D -/flurry:0C -/flute:51 -/fly:4N -/flysky:6H -/flytronix:3A -/fmoonII:0A -/fmoonSW:2J -/fmop:03 -/fn:4N -/fnbridge:2T -/fncy:6B -/fni:2T -/fni_:3M -/fnnmbjq:1C -/fnoodl:5E -/fnoodl_:1C -/fnzqvwz:3A -/fohCha:25 -/folesfan:3H -/foo:1Z -/foobar:25 -/fook:2T -/for_a_memory:6C -/foreverr:25 -/forkbomb:51 -/forks:1Z -/fornicato:3A -/fossegrim:0D -/fossegrim[m]:6H -/fossy:0C -/foto:3C -/foureyes:4G -/foureyes-:3H -/fow:4G -/fox:3C -/fox_:4N -/foxbutt:2T -/foxes:4G -/foxes_:40 -/foxtrash:3C -/foxyou:1Z -/foxzillah:1Z -/fp:6C -/fpb4:0C -/fpfihuh:4C -/fppe:42 -/fppe-:6C -/fpwr:4G -/fpwr_:5C -/fr0sty:09 -/fr0zn:1C -/fr33d0g:2D -/fr3en0de:7H -/frEEKie:2T -/fractal:51 -/fractal-:1U -/fran:51 -/franscan:0D -/franzer:0A -/franzer_:3C -/freakazoid0223:03 -/freckles:1Z -/fred:09 -/fred-:3C -/fred--:3M -/fred_:51 -/fredy1:0A -/free:2J -/free2:6H -/free2_:63 -/freedom:42 -/freekoala:2T -/freem:2J -/freemangordon:5E -/freex:2B -/frenK:1C -/freq:03 -/frewq:2T -/frez:03 -/frida:09 -/friend:3C -/fris_:5E -/frisjon:2T -/fritzl:25 -/frogaincia:0D -/frogface:51 -/frogface_:2T -/frogface_outside:63 -/frosty:63 -/frozen:0A -/frrobert:03 -/frrobert_:63 -/frvazab:3H -/frvbcbbh:0A -/fsckoff:09 -/fsh:51 -/fshow1:2D -/fstd:4G -/fstd_:3C -/fstd__:03 -/fstrelok:2B -/fstrelok_:5C -/fstrelok`:4N -/ftl:6B -/ftwjames:25 -/fuck:3C -/fuckJews:51 -/fuckasss:4G -/fuckdoll:51 -/fuckdoll_:2T -/fuckface:3H -/fucku:0C -/fucsadfga:4N -/fujikmoh:4N -/fujikmon:2J -/fujikom0:0D -/fujikomo:3C -/fullybent:25 -/fumblefez:0C -/functions:0C -/funintl:2J -/funkpow:6H -/funkpow1:4C -/funkpow1_:1C -/funkpowe1:6B -/funkpower:0D -/funkpwr`:03 -/funpower:03 -/furlow:03 -/fury:4G -/fusionroc:0C -/fuzpock:2J -/fuzz:3M -/fxjewlfu:6C -/fy:25 -/fyr:3M -/fyrfaras:03 -/fyxiamk:1Z -/g:1Z -/g0d_:25 -/g0dub:2J -/g0dub_:63 -/g0dub__:2D -/g0newtw:25 -/g0wce:6C -/g0wse:1C -/g22:4N -/g33:3A -/g3n713m4n:4G -/g3phi:5E -/g4570n:3M -/g7ji:1C -/gBHK:4G -/gNQf:3H -/gaetano:51 -/gaetano_:6B -/gah2:1C -/gahSh:2T -/galago:2T -/galego:09 -/gall0ws:6H -/gamakichi:4C -/gamedude:0A -/gamerdude:3H -/gamerrr:42 -/gamersdude:2T -/gammald:09 -/gandhi:3H -/gands:4N -/gangIand:3M -/gangfart:0C -/gangland:0C -/gangreen:1C -/gantry:5E -/garandil:25 -/gareppa:0D -/gargantua:0A -/gargus:1Z -/garlic:03 -/garp:6B -/garp_:2J -/garre:6H -/garret:3C -/garret88:25 -/garrett:42 -/gary:2D -/gary_oak:4N -/garyd:0A -/gascon:0C -/gascon_:5E -/gascon_lady:4N -/gascon_test_web:25 -/gasconheart:4N -/gasconheart1:6H -/gasconheart`:4C -/gast0n:0A -/gast0n_:0C -/gasull:3M -/gateway2000:3A -/gatti:4G -/gatti_:3H -/gatti`:25 -/gauss:0C -/gayrage:4N -/gayrape:4N -/gaysage:03 -/gayzee:63 -/gbmor:09 -/gbrqgme:25 -/gclau_:5C -/gcsyql:0A -/gctechs:3A -/gdkbql:4G -/gdyjifr:3C -/gebejhe:2T -/gediz0x53:25 -/gediz539:3M -/geeJee:3C -/geee:2J -/geezus:4G -/gelb:6H -/gemmi:6H -/gemmo:40 -/generalC:0D -/generalC_:6B -/genesc:3M -/genkade:6B -/genkade_:3H -/gentoodwm:6C -/geordie:3A -/geordie_:25 -/george:1Z -/georgette:3H -/gephi:2J -/geqjrxsg:3C -/gerbet:0C -/germ:42 -/germy:2J -/gerry666:6B -/getinrich:6N -/getout:6A -/gf5FaN5rx:25 -/gffmhk:1Z -/gfj:25 -/gfrds:0C -/gfsgd:4C -/gg:3C -/ggainey:6B -/ggg:63 -/ggibyza:5E -/gguopkin:42 -/gh0st:2J -/ghjgh777:4C -/ghjkl:2D -/ghost:09 -/ghost2501:3C -/ghost2501_:03 -/ghost64:6C -/ghost_:4N -/ghost__:1C -/ghosti1990:5E -/ghoul:09 -/gibigiana:5E -/gid:4G -/gigga:63 -/giggle:2T -/giggle-tan:25 -/gigio2000:2D -/gigs:3A -/gillz_:5E -/gimp:1Z -/gingerling:1Z -/ginopino:4C -/giorgos:3H -/gir:3H -/gisah:3A -/gituser:09 -/giwwvy:2D -/gizmo_:0C -/gjtgkt:63 -/gjvc:0A -/gjvc_:63 -/gk:42 -/gl00m:0D -/gl0ck:1Z -/glHC:42 -/glaciurso:51 -/gleevauomm:5E -/glenda:2T -/glhmnqfp:1Z -/glider:4C -/glinder:6H -/glitrbitz:6B -/gllit:0C -/globbot:4N -/glooby_32:1C -/gloomDev:2T -/glorfind1:42 -/glorfinde:2D -/glorious:1Z -/glorious_:4N -/glppvaa:4C -/gm:0C -/gmh:6C -/gmh-:51 -/gmh--:4C -/gmh--_:2J -/gms:2T -/gmxpllqe:03 -/gnaahoe:6H -/gnik:2D -/gnomus:42 -/gnostik:2T -/gnstaxo:0C -/gnupluslinux:42 -/gnusd:1C -/gnusd_:0C -/gob:4C -/gobbo:0C -/gobbo_:3A -/god:4N -/god_:4C -/god_is_dead:03 -/goduck777:3M -/goduck777_:2T -/gogo:3A -/gogog:25 -/goh:51 -/golakers:51 -/goldie:3A -/goldnick7:3H -/golem:3H -/goliath:6C -/gongreen:3A -/goodtimes:6B -/goody:3M -/goody2:63 -/gooey:4N -/goofypeen:4N -/goog:2J -/googal:03 -/google:1C -/gookfuzi:0C -/gophbot:09 -/gorgonzol:03 -/gorilla:2T -/goring1:2T -/gorthx:3C -/gotdosd:03 -/gotothekitchen:42 -/gowce:51 -/gowse:63 -/gowse_:6C -/gpQf:1Z -/gpaqdbpp:03 -/gppcpu:4C -/gpunjjkt:5E -/gq:0D -/gqbriele:09 -/gqllo:0C -/gr:2T -/gr-:3A -/gr0zz:2D -/gr3p:51 -/gr3y:25 -/gradew:4N -/gravestench:51 -/gravitas:0D -/gravitaz:6C -/gravyv:4G -/grawity1:2T -/grayskull:1C -/grayv:3C -/gre:3M -/greasee:0D -/greasy:3M -/greelly:5E -/greenbagels:3M -/greenone:6H -/greeter:03 -/greettest:0C -/greg:6C -/greg_:09 -/greghume:51 -/greghume_:3M -/gregory:3A -/grenade_:6H -/gretathunberg:3H -/greyc4:0A -/greywolver:5E -/greywolver_:4C -/grfzsnk:0C -/gri-:1C -/grimes:4G -/grimfosse:6C -/grip:3A -/grip-:3A -/grip^:4N -/grip_:3A -/gri|:3C -/grns3:4N -/grns4:40 -/groid:03 -/groin:5E -/groin_:0A -/groki:2D -/groove-o-:0C -/grosjean:51 -/grpar:4G -/grrf:3A -/grrfield:3M -/grrr:42 -/grrrrr:2T -/grsjfcn:03 -/gru:5E -/grufwub:3A -/grumble:1Z -/grungy:09 -/gruodf:6H -/grxyox:2D -/gry:3C -/gry_:4N -/gsserxo:63 -/gt:03 -/gt100boss:4N -/gtb:0C -/gtc:0C -/gtc1977:4N -/gtc19771:2J -/gtrhteh:63 -/gturner:6C -/guest1211:09 -/guest50320:25 -/guk:4G -/gulamakba:25 -/gumpybloo:3C -/gun:0C -/gupdg:1C -/guseboi:3A -/gusugs:4N -/guy9000:42 -/guzzo:51 -/gvzgcze:3C -/gwxsyz:2D -/gxyaem:3C -/gxykwllk:6C -/gyepfqd:42 -/gzyiyn:4G -/h0nk:4N -/h0noo:2J -/h0t1ine:25 -/h0tl1ne:0C -/h0tline:3A -/h1x:4C -/h1x_:4N -/h31:3M -/h3h3:4N -/h4ppy:0C -/h4rb1ng3rs:2T -/hHgs3s:2T -/hUpc:2D -/h_:3H -/h_hvn:7H -/haarek:25 -/hackerman:42 -/hackles:40 -/haeGh:0A -/hagen:1Z -/haiPa:6B -/haiku:42 -/hairyanus:1C -/haitch:1Z -/haleysmith:3A -/hallucinate:03 -/halmmfke:42 -/halt:3C -/hana:2J -/hangar118:6H -/hank:1C -/hank-:63 -/hank_:3H -/happy:1Z -/happy_day:6C -/happy_har:1C -/happyblue:4N -/happybox:5E -/happyhog:40 -/harilikha:2D -/harloe:3A -/harlow:6C -/harmetic:4N -/hasan:3C -/hasanAbi:3M -/hashcat:4N -/hashcat_:2D -/hashem:5E -/hashfyre:6H -/hata:4N -/hatefuckr:3M -/hatesec:6H -/have:2D -/havel:3A -/havel_:0C -/hawking_romantic:63 -/hay:0D -/haydenh:7H -/haydenh_:7H -/haydenh__:7H -/haydenh___:7H -/haydenh____:X7E -/haydenvh:2D -/haywalk:6B -/haywo:6C -/hazel:25 -/hc9:2T -/hcliph:6H -/he_has_risen:25 -/hea:4N -/heartface:2J -/heartless:0C -/heartliss:63 -/heartofrevel:6C -/heartofrevel1:2T -/heartofrevel4:09 -/heather:25 -/heatwave0:6H -/heaven_:0A -/heavy-r:6C -/heavyarms:0C -/heckle:09 -/hedge123:5E -/hedy:6H -/heftig1:4G -/heimdall:03 -/heimdall_:5E -/heimdallr:63 -/heinrich:3C -/hekyn:6H -/hellfire:0C -/hellfox:63 -/hellfoxy:2D -/hello_navi:03 -/hellofox:63 -/hellofoxy:51 -/help:6B -/henninb:51 -/henosis:3H -/henrique:3C -/heredoc:5E -/heretyk:51 -/hero:0A -/herszt:4N -/hextasy:0D -/hextasy^:3A -/heydude_:25 -/heydude`:09 -/heyron:6H -/heyron-:3M -/hfg:03 -/hfhgd:1C -/hgc:0C -/hgc_:3M -/hgdfsh:25 -/hghg:0C -/hhh:0C -/hhh`:09 -/hhhh:63 -/hhjbov:5E -/hhmmhh:2D -/hhvn:7H -/hhvn_:63 -/hhvn__:63 -/hhvnscv:2J -/hi:3C -/hiWoh:3A -/hiddmahj:03 -/hieFai:4G -/hif:2D -/hifbpz:3C -/higgs:6H -/higgsboso:6C -/hijack:09 -/hilighter:6H -/himmler:2T -/hinac:63 -/hippopotamus:51 -/hirnspiel:42 -/hiro:25 -/hisacro:1C -/hislittlelordshipFontleroy:0A -/hist0ry:3H -/hiteki:1Z -/hitl3r:09 -/hitler:2D -/hive-min1:0C -/hive-mind:42 -/hjenny:3M -/hjnzko:6C -/hkgf:6B -/hlfm:6B -/hmamj:6C -/hmh:09 -/hmm:4N -/hmmh:6B -/hnb:63 -/hobbelpaard:63 -/hobbler:2T -/hobosock:25 -/hobotier:3M -/hoek:6C -/hoho:0D -/hoho1:25 -/hollowleviathan:4N -/hollywood:6H -/hologra:6H -/holtmann:63 -/honest:40 -/honk:3H -/honk-:25 -/honken:1Z -/honk|:4C -/hook_ups:0C -/hooligani:25 -/hoosier5-:51 -/hoosier54:3C -/hooway:03 -/hooway_:6N -/hornyguy:25 -/horseshoecrab:63 -/hostserv:03 -/hotdogess:1C -/hotfart:63 -/hotline:09 -/hozed:5E -/hozed_:4G -/hpbvw:5E -/hpyc9:4N -/hrbdnjrh:4G -/hrbsjd:4C -/hrmtkrl:3H -/hrz:3H -/hschmale:6A -/hsen:1C -/html5car:63 -/htmrkl_:6B -/htmrmkml:5E -/htnrmek:0C -/htnrmkl:1Z -/htrkel:3M -/https:1C -/hub.efnet.us:3M -/hub.eu.hlircnet.:3H -/hub.us.hlircnet.:0D -/hubertf:4C -/hubutm20:63 -/hugo:4C -/huloxia:3M -/humbleMan:3M -/humility:3C -/hung0ver:5E -/hungral:2D -/hunko:51 -/hunnie:42 -/hunter_cat:6C -/hushmummy:3C -/huyens:1C -/hvhost1:2D -/hvnh:5E -/hvvn:6H -/hwidke:3H -/hyb:42 -/hybrid:5E -/hydrololi:0D -/hydrololi_:5E -/hyiltiz:09 -/hyiltiz_:51 -/hyper_object:4C -/hyperreal:1C -/hyperreal0:6B -/hyperreal3:42 -/hyperreal4:4G -/hyperreal6:0D -/hyyoyfk:3C -/hzavaesc:63 -/i:3H -/i3-lover:51 -/i87:2T -/iCjay:0C -/iKahl:3H -/iNgiew:4C -/iRapedYourFather:3C -/iRuint:5E -/iTzNavic:51 -/iTzNavic-:25 -/iZcc:4G -/i_like_THISsuperLONGnickBetter:63 -/i`:0C -/ia:6B -/ia2:6B -/ia_:51 -/ia__:1Z -/ia`:03 -/iahlbb:4N -/iai:0D -/iai_:1C -/iamerror:3H -/iamgr00t:42 -/iamkorea:1Z -/iamnotbob:42 -/iamthebug:2J -/ian:2J -/ianax:0C -/ibiza:6C -/ibnii:1Z -/icaretoomuch:6B -/ice303:1C -/icebane:0C -/iceman:25 -/icequeen81:6B -/iceweasel:3C -/icon:51 -/icy:1C -/idal-:63 -/identd-:63 -/identify:3M -/idiot:51 -/idiot_:6C -/idiot__:3H -/idleman:2T -/idleman_:03 -/ido:5E -/ie:1C -/ieBoo:3A -/ieGhi:4G -/ieHoch:1Z -/ieHooh:6C -/ieNohg:2T -/ieatcrayons:0C -/ieatcrayons66:3H -/ieatcrayons76:42 -/ieatpaste:2D -/ieatpaste21:42 -/ieatpaste37:25 -/ieatpaste76:6H -/iehueD:42 -/ieloyptj:51 -/iephoF:63 -/iga:1Z -/igel_:40 -/iggysage:6H -/ignucious:09 -/igol:03 -/igol_:1C -/igotreez:63 -/ihasdivui:63 -/ihate:6B -/ihavealongnickna:1Z -/ihower:63 -/ihtiby:51 -/ihugjews:4C -/ii:3M -/iiee:4N -/iiee2:1C -/iiee`:3H -/iiee``:3A -/iiee```:0D -/iiee````:1Z -/iije:2J -/iije`:09 -/iije``:6C -/iiwsa:2J -/iizqsvzr:3M -/ikhfxkcg:0C -/ikiboo:1C -/ikiycw:3A -/ikkkhakv:3M -/ikmaak:6C -/iko:6B -/ikr:1C -/ileHU:63 -/ill_eagle:3C -/illumin:4C -/ilovekit:3C -/iloveshortnickfuckyoumotherfuc:0D -/ilsa:3M -/ilsundal:3H -/ilumnatr:3M -/iluvkoala:42 -/imad_al-din-1970:0D -/imbbwjma:1C -/imbroken:4G -/imd0ne:1Z -/imfee:5E -/imnothere:1C -/impact:09 -/impl:4N -/impl-:0C -/impl_:25 -/impo:6B -/inVictus:03 -/incal:2T -/incel:3M -/incel46:51 -/incelupri:6H -/incluso:6B -/inco6:09 -/incog:4G -/inconsistentt:2J -/incubus:09 -/indacuhh:42 -/indulgence:5E -/indy:4C -/ine:3C -/inex:3A -/infection:0C -/infidelis:03 -/infil00p:51 -/infox:4C -/infraudsi:0C -/infraudsr:4G -/infspire:0D -/infy:0A -/inhiding:0C -/inky:63 -/innercircle:1Z -/innmntvs:3M -/innominat:4C -/inocent:0C -/ins4n3:4G -/ins4n3_:0C -/insanity:0C -/insep_:6B -/insidiou1:25 -/insidious:09 -/inssh:6C -/intebenis:4N -/intekra:0C -/intelinsidecore7:6B -/intelinsidecorei7:03 -/intercep7:4C -/intercep8:3H -/interdom:3C -/interdom-:0C -/interdom3:09 -/interdome:4G -/internut:0A -/intr0:09 -/intrin:63 -/intro:1C -/intx:03 -/invertednetron3:0A -/inz:2J -/io:4G -/iocc:09 -/iocc_:40 -/iolhkrl:03 -/ionosphre:3C -/iori_:03 -/ip22:3C -/ip_:42 -/irc:6H -/irc-eu-1.darkscience.net:03 -/irc-eu-2.darkscience.net:09 -/irc-us-east-1.darkscience.net:3H -/irc-us-east-2.darkscience.net:6C -/irc.Prison.NET:0C -/irc.area51.haydenvh.com:25 -/irc.efnet.nl:3A -/irc.haydenvh.com:3C -/irc1.unrealircd.org:09 -/irc2.unrealircd.org:3H -/ircMERC:63 -/ircchannelinfluencer:6C -/ircshark:1C -/ircuser01:6B -/ircuser10:4N -/iriHei:6B -/irick:2T -/irie:4G -/irie_:5E -/irish666:25 -/irish667:2J -/irishsoft:5C -/irl:5E -/ironmountain:3A -/ironybomb:03 -/irt^:1Z -/irwinz:1C -/is-:2J -/is-_:42 -/isaac:03 -/isahYe:2D -/ishutin:42 -/islam:3A -/islam2:4N -/ismoke:6B -/ismokechronik:2D -/it:3A -/it9exm:3M -/it_doesnt_matter_if_your_black:6H -/its_a_question:03 -/itsanaddiction:4C -/itsmylife:4G -/itspecial:51 -/itsracist:6H -/ivan:2J -/ivanfrey:25 -/iwq:51 -/ixirc1:4G -/iyeaa:3A -/iyzsong:03 -/iyzsong-:2B -/j0rdan:3M -/j0rdn:25 -/j0rdn]:2T -/j0rdn_:4G -/j0sh:42 -/j3wbird:0C -/jIMcRaMER:42 -/jWang:5E -/jabol:0C -/jaccid_:4G -/jaccid__:4N -/jack:09 -/jackiff:25 -/jaekwon:0D -/jagjoe:42 -/jah:2J -/jahPhi:6C -/jaiQu:6B -/jak:4C -/jak_:63 -/jake_:0A -/jakk:4C -/jakk_:5E -/jakks0:1Z -/jakozy85:1Z -/james:3A -/james_freewall:0C -/jameshjacks0njr:25 -/jammr:5E -/janet:09 -/japexxxx:4N -/jappxx:5E -/japxe:51 -/japxx:03 -/japxxx:4G -/jaqque:2T -/jar:2D -/jarg:25 -/jarro:6C -/jasmaz:0D -/jason14:63 -/jason7:42 -/jason_:0C -/javier37:42 -/javier38:2T -/jax0m:63 -/jay7369:6H -/jayde:6H -/jaydubbs:03 -/jayhamm-:1Z -/jaymondaddy:51 -/jayparee:2D -/jayw:3C -/jbaikge:5E -/jbals:2D -/jbird:1Z -/jblslpf:63 -/jboy:3C -/jbzabd:2D -/jcatv:25 -/jcb:03 -/jcrawford:0A -/jdavid:3C -/jdavid_:3H -/jduck:5E -/jdvfvleu:3C -/jdx:3A -/je:3H -/jebug29:03 -/jebug29_:0A -/jebug29__:3A -/jedi:4G -/jednak:09 -/jednak_:51 -/jeeLai:3A -/jeepee:63 -/jeff_stacey:3A -/jeffrey:25 -/jehru:6C -/jellyb:2T -/jellybeens:03 -/jenna:3A -/jenni_:2D -/jennie:6H -/jennie1:1C -/jepvpv:51 -/jepx:42 -/jerem:5E -/jericho:1C -/jerk:51 -/jerm:4N -/jero2:4N -/jero3:1Z -/jero4:6C -/jeru:09 -/jeru-:51 -/jerufu:0C -/jeruism:4G -/jerwin:42 -/jerwin-:51 -/jes:3C -/jess:42 -/jess-----:2T -/jessica:1Z -/jessica-:0A -/jessica-_:1Z -/jessup:1Z -/jest0:42 -/jester:0A -/jesusaur:6B -/jet_:25 -/jetcream:3C -/jetienne:3C -/jetscream:03 -/jevin:3C -/jew_b1rds:1Z -/jewbird:42 -/jewbird-:4N -/jewbird`:63 -/jewbirds:4C -/jewline:6C -/jewpax:1C -/jezbel:1Z -/jezza:63 -/jfkhibz:3A -/jh0ng:6C -/jhigh:6C -/jhigh_:0C -/jhigh__:4N -/jhill:4G -/jhonny:0C -/jhutchins:6C -/ji:09 -/ji_:6A -/jieuunwx:4G -/jig:0C -/jig_:3H -/jiggawatt:0D -/jiggawatz:0D -/jilla:1C -/jim0r:1C -/jim^:0C -/jim_:63 -/jimmy-:3M -/jims:51 -/jimz0fr:0C -/jimz0r:0A -/jimzor:6H -/jitoz:42 -/jiurjyts:6H -/jizzle_anesthesia:42 -/jizzmore:1C -/jjohnstone:0D -/jjrhekqo:6H -/jjs_tty:3M -/jkli5_:3M -/jkli5_________________________:3H -/jkrueger:3H -/jkyahgha:51 -/jlu5:03 -/jmancully:2D -/jmanfatty:4G -/jmansWifey:2D -/jmanswife:4G -/jmcgann:4C -/jmlich:4G -/jmoney:42 -/jmpzer0:51 -/jmw2020software:1C -/jnhmjyg:51 -/jns:09 -/jns_:6B -/jnsjunio1:4N -/jnsjunior:03 -/jnvhphe:6C -/joacim:6C -/joacim_:4C -/joacim__:25 -/joacim___:4G -/joaoprb:0A -/joe1701:63 -/joe1710:5E -/joeblogs:2D -/joedoe47:42 -/joelchrono12:4C -/joeleg:03 -/joeroller:42 -/joeroller_:1C -/joes:2J -/joes_:63 -/joew:5E -/jogisgaya:3A -/johan_:2D -/johansen:2D -/john-titor:3H -/john222:2D -/john_ceph:1C -/johncylee:2T -/johngalt3:51 -/johnhamelink:3H -/johnm:3M -/johnny569:09 -/join_sub1ine:1C -/join_subline:6H -/joji:4C -/jojoje:4G -/jojoli:4G -/jokk55:1U -/jokk555:4C -/jokk55_:6B -/jokles:3H -/jolia:1Z -/jolt:2T -/jonah:40 -/jonathan:0D -/jonnow:2J -/jonsger:3A -/jonsger1:1Z -/joobird:63 -/joonnnn:3C -/jooopltr:1C -/jordan_0:09 -/jordan__:0C -/jordan_o:3A -/jordan_o_:1C -/jordintosh:3A -/jordizle:6H -/jordn:0C -/jorge:2D -/josecito:6B -/joseph:09 -/josh:3A -/josi:6C -/josuah:25 -/jowbvu:2J -/jpcw:2T -/jprestwo:4C -/jpwg:3C -/jpx:3H -/jpxx:4N -/jpxxx:1Z -/jrayhawk:3M -/jrgufc:3M -/jrhorn424:3H -/jrra:0A -/jrra1:4G -/jrra3:2D -/jrra4:3C -/jrra5:1C -/jrra_:2D -/jrrabird:1Z -/jrrra:25 -/jrue:03 -/jrwr:3H -/jshoard:6C -/jshoard_:42 -/jshoard__:3C -/jsilver:2J -/jsilver_iphone:1C -/jsilvertw:42 -/jsmalls:2T -/jsmalls1:0C -/jsmalls2:6A -/jstg:0C -/jtm-lis:03 -/jtru:5E -/jts:42 -/jts_:25 -/juRs:1C -/jualgcqn:2D -/juda__:6C -/judge:51 -/julienxx:1C -/julienxx_:4G -/juliet:25 -/jungnam:6H -/junter2:4N -/jupedbir1:0C -/jupedbird:09 -/jupitor:42 -/just-testing3:03 -/justice:4C -/jvoisin:6B -/jvxxja:2J -/jwheare:51 -/jwinn:09 -/jwst:2B -/jxftlagd:51 -/jzrcvc:2D -/k:03 -/k0ga:0D -/k1r1t0:3M -/k22:4N -/k3yp:5E -/k3yp-:5E -/k4be:6C -/k82k8:3C -/k8du27d5:0C -/kB`:3M -/kB`_:4N -/k__:63 -/k___:2T -/k____:63 -/k_____:63 -/k______:3H -/k________:25 -/ka0s:42 -/kaalto:2J -/kaan:2D -/kaasen:1C -/kahn:51 -/kaiserin:09 -/kaj:2D -/kaj_:6C -/kajira:2D -/kakama:6C -/kakama_:63 -/kakamobil:09 -/kal:2D -/kal_:3C -/kalbasit:3H -/kalekale:3C -/kalekale_:3H -/kali:0C -/kalle:03 -/kalube:6C -/kamawana1:6H -/kamawanai:4G -/kamchatka:2D -/kameel:1Z -/kamel:2J -/kamel-:3H -/kamper:1Z -/kamper1:6C -/kaotisk:03 -/kaotisk_:0D -/kap:4G -/kara-:25 -/kara_:3C -/karatesan:6C -/karli:1Z -/karma:1C -/karnath:09 -/kash:25 -/kash_:3C -/kaskokaos:6H -/kathy:0D -/katkiller:6B -/kattarin-:3C -/kattarina:09 -/katzeilla:25 -/katzeilla1:3H -/kaw:0C -/kayo5:6H -/kayos:3M -/kayos_:2T -/kayzee:0C -/kb22:42 -/kbenn:3C -/kbrosnan:2J -/kbz:03 -/kbz3:4C -/kcayr:09 -/kcefjnm:42 -/kchr:3M -/kcn:6C -/kd:6B -/kd4wov:5C -/kdjdjd:4N -/kdndksj:0C -/kdy:3M -/kee:1Z -/keeZa:25 -/kee_:4N -/keentech:1Z -/kefka:3A -/keithhulu:1Z -/kek:63 -/kelp:1Z -/kelp-asusfone:1C -/kelp_:25 -/kelp____:3H -/kelpstar:6C -/ken:1C -/kendra-NU:6C -/kenn:42 -/kennedy:1C -/kenny:25 -/kenster:4C -/kerbalbass:25 -/keria:2J -/kermit:6C -/keroff:6H -/kest10:6H -/ketas:0A -/ketas-:03 -/kevin_:0D -/kevin_mit:1Z -/kevinburke:3C -/kevrocks67:2J -/keweiH:3M -/keyz:51 -/kgkfeaq:6B -/kgsuhy:25 -/khaybar:6B -/khecka_:2T -/khronos:2D -/khronos63:09 -/kiad:63 -/kichimi:3H -/kichimi2:0C -/kick-azz8:6C -/kidskilll:2D -/kierank:2D -/kiff_:5E -/kike1:6H -/kikee:2D -/kikes:3H -/kikesmasher:4N -/kill:1Z -/kill_grandma:4G -/killah2k:3A -/killarney:0A -/killer:51 -/killsushi:3C -/killwhite:25 -/killwhtes:03 -/killwites:4G -/kilroy:25 -/kilroy1:6B -/kilroy_:5E -/kilroy__:4G -/kilroy_work:2T -/kimberlite:2D -/kimjun:4G -/kindling:4N -/kinduff:1Z -/kinduff1:3H -/kinduff5:4G -/kingcobra:3H -/kingdom:6B -/kingdomz:3M -/kirch:0D -/kiririno[m]:4G -/kiryin:2J -/kissie:3M -/kit:2D -/kitTails:2T -/kitk:0A -/kitoy:51 -/kitoy_:1Z -/kitt:51 -/kittens:0A -/kiwi_27:6A -/kiwi_28:2D -/kiwi_38:51 -/kiwi_56:4G -/kiwi_57:3M -/kiwi_6:25 -/kiwi_99:1C -/kizuka:2D -/kj8am:3M -/kj8am_:51 -/kj8am_AFK:2D -/kj8am_CZ:3M -/kja:6C -/kjg:63 -/kjkomu:4N -/kk_:09 -/kkczk:42 -/kkk:0D -/kkkk:5E -/kkplqc:63 -/klaus:09 -/klaus-sleep:2T -/klaus1:2T -/klaus_:0C -/klc-:1Z -/klob:09 -/kloenk:4C -/klotski:2D -/klu:6B -/klu1:63 -/klu_:6C -/klyburn:0C -/klys:2T -/km:6B -/km_:5E -/kmbwabba:51 -/kmypw:09 -/kn1f3:09 -/kn1fe:3H -/kneegr0w:63 -/kneeldownbeforehim:2J -/knives:25 -/knqxbw:2D -/koalab:4C -/koasa:03 -/kobach:6B -/koenig:3C -/kog8:6H -/koga:09 -/koh:51 -/koi:25 -/koirishima:42 -/koisser:3H -/kojak:5E -/kokamo:2T -/kolobyte:2T -/komhxwn:4G -/konata404:51 -/kongfuzi:63 -/konox-csh:6C -/konox1337:6H -/konsentr`:3H -/konsonanz:03 -/kontaxis:3M -/koolaid:3C -/kornelio1:0C -/korneliov:3M -/koroded:42 -/koroded_:1C -/korozion:42 -/kosmorage:0C -/koss:42 -/kossy:4C -/koz:6H -/kr:51 -/kr1ss:03 -/krampus:0A -/krampus_:3M -/krell:2J -/kristal:2D -/kristian_on_linu:03 -/kristian_on_linu_:6B -/kristjans:0C -/krjst:3C -/krkd:3C -/krml:3A -/kron:5E -/kronik:2J -/kronuz:2J -/krud__:1U -/krusty:6C -/krys:63 -/ktrace:42 -/kubast2:6B -/kubes:2J -/kug:4C -/kujira:3M -/kukost:3H -/kulj:09 -/kultur:4N -/kun1z:2J -/kundumsta:40 -/kunt:0A -/kuntry:0A -/kuntz:1Z -/kupo:3H -/kuroi_dotsh:1C -/kuz:25 -/kuz2:3M -/kuz3:03 -/kuzx:4C -/kvm2k:1C -/kvothe:51 -/kwamaking:4G -/kwrs:4N -/kwvqnvad:25 -/kyle:2T -/kyle-:63 -/kyle2f:42 -/kylef:2T -/kylef_:0A -/kylefhitempest:3C -/kyloren:5E -/kyonko:3H -/kyonko_:25 -/kyonko___:40 -/kyonko|2:4G -/kyoon_:1C -/kyoon__:6B -/kyshoc:51 -/kyuzo:1Z -/kyzer:1Z -/kzxbcd:09 -/l0bster:4C -/l0bster_:1C -/l0de:0C -/l0de_:1C -/l0de__:03 -/l0decuck:3H -/l0dehater:3M -/l0demas:03 -/l0demas_:6A -/l0deradio:3M -/l0dey:3M -/l0dey_:1C -/l0deyear:2J -/l0draydio:09 -/l0ganWh1t:51 -/l0gic:1C -/l0gic__:6C -/l0l:5E -/l0l6:25 -/l0ra:4N -/l1tup:63 -/l1tup_:6H -/l200bps:5E -/l200bps_:09 -/l200bps__:1C -/l23456:4C -/l23456`:4G -/l4g:6H -/lFu9d52Ne:0A -/lIPMACaPHY:6B -/lJCg:1Z -/lRma:51 -/l^l:09 -/l_bratch:42 -/labanu:0C -/laboum:2J -/laboum-:03 -/laburd:5E -/laceless:6H -/lacni:5E -/ladew__:09 -/ladewerk:1C -/ladyG:4G -/lady_caro:63 -/ladyg:4N -/laePe:4C -/lagzilla:09 -/lain:3A -/lal:2J -/lal_:4N -/lameshit:3A -/lan:3A -/lane:1C -/largetni:3A -/lari:03 -/lari1:4N -/larpingwindows:42 -/larsan:2J -/lasers:3P -/last:63 -/last_:0C -/laters:1C -/latez_:2J -/lawjbug:4G -/lawnchair:25 -/lazr:42 -/lazyhazy:6C -/lb:4N -/ld100:63 -/ldrancer:2T -/leachim6:2T -/lead_pip3:4N -/lead_pipe:2D -/lead_pipe23:3C -/lean:1C -/lebbe1:1C -/lebbe2:4C -/lecci:09 -/lecter:0C -/legendary:3C -/legended:4G -/legended_:09 -/leighton:25 -/leisrech1:1C -/leisrich:2T -/lek:4N -/leku:0A -/lel:3A -/lel_:09 -/lelo:25 -/lemmings:4C -/lemon:6C -/lemon_meringue:3C -/lemond:42 -/lemongra1s:51 -/lemongrass:0C -/lemur:1C -/len:3C -/len_rose:4N -/lenin:51 -/lenin_:3P -/lenk:1C -/lennox:3A -/lennx:0D -/lenny:2D -/lenny_:0C -/leodisk:1Z -/leodisk_:6B -/leotare:4N -/lesderid:6B -/lesderid_:3M -/lesmo:09 -/lesmo1:6C -/lesmo3:6H -/lesmo7:6B -/lesmo8:2D -/less:42 -/lessbCd:0A -/leveal:4N -/levon444:2T -/lfozhyad:6H -/lhoqvso:1C -/lhtrsua:2D -/liber:42 -/liber2:4G -/lich:0D -/lickingwindows:4C -/lictalotofpuss:3C -/liePah:63 -/lienus:2J -/lift:25 -/lightup:2T -/likesboc:03 -/likwid:25 -/lil0ne-:03 -/lil0ne-_:1Z -/lil0ne-_-:3A -/lileh__:2T -/lilfagpoo:3A -/lillith:2D -/lillybett:1C -/lily_:1C -/limie:2T -/lin:6H -/lindalap:4G -/lindso:6B -/lindso_:09 -/lindso__:4N -/linear:0C -/linear-:6B -/linear_:2B -/linear__:6N -/linkinpar:4G -/linmob:4G -/linuxunix:03 -/linuxyo:1Z -/linuxyo3:63 -/linuxyo3_:4G -/linuxyo_:2B -/linx:03 -/lionkilla:1C -/liothen:4C -/liquidpc:4G -/liquidpc_:3C -/liqwud:2B -/liron:1Z -/liron_:1C -/liron__:1C -/lisq:0C -/litenull:5E -/literati:0A -/littleEVA:25 -/litup:2D -/litup_:25 -/liujhuw:2D -/live4irc:0C -/liveanna:2T -/livepan:09 -/livespan:6N -/ljrLBlx:6C -/ljypk:3A -/lklowdq:4G -/lkpsp:51 -/lkpsp__:63 -/lloyd15:4N -/llpmfq:25 -/lneely:2B -/loadlin:1C -/localhost:63 -/lochnas:1C -/lodis:51 -/lodis_:2D -/loganwhit:63 -/logic:3H -/loja:0A -/lokenorth:09 -/loki:0C -/lol:4G -/lol0gram:42 -/loliba:2J -/loller:2T -/loller_:42 -/lolmac:5E -/lolman:3C -/lologram:2J -/lolwhut:2J -/lolz0r:5E -/lolzenik:4C -/longer:40 -/longnickboi:5E -/loob:0C -/looney:6B -/looool:4G -/loophole_:6H -/loplz:6C -/lord-znc:2T -/lordbobso:4N -/lordfoxes:2T -/lordfoxle:25 -/lordkarf:4G -/lordsea:42 -/loser:09 -/loserwastaken:3C -/lossevaril:25 -/lost`:3H -/lostd:09 -/lostd_:6B -/losto__:4G -/losuler:09 -/loul:0A -/lovbe:09 -/love:4G -/love-:42 -/lovesage:51 -/lowkey:5E -/loyal:6B -/loyalis:51 -/loyalist:3P -/loyalty:6B -/loyqlist:0C -/lpgtwysr:1Z -/lphnus:3H -/lrvx:3C -/lt:1Z -/ltCd-:51 -/ltooru:63 -/ltup:1Z -/ltup_:0C -/lu1ldangs:1C -/luajvt:1C -/lucy_:6H -/luis:1Z -/lukaso666:2D -/luldangs:4G -/lulu:03 -/lulzee:03 -/lulzy:1Z -/lulzyyyyy:4C -/lumi:2J -/lumpy:63 -/luna_is_here:6B -/luna_is_here_:2J -/lunario:1C -/lurk:4C -/lus:2B -/luth:3M -/luvbunny_:0A -/luxneet:6C -/lvmbdv:42 -/lvwW:3C -/lvzffm:5E -/lwop:63 -/lxmrft:3C -/lynxis:3M -/lyrical:09 -/m0ds_halp:0D -/m0ngk:1U -/m0ngk_:6H -/m0nk:3P -/m0nt3:63 -/m0p4r:09 -/m0rgan:1Z -/m0rgan_:4C -/m0rgan__:6B -/m0rt1m0r:2J -/m1k[3y]:6H -/m1sdirection:2J -/m1sdirection_:6H -/m242:2J -/m33:0A -/m34r:1C -/m34r_:3H -/m3sk:5E -/m4d3lf:1C -/mAyui46:4C -/mEDIH8R:3A -/mIRC:51 -/mOrO^:42 -/mRl:0C -/mRmiSta:03 -/mWkO:63 -/ma0u:0C -/mac:1Z -/machiavel:42 -/machicol:09 -/machicola:3M -/macho:3A -/macho_man:4G -/machoduck:6B -/mackstann:4N -/macpie:0A -/madH4tter:1Z -/madHatter:3C -/madd:1C -/maddo:1Z -/madhatt_:6H -/madmouse:4N -/madmouse_:42 -/madog:51 -/madonna:6H -/madsage-:2B -/madsage-_:6A -/maga1488:5E -/magevet:5E -/maggie:3A -/magic:3M -/magicfx:3C -/magictest:6B -/magpie_:3C -/magus:0A -/mahoogan:2T -/majic_:1Z -/mak:6C -/mak13:1Z -/maki_:51 -/maki__:5E -/makudonarudo:3M -/malar:5E -/malice:1C -/maligno:3H -/mamabird:09 -/mamadou:3H -/man:03 -/manat:3C -/manat-:03 -/manat_:4C -/mandiblegrip:42 -/mandico:63 -/manedwolf:4N -/manhattan:4C -/maniac:42 -/manjaro-user-:3C -/manjaroi3_:0A -/manjaroxfcelol:1C -/manjaroxfcelol_:3H -/manoloeld:09 -/mantas322:09 -/mantra:3H -/manweuhk:25 -/mao:5E -/maph3r1us:2D -/maph3r1us-csh:5E -/maph3r1us1337:6C -/maph3r1us_csh:1C -/mapherius:3H -/mapherius_:5E -/mapperr:6H -/mar77i:0A -/marco_:63 -/marcthe12:2J -/mardril:6B -/mardril_:3P -/marfles:4N -/marg:6C -/marguesto:4G -/marienz:51 -/marihone:0D -/marilou:4G -/marissa:4C -/mark_:0C -/mark__:6B -/markm:4G -/marley:2D -/maroon:2D -/martin:09 -/martiu:4N -/martti:0C -/marvin:51 -/marvvin:2T -/marxthebat:2D -/marxthebat_:0A -/marxthebat__:0C -/mas4u20000:2T -/mason:4G -/masonburt:6C -/masoncb:4G -/masterdonx2:6H -/mastry0da:6H -/matcha:4G -/materiyolo:1Z -/mathepauker:4G -/mathsman:25 -/matiasP:6H -/matiasP_:3C -/matiasP__:51 -/matlio:4N -/matr1x:09 -/matrix:1C -/matrixrel:6H -/matryoshka:03 -/mattf:3C -/mattf1:2J -/matthew_:1Z -/matthewcu:3A -/matthewga:6C -/matthewth:6B -/mattisgay:3A -/matty:51 -/matuka:2D -/matus_120:63 -/mauRai:0C -/max10char:0C -/max_:2D -/max_stir-:0C -/max_stirner:09 -/maxh:0A -/maxster:63 -/maxwell:1Z -/maxxe:42 -/maxxe_:6B -/maya:03 -/mayui:6H -/maze:2J -/mazet:3A -/mbezyyat:4N -/mbp:51 -/mcburton:2J -/mcburton_:3M -/mcornick:6B -/mcornick_:3C -/mcp:0C -/mdashx:6C -/mdgsqbu:2T -/mdn:6B -/me-u:2D -/me`:1Z -/meadre:0A -/meaningfulNick:09 -/meat:3M -/meatthug:4C -/mech:3H -/mech_:0C -/mecosito:4N -/media:4N -/meemo:0C -/meenk_:2D -/meetnana:1Z -/meganrat:42 -/meh:09 -/meh`:2D -/mehcositi:0D -/mehh:3C -/mekyb:6H -/mel:09 -/mel_:2D -/melans:51 -/mella:5E -/mella-:03 -/mella|:6C -/mels:0A -/mels_:25 -/meltdown:5E -/meltheadorable:51 -/mem0ut:2J -/membranou:40 -/memingwindows:25 -/menfie:25 -/mengel3:6H -/mengu:63 -/meowmeow:03 -/meowy_:3C -/merav:0C -/merav-:5E -/meridion:2T -/merlin_1991:3C -/mermi:3A -/merpkz:3C -/mert:6H -/merzbow:42 -/messiah:2D -/metalchic:3A -/metalrock:2J -/metaphaze:1C -/metaphz:2T -/metaqwe:6A -/metestbug:42 -/mexicunt:3M -/mez:2J -/mfebxg:3C -/mffrice:6B -/mg55:2J -/mgsyfmw:63 -/mhitmikey:42 -/mhj:3M -/mhuqjq:6H -/mib_14puyt:51 -/mib_77vq3i:6B -/mib_8ygx9x:09 -/mib_geowgq:42 -/mib_jktqft:3C -/mib_m0go3k:2D -/mib_nor4ml:03 -/mib_s6lvls:0D -/mib_tujkas:6C -/mib_zj6ij1:6B -/mibggt:25 -/micha:6C -/michael_:6B -/michaelfm1211:5E -/michaelrules:6C -/michaelrules2:5E -/michaelrules_:03 -/michele:09 -/michele_:6C -/michi:51 -/michi_:0C -/michill:6A -/miconda:25 -/micrex22:0A -/microwire:42 -/midgardlol:42 -/midphase:09 -/mieJah:6H -/migbatix:1C -/miggy-chan:3C -/mighty17[m]:1C -/migranha:6H -/mihoX:25 -/mike_:5E -/mikealgor:3M -/mikejonez:4N -/mikemike:3H -/mikepence:1C -/mikeshea:4N -/milenia:0C -/militant-:3C -/milkii:3M -/milkness:0C -/milkness_:0C -/milktoast:2D -/millet:3H -/milquetoasti:3A -/mime:1U -/mimilaUra:4N -/mindcrime:5E -/mindlesstux:25 -/minicom:1C -/minicom7:3A -/minix92:3P -/mink:5E -/minorov:42 -/mintice:3M -/minty:6H -/minus:3C -/minusMplz:3C -/mion__:42 -/mircus:1Z -/mirhorse:3H -/mirhorse_:1C -/mirik:40 -/mirika:51 -/misfit:51 -/misfit_:3C -/misslavey:2T -/missx:63 -/misterjester:1C -/mithras_:1Z -/mits`:25 -/mixter:5E -/miyamoto:6N -/miyu:6C -/mjankovi`:2T -/mjankovic:1C -/mjo:2D -/mk-nn:5E -/mkfpq:63 -/mkk:2J -/mkke:03 -/mkkee:3H -/mkky:2T -/mkultra:3H -/mlaine:1Z -/mlavr:51 -/mlm:5C -/mm:6B -/mm29942:4C -/mmalecki:4C -/mmango:3C -/mmm:51 -/mmmh:6B -/mnemonix:4C -/mnmn:03 -/mnu:0C -/mnwafletx978:1C -/mnx:25 -/mnx_:09 -/mny:51 -/moane:03 -/mob_w:0A -/mobirails:1Z -/mod:42 -/modsToValhalla:5E -/moej:51 -/mofo-x:3A -/mofo-z:1C -/mohnish:0D -/mohnish_:25 -/mom:51 -/mona:1U -/monad:3A -/money40:1C -/moneytree:6H -/mongrel:2D -/moni12:3H -/monich:5E -/monique:63 -/monkey:09 -/monkeybal:0A -/mono:0D -/mono2:03 -/monokrom1:3H -/monokrome:6H -/monoxane:3A -/monoxane6:42 -/monoxyde:0C -/monte:6B -/monte-:0D -/monx:2J -/moon_:09 -/moondanc1:1Z -/moondance:3H -/moony:09 -/moony1:4N -/moony_:1C -/moot:03 -/mopi:4N -/mork:6B -/morse_naughty:63 -/mort:5E -/morthrane:3A -/mortisha:1C -/mosh:6A -/mostcows:3C -/mosterdt:3C -/moth3r:6N -/motte:5E -/motte_:6C -/moucly:6C -/mousepad:4G -/mouser:5E -/moutai__:3C -/mover:4G -/moxie:4N -/moxie`:5E -/mozillasandvich:63 -/mpt:6C -/mpwvyjdk:1C -/mpx:09 -/mr_hhvn:7H -/mr_moobs:4N -/mr_pants:0D -/mrafiee:6C -/mrbentarikau:4C -/mrbitterness:6A -/mrdubz:0C -/mre:42 -/mredgarfr:03 -/mrfreeze:3C -/mrhanky:2J -/mrinfinity:25 -/mrjones:6B -/mrkajetanp[m]:09 -/mrm:1C -/mrmehtada:6A -/mrnicke:1Z -/mrpfilser:42 -/mrraj:3A -/mrs__novak:51 -/mrs_hhvn:3P -/mrsfatty:0C -/mrskunk:4G -/mrtux_:03 -/mruno:4N -/ms_d:03 -/mshadle:5E -/mtqonv:6H -/muba:6H -/muba2:42 -/mugen:0C -/mugen_afk:4N -/mulberi:2J -/mulpjo:51 -/mumtaz_mahal95:3C -/mumtaz_mahal_:25 -/muneytree:3A -/munki_:4C -/muppeth:0C -/murmur_:4G -/musashi:5C -/muse:4C -/mushu:3H -/musicmake:3C -/muskrat:0C -/muslim:42 -/muslim_:0C -/mutarts:4N -/mutiny:09 -/mvDs:3H -/mwb:3M -/mwczwl:4N -/mwdkfx:6H -/mxl:0D -/mxthang:6C -/my5:4G -/myax:63 -/mychal:0A -/mydeardiary:4C -/mykah:2J -/myla:4G -/myr:4C -/mys:4C -/mys149:42 -/mys_:4C -/myscor:2T -/mysltex:1C -/mystery:0D -/mysticum:3M -/mystos:03 -/mzal:2T -/mzal_:25 -/mzgvpgpg:6B -/mzm:63 -/mzmzm:2T -/mzydjc:51 -/n00b:6C -/n00b100:4C -/n00b549:4N -/n00b620:4C -/n00b684:5E -/n00b849:2T -/n00b984:09 -/n00b__:3M -/n00ber:3A -/n00ber_:63 -/n07m3:2T -/n07m3-:2J -/n0_m0re:0A -/n0a110w:0C -/n0haxt:4N -/n0ne:2J -/n0ne`:6B -/n0nsense:2D -/n0rv:0C -/n0t0w:63 -/n0txx:2D -/n30nhybr1:1C -/n3mt4b:0A -/n473r5:0A -/n6tadam:0C -/nCore:6B -/nEverpk:4G -/nHlu:0A -/nIYO:4G -/nJRv:2T -/nOgAnOo:3A -/nUN3F47:4C -/na2met:2J -/naari:3H -/nabla:3A -/naeXi:6B -/nagdr:2D -/nagisa:3H -/nagual:25 -/nagual_:4G -/nahkhpjs:09 -/nahtjona:3M -/naitootat:42 -/naka:4G -/nala:0C -/name1:0A -/namibj:2J -/nan:63 -/nan0:6C -/nance:1C -/nancee:3C -/nanceeeee:3H -/nancy:4N -/nang:63 -/nani:2D -/nanii:3M -/nannerjammer:63 -/nano:03 -/nano-:2T -/nano_:4N -/nano_8086:51 -/nanoniem:51 -/nanoniem\:6A -/narada:2J -/narkos:09 -/nasteacat:3H -/nat:25 -/nate1:6C -/natsuya:2J -/nature:6A -/nax:1C -/nax_:4C -/nbozyoh:63 -/nc_:1Z -/ncqgjq:6H -/ndsddaeb:2T -/ndyeaj:25 -/ne:51 -/neaeto:63 -/neato:51 -/nebtakesthingsto:42 -/nebula027:25 -/nebula495:1Z -/neeasade:2J -/need:25 -/neelam69:3C -/negroe:6C -/negrokiller:4N -/negrox:3A -/neilalexander:0D -/neko_:4G -/nekobot:5E -/nekochen:03 -/nekomune:4C -/nem:3M -/nemdiggers:2T -/nemesisx:3M -/nemo:09 -/neonCoinZ:6C -/neonSimp:4C -/neonfreon:3H -/neongold:42 -/neonjesus:6B -/neonsata1:0A -/neonsatan:03 -/nerdk0re_:03 -/nero:3M -/nervous:0C -/neshpion:2J -/nesipice:63 -/nesipice_:2T -/nesoi:6C -/nesoi1:51 -/nesoin:42 -/nesta:2J -/nestacat:3H -/netblaz3:09 -/netblaze:6B -/netblaze-:0A -/netlan:2D -/netsec:4G -/netyaroze:6B -/netz:6C -/netz_:3M -/neuro:1C -/new:0D -/newbie:1C -/newnigger:51 -/newt:6H -/newt456:03 -/nexis_:2J -/nf:5E -/nga:63 -/nga0x539:09 -/nhahzwz:3C -/nharris:3H -/nhmmjtjc:6B -/ni291187:6H -/ni638629:4G -/ni886105:25 -/nib9888:0C -/nib9888_:6B -/nicenice:03 -/niceplace:3C -/nicesage:25 -/nicesage_:2D -/nicetry:42 -/nicetry-:4C -/nick1234:1C -/nick2:2J -/nickel:09 -/nickel_:3A -/nickl008:6C -/nickname:03 -/nickname0:3M -/nickotheus:03 -/nickserv:1Z -/nickyxxxl:6C -/nico1:51 -/nicolagi:03 -/nicolas:2J -/nicotime:6C -/nicteamn:6C -/nig_:2D -/niget:1C -/nigg3r:03 -/nigga:4C -/nigger:6B -/niggerman:3C -/niggerple:09 -/niggers:3A -/niggs:0A -/nightmares:3M -/nignog:4G -/nigsaw:4C -/nik:63 -/niles:3A -/nilnull:25 -/nin:4C -/nine:3A -/nine11:1C -/ninewise:51 -/ninex:2T -/ninex-:1Z -/ninex-_:4N -/ninex_:4C -/ninjabuffet:51 -/niqqqer:25 -/nirojan:4C -/nirvan4:5E -/nirvana:4N -/nisse:3H -/nitoplayer:42 -/nitrogen:6B -/nitroxis:09 -/nix:3C -/nixfloyd:3C -/niyish:2D -/nj:42 -/njaM:3C -/njha:3A -/njsg:51 -/njsg_:2J -/nk9k:3C -/nka:6B -/nkbkie:4N -/nkuld4:42 -/nm0i:6C -/nmQW:09 -/nmeum:4G -/nmmm:09 -/nmnm:4C -/nmvpf:2D -/nn:2J -/nnbt:4C -/nnnn:6C -/nnns:0C -/nnrre:4G -/no:5E -/nobo:4C -/nobo_:4N -/nobo__:0A -/nobody:4N -/nocarrie1:3C -/nocarrier:6H -/nocbz:6H -/nocountryforoldboy:0C -/nocturnal:2J -/nocturne:3A -/node:2T -/nodebit:1Z -/nodebit0:0C -/nodewire:0D -/nodfhfgf:6C -/noface:0C -/nofc:3C -/nohaq:2D -/nohesnot:1Z -/nohit:2J -/noice:5E -/nola_f_15:3M -/nolan:25 -/nolentils:1Z -/nolte:4N -/nom_:0D -/nom__:6H -/nomad:2T -/nomam:6H -/nomans:1Z -/nomic:1C -/nomic2:6B -/noname:4G -/noname_:3A -/noname__:63 -/nonickame:1C -/nonicknam:4C -/nonickname:3H -/nonlinear:0C -/nonlinear1:3A -/nonlinear2:63 -/noob_noob:2D -/noodlesx:2J -/nookname:2D -/nop:4N -/nope:03 -/nor:2J -/norex:42 -/normale:03 -/norvegia:42 -/norwaygrl:4N -/nosilica:1C -/nosilica_:03 -/nospam:63 -/nospinzy:42 -/nospinzyz:3H -/nostradms:40 -/not-rich:2J -/notB:09 -/notI:25 -/notK:3M -/notOutOfGum:6H -/not_b:42 -/not_seird:2J -/notagain:3M -/notatall:4N -/notb:3H -/notblaag:3M -/notbrewster:09 -/notdumb:6B -/notgamedude:6C -/nothuman:2T -/notimp:3H -/notkoro:3M -/notkoro_:03 -/notlenny:51 -/notnaka:2J -/notnoobr:0C -/notpk:25 -/notptr:1C -/notvash:1Z -/novidroog:2D -/novpnsigu:09 -/npchuv:2D -/nqafqtaq:1C -/nrgeqp:25 -/nsee:6B -/nt0__:3C -/ntr:03 -/ntvvyc:0A -/nubbles:4N -/nubbs:03 -/nubiee:2T -/nucor:42 -/nudist^AF:03 -/nufsed:25 -/nugget:3M -/nugrape:1C -/nujabes:0A -/nujabes-:6B -/null:3H -/null_:2T -/null__:3M -/null_ex:2J -/nulligan:09 -/nullptr:1C -/nullptr_:1C -/nully:1C -/nully2:3A -/number3:63 -/numbnuts:1C -/nutz0:6C -/nvnuq:1Z -/nvrhome:6B -/nxTMeksmG:4C -/nxnja:3H -/nxocd:6C -/ny:2J -/nyan:03 -/nyctea:4G -/nyctroll:6A -/nydel:09 -/nyku:3A -/nym:3A -/nymph:25 -/nyt:3C -/nyt_:51 -/nyyGOfLvb:2B -/o0:03 -/o9aa:63 -/oChoo:3A -/oGOMLsCMG:25 -/oMo:2D -/oTeeHi:2D -/o_0:0C -/o_C:3M -/o__o:25 -/oarion7:2T -/obake:4N -/obiZu:09 -/obon:2J -/obungie:4N -/obviyus:3H -/ocin:09 -/oclet:6C -/oct0:2T -/oct0pus:25 -/octest:51 -/octo:0C -/octopus:3A -/octopus-:6C -/octopus8:25 -/octopus`:6C -/od6n:3C -/odd13:4G -/odd13_:0D -/oddity:3C -/oddluck:0D -/oddluck7:0D -/odie:2T -/odp:0A -/oeXar:1C -/oelna5:25 -/oem:4G -/oepsie:4C -/oerjan:6H -/oevl:03 -/ofafynqw:09 -/offended:42 -/offendo:0C -/offic:4C -/offic_:6B -/offic__:6B -/ofiqjm:6C -/ogdeuwo:5E -/oh:0C -/ohJai:6C -/ohNgi:2J -/ohThoo:5E -/ohceiX:2T -/ohfmsmbh:4G -/ohgeetee:1C -/ohgeetee`:1Z -/ohn0s0hard:03 -/ohshi:3M -/ohyeahhh:3C -/ohyed:4G -/oicxvkzo:4G -/ojsdtxt:3A -/ok_____:0C -/okaber:51 -/okami:4N -/okay:6B -/okboss:3A -/okc0mputer:3M -/oketoch:63 -/okgovz:2D -/oksvk8989:6B -/olderkind:25 -/oldgeek:1Z -/olie-bol:63 -/oliebol:51 -/ollieparanoid[m]:51 -/ols:3A -/olsas:09 -/olus:03 -/olusx:0C -/omhwg:4N -/omlet:5E -/omlet_:4C -/oms:2D -/omse:0C -/onOw:51 -/one:6C -/one_almond:1U -/oned4:51 -/oneeightf:3A -/oneeightfourstco:51 -/oniijin:0A -/onmfd:2T -/onodera:6B -/ooGeeH:1C -/ooNge:4C -/ooNgoh:2J -/ooQuah:3M -/ooXav:3C -/oogaa:0A -/oohMemory:6C -/ooo:6H -/oopgcwv:51 -/oops_i_did_it_again:1C -/oosh:0A -/opal:51 -/opal-:63 -/opal_:6B -/openface:5E -/openface_:0A -/openfly:03 -/operbot:1Z -/ophie:03 -/opkes:51 -/opkes_:63 -/oppgqd:6H -/oppnhj:03 -/opposition:09 -/opticnerve:3H -/orahPi:4C -/orangefox:3A -/orangutan:3C -/orb:6C -/orbital:3C -/orblivion:09 -/ordinon:63 -/ordy:2T -/ordy1:25 -/ordy18:25 -/oregano:3M -/oreo:6B -/orgamses:2J -/ori:3H -/orko57:09 -/orlly:2D -/orlly11:1Z -/orlly2:63 -/orlly3:4C -/oroboroso:5E -/orthros:5E -/orthros77:0C -/osaoL:3M -/oscar:42 -/oshaH:3A -/osiris:1Z -/osprey:4C -/ossii:4N -/ot5436:2J -/ot54361:42 -/otfms:03 -/otorp:3A -/outsider_f:3C -/outt13:4N -/outtie:3M -/outwardjourney:2J -/ovan:3H -/over_loa-:09 -/over_load:4C -/overdose:09 -/ovsbgsem:3A -/ow:6B -/owenambro:63 -/owlpatrol:3A -/owo:1Z -/owo_:6C -/owo_owner_trollolol:25 -/ox8d:25 -/oxblood_r:5E -/oxidation:2J -/oxide:4G -/oxihe:1C -/ozamiz:09 -/oziiiz:2D -/p-ng:5E -/p0rpoise:4C -/p0rps:1C -/p0tat0es:3A -/p0tus:42 -/p1gl33t:3P -/p2pefnet:09 -/p4r4n0id0ne:3H -/p4xz:0A -/p80info:51 -/p80info`:3M -/pFUd:0C -/pHeS:1Z -/pJPQ:0A -/pRDB:1Z -/p`:6H -/p``f:5E -/p`f:0A -/paajeit:09 -/pagbndfv:6B -/pahreese:03 -/paige:1C -/paige1:2J -/pajeet:63 -/pajeet-:2J -/palisade:2D -/palooka:3C -/palyboy:3M -/pam_unix:0C -/panda1:6H -/pando:0D -/panicstr:2T -/panicstr_:4N -/panini:1U -/panini_:3M -/panini`:3A -/panitaliemom:1Z -/pankkake:2T -/panorain:3H -/panthar:4G -/panthar-:25 -/panzeroceania:3A -/papa:51 -/papawoofs:51 -/paper:6B -/parallels:5E -/paranoid:6B -/parazyd:3H -/parloir:3H -/parnini:51 -/parodie:0A -/partall:2J -/pask:42 -/pask2:6C -/passerby:3A -/password123:5E -/pastorkoa:0C -/pat:0C -/patkgnp:2D -/patpat4567:3H -/patpat4568:3A -/patpat4569:6C -/patryk:25 -/paul43:6B -/paulk-collins:1C -/pauum:3H -/paven:2J -/paven`:2T -/paxed:3C -/pay4irc:42 -/payforirc:51 -/payge:6B -/paysage:2J -/pb:1C -/pbb:4G -/pbb_:6B -/pbot:4G -/pbrxoifu:5E -/pbui:0C -/pbx5000:3H -/pbxou:2D -/pc:3P -/pc_:4G -/pcap:3A -/pcgjm:4C -/pcmike:1Z -/pea:51 -/peacecheese:0A -/peaches:25 -/peazz:42 -/peckr:09 -/pedo`:25 -/pedofile:6C -/pedophile:3C -/pedro[46]:4C -/peepee:1Z -/peetah:6C -/pekka:3A -/pemi:51 -/pencewins:51 -/pene:4G -/penedicavallo:1Z -/penis:1C -/penisbot:1Z -/penistits:6B -/penkster:2D -/penny:3M -/penski:1C -/penski_:0A -/penta:1Z -/penus:4G -/peppeag:3M -/perc:09 -/pere:3M -/pere_:1Z -/perlfan:4G -/perohig:3C -/peron:6B -/peron_:1C -/perp1exa:25 -/perplexa:2J -/perrierjo:0D -/pesky:3C -/pesky_:4G -/pespin:1C -/pespin_:4N -/peterhil:42 -/peterpomade:3C -/peters:2D -/pezmonkey:0C -/pf:1C -/pgreptom:0C -/pgrptm:6B -/ph0cis:3C -/ph0cus:25 -/phaggit:4C -/phanaeus:09 -/phantomb:63 -/phargle:6B -/phargul:0C -/phc:1Z -/pheni:0A -/phieP:6C -/phil:2T -/phillbush:3M -/phillipe5221:3H -/philmacfly:42 -/philzimmermann:3C -/phish:1Z -/phlud:4N -/phobos:2J -/phobos-:6A -/phocus:2J -/phocus`:4G -/phocus`_:3M -/phoenixcanary:4N -/phonekait:4N -/phonic:0A -/phooey:4G -/phooey_:4G -/photocyte:3M -/phr33d0m:03 -/phreak:1Z -/phrgl:3A -/phrost:4C -/phylum:3H -/pi:1C -/pi_:6B -/pi__:2D -/pickfire:1Z -/pickfire_:1C -/pico:3M -/pie:5E -/pierre:1C -/piesage:42 -/pig:6C -/pigeons:42 -/pinchy:3C -/pine127:09 -/ping:3H -/pingagn:42 -/pinkky:09 -/pinsessa:0C -/pinsessa14:2D -/piotrcap:0C -/pip:6N -/piratefox:25 -/piskapo-:25 -/pissbottl:0A -/pisslord:5E -/pitbull:2J -/pitbull_:4C -/pitz:6H -/pitz-:03 -/pixel_:25 -/pixelated:0C -/piyop:4G -/pizptein:4G -/pizzapal:4G -/pjgtre:6B -/pk:3A -/pk_is_fat:3H -/pkap:4G -/plab:03 -/plab_:42 -/plab__:25 -/plarceny:2T -/plastic:42 -/plasticca:5E -/plasticcat23434:3H -/plasticcat4030432:63 -/plasticcat420:4G -/player6969:4G -/pleemrkrl:03 -/plexa:1C -/ploks:03 -/plow:25 -/plskm:63 -/plsno:51 -/plsunban:3A -/plusMe:0C -/plus_m:2D -/plus_v-_p:1C -/plusme:3H -/plusvee:4G -/plusvplz:25 -/plzunban:4N -/pm-:5E -/pmi:0C -/pmis:3A -/pmis2:42 -/pmise:25 -/pnazzm:1C -/pnotic:6H -/poccri:09 -/poche:3M -/pocketpr0:1C -/pocketpro:25 -/pocky:51 -/podesta:3M -/podesta_:5E -/podesta__:63 -/poggri:51 -/pohBu:2J -/pok:2T -/poka:0A -/polanco:6B -/politburo:51 -/politicallycorrect:2D -/polka:63 -/pollini:2D -/pollpoc:42 -/poloanjel:25 -/polyglot:3M -/polyhrut:51 -/polyhurt:1U -/polyprop:1Z -/pomegra:3A -/pomf:4G -/pomff:1Z -/pomfret:4G -/pomfyyy:63 -/pomggf:6B -/pong:1C -/ponziSchemer:6B -/poontang:1U -/poop:0C -/poopbaby:1Z -/popcorn:4N -/popey:1C -/poppy:63 -/poptart:09 -/poqznx:6C -/porksandwich:5E -/pornini:03 -/porno:0A -/port:3C -/portee:3C -/potgirl:4C -/potien203:0C -/potien356:51 -/potsmoka:3A -/potus:6C -/poutine:3C -/powerfulmind:51 -/powiw:2D -/ppcpunk:4N -/ppp1:03 -/ppx:3C -/ppydsny:3M -/pr0pri3taryn0de:3C -/prank:2T -/prawnsalad:2J -/praxage:2B -/praxsage:4N -/prc194:0C -/prcdn:03 -/precipic1:6B -/precipic2:5E -/precipice:0C -/pregoia:3H -/prepuk:4N -/presonic:1Z -/presonic_:3C -/pretma:03 -/prez:6C -/prg:03 -/princeski:5E -/princesskitana:6B -/princesskitana-csh:0A -/princesskitana1337:6H -/prinsessa:25 -/prinsesse:3A -/priti:51 -/privbot:4N -/privy:6C -/prizzly:6B -/prizzly_:2T -/prjrbhru:5E -/prnflks:5E -/pro:3C -/profedward:4G -/profetik777:4N -/progrel:3C -/project:2J -/projectak:51 -/prometheus:2D -/proof:3H -/prophet:0A -/proto:6C -/proto-:0A -/protocol:3M -/protocol-:6C -/prym:2D -/psauqro:2T -/psg:2J -/psych094:63 -/psychedel:1C -/psycho:3M -/psychobee:3H -/psymasta:3H -/psymaste1:3H -/psynigger:2D -/psyop:4N -/psyvenrix:1Z -/pt300:03 -/ptadv:2T -/ptol3my:2J -/publicNME:4N -/puccimane:5E -/pudtrt:4G -/puke:03 -/puke2020:5E -/pulsar12:3C -/puly:5E -/pumpbull:3A -/pumpkins:1Z -/punished_mayu:0C -/puoSa:51 -/pupper:3P -/puppy:3C -/puppy-:4G -/purgemaster:3A -/purist:4G -/purp_:40 -/purpel:1C -/pussy:1Z -/pwkwht:0A -/pxgjlozt:42 -/pymassa:09 -/pyn:25 -/pyrate:2J -/pyrate_:03 -/pyratebeard:09 -/pyre:4C -/pyrex:42 -/pzUhgzI2s:42 -/q-u-a-n:42 -/q-u-a-n1:51 -/q-u-a-n2:1C -/q-u-a-n3:1C -/qD:1Z -/qapla_org:6B -/qarhmkrl:51 -/qbit:4G -/qcbiboy:0D -/qdflUe:51 -/qgkreg:4C -/qhfrmkv:3C -/qi:4G -/qizbdpct:6C -/qjajrkel:09 -/qk:4G -/qksmekl:51 -/qkvmuxb:6H -/qmiwea:63 -/qmjtlr:0C -/qnorsten|away:0A -/qpt:25 -/qpvud:2J -/qq2222222222222222222222222222:42 -/qqq:51 -/qryfhob:51 -/qrzn:1Z -/qscju:6B -/qsgpd:5E -/qssqxxu:0A -/qsvgu:09 -/qto:3C -/qto^:4N -/qtpie:0D -/qtpie_:3H -/quadDamage:4N -/quan:4N -/quan_:0D -/quantax:6B -/quantax_:0C -/quantico:0C -/quarex:2J -/quarex_:4G -/qubix_:6C -/queenofkings:6H -/queiD:25 -/quertzuiop:4G -/quiXuj:4N -/quinq:2J -/quisling:0C -/qw:42 -/qwe123454:2D -/qwebirc12:1Z -/qwebirc71:63 -/qwerty:3A -/qwertzuiop:51 -/qwertzuiop_:4G -/qwop:09 -/qy:03 -/qy_:1C -/r00t_Gh0sT:03 -/r00tobo:09 -/r00xz:2D -/r0bby:3H -/r0bobox:2J -/r0ndit0:6H -/r1mu:3H -/r1oWHt:0C -/r2d2:6C -/r3ader:6B -/r3d:03 -/r3d-:3C -/r3d_:4N -/r3d__:0D -/r3hab:3C -/r3mk:2D -/r6ZD:6H -/rEspiD:6H -/rMobWYX:1C -/ra-ra:03 -/ra-ra_:6H -/ra1n:63 -/ra7s:6H -/ra8s:6B -/raT:1Z -/raab:03 -/rabbipires:03 -/rabbitear:3M -/raboof:63 -/racehorse:2T -/racist-:2B -/radchad:40 -/radie:1C -/rafael2k:3A -/rage-:6H -/ragga64:3C -/raghavgururajan:3A -/ragnarok_:6B -/rails:4N -/rain`:2T -/rain`_:0C -/rainbowjo:40 -/rainy:0A -/raisin:4C -/raj:0C -/raj_:09 -/rak:0C -/rakemeS:6H -/rakiru:6C -/rakshasa:4C -/ramenz:1Z -/rami:0A -/rami_:3M -/ramiferou:09 -/rampage-:0C -/ramsay:25 -/ramsay_:4N -/ramses:4G -/ramses_:5E -/rand:3H -/randnet3:3C -/rando_99:2J -/random:0A -/randomO24:0C -/random_yanek:3C -/randomnickname:2J -/ranix:6B -/rapemerdr:3H -/rapemurdr:2T -/raperape:2D -/raph_ael:0A -/raphidae:03 -/raphidae-:0C -/raphidae`:6B -/rapunzel:25 -/rasengan:1Z -/rask0ln1k0v:1C -/raskolni-:0A -/raskolni|:2T -/raspcherry:6H -/raspcherry_:3A -/raspcherry__:4C -/rastabomb:4N -/rat:42 -/ratbert:09 -/ratfactor:51 -/rattle:1Z -/ratxue:03 -/ravagrrl:3C -/raven_:4N -/rawr:6H -/raxa:4C -/razy:4N -/rbk:0C -/rbots:51 -/rbrdv:0C -/rbrezzmh:5E -/rcdgpxe:63 -/rcdjssqd:25 -/rcf:42 -/rcf1:09 -/rda:40 -/rdr:2J -/rdr_:3H -/rds:1C -/rdtbjvoq:6C -/reading:5E -/reagen_:6C -/realDonaldTrump:3C -/realcone:2D -/reallll:42 -/reallylongnick:1C -/reaxt:3C -/rebel:6C -/rebel_:3P -/rebirf_:3M -/rebirth:6B -/rebs:25 -/receptive:2J -/rechos:6B -/redLotus:6B -/redangel:3M -/redbear:3M -/reden:2J -/redlegion:0C -/redneonglow:3C -/redragon:6H -/redsand:25 -/redsquare:6B -/redubious:03 -/redukt:51 -/redx113:51 -/redxer:2D -/reebot:03 -/reeee:03 -/reeeeeeeeee:2J -/refusist:2D -/regeneron:09 -/regulate:2D -/rehab:63 -/reiamani:3C -/reillyeon:6C -/reinnosuki:25 -/reisub:25 -/rejeeC:2J -/rejon:63 -/rekir:3C -/relaxo:51 -/relic:4N -/remogt:4N -/removepk:0C -/ren00b:0A -/rengaf:3C -/rennie:3A -/replicant:0C -/reppard:4N -/resemc:03 -/reshma:3H -/resident-:3H -/respect_:6C -/resting:4C -/restless:0D -/retards:4C -/retsetbug:4G -/retsetgub:3A -/retwt:0C -/reuntal:4G -/revilon:0C -/revolution:03 -/rewq:6B -/rfeany:25 -/rfmctm:0C -/rfx:40 -/rgcpcTqva:2D -/rgdgnfnfgh:51 -/rgsbkq:1Z -/rgu:1C -/rhauch:25 -/rhysm:63 -/ricardus:0C -/ricardus_mini9:0C -/richard:0A -/richiez:25 -/rickhayes:51 -/ricksanch:2D -/rievies:1Z -/right:1C -/riker:0A -/rill1:4N -/rimas:3C -/riznqfd:0A -/rjc:3M -/rjhurt:51 -/rjt_znc:6B -/rjyzlbt:5E -/rkk:3H -/rkl__:0C -/rklorax:4G -/rkl|:3C -/rlam1:4C -/rlszoc:51 -/rm:0C -/rm-:6C -/rmb:1Z -/rmb0:03 -/rmb1:63 -/rmmm:0C -/rmmm_:2J -/roaar:4C -/roach:42 -/roar:6C -/roar_:25 -/rob0:6H -/robbiet480:25 -/robbos:5E -/robboss:25 -/robertm:51 -/robi:3A -/robits:0D -/robmusial:03 -/robo_:6H -/roboirc:6C -/roboirc-:1C -/robot:0C -/robotic:51 -/roboticr:25 -/robotnik:4G -/robotnik_:2J -/robrand:3C -/robrand_:3C -/robwerks:03 -/rocepj:2T -/rocia:51 -/rock1:3M -/rockets:0C -/rocketsnail:4G -/rockey:1Z -/rockho:25 -/rodolphoeck:63 -/rodpod:3P -/rodpodimu:2D -/roen:2D -/roen1:4N -/rofl:2B -/roflwaffl:63 -/romare:3M -/romarefai:0C -/ron:2J -/rondeeto:51 -/rondito:6B -/ronery:2D -/roniez:4N -/ronnic:6H -/ronvoit:51 -/rooky:6C -/root:09 -/root1:25 -/root2:0C -/root3:3H -/roroboin-:0D -/roroboing:1Z -/roror:0C -/rorx:03 -/rosemary:0D -/rosemary1:6C -/rosfr:0A -/rosseaux:2T -/rossjones:63 -/rottenbi1s:3A -/rottenbits:4G -/route:3M -/roygbiv:2D -/rozay:3M -/rpP6QW5Q:09 -/rpifan:51 -/rptr:25 -/rpwwij:42 -/rqifio:2D -/rrats:4C -/rrats_:3M -/rrfx:25 -/rrn:5E -/rrn_:0C -/rrn__:4N -/rrn___:4G -/rrrts:4G -/rsaa:6C -/rsakeys:3P -/rsal:2T -/rsdmovw:1Z -/rshakin:3A -/rsoemn:4N -/rtalk101:4C -/rthrthstr:6C -/rubii:3A -/ruciu:4C -/rude:63 -/ruedeguy:2T -/ruedeguy1:3H -/rugan:2D -/rum-:3C -/rumblepez:3H -/rumbler:4G -/rumblerez:1C -/runswithcrayons:3A -/runswithsissors:3H -/runswithsissors7:03 -/runswithsissors8:25 -/rush:4G -/russanna2020---SnapChatName:2D -/russian:4N -/ruthless:40 -/ruthlesss:2T -/rvbres:2J -/rwDK:51 -/rwZL:2D -/rx:0D -/rx5100:1C -/rx999:03 -/ryan:0C -/ryanbw:42 -/ryanm:42 -/ryans:4N -/rydyi:09 -/rymeten:3M -/ryst:1Z -/ryxxed:25 -/rznegva:5E -/rznwclpu:2J -/s010:63 -/s0berag:3A -/s0berage:51 -/s0k1t:3H -/s0k1t_:3C -/s1l3nced:03 -/s1lent:25 -/s31:4G -/s3xyl1nux__:42 -/s628940:4N -/s7ntax:0D -/sBjc:6H -/sD:4G -/sF3Y:2D -/sHIa:0C -/sHIa2489:09 -/sKitt:25 -/sKyK:6H -/sLuL:0C -/sOkefenok:3M -/sSsSSs:09 -/sSssSs:4G -/sTranGer:0D -/sUbMuNdO:42 -/sUbMuNdO_:03 -/sVez:0C -/sZKuKutk:6C -/s\ash:42 -/saba:4G -/sabazios:51 -/sabazios_:3H -/sabotage:6C -/sabre:51 -/sacon:1C -/sact:2T -/sactown:5C -/sadasaulna:51 -/sadblue:6C -/safe:3P -/sagashi:1Z -/saika11:3C -/saintpie:3C -/sakura:3C -/sakurazuk:2D -/sal_:42 -/sal__:6H -/salerace:25 -/salimfadh:2T -/sally_v:4N -/saltbird:25 -/saltyspittoon:3A -/salvador:63 -/sam:0C -/samdems:3C -/sameo:4C -/sameo_:63 -/sammuel86:4N -/sammyette:2J -/samueldr:4G -/sand:6A -/sandflow:25 -/sandman:0C -/santiago39-uy:25 -/santiago39uy:51 -/santiago__:2J -/sara:2D -/sarkazm:5E -/sashimi:51 -/satan:63 -/saty:0C -/saty_:3C -/sauce1:6B -/sav:25 -/say10:5E -/sayjay:5C -/sbeve:0D -/sbffrtevz:2D -/sbhg:3C -/sbk:0C -/sboke:0A -/scar`face:6A -/scarecrow:09 -/scared:6C -/scarface:51 -/scd:0D -/scd_:0A -/schmillin:2B -/scholar:3A -/schwuk:3H -/sci3nc3:51 -/scifi:25 -/scifi_:63 -/sckuz:3A -/scones:6B -/scrapped:3A -/screamscreamSCREAM:3M -/screamscreamSCREAM_:2J -/screwgohan:3A -/scrim:0A -/scrotal_b:1Z -/scrub_:3M -/scruffles:1Z -/sctqha:4C -/scuttle:3C -/scuzwoot:2T -/sdas:4N -/sdfawdfas:3M -/sdfs:0D -/sdk:1Z -/sdldjsk:3M -/sdlfsd:3C -/sdrawkca1:5E -/sdrawkcab:1Z -/sdsadewf:6C -/se200718:1Z -/se7en:6B -/sea:3H -/sea_:63 -/seanh:3M -/seans:40 -/seasons:6H -/sebbu:2T -/sebbu2:2D -/sebyrock:3M -/secef:3H -/secretmyth:51 -/secure:1Z -/secure-:42 -/sedbot:4C -/sedjuani:3H -/seeNg:4C -/sefnintr:4G -/sehaydenh:X7E -/sehnsucht:4N -/seijvert:2J -/seisatsu:4G -/sektie:4G -/semendemon:25 -/sentinL:09 -/sepples:25 -/seriesofnumbers:25 -/serious:1Z -/seroquel:25 -/seroquel_:51 -/serrabqr:25 -/serviteur:5E -/set:2D -/seth:2T -/seuzt:0C -/severbot:3M -/sex:3M -/sex_slave:3H -/sexsex:2J -/sexslave:51 -/sfd8:3C -/sfowler:3A -/sg111:42 -/sgkfvgc:5E -/sgo:0C -/sh4:09 -/shadowfox:6H -/shaed:6C -/shah^:0A -/shamoanjac:2J -/shamus:09 -/shardy:0C -/sharky2:4G -/sharp:0A -/shawn:1Z -/shawn_:63 -/shaye:1Z -/shaye3:2T -/shekk:0C -/shelpe:0D -/shelpe_:3H -/sheraldo2:3P -/sherlock:25 -/sherop:2D -/shii:3M -/shiitake:4N -/shin_getter:63 -/shine:1C -/shine_:1C -/shine__:1C -/shinedown:4G -/shit:3C -/shitlord:1C -/shlomostein:5E -/shmoo:2J -/shockwave:1C -/showyrslf:2D -/shr00m:0A -/shrooms:2J -/sht:3M -/shusky:2T -/shusky_:4C -/shutuploser:3H -/shutuploser_:09 -/shzzx:4G -/sicelo:09 -/sickofag:6H -/sideffect:3H -/sife:6C -/sigkill:2J -/signop:03 -/sigrun:4N -/silhuette:03 -/sili:2J -/simbaLion:1C -/simboona:4C -/simp:4C -/simplewom:2T -/sin:42 -/singasbr:51 -/siniStar:4N -/sins:2J -/sitths:51 -/six8:03 -/sixone:42 -/sixwells:3M -/sjc:5E -/sjrvf:63 -/sk8erchic:4C -/skOlast:6B -/skalar10-:6H -/skankhunt:3C -/skapeg0aa:2T -/skepo:0A -/skg:6A -/skg_xyz:6H -/skill:1C -/skindots:5E -/skinzz87:3C -/skirl:1C -/skjoldr:4C -/sknkhnt42:3A -/skrike:6C -/skroni:09 -/skronind:4N -/skrzyp:4C -/skud_:3M -/skvidal:4G -/skydog:4N -/skydrome:2J -/skyghosts:09 -/skymaster:0C -/skywalk0:0C -/slackfam:1Z -/slackfam1:6B -/slapnuts:0A -/slaqer:63 -/slavegirl:25 -/slawz:2D -/slaypage:42 -/slee:5E -/sleeping:2J -/sleepy:51 -/sleepy_:4N -/slegna:0C -/slewis:42 -/sliceOirc:40 -/slime:5E -/slimeball:0A -/slopey:51 -/sloth`:3A -/slovenia:42 -/slowbot:4N -/sluagh:3A -/sly:3M -/sly_:4C -/slyshot:4G -/sm00:2J -/smPPtoDf:42 -/smartguy:4N -/smash-:0C -/smashgra_:2D -/smashgrab:5E -/smashjew:63 -/smashjew2:0A -/smbopax:6B -/smegmab0y:2J -/smithnesson:25 -/smlckz:42 -/smoke-z:42 -/smolder:5E -/smptnx:25 -/sn00p:4C -/sn00p_:51 -/sn00p___:51 -/sn1ff:0A -/sn1ff_:3H -/sn2ff:51 -/snEak:6B -/snEk:5E -/sn_:3A -/sn_ff:25 -/snadge:3M -/snazo:03 -/sneak:6A -/sneek:25 -/snek:1C -/snek_snab:3C -/snibeti:4N -/sniff:42 -/sniff-:1C -/sniff_:25 -/snip:25 -/snitches:3A -/snitchku:0C -/snk:03 -/snoozens:5E -/snorf:5E -/snow_:1Z -/snowdy:3H -/snuf:0C -/snuffy:3C -/snufkin:0C -/snufkinson:0C -/snugglo:6B -/snwwro:6B -/soTWYKFwt:25 -/society:6B -/sockmister:25 -/socks_:3H -/sockspls:51 -/socraticDev:0D -/soda4fries:6B -/sodium:03 -/softashell:25 -/soho:4G -/sohoichai2:2T -/sol:1Z -/sol37829:09 -/sol748923:6B -/solanjay:42 -/solene:03 -/solidus:1C -/solo:6B -/somatic:63 -/somedude:03 -/someguy:0C -/someguy__:6B -/someone:3A -/sonic-:1C -/soolo:6B -/sorengard:2D -/sorinello:6C -/sorinello1:4N -/soso:1Z -/soul_:4G -/souph3r:6H -/souph3r-csh:6H -/souph3r_:6H -/soupher-csh:63 -/soupnazi:25 -/soupspin:4G -/southey:3C -/southie:03 -/soxfan:3H -/soybean:42 -/sp:3H -/sp5ke:6H -/sp5ke_:3C -/sp8ke:4G -/sp8ke_:6C -/spGke:3H -/spQke:6H -/spQke_:42 -/spVke:25 -/spVke_:1C -/spWke:03 -/sp^ke:25 -/sp_:4N -/sp_ke:6H -/sp_ke_:3C -/space_rou:4G -/spacecat:5E -/spacecore:0D -/spags:1Z -/spags2:51 -/spake:51 -/spamus:1Z -/spamus_:2J -/spamus__:03 -/spamux:3M -/spark1313:3C -/sparklee:3M -/sparrow:0D -/spartan:6A -/spathi-wa:0A -/spawn-:6H -/spear:4G -/spear-:6B -/spear-_:4N -/spear^:51 -/spear_:2J -/spear|:3H -/spectre:3C -/sped:03 -/speedy:6C -/speedy_:4C -/speedy__:3M -/speko:4C -/spetzes:6C -/sphx:6C -/sphx_:6C -/sphx__:6C -/spice_:42 -/spidy:3H -/spidy_:2D -/spike:0C -/spill:6H -/spindizy:3H -/spinsane:2J -/spirit:6H -/spitroast:09 -/spk:6B -/splat:3C -/splatter:09 -/spoek:1U -/spoke:09 -/spoon:42 -/spoonm:4C -/spricht:2D -/sprinkle:2D -/spuddy:3C -/spuddy-:25 -/spunkworm:1Z -/spxke:4C -/spxke_:4N -/spy_:4N -/spynxic:3M -/spzke:25 -/sq:6H -/sq_:0A -/squiggle:1Z -/squirt:2D -/squirts:2B -/srh:3A -/srm:6C -/srmf:6C -/srsrh:6H -/srvdown:0A -/ssd:0A -/sslbea:2T -/sslr_:3H -/sss:25 -/sstd:2D -/ssxlfm:1C -/st0vepipe:0C -/stEvo:4N -/stabbie:4G -/stacker:2J -/stackiller:51 -/stansmith:2T -/starbomba:6C -/starboy:2T -/stardome:0D -/stark:4G -/starman85:4C -/starmobba:3C -/starrcade:0A -/starseed:0A -/stateles1:2D -/stateless:09 -/staticfox:3A -/staymad:1C -/stcyber:4N -/stcyber_:4N -/stdio:5E -/stdio_:3H -/ste90:4C -/ste[:1C -/steamgirl:42 -/steampot:0A -/stedly:3A -/stedly_:42 -/stedly__:6B -/steeby:2J -/steev:0A -/stegotti:03 -/sterile:2D -/steve:4C -/stevenix:2T -/stevenm:2T -/stevepipe:1Z -/steveskyp:4G -/stevoo:51 -/sth:3M -/sth-2:42 -/sthors:1Z -/stian:0C -/stick:6C -/stickfigure:03 -/stid3r:42 -/stigger:0D -/stigma:1C -/stigma2:2D -/stilbruch:6N -/stinker:3M -/stirlitz:2J -/stkhomi:1Z -/stoic:6H -/stoked:0A -/stomper:0D -/stompykins:0C -/ston3r:2D -/stone:0A -/stonecold:4N -/stonedcold:0A -/stonedcold_:3M -/stormd:4N -/stormium:2J -/stormsz:03 -/stormsz3:51 -/stormsz4:3C -/stormsz6:25 -/stormsz9:3C -/stormsz92:0C -/stormsz98:6H -/stovep1p3:2D -/stovep1pe:5E -/stovepip3:25 -/stovepipe:6B -/stovepooo:09 -/stovep|pe:1C -/stowa:1Z -/stowaway1:1C -/stranger:2D -/straton:2D -/stratum:03 -/stratum_:4N -/stratum__:5E -/stratum`:42 -/stratum`_:6C -/stratumm:25 -/straw-hat:2D -/strike:2J -/strikersh:6C -/strixy:1C -/strontium:42 -/stroopwafel:25 -/strtok:5E -/stu_meat:5E -/stupidguy:4C -/stuttgart:6B -/stygian:1Z -/styledash:4N -/styledash3:25 -/styledash7:3M -/styles:3M -/stylez:3C -/styopah:2D -/sub0hm:0D -/sub0hm-:42 -/sub0hm|:3M -/subXhm:4C -/subcon:3C -/subway:42 -/suckbot:51 -/suckmuh:63 -/suckmywan:3M -/sud0:3A -/sueuse:3C -/sufizzle:3H -/sugar:4N -/sugoi:51 -/sulke:1C -/sully:4C -/sultanofping:51 -/sum:51 -/sumbrero:1Z -/sumbrero_:5C -/sun-light:3C -/sun-lightt:51 -/sundie__:0A -/sundie___:6C -/sunrise:51 -/sunrise_:3P -/sunshavi:4C -/sunshy:1C -/sunzer0:25 -/suparel:0A -/suparel\aw:42 -/super-ultra_extreme_far_right:6B -/super_duper_uber_far_right:4G -/super_duper_uber_ultra_extreme:63 -/super_duper_uber_ultra_far_rig:03 -/superalpine:5E -/superalpine_:3M -/supercilious:4N -/superflu9:2J -/superfly:2T -/superher0:6A -/superjack:6N -/superpj:4C -/suplani:25 -/supradyn:3A -/surfdiver:3M -/surplussi:0A -/surreal:3H -/surreal_:0C -/sushibut:4G -/susse:3H -/sussumu:09 -/suswrd:3C -/suwa:42 -/svere:0C -/swab:6H -/swaps:4N -/swaps_:09 -/swaps__:4C -/swapss:63 -/swarthyPerson:1Z -/swiffles:2D -/swift:4G -/swift110:09 -/swift110_:4G -/swinder:51 -/swiss1:1C -/swrangsar:4G -/swudth:3A -/sxyvitami:3M -/sy:3C -/sy11ab3ar:1C -/syamimerinin:1C -/sycopa:6B -/syf:6C -/syf_:2T -/sykoeye:09 -/sylar:5E -/symtecs:3C -/syn:3A -/syn3yrb:25 -/syn\:2D -/syn^:6B -/syn`_:6C -/syn`__:4G -/synbiose:2T -/syneevj:5E -/synm7n3:3H -/synnlf3:25 -/synowvu:4G -/synqf4f:3C -/synszre:2T -/syntax:2T -/synth:25 -/synthk:09 -/synxqgf:6C -/synyof1:2D -/syrianrue:2D -/syrius:51 -/syrius_:3M -/sys:4G -/sysadmins:6B -/sysfz:2D -/sysop:4G -/system:6H -/systwi:5E -/systwi_:0A -/sz3kl3r:6H -/szass:6C -/szass_:09 -/szsdvfi:2D -/szssitdt:2D -/szzymzt:1Z -/t--manyt-c-unt:3C -/t--manyt-t-unt:2J -/t0fu:3M -/t0fu_:63 -/t2:2D -/t3chn01r:4C -/t3hyoshi:4C -/t3xtm0de:6H -/t420:6C -/t420_:0A -/t4l:09 -/t4n:4G -/t4nk949:2T -/t9Z4n:3A -/tGumbie:09 -/tXeX:4N -/tXmD:1C -/tXul:3M -/taaLu:25 -/tabb:6B -/tachikoma:5C -/tacocat:1C -/tacosage:3C -/tadam:40 -/taehuH:25 -/tafari:4G -/tag-:63 -/tag_:6H -/tahCha:4C -/tailpush:63 -/taimur:2J -/taimur_:6B -/tait1491:1Z -/takoyaki:63 -/tald:4N -/talia`:51 -/talia``:0A -/tallship:3M -/tallship_:5C -/tallship__:4N -/tammy:1C -/tanami:6H -/tangier:1C -/tankfox:3C -/tankfox_:63 -/tao:3H -/tardbaby:6B -/tater:0A -/tater_:0C -/tau:4N -/tawny:4N -/taxman:0D -/tay:4C -/tay_:0C -/taylor85345:25 -/tbwfv:1C -/tcghhj:4G -/tcm:3C -/td:6C -/td`:4G -/tdk:6B -/te:3H -/teGhi:3C -/teaman:0C -/teaman_:4G -/teaman__:25 -/teamux:42 -/technically:42 -/technically_:1C -/techniggger2:4C -/teddy66:2T -/tedead:6H -/teechay:6H -/tef:51 -/tegxxw:3A -/teiwaX:3A -/tekk:2T -/teksimia1:6C -/teksimian:4C -/telephone:6B -/television:51 -/teller:6B -/tem:4G -/tem_:6B -/tempette:3M -/tenecks:3C -/tenecks-:4N -/tepes:63 -/tepssct:25 -/tera_:1C -/teragram:03 -/teranaut:51 -/teratoma:51 -/teratoma_:3A -/termer:1Z -/termer_:1Z -/termina:3A -/terps:0C -/terpy:3C -/terra:3M -/terra-x:03 -/terri`schiavos`lover:09 -/terror:2D -/tertl3:5E -/test:1C -/test2:25 -/testabbb:3H -/testbot:4G -/testbot1:0C -/tester:3C -/tester_:6H -/testing:1Z -/testing123:42 -/testing123456:03 -/testing_:0C -/testman:2J -/testman9:6C -/testtest:1C -/tet3020:4G -/tetrasage:6C -/tetsing:4C -/teu-:1C -/teu-_:1Z -/tevzsbffr:3C -/textmate:4G -/tfpfzel:51 -/tgzgiy:3H -/th0rn:6A -/th1nkp4d:0C -/th3m4dm4n:4G -/th3r4p1st:40 -/thanat0s:4N -/thanatos:6B -/thanatos_:6C -/thatsme:4G -/thatsraci:2D -/thatty:4N -/that|Guy:1U -/the-fool:1Z -/theGrg:2D -/the_ark:1C -/the_d:03 -/the_hwite_race:3A -/thebaconfromhell:6B -/thecrp:6H -/thefoxes:5C -/thegiant:4N -/thelounge35:1Z -/thelounge92:5E -/them:2D -/them_:1Z -/themaSk:3H -/themadman:3C -/themask:03 -/thenewdesu:4N -/therealemma:4G -/therestrainingorder:25 -/theruleofodds:3C -/thetasock:25 -/thief:4N -/thinking:2D -/thinkp_:6C -/thinkpad:0C -/thirstyho:3C -/thirty:09 -/thomas:1C -/thonao:6H -/thonao_:42 -/thooGi:3A -/thopas:5E -/thot:1Z -/thot_:5E -/threv:6B -/thrillho:03 -/thruways:0C -/thufir:0A -/thwack:4N -/tiberius:4C -/tickles:4G -/tidux:6B -/tidux|webchat:25 -/tigg3r:6C -/tigger:25 -/tiggers:0D -/tim1:09 -/timecrystal:4G -/timm:0C -/timmah:3C -/tin_:4C -/tire:6C -/tires:2T -/tis:40 -/tiwEllien:3C -/tiwesdaeg:03 -/tiwesdaeg1:0D -/tiwgy:4N -/tj:1C -/tj_:2T -/tj__:0D -/tj___:0C -/tjuda:42 -/tjw:09 -/tkane:6C -/tkjmlb:4C -/tkk:63 -/tkk__:4C -/tlac:03 -/tlyu:0A -/tm512:3C -/tmberg:0C -/tmlind:6B -/tmux:25 -/tmuxedo:51 -/tndez:3A -/to0n:25 -/toast__:25 -/tobias:3H -/tobo:4N -/tobo2:09 -/toddler:1Z -/todlyncz:3A -/tofu:3H -/tofu_:1C -/tokyogringo:2J -/tokyogringo`:5E -/tomchanks:51 -/tomhanks:6B -/tomhanks-:6C -/tomhanx:1Z -/tomma`:0A -/tomo:1Z -/tomo_:5E -/tony:0C -/tony-:63 -/tooFarry:2T -/toocool_:42 -/tooka:3A -/tool1:2T -/tool2:25 -/tool4:6C -/toor_:25 -/tootle:4C -/tor.hlircnet.:1C -/torax:1Z -/torbot:3C -/torbox:6B -/torgal:3C -/torvalds_jovial:42 -/tosiaki1:0C -/tosiaki2:5E -/totally_not_OutOfGum:5E -/tough:1C -/tourettes:4C -/tourmaline:42 -/toxait174115422819548835257138:51 -/toxik:0D -/tprime:6B -/tprophet:4G -/tqcdw:3M -/tqndkruj:0C -/tr3:1Z -/trafficcone:03 -/tranny4u:42 -/trans:25 -/trans-git:2J -/trans-old:3M -/trans2:0A -/transact:42 -/transacte:3M -/transtest:5E -/trapgawd:3M -/traph:3C -/trapstze:3A -/traxex:25 -/trdaisuke:6C -/trebbn:4C -/tredfghyu:03 -/tree^_^:5C -/treehugga:1Z -/treeman2:4G -/treeman5:0C -/treeman6:51 -/treeman7:3H -/treeview:3M -/treeview2:0C -/treeview3:25 -/tref:6B -/trench:4C -/trev:63 -/trev1:4N -/trey:42 -/trigex:3C -/trigex_:03 -/trilobyte:0C -/trip:0C -/trip_:09 -/tripledonkey:09 -/tripped:3C -/triques:51 -/triques4:63 -/triques6:51 -/triques9:0C -/trishi:25 -/trivalleur23:1C -/trixis:1C -/trixisowned:4G -/trn:03 -/trnv2:3M -/trn|c:09 -/trollUSA:09 -/trollfag:3P -/tron:3A -/tronic:4C -/trper:3A -/true-asset:3A -/trummo:4N -/trump2020:0A -/truthhurtssome:6C -/truthr:5E -/truthrx:3H -/truthvalue:25 -/trypanoss:25 -/tsal:5E -/tsarb:2D -/tsarbobma:51 -/tsarbomb-:3H -/tsarbomb_:3A -/tsarbomba:1Z -/tsarmabob:3A -/tsiegel:0A -/tsk_:1C -/tsong:51 -/tt:09 -/tt1:09 -/ttill:2T -/tubes__:63 -/tubman_:42 -/tubman__:6C -/tuinhekje:5E -/tulpa:25 -/tulpa_:09 -/tumble:1Z -/tumble_:51 -/tumbleweed:1Z -/tuna:6H -/turd:2J -/turdboy:6H -/turin:3M -/turkrapingswedes:1C -/turtle:3M -/tuy360:3A -/tuy360_:42 -/tvall:1Z -/tw0:3H -/tweak:1C -/twinkcrea:4C -/twinkiecr:51 -/twinkream:2J -/twitch069:03 -/twixisowned:25 -/twoshay:03 -/twpvhyaw:63 -/txgl3mos:3C -/tyil:4N -/tynkle:2T -/type:6B -/type0:5E -/tystratum:63 -/tytratum:3C -/tyui:09 -/tzanger:2D -/tzanger_:4N -/tzngr:4C -/u:1Z -/u0_a117:4G -/u0_a157:3H -/u0_a165:0A -/u0_a165_:3A -/u0_a202:1C -/u0_a256:6B -/u0_a313:2D -/u0_a633:3C -/u1ktMQhOW:25 -/u2NmP2:42 -/u3046:1C -/u4ea:3C -/u4ea_:2D -/u4t:5E -/uBaig:6H -/uMaike:1C -/uNeebe:3C -/uReeve:0C -/uXLGKVgqI:3M -/uXyZ9V:0C -/ub`:5E -/ubergeek:2T -/uberius:42 -/uchi:4G -/udjygrpx:3H -/uejgk:4N -/uflwrm:1C -/ufo:2B -/ugjokndk:51 -/uhTrFrXXd:09 -/uhekki:1C -/uhg:1C -/uhhhh:3P -/ui89o:40 -/uid:63 -/ujcMaMSFZ:6H -/ukkces:3H -/ukulelele:6H -/ulcerpain:25 -/ulijtzvo:3M -/ultimate-:6C -/ultimate11:2J -/ultimate11_:6H -/ultra_extreme_far_right:5E -/ultraanon:0A -/ultraanon2:6H -/ulua:1C -/umaruchan:6C -/unacked:2T -/unbanMe:4G -/uncool:1C -/undefinde7:09 -/underAnt:5C -/underd0g:1Z -/underd0g_:2J -/underdoge:6B -/underline:2D -/undream:25 -/undream_:3M -/undulum:6C -/unfo-:0C -/unickusr:3C -/unicorn:1Z -/univrsal:1C -/unixbsd:0C -/unkn00n:0C -/unkn0w7n:3C -/unkster:6A -/unkw0oN:51 -/unlqrau:09 -/unrAAlvgJ:4N -/unreal23:2B -/unrooted:09 -/unrznbl[m]:3H -/unsane:6C -/unsmoked:51 -/unstone:6C -/unwrappin:1C -/uoam:03 -/uoya:25 -/uoya_:3A -/upfuck:5E -/upgrade:3M -/upyhpeh:4C -/uqbyuhnj:25 -/uqxhx:4G -/urhfre:03 -/urlinfo:4C -/urlinfo`:4N -/urodna:0C -/urodna_:3C -/ursa_vox:6H -/ursula:25 -/urthmover:2J -/usKt:63 -/usaezc:63 -/usedbird:6H -/user:2T -/user99200:4N -/user_:3C -/user__:0D -/user___:4N -/usernick:6C -/usr1987:25 -/usr481320:2T -/usxWieIrI:2T -/utanapischti:42 -/uther:3H -/utrvmfth:4N -/uuPB:1C -/uuVee:2J -/uvos:3H -/uw0tm8:3A -/uwvqgpgd:3M -/uxtfm:2D -/uzasof:1Z -/v:03 -/v4th0r:0A -/vFQF:3M -/vLK:3M -/vacuum:4N -/vae:0C -/vae1cpf:2D -/vae1tqp:6C -/vae1xte:0C -/vae2zs1:51 -/vae38d0:1Z -/vae3w06:4C -/vae483d:4N -/vae8705:03 -/vae8hwl:2D -/vae92rx:1Z -/vae99y9:6H -/vae_:0C -/vaeab91:2T -/vaebo5y:4N -/vaeccag:63 -/vaecx23:4G -/vaecyqw:3C -/vaed0ug:6C -/vaed8wa:25 -/vaedgub:1C -/vaedmoi:42 -/vaefj7u:5E -/vaegob7:51 -/vaei75x:3A -/vaej89o:0C -/vaejrk0:0C -/vaekc8h:6C -/vaekmov:1Z -/vaem7fg:1C -/vaemf63:4N -/vaemfbx:09 -/vaemztr:6C -/vaeoh2m:3M -/vaeolnr:63 -/vaeoped:09 -/vaeos67:09 -/vaeosj7:3H -/vaeqqkp:63 -/vaeqsii:3M -/vaesima:63 -/vaeuvrl:3M -/vaevboc:3C -/vaevjby:6H -/vaey480:2D -/vaeyqbi:3C -/vagisil:6C -/valiant:4C -/valuables:2D -/vamp1337:6B -/vamprella:03 -/vandmend:51 -/vanir:3C -/vanity:3M -/vanity-:2J -/vantawyte:0A -/vap0r_:1C -/var-g:42 -/var-g_:51 -/variableLabel:0D -/varju:63 -/vasalquaf:3M -/vash:3M -/vash-:63 -/vash_:6B -/vauvroe:6H -/vb:3C -/vbskapg:1Z -/vc:6H -/vectis:5E -/veeVoh:63 -/veiRu:0C -/vencx:63 -/vencx_:3M -/venial:3M -/venodka:3A -/ventures:2T -/venus_:6C -/venx:03 -/ver1z0n:2D -/ver1z0nn:3P -/verifier:1C -/verm1n:25 -/vert:6H -/vert2:3C -/veryvery:1C -/vet:2D -/vexorg:3M -/vexuC:42 -/vfC:2B -/vfrmedia:0D -/vicentius:0C -/videl:2D -/vigilant:42 -/vigilant`:3A -/vigilante:2D -/vigilan|:1Z -/vigole:0C -/viic:42 -/vikara_das:1C -/vikodin:4G -/vikodin_:4G -/vim:6C -/vim_user:03 -/vincenzo7:2T -/vino:6H -/vintagero:6B -/viper-:2J -/viper__:4N -/vir:25 -/virago:3M -/virginAnalyst:2D -/vish:09 -/visitoor:2J -/vita:6H -/vitimiti:6B -/viutk:1Z -/viwxcr:3C -/vix:40 -/vixen`_:1C -/vlad:1C -/vlad-:3A -/vmz:40 -/vnc-:09 -/vodka:4N -/vodka_:4N -/voet:42 -/vohHo:0A -/voice4u:4C -/voice_of_reason:4N -/voicemepl:1C -/voicepls:3M -/voiceplx:25 -/voidP0inter:3A -/voiddwm_:63 -/voidhlwm:42 -/voidhlwm_:4N -/volusto:4C -/vortex:4C -/vp:2D -/vpnbase:2T -/vprowl:3C -/vprowless:6B -/vpw:4G -/vr0n:6B -/vr0n1:6B -/vr0n2:6B -/vr0nmas:6B -/vr0nmas2:6B -/vr0nmas3:6B -/vraphim:5E -/vraphim_:0D -/vrelchott:25 -/vrl:2T -/vroomfondel:0C -/vrshfp:2J -/vscefj:4N -/vtgoneh:3H -/vueafk:25 -/vujxt:6C -/vvjkk:3A -/vvv_:6B -/vwehpreq:3H -/vx:25 -/w:42 -/w0bos:3A -/w0nder:63 -/w0rd:2J -/w0rd_:3H -/w0red:2D -/w0rhed:2T -/w0rm:0C -/w10x12:1C -/w10x121:42 -/w3stside:6B -/wDZY:6H -/wGumbie:0C -/wJVeZoc:6N -/waax:2T -/wagonbird:51 -/wakaranai:1C -/waleed:51 -/walrus:6B -/wang:51 -/wangs:6B -/wangx:09 -/wankEboi:25 -/warmbrake:42 -/warsawiol:3M -/warsoul:09 -/wasd55:6B -/wasd55_:25 -/wattlings:1Z -/waveclaw:0D -/waveclaw_:3A -/waveframe:2J -/waw:2J -/waylon531:3A -/wayne:51 -/wayne_:6H -/wb9814:0A -/wbwj:6B -/wdna:09 -/wdz:09 -/we_____:4C -/wear:25 -/weather:42 -/webslayer:2D -/wednesday:3A -/wednesday_:3C -/weds:63 -/weds_:3M -/weeHiz:0A -/weeds:0C -/weekend:2T -/weekend-away:6C -/weekoro:3M -/weems:2D -/weird:2J -/wer1:3M -/wer2:3M -/wer3:3M -/wer4:3M -/wer5:3M -/werejag:2J -/werewolf:3C -/werrejag:2T -/wervenyt:4N -/west:6C -/westerns:03 -/westor:25 -/westor{off}:3M -/wfUauWQ:0A -/wfnincor:0D -/wfnintor:1Z -/wfnintr:3M -/wfnintr_:3M -/wfnintr___:3M -/whatwut:0C -/wheat:3C -/wheresmyv:2D -/whiplash:09 -/whirlygig:42 -/whispers:4N -/whitecaps:0C -/whitetras:0A -/whitey:5E -/whjuwb:09 -/whoami:1Z -/whodini:6B -/whoef:09 -/whoflungpoop:3A -/whoops:03 -/whore:4N -/whtes:3M -/whuntley:51 -/whyiseveryonecha:6C -/wiavb:0C -/wikkid:0C -/wil:2J -/wil_:2T -/wildting:4G -/wildting2:03 -/wildting4:42 -/wildtingTwo:6B -/wilkie:0C -/william:3A -/wilsonk|2:6C -/wilt3d:0C -/wilt3d_:4N -/win:6H -/win95:6B -/win98:6B -/windsok:2B -/wink:2D -/winny:6B -/wirss:1C -/wise:1Z -/wise_:6C -/wise__:6B -/wisefool:3C -/wiseguy:3M -/wiseone:42 -/wishbone:25 -/wizard:4N -/wizarddude:0C -/wizrd:2D -/wizrd_:3H -/wjmnmeuq:42 -/wk:1C -/wkr4k4r:09 -/wkuwxk:4N -/wleslie:51 -/wleslie_:4G -/wlsn:2J -/wlsseksv:4G -/wmllximz:3H -/wnqubdx:4C -/wo0GieWoO:3C -/wof:4N -/wof_:4N -/wof__:4G -/wojo:3H -/wombat:3C -/wombat_:25 -/womble2:03 -/wompum:3C -/wonder:6H -/woofwoof:1Z -/wook:0D -/wook_____:3C -/wooky:1C -/wooky__:3A -/wordpress:63 -/workdays:6B -/worst_alternative:03 -/worstwish:0D -/wowaname:03 -/woyzz:1C -/wpsoonkh:6H -/wqphasi:3H -/wrapper:0C -/wredny:2D -/wreo:42 -/wrex:03 -/wrjeod:25 -/wrqhw:1C -/wsco:2D -/wsgkx:63 -/wslahr:51 -/wsmith:2D -/wsnnPVBoA:63 -/wtfanon:2J -/wtweek:3C -/wurrier:2D -/wut:3A -/wuvjfq:3H -/wuwei:6H -/www:3C -/wyaei:2T -/wyldmagyc:09 -/wylel:0D -/wymillerlinux:1Z -/wyn:3A -/wynton_boomer:6H -/wyrm:6B -/wytau:63 -/x:3C -/x-amy-x:4C -/x-fag:3H -/x-girl:1C -/x0:0A -/x11r72:0C -/x1bncwn:1C -/x1bncwn_:5C -/x1bncwn__:6N -/x3mboy:6H -/x3pom:3P -/x507:0C -/x7z:6C -/x90:6C -/xAsh:42 -/xDemonessx:3H -/xGps:4G -/xGumbie:25 -/xKqK:4N -/xLara:6B -/xLink:0D -/xSubZer0x:0C -/xVgZdftRO:3A -/xYaA:0C -/x_:6B -/x_x:1Z -/xa0s:2J -/xadammr:2J -/xade:42 -/xaePhu:5E -/xanban:0C -/xanban6:2J -/xaphod:0C -/xaphod1:4N -/xargs1:3A -/xart:4C -/xartet:42 -/xartet-:2D -/xartet--:3H -/xartet_:4C -/xartet__:3M -/xavier:2T -/xaviercm63:63 -/xb0ner:2D -/xbbitfm:3A -/xbeastx:1Z -/xbfuxp:6C -/xbhjxk:51 -/xbmhy:0A -/xboner:4C -/xbpyyx:0A -/xc:42 -/xczzcas:3A -/xc|:0D -/xdaff:42 -/xdragon:4C -/xecut:25 -/xeeder:1C -/xelpapus:5E -/xeni:42 -/xeno:2J -/xeno_:4G -/xero:0C -/xerrox:0C -/xerrox_:3A -/xes_:5E -/xes__:4N -/xfskoo:3C -/xhigb:6H -/xiXai:3C -/xikkub:2D -/xiktc:6B -/xinnie:1Z -/xioGh:63 -/xjcyq:4C -/xkwgre:6C -/xld:3H -/xlei:6C -/xmage:6C -/xmn:3A -/xmyicyu:6H -/xnaas:0D -/xnaas2:42 -/xnaas7:4N -/xokfealn:25 -/xolhbj:3H -/xorhash:4N -/xoutxin:1Z -/xqndpk:6B -/xqxvjr:0C -/xrmjlwcz:4C -/xs:3M -/xspfgoqt:1Z -/xtc:25 -/xtc-:1Z -/xtfcpdm:6H -/xtor:42 -/xtraterra:3H -/xuu:3C -/xvcusv:42 -/xxaY:3H -/xxld:0C -/xxx32:3H -/xxxxx:51 -/xyte:09 -/xz:6B -/y0m5CQtGb:2J -/y91y91y91:2T -/yDFw:0C -/yGYK1Vg:3H -/yQOX:6H -/yUpKx:09 -/yWbc:0C -/yakamo:3H -/yakuza:3C -/yall:63 -/yang:3M -/yanski:4C -/yanski_:63 -/yanu:6H -/yasoR:42 -/yaungcor:4G -/yawkvlhp:0A -/yayjman:09 -/yayoman:0C -/yayomanpatty:0C -/yayomanshatty:4N -/yaypixxo:1Z -/ybbuq:3H -/ybwfneiv:09 -/ydtotm:03 -/ydvvzqyh:4C -/ydxccjxa:3H -/yeagel:4G -/yeahok:63 -/yeeQu:4G -/yeee:3H -/yeee`:2J -/yelmxn:51 -/yenrod:1C -/yerseas:51 -/yeti:1Z -/yeti1:3H -/yeye:51 -/yeynruru:2J -/yhoxHCaj:51 -/yhsiang:09 -/yito:2J -/yjgbn:25 -/yjxbxmc:3H -/ykjsony:2T -/ylJPQu6Z:25 -/ymtdmkz:51 -/yngwizard:4N -/ynizyjq:6B -/yoduh:1C -/yoonix:0A -/yoonix-:1C -/yoonix0:3H -/yoshi15:1C -/yoss:2D -/youdontknowme:42 -/youfuckin:1C -/yourbothere:1C -/yourname:42 -/yowhbvq:3C -/yoyomiho:0A -/ypfkqig:3M -/ysyck:4G -/ytcracker:2D -/ytf0rd:2T -/ytilimuh:6B -/ytlyv97:1Z -/ytoucs:2D -/yumas:3A -/yur3i:5C -/yxhjsh:5E -/yxutqvz:63 -/yxxqpb:3H -/yyy:4G -/yzUBAy:0C -/z:03 -/z0z0:6B -/z3bra:09 -/z3n:2D -/z3ntu_:0A -/z3r0:2J -/z3uS:3A -/zFgXdqQKQ:3H -/zabxg:6C -/zacts:3M -/zahyxqxd:1C -/zakku:3C -/zakku90:09 -/zakku900:1C -/zakkus:09 -/zambia:42 -/zanetti:3H -/zapatasec:25 -/zaqtjwv:09 -/zb_:42 -/zcPq:42 -/zcrayfish:5E -/zcrbqs:6C -/zdfop:0C -/zduchac:4N -/zeamp:5E -/zeb:03 -/zebra:25 -/zedfreak:51 -/zeeshi:1C -/zeezoo:6B -/zeezoo_:6C -/zelest:3A -/zen:0C -/zen-:6C -/zeng0d:1C -/zenga:4C -/zenik:51 -/zenik-:4C -/zenik^:51 -/zenik_:3A -/zenik|:6C -/zenostar:4G -/zensor:6B -/zen|:0A -/zeougm:3H -/zephros:4G -/zeptar:3A -/zer0rest:0D -/zero:51 -/zeroNot:4G -/zerocool:4G -/zerocool0:2D -/zerodaysfordays:2J -/zerodub:3H -/zerosouls:0D -/zerous:3C -/zerous1:3A -/zeta:51 -/zethius:4N -/zfs:0D -/zfvxv:4G -/zfvxv-:0D -/zgngzzya:6H -/zgrep:3M -/zhhawgql:5E -/zhig:4N -/zi:1C -/zid:3C -/zigg:09 -/ziggys:25 -/zigzag:0C -/zinestro:51 -/zinestro_:6B -/zip:3M -/zipper:2J -/zippity:6H -/ziqlqwu:2J -/zllkemev:6H -/zlspetek:1C -/zmm:63 -/zmugee:1Z -/znEk:6C -/zneak:1C -/znedw:3H -/zneeb:0A -/zodi4c:25 -/zof:42 -/zooey:4C -/zorg:1Z -/zorg1:4G -/zoroaster:3C -/zouz:42 -/zouz_:4N -/zozo:42 -/zp:2D -/zphinx:6H -/zpkbz:3A -/zpmafkuf:1C -/zpwMjXYrF:40 -/zqjfk:2T -/zrrn:3A -/zsjrsre:03 -/ztmihhl:3A -/zuHiHu:63 -/zuexys:2D -/zujnavyi:2T -/zune:6B -/zup:4C -/zwansch:2T -/zx:3C -/zyfuob:3A -/zyklon:63 -/zylone:25 -/zylone_:6H -/zylone__:4N -/zyme:3A -/zyxx0r:2D -/zyxxor:6C -/zzenik:1C -/zzmm`:2T -/zzzzzzzzzzzzzzz:2D -/{0_o}:03 -/{nick}:5E -/{zenik}:3C -/|:51 -/|-{}-|:2D -/|00|:3P -/|23|:2T -/|3[]T:2D -/|GIG:6B -/|GIG-1:0A -/|GIG2:4N -/|V||K[][]|_[]:09 -/|WEREJAG|:6C -/|X-File|:3A -/|][][]:63 -/|beatdown:6C -/|darkwind:3C -/|dev|:2D -/|haydenh|:7H -/|iCE|:0A -/|san|:03 -/|san|-:1Z -/|silicon:3C -/|werejag:2J -/|werejag|:0A -/|werejeg|:0C -/|||||||||:0C -/}{-XP-}{:3C -/beenz/beenz:1C -/davis/davis:2J -/fixingshithopefully/fixingshithopefully:25 -/happy/happy:1Z -/hyperreal/hyperreal:1C -/ia/ia:6B -Rizon/#/g/technology/hyperreal:4N -Rizon/#8chan/Benett:4G -Rizon/#8chan/Wildstorm:0C -Rizon/#8chan/viic:03 -Rizon/#uk/Benett:03 -Rizon/#uk/Wildstorm:4C -Rizon/#uk/viic:42 -efnet/#IRC30/beenz:2J -efnet/#asciiart/haydenh:5E -efnet/#efnet/haydenh:5E -hlircnet/#hlircnet/davis:3M -hlircnet/#hlircnet/fixingshithopefully:03 -sdf/#sdf/haydenh:09 - -[set] -/NickServ:3H -/Sopel:2J -/card.freenode.net:5C -/efnet.port80.se:6N -/freenode-connect:40 -/hhvn:7H -/irc.haydenvh.com:3C -/irc.nebulacentre.net:09 -/irc.sdf.org:2D -/legended:4G -/thufir:0A -/unix.chat:03 diff --git a/.config/irssi/scripts/autorun/README b/.config/irssi/scripts/autorun/README @@ -1,21 +0,0 @@ - -ascii.pl: - /ASCII [-c1234] [-f <fontname>] [-p <prefix>] [-l|-s|-m <where>] <text> - /COLSAY [-1234] [-m <where>] <text> - /COLME [-1234] <text> - /COLTOPIC [-1234] <text> - /COLKICK [-1234] [nick(,nick_1,...,nick_n)] <reason> - /COLQUIT [-1234] <reason> - /SET ascii_figlet_path [path] - -auto_whois: - all is handled by itself - -nickcolor.pl: - all is handled by itself - -url_hilight.pl: - all is handled by itself - -usercount.pl: - all is handled by itself diff --git a/.config/irssi/scripts/autorun/adv_windowlist.pl b/.config/irssi/scripts/autorun/adv_windowlist.pl @@ -1,2954 +0,0 @@ -use strict; -use warnings; - -our $VERSION = '1.9'; # 32a6d4807a45e71 -our %IRSSI = ( - authors => 'Nei', - contact => 'Nei @ anti@conference.jabber.teamidiot.de', - url => "http://anti.teamidiot.de/", - name => 'adv_windowlist', - description => 'Adds a permanent advanced window list on the right or in a status bar.', - sbitems => 'awl_shared', - license => 'GNU GPLv2 or later', - ); - -# UPGRADE NOTE -# ============ -# for users of 0.7 or earlier series, please note that appearance -# settings have moved to /format, i.e. inside your theme! -# the fifo (screen) has been replaced by an external viewer script - -# Usage -# ===== -# copy the script to ~/.irssi/scripts/ -# -# In irssi: -# -# /run adv_windowlist -# -# In your shell (for example a tmux split): -# -# perl ~/.irssi/scripts/adv_windowlist.pl -# -# To use sbar mode instead: -# -# /toggle awl_viewer -# -# Hint: to get rid of the old [Act:] display -# /statusbar window remove act -# -# to get it back: -# /statusbar window add -after lag -priority 10 act - -# Options -# ======= -# formats can be cleared with /format -delete -# -# /format awl_display_(no)key(_active|_visible) <string> -# * string : Format String for one window. The following $'s are expanded: -# $C : Name -# $N : Number of the Window -# $Q : meta-Keymap -# $H : Start hilighting -# $S : Stop hilighting -# /+++++++++++++++++++++++++++++++++, -# | **** I M P O R T A N T : **** | -# | | -# | don't forget to use $S if you | -# | used $H before! | -# | | -# '+++++++++++++++++++++++++++++++++/ -# key : a key binding that goes to this window could be detected in /bind -# nokey : no such key binding was detected -# active : window would receive the input you are currently typing -# visible : window is also visible on screen but not active (a split window) -# -# /format awl_name_display <string> -# * string : Format String for window names -# $0 : name as formatted by the settings -# -# /format awl_display_header <string> -# * string : Format String for this header line. The following $'s are expanded: -# $C : network tag -# -# /format awl_separator(2) <string> -# * string : Character to use between the channel entries -# variant 2 can be used for alternating separators (only in status bar -# without block display) -# -# /format awl_abbrev_chars <string> -# * string : Character to use when shortening long names. The second character -# will be used if two blocks need to be filled. -# -# /format awl_title <string> -# * string : Text to display in the title string or title bar -# -# /format awl_viewer_item_bg <string> -# * string : Format String specifying the viewer's item background colour -# -# /set awl_prefer_name <ON|OFF> -# * this setting decides whether awl will use the active_name (OFF) or the -# window name as the name/caption in awl_display_*. -# That way you can rename windows using /window name myownname. -# -# /set awl_hide_empty <num> -# * if visible windows without items should be hidden from the window list -# set it to 0 to show all windows -# 1 to hide visible windows without items (negative exempt -# active window) -# -# /set awl_detach <list> -# * list of windows that should be hidden from the window list. you -# can also use /awl detach and /awl attach to manage this -# setting. an optional data_level can be specified with ",num" -# -# /set awl_detach_data <num> -# * num : hide the detached window if its data_level is below num -# -# /set awl_detach_aht <ON|OFF> -# * if enabled, also detach all windows listed in the -# activity_hide_targets setting -# -# /set awl_hide_data <num> -# * num : hide the window if its data_level is below num -# set it to 0 to basically disable this feature, -# 1 if you don't want windows without activity to be shown -# 2 to show only those windows with channel text or hilight -# 3 to show only windows with hilight (negative exempt active window) -# -# /set awl_hide_name_data <num> -# * num : hide the name of the window if its data_level is below num -# (only works in status bar without block display) -# you will want to change your formats to add $H...$S around $Q or $N -# if you plan to use this -# -# /set awl_maxlines <num> -# * num : number of lines to use for the window list (0 to disable, negative -# lock) -# -# /set awl_maxcolumns <num> -# * num : number of columns to use for the window list when using the -# tmux integration (0 to disable) -# -# /set awl_block <num> -# * num : width of a column in viewer mode (negative values = block -# display in status bar mode) -# /+++++++++++++++++++++++++++++++++, -# | ****** W A R N I N G ! ****** | -# | | -# | If your block display looks | -# | DISTORTED, you need to add the | -# | following line to your .theme | -# | file under | -# | abstracts = { : | -# | | -# | sb_act_none = "%K$*"; | -# | | -# '+++++++++++++++++++++++++++++++++/ -# -# /set awl_sbar_maxlength <ON|OFF> -# * if you enable the maxlength setting, the block width will be used as a -# maximum length for the non-block status bar mode too. -# -# /set awl_height_adjust <num> -# * num : how many lines to leave empty in viewer mode -# -# /set awl_sort <-data_level|-last_line|refnum> -# * you can change the window sort order with this variable -# -data_level : sort windows with hilight first -# -last_line : sort windows in order of activity -# refnum : sort windows by window number -# active/server/tag : sort by server name -# lru : sort windows with the last recently used last -# "-" reverses the sort order -# typechecks are supported via ::, e.g. active::Query or active::Irc::Query -# undefinedness can be checked with ~, e.g. ~active -# string comparison can be done with =, e.g. name=(status) -# to make sort case insensitive, use #i, e.g. name#i -# any key in the window hash can be tested, e.g. active/chat_type=XMPP -# multiple criteria can be separated with , or +, e.g. -data_level+-last_line -# -# /set awl_placement <top|bottom> -# /set awl_position <num> -# * these settings correspond to /statusbar because awl will create -# status bars for you -# (see /help statusbar to learn more) -# -# /set awl_all_disable <ON|OFF> -# * if you set awl_all_disable to ON, awl will also remove the -# last status bar it created if it is empty. -# As you might guess, this only makes sense with awl_hide_data > 0 ;) -# -# /set awl_viewer <ON|OFF> -# * enable the external viewer script -# -# /set awl_viewer_launch <ON|OFF> -# * try to auto-launch the viewer under tmux or with a shell command -# /awl restart is required all auto-launch related settings to take -# effect -# -# /set awl_viewer_tmux_position <left|top|right|bottom|custom> -# * try to split in this direction when using tmux for the viewer -# custom : use custom_command setting -# -# /set awl_viewer_xwin_command <shell command> -# * custom command to run in order to start the viewer when irssi is -# running under X -# %A - gets replaced by the command to run the viewer -# %qA - additionally quote the command -# -# /set awl_viewer_custom_command <shell command> -# * custom command to run in order to start the viewer -# -# /set awl_viewer_launch_env <string> -# * specific environment settings for use on viewer auto-launch, -# without the AWL_ prefix -# -# /set awl_shared_sbar <left<right|OFF> -# * share a status bar for the first awl item, you will need to manually -# /statusbar window add -after lag -priority 10 awl_shared -# left : space in cells occupied on the left of status bar -# right : space occupied on the right -# Note: you need to replace "left" AND "right" with the appropriate numbers! -# -# /set awl_path <path> -# * path to the file which the viewer script reads -# -# /set fancy_abbrev <no|head|strict|fancy> -# * how to shorten too long names -# no : shorten in the middle -# head : always cut off the ends -# strict : shorten repeating substrings -# fancy : combination of no+strict -# -# /set awl_custom_xform <perl code> -# * specify a custom routine to transform window names -# example: s/^#// remove the #-mark of IRC channels -# the special flags $CHANNEL / $TAG / $QUERY / $NAME can be -# tested in conditionals -# -# /set awl_last_line_shade <timeout> -# * set timeout to shade activity base colours, to enable -# you also need to add +-last_line to awl_sort -# (requires 256 colour support) -# -# /set awl_no_mode_hint <ON|OFF> -# * whether to show the hint of running the viewer script in the -# status bar -# -# /set awl_mouse <ON|OFF> -# * enable the terminal mouse in irssi -# (use the awl-patched mouse.pl for gestures and commands if you need -# them and disable mouse_escape) -# -# /set awl_mouse_offset <num> -# * specifies where on the screen is the awl status bar -# (0 = on top/bottom, 1 = one additional line in between, -# e.g. prompt) -# you MUST set this correctly otherwise the mouse coordinates will -# be off -# -# /set mouse_scroll <num> -# * how many lines the mouse wheel scrolls -# -# /set mouse_escape <num> -# * seconds to disable the mouse, when not clicked on the windowlist -# - -# Commands -# ======== -# /awl detach <num> -# * hide the current window from the window list. num specifies the -# data_level (optional) -# -# /awl attach -# * unhide the current window from the window list -# -# /awl ack -# * change to the next window with activity, ignoring detached windows -# -# /awl redraw -# * redraws the windowlist. There may be occasions where the -# windowlist can get destroyed so you can use this command to -# force a redraw. -# -# /awl restart -# * restart the connection to the viewer script. - -# Viewer script -# ============= -# When run from the command line, adv_windowlist acts as the viewer -# script to be used together with the irssi script to display the -# window list in a sidebar/terminal of its own. -# -# One optional parameter is accepted, the awl_path -# -# The viewer can be configured by three environment variables: -# -# AWL_HI9=1 -# * interpret %9 as high-intensity toggle instead of bold. This had -# been the default prior to version 0.9b8 -# -# AWL_AUTOFOCUS=0 -# * disable auto-focus behaviour when activating a window -# -# AWL_NOTITLE=1 -# * disable the title bar - -# Nei =^.^= ( anti@conference.jabber.teamidiot.de ) - -no warnings 'redefine'; -use constant IN_IRSSI => __PACKAGE__ ne 'main' || $ENV{IRSSI_MOCK}; -use constant SCRIPT_FILE => __FILE__; -no if !IN_IRSSI, strict => (qw(subs refs)); -use if IN_IRSSI, Irssi => (); -use if IN_IRSSI, 'Irssi::TextUI' => (); -use v5.10; -use Encode; -use Storable (); -use IO::Socket::UNIX; -use List::Util qw(min max reduce); -use Hash::Util qw(lock_keys); -use Text::ParseWords qw(shellwords); - -BEGIN { - if ($] < 5.012) { - *CORE::GLOBAL::length = *CORE::GLOBAL::length = sub (_) { - defined $_[0] ? CORE::length($_[0]) : undef - }; - } - *Irssi::active_win = {}; # hide incorrect warning -} - -unless (IN_IRSSI) { - local *_ = \@ARGV; - &AwlViewer::main; - exit; -} - - -use constant GLOB_QUEUE_TIMER => 100; - -our $BLOCK_ALL; # localized blocker -my @actString; # status bar texts -my @win_items; -my $currentLines = 0; -my %awins; -my $globTime; # timer to limit remake calls - -my %CHANGED; -my $VIEWER_MODE; -my $MOUSE_ON; -my %mouse_coords; -my %statusbars; -my %S; # settings -my $settings_str = '1'; -my $window_sort_func; -my $custom_xform; -my ($sb_base_width, $sb_base_width_pre, $sb_base_width_post); -my $print_text_activity; -my $shade_line_timer; -my ($screenHeight, $screenWidth); -my %viewer; - -my (%keymap, %nummap, %wnmap, %specialmap, %wnmap_exp, %custom_key_map); -my %banned_channels; -my %detach_map; -my %abbrev_cache; - -use constant setc => 'awl'; - -sub set ($) { - setc . '_' . $_[0] -} - -sub add_statusbar { - for (@_) { - # add subs - my $l = set $_; - { - my $close = $_; - no strict 'refs'; - *{$l} = sub { awl($close, @_) }; - } - Irssi::command("^statusbar $l reset"); - Irssi::command("statusbar $l enable"); - if (lc $S{placement} eq 'top') { - Irssi::command("statusbar $l placement top"); - } - if (my $x = $S{position}) { - Irssi::command("statusbar $l position $x"); - } - Irssi::command("statusbar $l add -priority 100 -alignment left barstart"); - Irssi::command("statusbar $l add $l"); - Irssi::command("statusbar $l add -priority 100 -alignment right barend"); - Irssi::command("statusbar $l disable"); - Irssi::statusbar_item_register($l, '$0', $l); - $statusbars{$_} = 1; - Irssi::command("statusbar $l enable"); - } -} - -sub remove_statusbar { - for (@_) { - my $l = set $_; - Irssi::command("statusbar $l disable"); - Irssi::command("statusbar $l reset"); - Irssi::statusbar_item_unregister($l); - { - no strict 'refs'; - undef &{$l}; - } - delete $statusbars{$_}; - } -} - -my $awl_shared_empty = sub { - return if $BLOCK_ALL; - my ($item, $get_size_only) = @_; - $item->default_handler($get_size_only, '', '', 0); -}; - -sub syncLines { - my $maxLines = $S{maxlines}; - my $newLines = ($maxLines > 0 and @actString > $maxLines) ? - $maxLines : - ($maxLines < 0) ? - -$maxLines : - @actString; - $currentLines = 1 if !$currentLines && $S{shared_sbar}; - if ($S{shared_sbar} && !$statusbars{shared}) { - my $l = set 'shared'; - { - no strict 'refs'; - *{$l} = sub { - return if $BLOCK_ALL; - my ($item, $get_size_only) = @_; - - my $text = $actString[0]; - my $title = _get_format(set 'title'); - if (length $title) { - $title =~ s{\\(.)|(.)}{ - defined $2 ? quotemeta $2 - : $1 eq 'V' ? '\u' - : $1 eq ':' ? quotemeta ':%n' - : $1 =~ /^[uUFQE]$/ ? "\\$1" - : quotemeta "\\$1" - }sge; - $title = eval qq{"$title"}; - $title .= ' '; - } - my $pat = defined $text ? "{sb_awl $title\$*}" : '{sb_awl }'; - $text //= ''; - $item->default_handler($get_size_only, $pat, $text, 0); - }; - } - $statusbars{shared} = 1; - remove_statusbar (0) if $statusbars{0}; - } - elsif ($statusbars{shared} && !$S{shared_sbar}) { - add_statusbar (0) if $currentLines && $newLines; - delete $statusbars{shared}; - my $l = set 'shared'; - { - no strict 'refs'; - *{$l} = $awl_shared_empty; - } - } - if ($currentLines == $newLines) { return; } - elsif ($newLines > $currentLines) { - add_statusbar ($currentLines .. ($newLines - 1)); - } - else { - remove_statusbar (reverse ($newLines .. ($currentLines - 1))); - } - $currentLines = $newLines; -} - -sub awl { - return if $BLOCK_ALL; - my ($line, $item, $get_size_only) = @_; - - my $text = $actString[$line]; - my $pat = defined $text ? '{sb_awl $*}' : '{sb_awl }'; - $text //= ''; - $item->default_handler($get_size_only, $pat, $text, 0); -} - -# remove old statusbars -{ my %killBar; - sub get_old_status { - my ($textDest, $cont, $cont_stripped) = @_; - if ($textDest->{level} == 524288 and $textDest->{target} eq '' and !defined $textDest->{server}) { - my $name = quotemeta(set ''); - if ($cont_stripped =~ m/^$name(\d+)\s/) { $killBar{$1} = 1; } - Irssi::signal_stop; - } - } - sub killOldStatus { - %killBar = (); - Irssi::signal_add_first('print text' => 'get_old_status'); - Irssi::command('statusbar'); - Irssi::signal_remove('print text' => 'get_old_status'); - remove_statusbar(keys %killBar); - } -} - -sub _add_map { - my ($type, $target, $map) = @_; - ($type->{$target}) = sort { length $a <=> length $b || $a cmp $b } - $map, exists $type->{$target} ? $type->{$target} : (); -} - -sub get_keymap { - my ($textDest, undef, $cont_stripped) = @_; - if ($textDest->{level} == 524288 and $textDest->{target} eq '' and !defined $textDest->{server}) { - my $one_meta_or_ctrl_key = qr/((?:meta-)*?)(?:(meta-|\^)(\S)|(\w+))/; - $cont_stripped = as_uni($cont_stripped); - if ($cont_stripped =~ m/((?:$one_meta_or_ctrl_key-)*$one_meta_or_ctrl_key)\s+(.*)$/) { - my ($combo, $command) = ($1, $10); - my $map = ''; - while ($combo =~ s/(?:-|^)$one_meta_or_ctrl_key$//) { - my ($level, $ctl, $key, $nkey) = ($1, $2, $3, $4); - my $numlevel = ($level =~ y/-//); - $ctl = '' if !$ctl || $ctl ne '^'; - $map = ('-' x ($numlevel%2)) . ('+' x ($numlevel/2)) . - $ctl . (defined $key ? $key : "\01$nkey\01") . $map; - } - for ($command) { - last unless length $map; - if (/^change_window (\d+)/i) { - _add_map(\%nummap, $1, $map); - } - elsif (/^(?:command window goto|change_window) (\S+)/i) { - my $window = $1; - if ($window !~ /\D/) { - _add_map(\%nummap, $window, $map); - } - elsif (lc $window eq 'active') { - _add_map(\%specialmap, '_active', $map); - } - else { - _add_map(\%wnmap, $window, $map); - } - } - elsif (/^(?:active_window|command ((awl )?ack))/i) { - _add_map(\%specialmap, '_active', $map); - $viewer{use_ack} = $1; - } - elsif (/^command window last/i) { - _add_map(\%specialmap, '_last', $map); - } - elsif (/^(?:upper_window|command window up)/i) { - _add_map(\%specialmap, '_up', $map); - } - elsif (/^(?:lower_window|command window down)/i) { - _add_map(\%specialmap, '_down', $map); - } - elsif (/^key\s+(\w+)/i) { - $custom_key_map{$1} = $map; - } - } - } - Irssi::signal_stop; - } -} - -sub update_keymap { - %nummap = %wnmap = %specialmap = %custom_key_map = (); - Irssi::signal_remove('command bind' => 'watch_keymap'); - Irssi::signal_add_first('print text' => 'get_keymap'); - Irssi::command('bind'); - Irssi::signal_remove('print text' => 'get_keymap'); - for (keys %custom_key_map) { - if (exists $custom_key_map{$_} && - $custom_key_map{$_} =~ s/\01(\w+)\01/exists $custom_key_map{$1} ? $custom_key_map{$1} : "\02"/ge) { - if ($custom_key_map{$_} =~ /\02/) { - delete $custom_key_map{$_}; - } - else { - redo; - } - } - } - for my $keymap (\(%specialmap, %wnmap, %nummap)) { - for (keys %$keymap) { - if ($keymap->{$_} =~ s/\01(\w+)\01/exists $custom_key_map{$1} ? $custom_key_map{$1} : "\02"/ge) { - if ($keymap->{$_} =~ /\02/) { - delete $keymap->{$_}; - } - } - } - } - Irssi::signal_add('command bind' => 'watch_keymap'); - delete $viewer{client_keymap}; - &wl_changed; -} - -# watch keymap changes -sub watch_keymap { - Irssi::timeout_add_once(1000, 'update_keymap', undef); -} - -{ my %strip_table = ( - # fe-common::core::formats.c:format_expand_styles - # delete format_backs format_fores bold_fores other stuff - (map { $_ => '' } (split //, '04261537' . 'kbgcrmyw' . 'KBGCRMYW' . 'U9_8I:|FnN>#[' . 'pP')), - # escape - (map { $_ => $_ } (split //, '{}%')), - ); - sub ir_strip_codes { # strip %codes - my $o = shift; - $o =~ s/(%(%|Z.{6}|z.{6}|X..|x..|.))/exists $strip_table{$2} ? $strip_table{$2} : - $2 =~ m{x(?:0[a-f]|[1-6][0-9a-z]|7[a-x])|z[0-9a-f]{6}}i ? '' : $1/gex; - $o - } -} -## ir_parse_special -- wrapper around parse_special -## $i - input format -## $args - array ref of arguments to format -## $win - different target window (default current window) -## $flags - different kind of escape flags (default 4|8) -## returns formatted str -sub ir_parse_special { - my $o; - my $i = shift; - my $args = shift // []; - y/ /\177/ for @$args; # hack to escape spaces - my $win = shift || Irssi::active_win; - my $flags = shift // 0x4|0x8; - my @cmd_args = ($i, (join ' ', @$args), $flags); - my $server = Irssi::active_server(); - if (ref $win and ref $win->{active}) { - $o = $win->{active}->parse_special(@cmd_args); - } - elsif (ref $win and ref $win->{active_server}) { - $o = $win->{active_server}->parse_special(@cmd_args); - } - elsif (ref $server) { - $o = $server->parse_special(@cmd_args); - } - else { - $o = &Irssi::parse_special(@cmd_args); - } - $o =~ y/\177/ /; - $o -} - -sub sb_format_expand { # Irssi::current_theme->format_expand wrapper - Irssi::current_theme->format_expand( - $_[0], - ( - Irssi::EXPAND_FLAG_IGNORE_REPLACES - | - ($_[1] ? 0 : Irssi::EXPAND_FLAG_IGNORE_EMPTY) - ) - ) -} - -{ my $term_type = Irssi::version > 20040819 ? 'term_charset' : 'term_type'; - if (Irssi->can('string_width')) { - *screen_length = sub { Irssi::string_width($_[0]) }; - } - else { - local $@; - eval { require Text::CharWidth; }; - unless ($@) { - *screen_length = sub { Text::CharWidth::mbswidth($_[0]) }; - } - else { - my $err = $@; chomp $err; $err =~ s/\sat .* line \d+\.$//; - #Irssi::print("%_$IRSSI{name}: warning:%_ Text::CharWidth module failed to load. Length calculation may be off! Error was:"); - print "%_$IRSSI{name}:%_ $err"; - *screen_length = sub { - my $temp = shift; - if (lc Irssi::settings_get_str($term_type) eq 'utf-8') { - Encode::_utf8_on($temp); - } - length($temp) - }; - } - } - sub as_uni { - no warnings 'utf8'; - Encode::decode(Irssi::settings_get_str($term_type), $_[0], 0) - } - sub as_tc { - Encode::encode(Irssi::settings_get_str($term_type), $_[0], 0) - } -} - -sub sb_length { - screen_length(ir_strip_codes($_[0])) -} - -sub run_custom_xform { - local $@; - eval { - $custom_xform->() - }; - if ($@) { - $@ =~ /^(.*)/; - print '%_'.(set 'custom_xform').'%_ died (disabling): '.$1; - $custom_xform = undef; - } -} - -sub remove_uniform { - my $o = shift; - $o =~ s/^xmpp:(.*?[%@]).+\.[^.]+$/$1/ or - $o =~ s#^psyc://.+\.[^.]+/([@~].*)$#$1#; - if ($custom_xform) { - run_custom_xform() for $o; - } - $o -} - -sub remove_uniform_vars { - my $win = shift; - my $name = __PACKAGE__ . '::custom_xform::' . $win->{active}{type} - if ref $win->{active} && $win->{active}{type}; - no strict 'refs'; - local ${$name} = 1 if $name; - remove_uniform(+shift); -} - -sub lc1459 { - my $x = shift; - $x =~ y/][\\^/}{|~/; - lc $x -} - -sub window_list { - my $i = 0; - map { $_->[1] } sort $window_sort_func map { [ $i++, $_ ] } Irssi::windows; -} - -sub _calculate_abbrev { - my ($wins, $abbrevList) = @_; - if ($S{fancy_abbrev} !~ /^(no|off|head)/i) { - my @nameList = map { ref $_ ? remove_uniform_vars($_, as_uni($_->get_active_name) // '') : '' } @$wins; - for (my $i = 0; $i < @nameList - 1; ++$i) { - my ($x, $y) = ($nameList[$i], $nameList[$i + 1]); - s/^[+#!=]// for $x, $y; - my $res = exists $abbrev_cache{$x}{$y} ? $abbrev_cache{$x}{$y} - : $abbrev_cache{$x}{$y} = string_LCSS($x, $y); - if (defined $res) { - for ($nameList[$i], $nameList[$i + 1]) { - $abbrevList->{$_} //= int((index $_, $res) + (length $res) / 2); - } - } - } - } -} - -my %act_last_line_shades = ( - r => [qw[ 50 40 30 20 ]], - g => [qw[ 1O 1I 1C 16 ]], - y => [qw[ 5O 4I 3C 26 ]], - b => [qw[ 15 14 13 12 ]], - m => [qw[ 54 43 32 21 ]], - c => [qw[ 1S 1L 1E 17 ]], - w => [qw[ 7W 7T 7Q 3E ]], - K => [qw[ 7M 7K 27 7H ]], - R => [qw[ 60 50 40 30 ]], - G => [qw[ 1U 1O 1I 1C ]], - Y => [qw[ 6U 5O 4I 3C ]], - B => [qw[ 2B 2A 29 28 ]], - M => [qw[ 65 54 43 32 ]], - C => [qw[ 1Z 1S 1L 1E ]], - W => [qw[ 6Z 5S 7R 7O ]], - ); - -sub _format_display { - my (undef, $format, $cformat, $hilight, $name, $number, $key, $win) = @_; - if ($print_text_activity && $S{line_shade}) { - my @hilight_code = split /\177/, sb_format_expand("{$hilight \177}"), 2; - my $max_time = max(1, log($S{line_shade}) - log(1000)); - my $time_delta = min(3, min($max_time, log(max(1, time - $win->{last_line}))) / $max_time * 3); - if ($hilight_code[0] =~ /%(.)/ && exists $act_last_line_shades{$1}) { - $hilight = 'sb_act_hilight_color %X'.$act_last_line_shades{$1}[$time_delta]; - } - } - $cformat = '$0' unless length $cformat; - my %map = ('$C' => $cformat, '$N' => '$1', '$Q' => '$2'); - $format =~ s<(\$.)><$map{$1}//$1>ge; - $format =~ s<\$H((?:\$.|[^\$])*?)\$S><{$hilight $1%n}>g; - my @ret = ir_parse_special(sb_format_expand($format), [$name, $number, $key], $win); - @ret -} - -sub _get_format { - Irssi::current_theme->get_format(__PACKAGE__, @_) -} - -sub _is_detached { - my ($win, $active_number) = @_; - my $level = $win->{data_level} // 0; - my $number = $win->{refnum}; - my $name = lc1459( as_uni($win->{name}) ); - my $active = lc1459( as_uni($win->get_active_name) // '' ); - my $tag = $win->{active} && $win->{active}{server} ? lc1459( as_uni($win->{active}{server}{tag}) // '' ) : ''; - my @cond = ($number); - push @cond, "$name" if length $name; - push @cond, "$tag/$active" if length $tag && length $active; - push @cond, "$active" if length $active; - push @cond, "$tag/*", "$tag/::all" if length $tag; - push @cond, "*", "::all"; - for my $cond (@cond) { - if (exists $detach_map{ $cond }) { - my $dd = $detach_map{ $cond } // $S{detach_data}; - return $win->{data_level} < abs $dd - && ($number != $active_number || 0 <= $dd); - } - } - return; -} - -sub _calculate_items { - my ($wins, $abbrevList) = @_; - - my $display_header = _get_format(set 'display_header'); - my $name_format = _get_format(set 'name_display'); - my $abbrev_chars = as_uni(_get_format(set 'abbrev_chars')); - - my %displays; - - my $active = Irssi::active_win; - @win_items = (); - %keymap = (%nummap, %wnmap_exp); - - my ($numPad, $keyPad) = (0, 0); - if ($VIEWER_MODE or $S{block} < 0) { - $numPad = length((sort { length $b <=> length $a } keys %keymap)[0]) // 0; - $keyPad = length((sort { length $b <=> length $a } values %keymap)[0]) // 0; - } - my $last_net; - my ($abbrev1, $abbrev2) = $abbrev_chars =~ /(\X)(.*)/; - my @abbrev_chars = ('~', "\x{301c}"); - unless (defined $abbrev1 && screen_length(as_tc($abbrev1)) == 1) { $abbrev1 = $abbrev_chars[0] } - unless (length $abbrev2) { - $abbrev2 = $abbrev1; - if ($abbrev1 eq $abbrev_chars[0]) { - $abbrev2 = $abbrev_chars[1]; - } - else { - $abbrev2 = $abbrev1; - } - } - if (screen_length(as_tc($abbrev2)) == 1) { - $abbrev2 x= 2; - } - while (screen_length(as_tc($abbrev2)) > 2) { - chop $abbrev2; - } - unless (screen_length(as_tc($abbrev2)) == 2) { - $abbrev2 = $abbrev_chars[1]; - } - for my $win (@$wins) { - my $global_tag_header_mode; - - next unless ref $win; - - my $backup_win = Storable::dclone($win); - delete $backup_win->{active} unless ref $backup_win->{active}; - - $global_tag_header_mode = - $display_header && ($last_net // '') ne ($backup_win->{active}{server}{tag} // ''); - - if ($win->{data_level} < abs $S{hide_data} - && ($win->{refnum} != $active->{refnum} || 0 <= $S{hide_data})) { - next; } - elsif (exists $awins{$win->{refnum}} && $S{hide_empty} && !$win->items - && ($win->{refnum} != $active->{refnum} || 0 <= $S{hide_empty})) { - next; } - elsif (_is_detached($win, $active->{refnum})) { - next; } - - my $colour = $win->{hilight_color} // ''; - my $hilight = do { - if ($win->{data_level} == 0) { 'sb_act_none'; } - elsif ($win->{data_level} == 1) { 'sb_act_text'; } - elsif ($win->{data_level} == 2) { 'sb_act_msg'; } - elsif ($colour ne '') { 'sb_act_hilight'; } - elsif ($win->{data_level} == 3) { 'sb_act_hilight'; } - else { 'sb_act_special'; } - }; - my $number = $win->{refnum}; - - my ($name, $display, $cdisplay); - if ($global_tag_header_mode) { - $display = $display_header; - $name = as_uni($backup_win->{active}{server}{tag}) // ''; - if ($custom_xform) { - no strict 'refs'; - local ${ __PACKAGE__ . '::custom_xform::TAG' } = 1; - run_custom_xform() for $name; - } - } - else { - my @display = ('display_nokey'); - if (defined $keymap{$number} and $keymap{$number} ne '') { - unshift @display, map { (my $cpy = $_) =~ s/_no/_/; $cpy } @display; - } - if (exists $awins{$number}) { - unshift @display, map { my $cpy = $_; $cpy .= '_visible'; $cpy } @display; - } - if ($active->{refnum} == $number) { - unshift @display, map { my $cpy = $_; $cpy .= '_active'; $cpy } - grep { !/_visible$/ } @display; - } - $display = (grep { length $_ } - map { $displays{$_} //= _get_format(set $_) } - @display)[0]; - $cdisplay = $name_format; - $name = as_uni($win->get_active_name) // ''; - $name = '*' if $S{banned_on} and exists $banned_channels{lc1459($name)}; - $name = remove_uniform_vars($win, $name) if $name ne '*'; - if ($name ne '*' and $win->{name} ne '' and $S{prefer_name}) { - $name = as_uni($win->{name}); - if ($custom_xform) { - no strict 'refs'; - local ${ __PACKAGE__ . '::custom_xform::NAME' } = 1; - run_custom_xform() for $name; - } - } - - if (!$VIEWER_MODE && $S{block} >= 0 && $S{hide_name} - && $win->{data_level} < abs $S{hide_name} - && ($win->{refnum} != $active->{refnum} || 0 <= $S{hide_name})) { - $name = ''; - $cdisplay = ''; - } - } - - $display = "$display%n"; - my $num_ent = (' 'x max(0,$numPad - length $number)) . $number; - my $key_ent = exists $keymap{$number} ? ((' 'x max(0,$keyPad - length $keymap{$number})) . $keymap{$number}) : ' 'x$keyPad; - if ($VIEWER_MODE or $S{sbar_maxlen} or $S{block} < 0) { - my $baseLength = sb_length(_format_display( - '', $display, $cdisplay, $hilight, - 'x', # placeholder - $num_ent, - $key_ent, - $win)) - 1; - my $diff = (abs $S{block}) - (screen_length(as_tc($name)) + $baseLength); - if ($diff < 0) { # too long - my $screen_length = screen_length(as_tc($name)); - if ((abs $diff) >= $screen_length) { $name = '' } # forget it - elsif ((abs $diff) + screen_length(as_tc(substr($name, 0, 1))) >= $screen_length) { $name = substr($name, 0, 1); } - else { - my $ulen = length $name; - my $middle2 = exists $abbrevList->{$name} ? - ($S{fancy_strict}) ? - 2* $abbrevList->{$name} : - (2*($abbrevList->{$name} + $ulen) / 3) : - ($S{fancy_head}) ? - 2*$ulen : - $ulen; - my $first = 1; - while (length $name > 1) { - my $cp = $middle2 >= 0 ? $middle2/2 : -1; # clearing position - my $rm = 2; - # if character at end is wider than 1 cell -> replace it with ~ - if (screen_length(as_tc(substr $name, $cp, 1)) > 1) { - if ($first || $cp < 0) { - $rm = 1; - $first = undef; - } - } - elsif ($cp < 0) { # elsif at end -> replace last 2 characters - --$cp; - } - (substr $name, $cp, $rm) = $abbrev1; - if ($cp > -1 && $rm > 1) { - --$middle2; - } - my $sl = screen_length(as_tc($name)); - if ($sl + $baseLength < abs $S{block}) { - (substr $name, ($middle2+1)/2, 1) = $abbrev2; - last; - } - elsif ($sl + $baseLength == abs $S{block}) { - last; - } - } - } - } - elsif ($VIEWER_MODE or $S{block} < 0) { - $name .= (' ' x $diff); - } - } - - push @win_items, _format_display( - '', $display, $cdisplay, $hilight, - as_tc($name), - $num_ent, - as_tc($key_ent), - $win); - - if ($global_tag_header_mode) { - $last_net = $backup_win->{active}{server}{tag}; - redo; - } - - $mouse_coords{refnum}{$#win_items} = $number; - } -} - -sub _spread_items { - my $width = $screenWidth - $sb_base_width - 1; - my @separator = _get_format(set 'separator'); - if ($S{block} >= 0) { - my $sep2 = _get_format(set 'separator2'); - push @separator, $sep2 if length $sep2 && $sep2 ne $separator[0]; - } - $separator[0] .= '%n'; - my @sepLen = map { sb_length($_) } @separator; - - @actString = (); - my $curLine; - my $curLen = 0; - if ($S{shared_sbar}) { - $curLen += $S{shared_sbar}[0] + 2; - $width -= $S{shared_sbar}[2]; - } - my $mouse_header_check = 0; - for my $it (@win_items) { - my $itemLen = sb_length($it); - if ($curLen) { - if ($curLen + $itemLen + $sepLen[$mouse_header_check % @sepLen] > $width) { - $width += $S{shared_sbar}[2] - if !@actString && $S{shared_sbar}; - push @actString, $curLine; - $curLine = undef; - $curLen = 0; - } - elsif (defined $curLine) { - $curLine .= $separator[$mouse_header_check % @separator]; - $curLen += $sepLen[$mouse_header_check % @sepLen]; - } - } - $curLine .= $it; - if (exists $mouse_coords{refnum}{$mouse_header_check}) { - $mouse_coords{scalar @actString}{ $_ } = $mouse_coords{refnum}{$mouse_header_check} - for $curLen .. $curLen + $itemLen - 1; - } - $curLen += $itemLen; - } - continue { - ++$mouse_header_check; - } - $curLen -= $S{shared_sbar}[0] - if !@actString && $S{shared_sbar}; - push @actString, $curLine if $curLen; -} - -sub remake { - my %abbrevList; - my @wins = window_list(); - if ($VIEWER_MODE or $S{sbar_maxlen} or $S{block} < 0) { - _calculate_abbrev(\@wins, \%abbrevList); - } - - %mouse_coords = ( refnum => +{} ); - _calculate_items(\@wins, \%abbrevList); - - unless ($VIEWER_MODE) { - _spread_items(); - - push @actString, undef unless @actString || $S{all_disable}; - } -} - -sub update_wl { - return if $BLOCK_ALL; - remake(); - - Irssi::statusbar_items_redraw(set $_) for keys %statusbars; - - unless ($VIEWER_MODE) { - Irssi::timeout_add_once(100, 'syncLines', undef); - } - else { - syncViewer(); - } -} - -sub screenFullRedraw { - my ($window) = @_; - if (!ref $window or $window->{refnum} == Irssi::active_win->{refnum}) { - $viewer{fullRedraw} = 1 if $viewer{client}; - $settings_str = ''; - &setup_changed; - } -} - -sub restartViewerServer { - if ($VIEWER_MODE) { - stop_viewer(); - start_viewer(); - } -} - -sub _simple_quote { - my @r = map { - my $x = $_; - $x =~ s/'/'"'"'/g; - $x = "'$x'"; - } @_; - wantarray ? @r : shift @r -} - -sub _viewer_command_replace_format { - my ($ecmd, @args) = @_; - my $file = _simple_quote(SCRIPT_FILE()); - my $path = _simple_quote($viewer{path}); - my @env; - for my $env (shellwords($S{viewer_launch_env})) { - if ($env =~ /^(\w+)(?:=(.*))$/) { - push @env, "AWL_$1=$2" - } - } - my $cmd = join ' ', - (@env ? ('env', _simple_quote(@env)) : ()), - 'perl', $file, '-1', _simple_quote(@args), $path; - $ecmd =~ s{%(%|\w+)}{ - my $sub = $1; - if ($sub eq '%') { - '%' - } - elsif ($sub =~ /^(q*)A(.*)/) { - my $ret = $cmd; - for (1..length $1) { - $ret = _simple_quote($ret); - } - "$ret$2" - } - else { - "%$sub" - } - }gex; - $ecmd -} - -sub start_viewer { - unlink $viewer{path} if -S $viewer{path} || -p _; - - $viewer{server} = IO::Socket::UNIX->new( - Type => SOCK_STREAM, - Local => $viewer{path}, - Listen => 1 - ); - unless ($viewer{server}) { - $viewer{msg} = "Viewer: $!"; - $viewer{retry} = Irssi::timeout_add_once(5000, 'retry_viewer', 1); - return; - } - $viewer{server}->blocking(0); - set_viewer_mode_hint(); - $viewer{server_tag} = Irssi::input_add($viewer{server}->fileno, INPUT_READ, 'vi_connected', undef); - - if ($S{viewer_launch}) { - if (length $ENV{TMUX_PANE} && length $ENV{TMUX} && lc $S{viewer_tmux_position} ne 'custom') { - my $cmd = _viewer_command_replace_format('%qA', '-p', lc $S{viewer_tmux_position}); - Irssi::command("exec - tmux neww -d $cmd 2>&1 &"); - } - elsif (length $ENV{WINDOWID} && length $ENV{DISPLAY} && length $S{viewer_xwin_command} && $S{viewer_xwin_command} =~ /\S/) { - my $cmd = _viewer_command_replace_format($S{viewer_xwin_command}); - Irssi::command("exec - $cmd 2>&1 &"); - } - elsif (length $S{viewer_custom_command} && $S{viewer_custom_command} =~ /\S/) { - my $cmd = _viewer_command_replace_format($S{viewer_custom_command}); - Irssi::command("exec - $cmd 2>&1 &"); - } - } -} - -sub set_viewer_mode_hint { - return unless $viewer{server}; - if ($S{no_mode_hint}) { - $viewer{msg} = undef; - } - else { - my ($name) = __PACKAGE__ =~ /::([^:]+)$/; - $viewer{msg} = "Run $name from the shell or switch to sbar mode"; - } -} - -sub retry_viewer { - start_viewer(); -} - -sub vi_close_client { - Irssi::input_remove(delete $viewer{client_tag}) if exists $viewer{client_tag}; - $viewer{client}->close if $viewer{client}; - delete $viewer{client}; - delete $viewer{client_keymap}; - delete $viewer{client_settings}; - delete $viewer{client_env}; - delete $viewer{fullRedraw}; -} - -sub vi_connected { - vi_close_client(); - $viewer{client} = $viewer{server}->accept or return; - $viewer{client}->blocking(0); - $viewer{client_tag} = Irssi::input_add($viewer{client}->fileno, INPUT_READ, 'vi_clientinput', undef); - syncViewer(); -} - -use constant VIEWER_BLOCK_SIZE => 1024; -sub vi_clientinput { - if ($viewer{client}->read(my $buf, VIEWER_BLOCK_SIZE)) { - $viewer{rcvbuf} .= $buf; - if ($viewer{rcvbuf} =~ s/^(?:(active|\d+)|(last|up|down))\n//igm) { - if (defined $2) { - Irssi::command("window $2"); - } - elsif (lc $1 eq 'active' && $viewer{use_ack}) { - Irssi::command($viewer{use_ack}); - } - else { - Irssi::command("window goto $1"); - } - } - } - else { - vi_close_client(); - Irssi::timeout_add_once(100, 'syncViewer', undef); - } -} - -sub stop_viewer { - Irssi::timeout_remove(delete $viewer{retry}) if exists $viewer{retry}; - vi_close_client(); - Irssi::input_remove(delete $viewer{server_tag}) if exists $viewer{server_tag}; - return unless $viewer{server}; - $viewer{server}->close; - delete $viewer{server}; -} -sub _encode_var { - my $str; - while (@_) { - my ($name, $var) = splice @_, 0, 2; - my $type = ref $var ? $var =~ /HASH/ ? 'map' : $var =~ /ARRAY/ ? 'list' : '' : ''; - $str .= "\n\U$name$type\_begin\n"; - if ($type eq 'map') { - no warnings 'numeric'; - $str .= " $_\n ${$var}{$_}\n" for sort { $a <=> $b || $a cmp $b } keys %$var; - } - elsif ($type eq 'list') { - $str .= " $_\n" for @$var; - } - else { - $str .= " $var\n"; - } - $str .= "\U$name$type\_end\n"; - } - $str -} -sub syncViewer { - if ($viewer{client}) { - @actString = (); - if ($currentLines) { - killOldStatus(); - $currentLines = 0; - } - my $str; - unless ($viewer{client_keymap}) { - $str .= _encode_var('key', +{ %nummap, %specialmap }); - $viewer{client_keymap} = 1; - } - unless ($viewer{client_settings}) { - $str .= _encode_var( - block => $S{block}, - ha => $S{height_adjust}, - mc => $S{maxcolumns}, - ml => $S{maxlines}, - tc => $S{true_colour}, - ); - $viewer{client_settings} = 1; - } - unless ($viewer{client_env}) { - $str .= _encode_var(irssienv => +{ - length $ENV{TMUX_PANE} && length $ENV{TMUX} ? - (tmux_pane => $ENV{TMUX_PANE}, - tmux_srv => $ENV{TMUX}) : (), - length $ENV{WINDOWID} ? - (xwinid => $ENV{WINDOWID}) : (), - }); - $viewer{client_env} = 1; - } - my $separator = _get_format(set 'separator'); - my $sepLen = sb_length($separator); - my $item_bg = _get_format(set 'viewer_item_bg'); - my $title = _get_format(set 'title'); - if (length $title) { - $title =~ s{\\(.)|(.)}{ - defined $2 ? quotemeta $2 - : $1 eq 'V' ? '\U' - : $1 eq ':' ? quotemeta '%N' - : $1 =~ /^[uUFQE]$/ ? "\\$1" - : quotemeta "\\$1" - }sge; - $title = eval qq{"$title"}; - } - $str .= _encode_var(redraw => 1) if delete $viewer{fullRedraw}; - $str .= _encode_var(separator => $separator, - seplen => $sepLen, - itembg => $item_bg, - title => $title, - mouse => $mouse_coords{refnum}, - key2 => \%wnmap_exp, - win => \@win_items); - - my $was = $viewer{client}->blocking(1); - $viewer{client}->print($str); - $viewer{client}->blocking($was); - } - elsif ($viewer{server}) { - if (defined $viewer{msg}) { - @actString = ((uc setc()).": $viewer{msg}"); - } - else { - @actString = (); - } - } - elsif (defined $viewer{msg}) { - @actString = ((uc setc()).": $viewer{msg}"); - } - if (@actString) { - Irssi::timeout_add_once(100, 'syncLines', undef); - } - elsif ($currentLines) { - killOldStatus(); - $currentLines = 0; - } -} - -sub reset_awl { - Irssi::timeout_remove($shade_line_timer) if $shade_line_timer; $shade_line_timer = undef; - my $was_sort = $S{sort} // ''; - my $was_xform = $S{xform} // ''; - my $was_shared = $S{shared_sbar}; - my $was_no_hint = $S{no_mode_hint}; - %S = ( - sort => Irssi::settings_get_str( set 'sort'), - fancy_abbrev => Irssi::settings_get_str('fancy_abbrev'), - xform => Irssi::settings_get_str( set 'custom_xform'), - block => Irssi::settings_get_int( set 'block'), - banned_on => Irssi::settings_get_bool('banned_channels_on'), - prefer_name => Irssi::settings_get_bool(set 'prefer_name'), - hide_data => Irssi::settings_get_int( set 'hide_data'), - hide_name => Irssi::settings_get_int( set 'hide_name_data'), - hide_empty => Irssi::settings_get_int( set 'hide_empty'), - detach => Irssi::settings_get_str( set 'detach'), - detach_data => Irssi::settings_get_int( set 'detach_data'), - detach_aht => Irssi::settings_get_bool(set 'detach_aht'), - sbar_maxlen => Irssi::settings_get_bool(set 'sbar_maxlength'), - placement => Irssi::settings_get_str( set 'placement'), - position => Irssi::settings_get_int( set 'position'), - maxlines => Irssi::settings_get_int( set 'maxlines'), - maxcolumns => Irssi::settings_get_int( set 'maxcolumns'), - all_disable => Irssi::settings_get_bool(set 'all_disable'), - height_adjust => Irssi::settings_get_int( set 'height_adjust'), - mouse_offset => Irssi::settings_get_int( set 'mouse_offset'), - mouse_scroll => Irssi::settings_get_int( 'mouse_scroll'), - mouse_escape => Irssi::settings_get_int( 'mouse_escape'), - line_shade => Irssi::settings_get_time(set 'last_line_shade'), - no_mode_hint => Irssi::settings_get_bool(set 'no_mode_hint'), - true_colour => Irssi::parse_special('$colors_ansi_24bit'), - viewer_launch => Irssi::settings_get_bool(set 'viewer_launch'), - viewer_launch_env => Irssi::settings_get_str(set 'viewer_launch_env'), - viewer_xwin_command => Irssi::settings_get_str(set 'viewer_xwin_command'), - viewer_custom_command => Irssi::settings_get_str(set 'viewer_custom_command'), - viewer_tmux_position => Irssi::settings_get_str(set 'viewer_tmux_position'), - ); - $S{fancy_strict} = $S{fancy_abbrev} =~ /^strict/i; - $S{fancy_head} = $S{fancy_abbrev} =~ /^head/i; - my $shared = Irssi::settings_get_str(set 'shared_sbar'); - if ($shared =~ /^(\d+)([<])(\d+)$/) { - $S{shared_sbar} = [$1, $2, $3]; - } - else { - Irssi::settings_set_str(set 'shared_sbar', 'OFF'); - $S{shared_sbar} = undef; - } - lock_keys(%S); - if ($was_sort ne $S{sort}) { - $print_text_activity = undef; - my @sort_order = grep { @$_ > 4 } map { - s/^\s*//; - my $reverse = s/^\W*\K[-!]//; - my $undef_check = s/^\W*\K~// ? 1 : undef; - my $equal_check = s/=(.*)\s?$// ? $1 : undef; - s/\s*$//; - my $ignore_case = s/#i$// ? 1 : undef; - - $print_text_activity = 1 if $_ eq 'last_line'; - - my @path = split '/'; - my $class_check = @path && $path[-1] =~ s/(::.*)$// ? $1 : undef; - my $lru = "@path" eq 'lru'; - - [ $reverse ? -1 : 1, $undef_check, $equal_check, $class_check, $ignore_case, $lru, @path ] - } "$S{sort}," =~ /([^+,]*|[^+,]*=[^,]*?\s(?=\+)|[^+,]*=[^,]*)[+,]/g; - $window_sort_func = sub { - no warnings qw(numeric uninitialized); - for my $so (@sort_order) { - my @x = map { - my $ret = 0; - $_ = lc1459($_) if defined $_ && !ref $_ && $so->[4]; - $ret = $_ eq ($so->[4] ? lc1459($so->[2]) : $so->[2]) ? 1 : -1 if defined $so->[2]; - $ret = defined $_ ? ($ret || -3) : 3 if $so->[1]; - $ret = ref $_ && $_->isa('Irssi'.$so->[3]) ? 2 : ($ret || -2) if $so->[3]; - -$ret || $_ - } - map { - $so->[5] ? $_->[0] : reduce { return unless ref $a; $a->{$b} } $_->[1], @{$so}[6..$#$so] - } $a, $b; - return ((($x[0] <=> $x[1] || $x[0] cmp $x[1]) * $so->[0]) || next); - } - return ($a->[1]{refnum} <=> $b->[1]{refnum}); - }; - } - if ($was_xform ne $S{xform}) { - if ($S{xform} !~ /\S/) { - $custom_xform = undef; - } - else { - my $script_pkg = __PACKAGE__ . '::custom_xform'; - local $@; - $custom_xform = eval qq{ -package $script_pkg; -use strict; -no warnings; -our (\$QUERY, \$CHANNEL, \$TAG, \$NAME); -return sub { -# line 1 @{[ set 'custom_xform' ]}\n$S{xform}\n}}; - if ($@) { - $@ =~ /^(.*)/; - print '%_'.(set 'custom_xform').'%_ did not compile: '.$1; - } - } - } - - my $new_settings = join "\n", $VIEWER_MODE - ? ("\\", $S{block}, $S{height_adjust}, $S{maxlines}, $S{maxcolumns}, $S{true_colour}) - : ("!", $S{placement}, $S{position}); - - my $first_viewer = $settings_str eq '1'; - if ($settings_str ne $new_settings) { - @actString = (); - %abbrev_cache = (); - $currentLines = 0; - killOldStatus(); - delete $viewer{client_settings}; - $settings_str = $new_settings; - } - - my $was_mouse_mode = $MOUSE_ON; - if ($MOUSE_ON = Irssi::settings_get_bool(set 'mouse') and !$was_mouse_mode) { - install_mouse(); - } - elsif ($was_mouse_mode and !$MOUSE_ON) { - uninstall_mouse(); - } - - unless ($first_viewer) { - my $path = Irssi::settings_get_str(set 'path'); - my $was_viewer_mode = $VIEWER_MODE; - if ($was_viewer_mode && - defined $viewer{path} && $viewer{path} ne $path) { - stop_viewer(); - $was_viewer_mode = 0; - } - elsif ($was_viewer_mode && $S{no_mode_hint} != $was_no_hint + 0) { - set_viewer_mode_hint(); - } - $viewer{path} = $path; - if ($VIEWER_MODE = Irssi::settings_get_bool(set 'viewer') and !$was_viewer_mode) { - start_viewer(); - } - elsif ($was_viewer_mode and !$VIEWER_MODE) { - stop_viewer(); - } - } - - %banned_channels = map { lc1459(as_uni($_)) => undef } - split ' ', Irssi::settings_get_str('banned_channels'); - - %detach_map = ($S{detach_aht} - ? (map { ( lc1459(as_uni($_)) => undef ) } - split ' ', Irssi::settings_get_str('activity_hide_targets')) : (), - (map { my ($k, $v) = (split /(?:,(-?\d+))$/, $_)[0, 1]; - ( lc1459(as_uni($k)) => $v ) } - split ' ', $S{detach})); - - my @sb_base = split /\177/, sb_format_expand("{sbstart}{sb_awl \177}{sbend}"), 2; - $sb_base_width_pre = sb_length($sb_base[0]); - $sb_base_width_post = max 0, sb_length($sb_base[1])-1; - $sb_base_width = $sb_base_width_pre + $sb_base_width_post; - - if ($print_text_activity && $S{line_shade}) { - $shade_line_timer = Irssi::timeout_add(max(10 * GLOB_QUEUE_TIMER, 100*$S{line_shade}**(1/3)), 'wl_changed', undef); - } - - $CHANGED{AWINS} = 1; -} - -sub hide_window { - my ($data) = @_; - my $ent; - - $data =~ s/\s*$//; - my $win = Irssi::active_win; - my $number = $win->{refnum}; - my $name = as_uni($win->{name}); - my $active = as_uni($win->get_active_name) // ''; - my $tag = $win->{active} && $win->{active}{server} ? as_uni($win->{active}{server}{tag}) // '' : ''; - if (length $name) { - $ent = "$name"; - } - elsif (length $tag && length $active) { - $ent = "$tag/$active"; - } - else { - $ent = "$number"; - } - - my $found = 0; - my @setting; - for my $s (split ' ', $S{detach}) { - my ($k, $v) = (split /(?:,(-?\d+))$/, $s)[0, 1]; - if (lc1459(as_uni($k)) eq lc1459($ent)) { - unless ($found) { - if ($data =~ /^(-?\d+)$/) { - $ent .= ",$1"; - } - if (defined $v && 0 == abs $v) { - $win->print("Hiding window $ent"); - } - push @setting, as_tc($ent); - $found = 1; - } - } - else { - push @setting, defined $v ? "$k,$v" : $k; - } - } - unless ($found) { - $win->print("Hiding window $ent"); - if ($data =~ /^(-?\d+)$/) { - $ent .= ",$1"; - } - push @setting, as_tc($ent); - } - - if (@setting) { - Irssi::command("^set ".(set 'detach')." @setting"); - } else { - Irssi::command("^set -clear ".(set 'detach')); - } -} - -sub unhide_window { - my ($data, $server, $witem) = @_; - my $win = Irssi::active_win; - my $number = $win->{refnum}; - my $name = as_uni($win->{name}); - my $active = as_uni($win->get_active_name) // ''; - my $tag = $win->{active} && $win->{active}{server} ? as_uni($win->{active}{server}{tag}) // '' : ''; - - my %detach_aht; - if ($S{detach_aht}) { - %detach_aht = (map { ( lc1459(as_uni($_)) => undef ) } - split ' ', Irssi::settings_get_str('activity_hide_targets')); - } - my @setting; - my @kills = (length $name ? $name : undef, - length $tag && length $active ? "$tag/$active" : undef, - length $active ? $active : undef, - $number); - my @was_unhidden = (0) x @kills; - for my $s (split ' ', $S{detach}) { - my ($k, $v) = (split /(?:,(-?\d+))$/, $s)[0, 1]; - my $k2 = lc1459(as_uni($k)); - my $kill; - for my $ki (0..$#kills) { - if (defined $kills[$ki] && $k2 eq lc1459($kills[$ki])) { - $kill = $ki; - } - } - - if (defined $kill) { - if (defined $v && 0 == abs $v) { - $was_unhidden[$kill] = 1; - push @setting, defined $v ? "$k,$v" : $k; - } else { - $win->print("Unhiding window $kills[$kill]"); - } - } - else { - push @setting, defined $v ? "$k,$v" : $k; - } - } - my @is_hidden = (defined $kills[0] && (exists $detach_map{"*"} || exists $detach_map{"::all"}), - defined $kills[1] && (exists $detach_map{lc1459("$tag/*")} || exists $detach_map{lc1459("$tag/::all")} - || exists $detach_map{"*"} || exists $detach_map{"::all"}), - defined $kills[2] && (exists $detach_map{"*"} || exists $detach_map{"::all"}), - (exists $detach_map{"*"} || exists $detach_map{"::all"}) - ); - for my $ki (1, 2, 0, 3) { - if ($is_hidden[$ki]) { - unless ($was_unhidden[$ki]) { - $win->print("Unhiding window $kills[$ki]"); - push @setting, "$kills[$ki],0"; - $was_unhidden[$ki] = 1; - } - last; - } - } - my @is_hidden_aht = (defined $kills[0] && (exists $detach_aht{lc1459($name)} - || exists $detach_aht{"*"} || exists $detach_aht{"::all"}), - defined $kills[1] && (exists $detach_aht{lc1459("$tag/$active")} - || exists $detach_aht{lc1459($active)} - || exists $detach_aht{lc1459("$tag/*")} || exists $detach_aht{lc1459("$tag/::all")} - || exists $detach_aht{"*"} || exists $detach_aht{"::all"}), - defined $kills[2] && (exists $detach_aht{lc1459($active)} - || exists $detach_aht{"*"} || exists $detach_aht{"::all"}), - (exists $detach_aht{$number} || exists $detach_aht{"*"} || exists $detach_aht{"::all"}) - ); - for my $ki (1, 2, 0, 3) { - if ($is_hidden_aht[$ki]) { - unless ($was_unhidden[$ki]) { - $win->print("Unhiding window $kills[$ki], it is hidden because ".(set 'detach_aht')." is ON"); - push @setting, "$kills[$ki],0"; - $was_unhidden[$ki] = 1; - } - last; - } - } - - if (@setting) { - Irssi::command("^set ".(set 'detach')." @setting"); - } else { - Irssi::command("^set -clear ".(set 'detach')); - } -} - -sub ack_window { - my ($data, $server, $witem) = @_; - my $win = Irssi::active_win; - my $number = $win->{refnum}; - if (grep { $_->{cmd} eq 'ack' } Irssi::commands) { - my $Orig_Irssi_windows = \&Irssi::windows; - local *Irssi::windows = sub () { grep { !_is_detached($_, $number) } $Orig_Irssi_windows->() }; - Irssi::command("ack" . (length $data ? " $data" : "")); - } else { - my $ignore_refnum = Irssi::settings_get_bool('active_window_ignore_refnum'); - my $max_win; - my $max_act = 0; - my $max_ref = 0; - for my $rec (Irssi::windows) { - next if _is_detached($rec, $number); - - # ignore refnum - if ($ignore_refnum && - $rec->{data_level} > 0 && $max_act < $rec->{data_level}) { - $max_act = $rec->{data_level}; - $max_win = $rec; - } - - # windows with lower refnums break ties - elsif (!$ignore_refnum && - $rec->{data_level} > 0 && - ($rec->{data_level} > $max_act || - ($rec->{data_level} == $max_act && $rec->{refnum} < $max_ref))) { - $max_act = $rec->{data_level}; - $max_win = $rec; - $max_ref = $rec->{refnum}; - } - } - $max_win->set_active if defined $max_win; - } -} - -sub refnum_changed { - my ($win, $old_refnum) = @_; - my @old_setting = split ' ', $S{detach}; - my @setting = map { - my ($k, $v) = (split /(?:,(-?\d+))$/, $_)[0, 1]; - if ($k eq $old_refnum) { - $win->{refnum} . (defined $v ? ",$v" : "") - } - else { - $_ - } - } @old_setting; - if ("@old_setting" ne "@setting") { - $S{detach} = "@setting"; - Irssi::settings_set_str(set 'detach', "@setting"); - &setup_changed; - } - else { - &wl_changed; - } -} - -sub window_destroyed { - my ($win) = @_; - my @old_setting = split ' ', $S{detach}; - my @setting = grep { - my ($k, $v) = (split /(?:,(-?\d+))$/, $_)[0, 1]; - if ($k eq $win->{refnum}) { - 0; - } - else { - 1; - } - } @old_setting; - if ("@old_setting" ne "@setting") { - $S{detach} = "@setting"; - Irssi::settings_set_str(set 'detach', "@setting"); - &setup_changed; - } - else { - &awins_changed; - } -} - -sub stop_mouse_tracking { - print STDERR "\e[?1005l\e[?1000l"; -} -sub start_mouse_tracking { - print STDERR "\e[?1000h\e[?1005h"; -} -sub install_mouse { - Irssi::command_bind('mouse_xterm' => 'mouse_xterm'); - Irssi::command('^bind meta-[M command mouse_xterm'); - Irssi::signal_add_first('gui key pressed' => 'mouse_key_hook'); - start_mouse_tracking(); -} -sub uninstall_mouse { - stop_mouse_tracking(); - Irssi::signal_remove('gui key pressed' => 'mouse_key_hook'); - Irssi::command('^bind -delete meta-[M'); - Irssi::command_unbind('mouse_xterm' => 'mouse_xterm'); -} - -sub awl_mouse_event { - return if $VIEWER_MODE; - if ((($_[0] == 3 and $_[3] == 0) - || $_[0] == 64 || $_[0] == 65) and - $_[1] == $_[4] and $_[2] == $_[5]) { - my $top = lc $S{placement} eq 'top'; - my ($pos, $line) = @_[1 .. 2]; - unless ($top) { - $line -= $screenHeight; - $line += $currentLines; - $line += $S{mouse_offset}; - } - else { - $line -= $S{mouse_offset}; - } - $pos -= $sb_base_width_pre; - return if $line < 0 || $line >= $currentLines; - if ($_[0] == 64) { - Irssi::command('window up'); - } - elsif ($_[0] == 65) { - Irssi::command('window down'); - } - elsif (exists $mouse_coords{$line}{$pos}) { - my $win = $mouse_coords{$line}{$pos}; - Irssi::command('window ' . $win); - } - Irssi::signal_stop; - } -} - -sub mouse_scroll_event { - return unless $S{mouse_scroll}; - if (($_[3] == 64 or $_[3] == 65) and - $_[0] == $_[3] and $_[1] == $_[4] and $_[2] == $_[5]) { - my $cmd = 'scrollback goto ' . ($_[3] == 64 ? '-' : '+') . $S{mouse_scroll}; - Irssi::active_win->command($cmd); - Irssi::signal_stop; - } - elsif ($_[0] == 64 or $_[0] == 65) { - Irssi::signal_stop; - } -} - -sub mouse_escape { - return unless $S{mouse_escape} > 0; - if ($_[0] == 3) { - my $tm = $S{mouse_escape}; - $tm *= 1000 if $tm < 1000; - stop_mouse_tracking(); - Irssi::timeout_add_once($tm, 'start_mouse_tracking', undef); - Irssi::signal_stop; - } -} - -sub UNLOAD { - @actString = (); - killOldStatus(); - stop_viewer() if $VIEWER_MODE; - uninstall_mouse() if $MOUSE_ON; -} - -sub addPrintTextHook { # update on print text - return unless defined $^S; - return if $BLOCK_ALL; - return unless $print_text_activity; - return if $_[0]->{level} == 262144 and $_[0]->{target} eq '' - and !defined($_[0]->{server}); - &wl_changed; -} - -sub block_event_window_change { - Irssi::signal_stop; -} - -sub update_awins { - my @wins = Irssi::windows; - local $BLOCK_ALL = 1; - Irssi::signal_add_first('window changed' => 'block_event_window_change'); - my $bwin = - my $awin = Irssi::active_win; - my $lwin; - my $defer_irssi_broken_last; - unless ($wins[0]{refnum} == $awin->{refnum}) { - # special case: more than 1 last win, so /win last; - # /win last doesn't come back to the current window. eg. after - # connect & autojoin; we can't handle this situation, bail out - $defer_irssi_broken_last = 1; - } - else { - $awin->command('window last'); - $lwin = Irssi::active_win; - $lwin->command('window last'); - $defer_irssi_broken_last = $lwin->{refnum} == $bwin->{refnum}; - } - my $awin_counter = 0; - Irssi::signal_remove('window changed' => 'block_event_window_change'); - unless ($defer_irssi_broken_last) { - # we need to keep the fe-windows code running here - Irssi::signal_add_priority('window changed' => 'block_event_window_change', -99); - %awins = %wnmap_exp = (); - do { - Irssi::active_win->command('window up'); - $awin = Irssi::active_win; - $awins{$awin->{refnum}} = undef; - ++$awin_counter; - } until ($awin->{refnum} == $bwin->{refnum} || $awin_counter >= @wins); - Irssi::signal_remove('window changed' => 'block_event_window_change'); - - Irssi::signal_add_first('window changed' => 'block_event_window_change'); - for my $key (keys %wnmap) { - next unless Irssi::window_find_name($key) || Irssi::window_find_item($key); - $awin->command("window goto $key"); - my $cwin = Irssi::active_win; - $wnmap_exp{ $cwin->{refnum} } = $wnmap{$key}; - $cwin->command('window last') - if $cwin->{refnum} != $awin->{refnum}; - } - for my $win (reverse @wins) { # restore original window order - Irssi::active_win->command('window '.$win->{refnum}); - } - $awin->command('window '.$lwin->{refnum}); # restore last win - Irssi::active_win->command('window last'); - Irssi::signal_remove('window changed' => 'block_event_window_change'); - } - $CHANGED{WL} = 1; -} - -sub resizeTerm { - if (defined (my $r = `stty size 2>/dev/null`)) { - ($screenHeight, $screenWidth) = split ' ', $r; - $CHANGED{SETUP} = 1; - } - else { - $CHANGED{SIZE} = 1; - } -} - -sub awl_refresh { - $globTime = undef; - resizeTerm() if delete $CHANGED{SIZE}; - reset_awl() if delete $CHANGED{SETUP}; - update_awins() if delete $CHANGED{AWINS}; - update_wl() if delete $CHANGED{WL}; -} - -sub termsize_changed { $CHANGED{SIZE} = 1; &queue_refresh; } -sub setup_changed { $CHANGED{SETUP} = 1; &queue_refresh; } -sub awins_changed { $CHANGED{AWINS} = 1; &queue_refresh; } -sub wl_changed { $CHANGED{WL} = 1; &queue_refresh; } - -sub window_changed { - &awins_changed if $_[1]; -} - -sub queue_refresh { - return if $BLOCK_ALL; - Irssi::timeout_remove($globTime) - if defined $globTime; # delay the update further - $globTime = Irssi::timeout_add_once(GLOB_QUEUE_TIMER, 'awl_refresh', undef); -} - -sub awl_init { - termsize_changed(); - setup_changed(); - update_keymap(); - Irssi::timeout_remove($globTime) - if defined $globTime; - awl_refresh(); - termsize_changed(); -} - -sub runsub { - my $cmd = shift; - sub { - my ($data, $server, $item) = @_; - Irssi::command_runsub($cmd, $data, $server, $item); - }; -} - -Irssi::signal_register({ - 'gui mouse' => [qw/int int int int int int/], - }); -{ my $broken_expandos = (Irssi::version >= 20081128 && Irssi::version < 20110210) - ? sub { my $x = shift; $x =~ s/\$\{cumode_space\}/ /; $x } : undef; - Irssi::theme_register([ - map { $broken_expandos ? $broken_expandos->($_) : $_ } - set 'display_nokey' => '$N${cumode_space}$H$C$S', - set 'display_key' => '$Q${cumode_space}$H$C$S', - set 'display_nokey_visible' => '%2$N${cumode_space}$H$C$S', - set 'display_key_visible' => '%2$Q${cumode_space}$H$C$S', - set 'display_nokey_active' => '%1$N${cumode_space}$H$C$S', - set 'display_key_active' => '%1$Q${cumode_space}$H$C$S', - set 'display_header' => '%8$C|${N}', - set 'name_display' => '$0', - set 'separator' => ' ', - set 'separator2' => '', - set 'abbrev_chars' => "~\x{301c}", - set 'viewer_item_bg' => sb_format_expand('{sb_background}'), - set 'title' => '\V'.setc().'\:', - ]); -} -Irssi::settings_add_bool(setc, set 'prefer_name', 0); # -Irssi::settings_add_int( setc, set 'hide_empty', 0); # -Irssi::settings_add_int( setc, set 'hide_data', 0); # -Irssi::settings_add_str( setc, set 'detach', ''); # -Irssi::settings_add_int( setc, set 'detach_data', -3); # -Irssi::settings_add_bool(setc, set 'detach_aht', 0); # -Irssi::settings_add_int( setc, set 'hide_name_data', 0); # -Irssi::settings_add_int( setc, set 'maxlines', 9); # -Irssi::settings_add_int( setc, set 'maxcolumns', 4); # -Irssi::settings_add_int( setc, set 'block', 15); # -Irssi::settings_add_bool(setc, set 'sbar_maxlength', 1); # -Irssi::settings_add_int( setc, set 'height_adjust', 2); # -Irssi::settings_add_str( setc, set 'sort', 'refnum'); # -Irssi::settings_add_str( setc, set 'placement', 'bottom'); # -Irssi::settings_add_int( setc, set 'position', 0); # -Irssi::settings_add_bool(setc, set 'all_disable', 1); # -Irssi::settings_add_bool(setc, set 'viewer', 1); # -Irssi::settings_add_str( setc, set 'shared_sbar', 'OFF'); # -Irssi::settings_add_bool(setc, set 'mouse', 0); # -Irssi::settings_add_str( setc, set 'path', Irssi::get_irssi_dir . '/_windowlist'); # -Irssi::settings_add_str( setc, set 'custom_xform', ''); # -Irssi::settings_add_time(setc, set 'last_line_shade', '0'); # -Irssi::settings_add_int( setc, set 'mouse_offset', 1); # -Irssi::settings_add_int( setc, 'mouse_scroll', 3); # -Irssi::settings_add_int( setc, 'mouse_escape', 1); # -Irssi::settings_add_str( setc, 'banned_channels', ''); -Irssi::settings_add_bool(setc, 'banned_channels_on', 1); -Irssi::settings_add_str( setc, 'fancy_abbrev', 'fancy'); # -Irssi::settings_add_bool(setc, set 'no_mode_hint', 0); # -Irssi::settings_add_bool(setc, set 'viewer_launch', 1); # -Irssi::settings_add_str( setc, set 'viewer_launch_env', ''); # -Irssi::settings_add_str( setc, set 'viewer_tmux_position', 'left'); # -Irssi::settings_add_str( setc, set 'viewer_xwin_command', 'xterm +sb -e %A'); # -Irssi::settings_add_str( setc, set 'viewer_custom_command', ''); # - -Irssi::signal_add_last({ - 'setup changed' => 'setup_changed', - 'print text' => 'addPrintTextHook', - 'terminal resized' => 'termsize_changed', - 'setup reread' => 'screenFullRedraw', - 'window hilight' => 'wl_changed', - 'command format' => 'wl_changed', -}); -Irssi::signal_add({ - 'window changed' => 'window_changed', - 'window item changed' => 'wl_changed', - 'window changed automatic' => 'window_changed', - 'window created' => 'awins_changed', - 'window destroyed' => 'window_destroyed', - 'window name changed' => 'wl_changed', - 'window refnum changed' => 'refnum_changed', -}); -Irssi::signal_add_last('gui mouse' => 'mouse_escape'); -Irssi::signal_add_last('gui mouse' => 'mouse_scroll_event'); -Irssi::signal_add_last('gui mouse' => 'awl_mouse_event'); -Irssi::command_bind( setc() => runsub(setc()) ); -Irssi::command_bind( setc() . ' redraw' => 'screenFullRedraw' ); -Irssi::command_bind( setc() . ' restart' => 'restartViewerServer' ); -Irssi::command_bind( setc() . ' attach' => 'unhide_window' ); -Irssi::command_bind( setc() . ' detach' => 'hide_window' ); -Irssi::command_bind( setc() . ' ack' => 'ack_window' ); - -{ - my $l = set 'shared'; - { - no strict 'refs'; - *{$l} = $awl_shared_empty; - } - Irssi::statusbar_item_register($l, '$0', $l); -} - -awl_init(); - -# Mouse script based on irssi mouse patch by mirage -{ my $mouse_status = -1; # -1:off 0,1,2:filling mouse_combo - my @mouse_combo; # 0:button 1:x 2:y - my @mouse_previous; # previous contents of mouse_combo - - sub mouse_xterm_off { - $mouse_status = -1; - } - sub mouse_xterm { - $mouse_status = 0; - Irssi::timeout_add_once(10, 'mouse_xterm_off', undef); - } - - sub mouse_key_hook { - my ($key) = @_; - if ($mouse_status != -1) { - if ($mouse_status == 0) { - @mouse_previous = @mouse_combo; - #if @mouse_combo && $mouse_combo[0] < 64; - } - $mouse_combo[$mouse_status] = $key - 32; - $mouse_status++; - if ($mouse_status == 3) { - $mouse_status = -1; - # match screen coordinates - $mouse_combo[1]--; - $mouse_combo[2]--; - Irssi::signal_emit('gui mouse', @mouse_combo[0 .. 2], @mouse_previous[0 .. 2]); - } - Irssi::signal_stop; - } - } -} - -sub string_LCSS { - my $str = join "\0", @_; - (sort { length $b <=> length $a } $str =~ /(?=(.+).*\0.*\1)/g)[0] -} - -# workaround for issue #271 -{ package Irssi::Nick } - -# workaround for issue #572 -@Irssi::UI::Exec::ISA = 'Irssi::Windowitem' - if Irssi::version >= 20140822 && Irssi::version <= 20161101 && !@Irssi::UI::Exec::ISA; - -UNITCHECK -{ package AwlViewer; - use strict; - use warnings; - no warnings 'redefine'; - use Encode; - use IO::Socket::UNIX; - use IO::Select; - use List::Util qw(max); - use constant BLOCK_SIZE => 1024; - use constant RECONNECT_TIME => 5; - - my $sockpath; - - our $VERSION = '0.8'; - - our ($got_int, $resized, $timeout); - - my %vars; - my (%c2w, @seqlist); - my %mouse_coords; - my (@mouse, @last_mouse); - my ($err, $sock, $loop); - my ($keybuf, $rcvbuf); - my @screen; - my ($screenHeight, $screenWidth); - my ($disp_update, $fs_open, $one_shot_integration, $one_shot_resize); - my $integration_position; - my $show_title_bar; - - sub connect_it { - $sock = IO::Socket::UNIX->new( - Type => SOCK_STREAM, - Peer => $sockpath, - ); - unless ($sock) { - $err = $!; - return; - } - $sock->blocking(0); - $loop->add($sock); - } - - sub remove_conn { - my $fh = shift; - $loop->remove($fh); - $fh->close; - $sock = undef; - %vars = (); - @screen = (); - } - - { package Terminfo; # xterm - sub civis { "\e[?25l" } - sub sc { "\e7" } - sub cup { "\e[" . ($_[0] + 1) . ';' . ($_[1] + 1) . 'H' } - sub el { "\e[K" } - sub rc { "\e8" } - sub cnorm { "\e[?25h" } - sub setab { "\e[4" . $_[0] . 'm' } - sub setaf { "\e[3" . $_[0] . 'm' } - sub setaf16 { "\e[9" . $_[0] . 'm' } - sub setab16 { "\e[10" . $_[0] . 'm' } - sub setaf256 { "\e[38;5;" . $_[0] . 'm' } - sub setab256 { "\e[48;5;" . $_[0] . 'm' } - sub setafrgb { "\e[38;2;" . $_[0] . ';' . $_[1] . ';' . $_[2] . 'm' } - sub setabrgb { "\e[48;2;" . $_[0] . ';' . $_[1] . ';' . $_[2] . 'm' } - sub sgr0 { "\e[0m" } - sub bold { "\e[1m" } - sub it { "\e[3m" } - sub ul { "\e[4m" } - sub blink { "\e[5m" } - sub rev { "\e[7m" } - sub op { "\e[39;49m" } - sub exit_bold { "\e[22m" } - sub exit_it { "\e[23m" } - sub exit_ul { "\e[24m" } - sub exit_blink { "\e[25m" } - sub exit_rev { "\e[27m" } - sub smcup { "\e[?1049h" } - sub rmcup { "\e[?1049l" } - sub smmouse { "\e[?1000h\e[?1005h" } - sub rmmouse { "\e[?1005l\e[?1000l" } - } - - sub init { - $sockpath = shift // "$ENV{HOME}/.irssi/_windowlist"; - STDOUT->autoflush(1); - printf "\r%swaiting for %s...", Terminfo::sc, $::IRSSI{name}; - - `stty -icanon -echo`; - - $loop = IO::Select->new; - STDIN->blocking(0); - $loop->add(\*STDIN); - - $SIG{INT} = sub { - $got_int = 1 - }; - $SIG{WINCH} = sub { - $resized = 1 - }; - - $resized = 3; - - $disp_update = 2; - - $show_title_bar = 1; - } - - sub enter_fs { - return if $fs_open; - safe_print(Terminfo::rc, Terminfo::smcup, Terminfo::civis, Terminfo::smmouse); - $fs_open = 1; - } - - sub leave_fs { - return unless $fs_open; - safe_print(Terminfo::rmmouse, Terminfo::cnorm, Terminfo::rmcup); - safe_print(sprintf "\r%swaiting for %s...", Terminfo::sc, $::IRSSI{name}) if $_[0]; - - $fs_open = 0; - } - - sub end_prog { - leave_fs(); - STDIN->blocking(1); - `stty sane`; - printf "\r%s%sthanks for using %s\n", Terminfo::rc, Terminfo::el, $::IRSSI{name}; - } - - sub safe_print { - my $st = STDIN->blocking(1); - print @_; - STDIN->blocking($st); - } - - sub safe_qx { - my $st = STDIN->blocking(1); - my $ret = `$_[0]`; - STDIN->blocking($st); - $ret - } - - sub safe_print_sock { - return unless $sock; - my $was = $sock->blocking(1); - $sock->print(@_); - $sock->blocking($was); - } - - sub process_recv { - my $need = 0; - while ($rcvbuf =~ s/\n(.+)_BEGIN\n((?: .*\n)*)\1_END\n//) { - my $var = lc $1; - my $data = $2; - my @data = split "\n ", "\n$data ", -1; - shift @data; pop @data; - my $itembg = $vars{itembg}; - if ($var =~ s/list$//) { - $vars{$var} = \@data; - } - elsif ($var =~ s/map$//) { - $vars{$var} = +{ @data }; - } - else { - $vars{$var} = join "\n", @data; - } - $need = 1 if $var eq 'win'; - $need = 1 if $var eq 'redraw' && $vars{$var}; - if (($itembg//'') ne ($vars{itembg}//'')) { - $need = $vars{redraw} = 1; - } - _build_keymap() if $var eq 'key2'; - } - $need - } - - { my %ansi_table; - my ($i, $j, $k) = (0, 0, 0); - my %term_state; - sub reset_term_state { my %old_term = %term_state; %term_state = (); %old_term } - sub set_term_state { my %old_term = %term_state; %term_state = @_; %old_term } - %ansi_table = ( - # fe-common::core::formats.c:format_expand_styles - (map { my $t = $i++; ($_ => sub { my $n = $term_state{hicolor} ? \&Terminfo::setab16 : \&Terminfo::setab; - $n->($t) }) } (split //, '01234567' )), - (map { my $t = $j++; ($_ => sub { my $n = $term_state{hicolor} ? \&Terminfo::setaf16 : \&Terminfo::setaf; - $n->($t) }) } (split //, 'krgybmcw' )), - (map { my $t = $k++; ($_ => sub { my $n = $term_state{hicolor} ? \&Terminfo::setaf : \&Terminfo::setaf16; - $n->($t) }) } (split //, 'KRGYBMCW')), - # reset - n => sub { $term_state{hicolor} = 0; my $r = Terminfo::op; - for (qw(blink rev bold)) { - $r .= Terminfo->can("exit_$_")->() if delete $term_state{$_}; - } - { - local $ansi_table{n} = $ansi_table{N}; - $r .= formats_to_ansi_basic($vars{itembg}); - } - $r - }, - N => sub { reset_term_state(); Terminfo::sgr0 }, - # flash/bright - F => sub { my $n = 'blink'; my $e = ($term_state{$n} ^= 1) ? $n : "exit_$n"; Terminfo->can($e)->() }, - # reverse - 8 => sub { my $n = 'rev'; my $e = ($term_state{$n} ^= 1) ? $n : "exit_$n"; Terminfo->can($e)->() }, - # bold - "_" => sub { my $n = 'bold'; my $e = ($term_state{$n} ^= 1) ? $n : "exit_$n"; Terminfo->can($e)->() }, - # underline - U => sub { my $n = 'ul'; my $e = ($term_state{$n} ^= 1) ? $n : "exit_$n"; Terminfo->can($e)->() }, - # italic - I => sub { my $n = 'it'; my $e = ($term_state{$n} ^= 1) ? $n : "exit_$n"; Terminfo->can($e)->() }, - # bold, used as colour modifier if AWL_HI9 is set - 9 => $ENV{AWL_HI9} ? sub { $term_state{hicolor} ^= 1; '' } - : sub { my $n = 'bold'; my $e = ($term_state{$n} ^= 1) ? $n : "exit_$n"; Terminfo->can($e)->() }, - # delete other stuff - (map { $_ => sub { '' } } (split //, ':|>#[')), - # escape - (map { my $close = $_; $_ => sub { $close } } (split //, '{}%')), - ); - for my $base (0 .. 15) { - my $close = $base; - my $idx = ($close&8) | ($close&4)>>2 | ($close&2) | ($close&1)<<2; - $ansi_table{ (sprintf "x0%x", $close) } = - $ansi_table{ (sprintf "x0%X", $close) } = - sub { Terminfo::setab256($idx) }; - $ansi_table{ (sprintf "X0%x", $close) } = - $ansi_table{ (sprintf "X0%X", $close) } = - sub { Terminfo::setaf256($idx) }; - } - for my $plane (1 .. 6) { - for my $coord (0 .. 35) { - my $close = 16 + ($plane-1) * 36 + $coord; - my $ch = $coord < 10 ? $coord : chr( $coord - 10 + ord 'a' ); - $ansi_table{ "x$plane$ch" } = - $ansi_table{ "x$plane\U$ch" } = - sub { Terminfo::setab256($close) }; - $ansi_table{ "X$plane$ch" } = - $ansi_table{ "X$plane\U$ch" } = - sub { Terminfo::setaf256($close) }; - } - } - for my $gray (0 .. 23) { - my $close = 232 + $gray; - my $ch = chr( $gray + ord 'a' ); - $ansi_table{ "x7$ch" } = - $ansi_table{ "x7\U$ch" } = - sub { Terminfo::setab256($close) }; - $ansi_table{ "X7$ch" } = - $ansi_table{ "X7\U$ch" } = - sub { Terminfo::setaf256($close) }; - } - # fe-windows.c:color_24bit_256 - my $cc = sub { - use integer; - - my $cstep_size = 40; - my $cstep_start = 0x5f; - - my $gstep_size = 10; - my $gstep_start = 0x08; - - my @dist = (0) x 3; - my @r; my @gr; - - for (my $i = 0; $i < 3; ++$i) { - my $n = $_[$i]; - $gr[$i] = -1; - if ($n < $cstep_start /2) { - $r[$i] = 0; - $dist[$i] = -$cstep_size/2; - } - else { - $r[$i] = 1+(($n-$cstep_start + $cstep_size /2)/$cstep_size); - $dist[$i] = (($n-$cstep_start + $cstep_size /2)% $cstep_size - $cstep_size/2); - } - if ($n < $gstep_start /2) { - $gr[$i] = -1; - } - else { - $gr[$i] = (($n-$gstep_start + $gstep_size /2)/$gstep_size); - } - } - if ($r[0] == $r[1] && $r[1] == $r[2] && - 4*abs($dist[0]) < $gstep_size && 4*abs($dist[1]) < $gstep_size && 4*abs($dist[2]) < $gstep_size) { - # skip gray detection - } - else { - my $j = $r[1] == $r[2] ? 0 : 1; - if (($r[0] == $r[1] || $r[$j] == $r[2]) && abs($r[$j]-$r[($j+1)% 3]) <= 1) { - my $k = $gr[1] == $gr[2] ? 0 : 1; - if (($gr[0] == $gr[1] || $gr[$k] == $gr[2]) && abs($gr[$k]-$gr[($k+1)% 3]) <= 2) { - if ($gr[$k] < 0) { - $r[0] = $r[1] = $r[2] = 0; - } - elsif ($gr[$k] > 23) { - $r[0] = $r[1] = $r[2] = 5; - } - else { - $r[0] = 6; - $r[1] = ($gr[$k] / 6); - $r[2] = $gr[$k]% 6; - } - } - } - } - return 16 + $r[0]*36 + $r[1] * 6 + $r[2]; - }; - $ansi_table{z} = sub { - my ($r, $g, $b) = map { hex } unpack '(A2)*', $_[0]; - $vars{tc} eq 'ON' ? Terminfo::setabrgb($r, $g, $b) : Terminfo::setab256($cc->($r, $g, $b)); - }; - $ansi_table{Z} = sub { - my ($r, $g, $b) = map { hex } unpack '(A2)*', $_[0]; - $vars{tc} eq 'ON' ? Terminfo::setafrgb($r, $g, $b) : Terminfo::setaf256($cc->($r, $g, $b)); - }; - sub formats_to_ansi_basic { - my $o = shift; - $o =~ s{(%((Z|z)(......)|X..|x..|.))}{ - if ($ansi_table{$2}) { $ansi_table{$2}->() } - elsif ($ansi_table{$3}) { $ansi_table{$3}->($4) } - else { $1 } - }gex; - $o - } - } - - sub _header { - my $str = $vars{title} // uc ::setc(); - my $ccs = qr/%(?:Z(?:[0-9A-F]{6})|X(?:[1-6][0-9A-Z]|7[A-X])|[0-9BCFGIKMNRUWY_])/i; - (my $stripstr = $str) =~ s/($ccs)//g; - my $space = int( ((abs $vars{block}) - length $stripstr) / (1 + length $stripstr)); - if ($space > 0) { - my $ss = ' ' x $space; - my @x = $str =~ /((?:$ccs)*\X(?:(?:$ccs)*$)?)/g; - $str = join $ss, '', @x, ''; - } - ($stripstr = $str) =~ s/($ccs)//g; - my $pad = max 0, (abs $vars{block}) - length $stripstr; - $str = ' ' x ($pad/2) . $str . ' ' x ($pad/2 + $pad%2); - $str - } - - sub _add_item { - my ($i, $j, $c, $wi, $screen, $mouse) = @_; - $screen->[$i][$j] = "%N%n$wi"; - if (exists $vars{mouse}{$c - 1}) { - $mouse->[$i][$j] = $vars{mouse}{$c - 1}; - } - } - sub update_screen { - $disp_update = 0; - unless ($sock && exists $vars{seplen} && exists $vars{block}) { - leave_fs(1); - return; - } - enter_fs(); - @screen = () if delete $vars{redraw}; - %mouse_coords = (); - my $ncols = ($vars{seplen} + abs $vars{block}) ? - int( ($screenWidth + $vars{seplen}) / ($vars{seplen} + abs $vars{block}) ) : 0; - my $xenl = ($vars{seplen} + abs $vars{block}) - && $ncols > int( ($screenWidth + $vars{seplen} - 1) / ($vars{seplen} + abs $vars{block}) ); - my $nrows = $screenHeight - $vars{ha}; - my @wi = @{$vars{win}//[]}; - my $max_items = $ncols * $nrows; - my $c = $show_title_bar ? 1 : 0; - my $items = @wi + $c; - my $titems = $items > $max_items ? $max_items : $items; - my $i = 0; - my $j = 0; - my @new_screen; - my @new_mouse; - $new_screen[0][0] = _header() #. ' ' x $vars{seplen} - if $show_title_bar; - unless ($nrows > $ncols) { # line layout - ++$j if $show_title_bar; - for my $wi (@wi) { - if ($j >= $ncols) { - $j = 0; - ++$i; - } - last if $i >= $nrows; - _add_item($i, $j, $show_title_bar ? $c : $c + 1, - $wi, \@new_screen, \@new_mouse); - if ($c + 1 < $titems && $j + 1 < $ncols) { - $new_screen[$i][$j] .= $vars{separator}; - } - ++$j; - ++$c; - } - } - else { # column layout - ++$i if $show_title_bar; - for my $wi (@wi) { - if ($i >= $nrows) { - $i = 0; - ++$j; - } - last if $j >= $ncols; - _add_item($i, $j, $show_title_bar ? $c : $c + 1, - $wi, \@new_screen, \@new_mouse); - if ($c + $nrows < $titems) { - $new_screen[$i][$j] .= $vars{separator}; - } - ++$i; - ++$c; - } - } - my $step = $vars{seplen} + abs $vars{block}; - $i = 0; - my $str = Terminfo::sc . Terminfo::sgr0; - for (my $i = 0; $i < @new_screen; ++$i) { - for (my $j = 0; $j < @{$new_screen[$i]}; ++$j) { - if (defined $new_mouse[$i] && defined $new_mouse[$i][$j]) { - my $from = $j * $step; - $mouse_coords{$i}{$_} = $new_mouse[$i][$j] - for $from .. $from + abs $vars{block}; - } - next if defined $screen[$i] && defined $screen[$i][$j] - && $screen[$i][$j] eq $new_screen[$i][$j]; - $str .= Terminfo::cup($i, $j * $step) - . formats_to_ansi_basic($new_screen[$i][$j]) - . Terminfo::sgr0; - $str .= Terminfo::el if $j == $#{$new_screen[$i]} && (!$xenl || $j + 1 != $ncols); - } - } - for (@new_screen .. $screenHeight - 1) { - if (!@screen || defined $screen[$_]) { - $str .= Terminfo::cup($_, 0) . Terminfo::sgr0 . Terminfo::el; - } - } - $str .= Terminfo::rc; - safe_print $str; - @screen = @new_screen; - } - - sub handle_resize { - if (defined (my $r = safe_qx('stty size'))) { - ($screenHeight, $screenWidth) = split ' ', $r; - $resized = 0; - @screen = (); - $disp_update = 1; - if ($one_shot_integration == 2) { - $one_shot_resize--; - } - } - else { - } - } - - sub _build_keymap { - %c2w = reverse( %{$vars{key}}, %{$vars{key2}} ); - if (!grep { /^[+-]./ } keys %c2w) { - %c2w = (%c2w, map { ("-$_" => $c2w{$_}) } grep { !/^\^./ } keys %c2w); - } - %c2w = map { - my $key = $_; - s{^(-)?(\+)?(\^)?(.)}{ - join '', ( - ($1 ? "\e" : ''), - ($2 ? "\e\e" : ''), - ($3 ? "$4"^"@" : $4) - ) - }e; - $_ => $c2w{$key} - } keys %c2w; - @seqlist = sort { length $b <=> length $a } keys %c2w; - } - - sub _match_tmux { - length $ENV{TMUX} && exists $vars{irssienv}{tmux_srv} && length $vars{irssienv}{tmux_pane} - && $ENV{TMUX} eq $vars{irssienv}{tmux_srv} - } - - sub process_keys { - Encode::_utf8_on($keybuf); - my $win; - my $use_mouse; - my $maybe; - KEY: while (length $keybuf && !$maybe) { - $maybe = 0; - if ($keybuf =~ s/^\e\[M(.)(.)(.)//) { - @last_mouse = @mouse;# if @mouse && $mouse[0] < 64; - @mouse = map { -32 + ord } ($1, $2, $3); - $use_mouse = 1; - next KEY; - } - for my $s (@seqlist) { - if ($keybuf =~ s/^\Q$s//) { - $win = $c2w{$s}; - $use_mouse = 0; - next KEY; - } - elsif (length $keybuf < length $s && $s =~ /^\Q$keybuf/) { - $maybe = 1; - } - } - unless ($maybe) { - substr $keybuf, 0, 1, ''; - } - } - if ($use_mouse && @mouse && @last_mouse && - $mouse[2] == $last_mouse[2] && - $mouse[1] == $last_mouse[1] && - ($mouse[0] == 3 || $mouse[0] == 64 || $mouse[0] == 65)) { - if ($mouse[0] == 64) { - $win = 'up'; - } - elsif ($mouse[0] == 65) { - $win = 'down'; - } - elsif (exists $mouse_coords{$mouse[2] - 1}{$mouse[1] - 1}) { - $win = $mouse_coords{$mouse[2] - 1}{$mouse[1] - 1}; - } - elsif ($mouse[2] == 1 && $mouse[1] <= abs $vars{block}) { - $win = $last_mouse[0] != 0 ? 'last' : 'active'; - } - else { - } - } - if (defined $win) { - $win =~ s/^_//; - safe_print_sock("$win\n"); - if (!exists $ENV{AWL_AUTOFOCUS} || $ENV{AWL_AUTOFOCUS}) { - if (_match_tmux()) { - safe_qx("tmux selectp -t $vars{irssienv}{tmux_pane} 2>&1"); - } - elsif (exists $vars{irssienv}{xwinid}) { - safe_qx("wmctrl -ia $vars{irssienv}{xwinid} 2>/dev/null"); - } - } - } - Encode::_utf8_off($keybuf); - } - - sub check_integration { - return unless $vars{irssienv}; - return unless $sock && exists $vars{seplen} && exists $vars{block}; - if ($one_shot_integration == 1) { - my $nrows = $screenHeight - $vars{ha}; - my $ncols = ($vars{seplen} + abs $vars{block}) ? int( ($screenWidth + $vars{seplen}) / ($vars{seplen} + abs $vars{block}) ) : 0; - my $items = ($show_title_bar ? 1 : 0) + @{$vars{win}//[]}; - my $dcols_required = $nrows ? int($items/$nrows) + !!($items%$nrows) : 0; - my $rows_required = $ncols ? int($items/$ncols) + !!($items%$ncols) : 0; - $rows_required = abs $vars{ml} - if ($vars{ml} < 0 || ($vars{ml} > 0 && $rows_required > $vars{ml})); - $dcols_required = abs $vars{mc} - if ($vars{mc} < 0 || ($vars{mc} > 0 && $dcols_required > $vars{mc})); - my $rows = $rows_required + $vars{ha}; - my $cols = ($dcols_required * ($vars{seplen} + abs $vars{block})) - $vars{seplen}; - if (_match_tmux()) { - # int( ($screenWidth + $vars{seplen}) / ($vars{seplen} + abs $vars{block}) ); - my ($pos_flag, $before); - if ($integration_position eq 'left') { - $pos_flag = 'h'; - $before = 1; - } - elsif ($integration_position eq 'top') { - $pos_flag = 'v'; - $before = 1; - } - elsif ($integration_position eq 'right') { - $pos_flag = 'h'; - } - else { - $pos_flag = 'v'; - } - my @cmd = "joinp -d$pos_flag -s $ENV{TMUX_PANE} -t $vars{irssienv}{tmux_pane}"; - push @cmd, "swapp -d -t $ENV{TMUX_PANE} -s $vars{irssienv}{tmux_pane}" - if $before; - $cols = max($cols, 2); - $rows = max($rows, 2); - - safe_qx("tmux " . (join " \\\; ", @cmd) . " 2>&1"); - } - else { - $resized = 1; - #safe_qx("resize -s $screenHeight $cols 2>&1") - # if $cols > 0; - } - $one_shot_integration++; - if ($resized == 1) { - handle_resize(); - resize_integration(); - } - } - elsif ($one_shot_integration == 2) { - resize_integration(1); - } - } - - sub resize_integration { - return unless $one_shot_integration; - return unless ($one_shot_resize//0) < 0 || shift; - return if ($one_shot_resize//0) > 0; - - my $nrows = $screenHeight - $vars{ha}; - my $ncols = ($vars{seplen} + abs $vars{block}) ? int( ($screenWidth + $vars{seplen}) / ($vars{seplen} + abs $vars{block}) ) : 0; - my $items = ($show_title_bar ? 1 : 0) + @{$vars{win}//[]}; - my $dcols_required = $nrows ? (int($items/$nrows) + !!($items%$nrows)) : 0; - my $rows_required = $ncols ? int($items/$ncols) + !!($items%$ncols) : 0; - $rows_required = abs $vars{ml} - if ($vars{ml} < 0 || ($vars{ml} > 0 && $rows_required > $vars{ml})); - $dcols_required = abs $vars{mc} - if ($vars{mc} < 0 || ($vars{mc} > 0 && $dcols_required > $vars{mc})); - my $rows = $rows_required + $vars{ha}; - my $cols = ($dcols_required * ($vars{seplen} + abs $vars{block})) - $vars{seplen}; - if (_match_tmux()) { - my $pos_flag; - my $before = 0; - if ($integration_position eq 'left') { - $pos_flag = 'h'; - $before = 1; - } - elsif ($integration_position eq 'top') { - $pos_flag = 'v'; - $before = 1; - } - elsif ($integration_position eq 'right') { - $pos_flag = 'h'; - } - else { - $pos_flag = 'v'; - } - my @cmd; - # hard tmux limits - $cols = max($cols, 2); - $rows = max($rows, 2); - if ($pos_flag eq 'h' && $cols != $screenWidth) { - my $change = $screenWidth - $cols; - my $dir = ($before ^ ($change<0)) ? 'L' : 'R'; - push @cmd, "resizep -$dir -t $ENV{TMUX_PANE} @{[abs $change]}"; - #push @cmd, "resizep -x $cols -t $ENV{TMUX_PANE}"; - $one_shot_resize = 1; - } - if ($pos_flag eq 'v' && $rows != $screenHeight) { - #push @cmd, "resizep -y $rows -t $ENV{TMUX_PANE}"; - my $change = $screenHeight - $rows; - my $dir = ($before ^ ($change<0)) ? 'U' : 'D'; - push @cmd, "resizep -$dir -t $ENV{TMUX_PANE} @{[abs $change]}"; - $one_shot_resize = 1; - } - - safe_qx("tmux " . (join " \\\; ", @cmd) . " 2>&1") - if @cmd; - } - else { - $cols = max($cols, 1); - $rows = max($rows, 1); - unless ($nrows > $ncols) { # line layout - if ($rows != $screenHeight) { - safe_qx("resize -s $rows $screenWidth 2>&1"); - $one_shot_resize = 1; - } - } - else { - if ($cols != $screenWidth) { - safe_qx("resize -s $screenHeight $cols 2>&1"); - $one_shot_resize = 1; - } - } - } - if ($resized == 1) { - handle_resize(); - } - } - - sub init_integration { - return unless $one_shot_integration; - if (_match_tmux()) { - } - else { - } - safe_print("\e]2;".(uc ::setc())."\e\\"); - } - - sub main { - require Getopt::Std; - my %opts; - Getopt::Std::getopts('1p:', \%opts); - my $one_shot = $opts{1}; - $integration_position = $opts{p}; - $one_shot_integration = 0+!!$one_shot; - #shift if @_ && $_[0] eq '--'; - &init; - $show_title_bar = 0; - init_integration(); - until ($got_int) { - $timeout = undef; - if ($resized) { - if ($resized == 1) { - $timeout = 1; - $resized++; - } - else { - handle_resize(); - resize_integration(); - } - } - unless ($sock || $timeout) { - connect_it(); - } - $timeout ||= RECONNECT_TIME unless $sock; - update_screen() if $disp_update; - SELECT: while (my @read = $loop->can_read($timeout)) { - for my $fh (@read) { - if ($fh == \*STDIN) { - if (read STDIN, my $buf, BLOCK_SIZE) { - do { - $keybuf .= $buf; - } while read STDIN, $buf, BLOCK_SIZE; - } - else { - $got_int = 1; - last SELECT; - } - } - else { - if ($fh->read(my $buf, BLOCK_SIZE)) { - do { - $rcvbuf .= $buf; - } while $fh->read($buf, BLOCK_SIZE); - } - else { - $disp_update = 1; - remove_conn($fh); - if ($one_shot) { - $got_int = 1; - last SELECT; - } - $timeout ||= RECONNECT_TIME; - } - } - } - $disp_update |= process_recv() if length $rcvbuf; - process_keys() if length $keybuf; - check_integration() if $one_shot; - update_screen() if $disp_update; - } - continue { - } - } - end_prog(); - } -} - -1; - -# Changelog -# ========= -# 1.9 -# - add %Z support to viewer -# -# 1.8 -# - use string_width in Irssi 1.2.0 -# -# 1.7 -# - fix crash on invalid /set awl_sort, introduced in 1.6, reported by -# tpetazzoni -# - delay viewer initialisation -# - improve race condition on tmux resize integration -# -# 1.6 -# - add detach setting to hide windows -# - fix race condition when loading the script, reported by madduck -# - improve compatibility with irssi 1.2 -# - add special value lru to awl_sort to sort windows by usage -# -# 1.5 -# - improve compat. with sideways splits -# -# 1.4 -# - fix line wrapping in some themes, reported by justanotherbody -# - fix named window key detection, reported by madduck -# - make title (in viewer and shared_sbar) configurable -# -# 1.3 -# - workaround for irssi issue #572 -# -# 1.2 -# - new format to choose abbreviation character -# -# 1.1 -# - infinite loop on shortening certain window names reported by Kalan -# -# 1.0 -# - new awl_viewer_launch setting and an array of related settings -# - fixed regression bug /exec -interactive -# - fixed some warnings in perl 5.10 reported by kl3 -# - workaround for crash due to infinite recursion in irssi's Perl -# error handling -# -# 0.9 -# - fix endless loop in awin detection code! -# - correct colour swap in awl_viewer -# - fix passing of alternate socket path to the viewer -# - potential undefinedness in mouse refnum hinted at by Canopus -# - fixed regression bug /exec -interactive -# - add case-insensitive modifier to awl_sort -# - run custom_xform on awl_prefer_name also -# - avoid inconsistent active window state after awin detection -# reported by ss -# - revert %9-hack in the viewer prompted by discussion with pierrot -# - fix new warning in perl 5.22 -# -# 0.8 -# - replace fifo mode with external viewer script -# - remove bundled cpan modules -# - work around bogus irssi warning -# - improve mouse support -# - workaround for broken cumode in irssi 0.8.15 -# - fix handling of non-meta windows (uninitialized warning) -# - add 256 colour support, strip true colour codes -# - fix totally bogus $N padding reported by Ed S. -# - make /window goto #name mappings work but ignore non-existant ones -# - improve incomplete reads reported by bcode -# - fix single % in awl_viewer reported by bcode -# - add support for key bindings by nike and ferret -# - coerce utf8 key binds -# - add settings: custom_xform, last_line_shade, hide_name_data -# - abbreviations were broken in some cases -# - fix some misuse of / as cmdchar in mouse script reported by bcode -# - add shared status bar mode -# - ${type} variables for custom_xform setting -# - crash if custom_xform had runtime error -# - update sorting documentation -# - fix odd case in size calculation noted by lasers -# - add missing font styles to the viewer reported by ishanyx -# - add italic -# -# 0.7g -# - remove screen support and replace it with fifo support -# - add double-width support to the shortener -# - correct documentation regarding $T vs. display_header -# - add missing refresh for window item changed (thanks vague) -# - add visible windows -# - add exemptions for active window -# - workaround for hiding the window changes from trackbar -# - hack to force 16colours in screen mode -# - remember last window (reported by earthnative) -# - wrong window focus on new queries (reported by emsid) -# - dataloss bug on trying to remember last window -# -# 0.6d+ -# - add support for network headers -# - fixed regression bug /exec -interactive -# -# 0.6ca+ -# - add screen support (from nicklist.pl) -# - names can now have a max length and window names can be used -# - fixed a bug with block display in screen mode and status bar mode -# - added space handling to ir_fe and removed it again -# - now handling formats on my own -# - started to work on $tag display -# - added warning about missing sb_act_none abstract leading to -# - display*active settings -# - added warning about the bug in awl_display_(no)key_active settings -# - mouse hack -# -# 0.5d -# - add setting to also hide the last status bar if empty (awl_all_disable) -# - reverted to old utf8 code to also calculate broken utf8 length correctly -# - simplified dealing with status bars in wlreset -# - added a little tweak for the renamed term_type somewhere after Irssi 0.8.9 -# - fixed bug in handling channel #$$ -# - reset background colour at the beginning of an entry -# -# 0.4d -# - fixed order of disabling status bars -# - several attempts at special chars, without any real success -# and much more weird new bugs caused by this -# - setting to specify sort order -# - reduced timeout values -# - added awl_hide_data -# - make it so the dynamic sub is actually deleted -# - fix a bug with removing of the last separator -# - take into consideration parse_special -# -# 0.3b -# - automatically kill old status bars -# - reset on /reload -# - position/placement settings -# -# 0.2 -# - automated retrieval of key bindings (thanks grep.pl authors) -# - improved removing of status bars -# - got rid of status chop -# -# 0.1 -# - Based on chanact.pl which was apparently based on lightbar.c and -# nicklist.pl with various other ideas from random scripts. diff --git a/.config/irssi/scripts/autorun/ascii.pl b/.config/irssi/scripts/autorun/ascii.pl @@ -1,405 +0,0 @@ -# -# Commands: /ASCII, /COLSAY, /COLME, /COLTOPIC, /COLKICK, /COLQUIT -# Usage: -# /ASCII [-c1234] [-f <fontname>] [-p <prefix>] [-l|-s|-m <where>] <text> -# /COLSAY [-1234] [-m <where>] <text> -# /COLME [-1234] <text> -# /COLTOPIC [-1234] <text> -# /COLKICK [-1234] [nick(,nick_1,...,nick_n)] <reason> -# /COLQUIT [-1234] <reason> -# Settings: -# /SET ascii_figlet_path [path] -# /SET ascii_default_font [fontname] -# /SET ascii_default_colormode [1-4] -# /SET ascii_default_prefix [prefix] -# /SET ascii_default_kickreason [reason] -# /SET ascii_default_quitreason [reason] -# -# Script is bassed on figlet. -# - -use strict; -use Irssi; -use Irssi::Irc; - -use vars qw($VERSION %IRSSI); - -$VERSION = "1.6.3"; -%IRSSI = ( - "authors" => "Marcin Rozycki", - "contact" => "derwan\@irssi.pl", - "name" => "ascii-art", - "description" => "Ascii-art bassed on figlet. Available commands: /ASCII, /COLSAY, /COLME, /COLTOPIC, /COLKICK, /COLQUIT.", - "url" => "http://derwan.irssi.pl", - "license" => "GNU GPL v2", - "changed" => "Fri Jun 21 17:17:53 CEST 2002" -); - -use IPC::Open3; - -# defaults -my $ascii_default_font = "small.flf"; -my $ascii_default_kickreason = "Irssi BaBy!"; -my $ascii_default_quitreason = "I Quit!"; -my $ascii_last_color = undef; -my @ascii_colors = (12, 12, 12, 9, 5, 4, 13, 8, 7, 3, 11, 10, 2, 6, 6, 6, 6, 10, 8, 7, 4, 3, 9, 11, 2, 12, 13, 5); - -# registering themes -Irssi::theme_register([ - 'ascii_not_connected', '%_$0:%_ You\'re not connected to server', - 'ascii_not_window', '%_$0:%_ Not joined to any channel or query window', - 'ascii_not_chanwindow', '%_$0:%_ Not joined to any channel', - 'ascii_not_chanop', '%_$0:%_ You\'re not channel operator in {hilight $1}', - 'ascii_figlet_notfound', '%_Ascii:%_ Cannot execute {hilight $0} - file not found or bad permissions', - 'ascii_figlet_notset', '%_Ascii:%_ Cannot find external program %_figlet%_, usign /SET ascii_figlet_path [path], to set it', - 'ascii_cmd_syntax', '%_$0:%_ $1, usage: $2', - 'ascii_figlet_error', '%_Ascii: Figlet returns error:%_ $0-', - 'ascii_fontlist', '%_Ascii:%_ Available fonts [in $0]: $1 ($2)', - 'ascii_empty_fontlist', '%_Ascii:%_ Cannot find figlet fonts in $0', - 'ascii_unknown_fontdir', '%_Ascii:%_ Cannot find figlet fontdir', - 'ascii_show_line', '$0-' - -]); - -# str find_figlet_path() -sub find_figlet_path { - foreach my $dir (split(/\:/, $ENV{'PATH'})) - { - return "$dir/figlet" if ($dir and -x "$dir/figlet"); - } -} - -# int randcolor() -sub randcolor { - return $ascii_colors[int(rand(12)+18)]; -} - -# str colorline($colormode, $text) -sub colorline { - my ($colormode, $text) = @_; - my $colortext = undef; - my $last = ($ascii_last_color) ? $ascii_last_color : randcolor(); - my $indx = $last; - - if ($colormode =~ /3/) { - $ascii_last_color = randcolor(); - }elsif ($colormode =~ /4/) { - $ascii_last_color = $ascii_colors[$last]; - }elsif ($colormode !~ /2/) { - $ascii_last_color = $ascii_colors[14+$last]; - } - - while ($text =~ /./g) - { - my $char = "$&"; - - if ($colormode =~ /3/) { - while ($indx == $last) { $indx = randcolor(); }; - $last = $indx; - }elsif ($colormode =~ /4/) { - $indx = $ascii_colors[$indx]; - }elsif ($last) { - $indx = $ascii_colors[$last]; - undef $last; - } else { - $indx = $ascii_colors[$indx]; - $last = $indx + 14; - }; - - $colortext .= $char, next if ($char eq " "); - $colortext .= "\003" . sprintf("%02d", $indx) . $char; - $colortext .= $char if ($char eq ","); - }; - - return $colortext; -}; - -# int colormode() -sub colormode { - my $mode = Irssi::settings_get_int("ascii_default_colormode"); - $mode =~ s/-//g; - return (!$mode or $mode > 4) ? 1 : $mode; -}; - -# bool ascii_test($command, $flags, $server, $window) -sub ascii_test { - my ($cmd, $test, $server, $window) = @_; - - if ($test =~ /s/ and !$server || !$server->{connected}) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_connected", $cmd); - return 0; - }; - if ($test =~ /W/ and !$window || $window->{type} !~ /(channel|query)/i) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_window", $cmd); - return 0; - }; - if ($test =~ /(w|o)/ and !$window || $window->{type} !~ /channel/i) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_chanwindow", $cmd); - return 0; - }; - if ($test =~ /o/ and !$window->{chanop}) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_chanop", $cmd, Irssi::active_win()->get_active_name()); - return 0; - }; - - return 1; -} - -# void cmd_ascii() -# handles /ascii -sub cmd_ascii -{ - my $usage = "/ASCII [-c1234] [-f <fontname>] [-p <prefix>] [-l|-s|-m <where>] <text>"; - my $font = Irssi::settings_get_str("ascii_default_font"); - my $prefix = Irssi::settings_get_str("ascii_default_prefix"); - my ($arguments, $server, $witem) = @_; - my ($text, $cmd, $mode); - - $font = $ascii_default_font unless ($font); - $ascii_last_color = randcolor(); - - my $figlet = Irssi::settings_get_str("ascii_figlet_path"); - if (!$figlet or !(-x $figlet)) { - my $theme = ($figlet) ? "ascii_figlet_notfound" : "ascii_figlet_notset"; - Irssi::printformat(MSGLEVEL_CRAP, $theme, $figlet); - return; - }; - - my @foo = split(/ +/, $arguments); - while ($_ = shift(@foo)) - { - /^-l$/ and show_figlet_fonts($figlet), return; - /^-c$/ and $mode = colormode(), next; - /^-(1|2|3|4)$/ and s/-//g, $mode = $_, next; - /^-f$/ and $font = shift(@foo), next; - /^-p$/ and $prefix = shift(@foo), next; - /^-m$/ and $cmd = shift(@foo), next; - /^-s$/ and $cmd = 0, next; - /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Ascii", "Unknown argument: $_", $usage), return; - $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); - last; - } - - unless (length($text)) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Ascii", "Missing arguments", $usage); - return; - }; - - if ($cmd eq "") { - return unless (ascii_test("Ascii", "sW", $server, $witem)); - $cmd = Irssi::active_win()->get_active_name(); - } elsif ($cmd ne "0" and !ascii_test("Ascii", "s", $server, $witem)) { - return; - } - - my $pid = open3(*FIGIN, *FIGOUT, *FIGERR, $figlet, qw(-k -f), $font, $text); - - while (<FIGOUT>) - { - chomp; - next unless (/[^ ]/); - $_ = colorline($mode, $_) if ($mode); - Irssi::printformat(MSGLEVEL_CLIENTCRAP, "ascii_show_line", $prefix.$_), next if ($cmd eq "0"); - $server->command("msg $cmd $prefix$_"); - } - - while (<FIGERR>) - { - chomp; - Irssi::printformat(MSGLEVEL_CRAP, "ascii_figlet_error", $_); - }; - - close FIGIN; - close FIGOUT; - close FIGERR; - - waitpid $pid, 0; -} - -# void show_figlet_fonts(figlet path) -sub show_figlet_fonts { - my @fontlist; - if (my $fontdir = `"$_[0]" -I 2 2>/dev/null`) { - chomp $fontdir; - foreach my $font (glob $fontdir."/*.flf") - { - $font =~ s/^$fontdir\///; - $font =~ s/\.flf$//; - push @fontlist, $font; - } - if ($#fontlist < 0) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_fontlist_empty", $fontdir); - } else { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_fontlist", $fontdir, join(", ", @fontlist), scalar(@fontlist)); - } - } else { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_unknown_fontdir"); - } -} - -# void cmd_colsay() -# handles /colsay -sub cmd_colsay { - my $usage = "/COLSAY [-1234] [-m <where>] <text>"; - my ($arguments, $server, $witem) = @_; - my ($cmd, $text); - my $mode = colormode(); - - $ascii_last_color = randcolor(); - - my @foo = split(/ /, $arguments); - while ($_ = shift(@foo)) - { - /^-(1|2|3|4)$/ and $mode = $_, next; - /^-m$/i and $cmd = shift(@foo), next; - /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colsay", "Unknown argument: $_", $usage), return; - $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); - last; - }; - - unless (length($text)) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colsay", "Missing arguments", $usage); - return; - }; - - if ($cmd) { - return unless (ascii_test("Colsay", "s", $server, $witem)); - } else { - return unless (ascii_test("Colsay", "sW", $server, $witem)); - $cmd = Irssi::active_win()->get_active_name(); - }; - - $server->command("msg $cmd ".colorline($mode, $text)); -} - - -sub cmd_colme { - my $usage = "/COLME [-1234] <text>"; - my ($arguments, $server, $witem) = @_; - my $mode = colormode(); - my $text; - - $ascii_last_color = randcolor(); - - my @foo = split(/ /, $arguments); - while ($_ = shift(@foo)) - { - /^-(1|2|3|4)$/ and $mode = $_, next; - /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colme", "Unknown argument: $_", $usage), return; - $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); - last; - }; - - unless (length($text)) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colme", "Missing arguments", $usage); - return; - }; - - return unless (ascii_test("Colme", "sW", $server, $witem)); - $witem->command("me ".colorline($mode, $text)); -} - -# void cmd_coltopic() -# handles /coltopic -sub cmd_coltopic { - my $usage = "/COLTOPIC [-1234] <text>"; - my ($arguments, $server, $witem) = @_; - my $mode = colormode(); - my $text; - - $ascii_last_color = randcolor(); - - my @foo = split(/ /, $arguments); - while ($_ = shift(@foo)) - { - /^-(1|2|3|4)$/ and $mode = $_, next; - /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Coltopic", "Unknown argument: $_", $usage), return; - $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); - last; - }; - - unless (length($text)) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Coltopic", "Missing arguments", $usage); - return; - }; - - return unless (ascii_test("Coltopic", "sw", $server, $witem)); - - $server->command("topic " . Irssi::active_win()->get_active_name() . " " . colorline($mode, $text)); -}; - -# void cmd_colkick() -# handles /colkick -sub cmd_colkick { - my $usage = "/COLKICK [-1234] [nick(,nick_1,...,nick_n)] <reason>"; - my ($arguments, $server, $witem) = @_; - my $kickreason = Irssi::settings_get_str("ascii_default_kickreason"); - my $mode = colormode(); - my $who = undef; - - $ascii_last_color = randcolor(); - $kickreason = $ascii_default_kickreason unless ($kickreason); - - my @foo = split(/ /, $arguments); - while ($_ = shift(@foo)) - { - /^-(1|2|3|4)$/ and $mode = $_, next; - /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colkick", "Unknown argument: $_", $usage), return; - $kickreason = join(" ", @foo) if ($#foo >= 0); - $who = $_; - last; - }; - - if (!$who or !length($kickreason)) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colkick", "Missing arguments", $usage); - return; - }; - - return unless (ascii_test("Colkick", "swo", $server, $witem)); - $witem->command("kick $who ".colorline($mode, $kickreason)); -}; - -# void cmd_colquit() -# handles /colquit -sub cmd_colquit { - my $usage = "/COLQUIT [-1234] <reason>"; - my ($arguments, $server, $witem) = @_; - my $quitreason = Irssi::settings_get_str("ascii_default_quitreason"); - my $mode = colormode(); - - $ascii_last_color = randcolor(); - $quitreason = $ascii_default_quitreason unless ($quitreason); - - my @foo = split(/ /, $arguments); - while ($_ = shift(@foo)) - { - /^-(1|2|3|4)$/ and $mode = $_, next; - /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colquit", "Unknown argument: $_", $usage), return; - $quitreason = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); - last; - }; - - unless (length($quitreason)) { - Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colquit", "Missing arguments", $usage); - return; - }; - - return unless (ascii_test("Colquit", "s", $server, $witem)); - $server->command("quit " . colorline($mode, $quitreason)); -} - -# registering settings -Irssi::settings_add_str("misc", "ascii_default_font", $ascii_default_font); -Irssi::settings_add_str("misc", "ascii_default_kickreason", $ascii_default_kickreason); -Irssi::settings_add_str("misc", "ascii_default_quitreason", $ascii_default_quitreason); -Irssi::settings_add_str("misc", "ascii_default_prefix", ""); -Irssi::settings_add_int("misc", "ascii_default_colormode", 1); -Irssi::settings_add_str("misc", "ascii_figlet_path", find_figlet_path); - -# binding commands -Irssi::command_bind("ascii", "cmd_ascii"); -Irssi::command_bind("colsay", "cmd_colsay"); -Irssi::command_bind("colme", "cmd_colme"); -Irssi::command_bind("coltopic", "cmd_coltopic"); -Irssi::command_bind("colkick", "cmd_colkick"); -Irssi::command_bind("colquit", "cmd_colquit"); diff --git a/.config/irssi/scripts/autorun/autonickprefix.pl b/.config/irssi/scripts/autorun/autonickprefix.pl @@ -1,39 +0,0 @@ -use strict; - -our $VERSION = '1.00'; -our %IRSSI = ( - authors => 'Juerd', - contact => '#####@juerd.nl', - name => 'autonickprefix', - description => "Change 'nick: ' prefix if the nick is changed while you're still editing.", - license => 'Any OSI', -); - -use Irssi::TextUI; -use Irssi qw( - signal_add active_win settings_get_str parse_special - gui_input_get_pos gui_input_set gui_input_set_pos -); - -signal_add 'nicklist changed' => sub { - my ($chan, $newnick, $oldnick) = @_; - $newnick = $newnick->{nick}; - - # Ignore other channels than current - my $viewing = active_win->{active} or return; - $viewing->{_irssi} == $chan->{_irssi} or return; - - my $char = settings_get_str 'completion_char'; - my $pos = gui_input_get_pos; - - # Incomplete nick could be something else. - $pos >= length("$oldnick$char") or return; - - my $delta = length($newnick) - length($oldnick); - - my $input = parse_special '$L'; - $input =~ s/^\Q$oldnick$char/$newnick$char/ or return; - - gui_input_set $input; - gui_input_set_pos $pos + $delta; -}; diff --git a/.config/irssi/scripts/autorun/cmdind.pl b/.config/irssi/scripts/autorun/cmdind.pl @@ -1,61 +0,0 @@ -use strict; -use warnings; - -our $VERSION = '1.1'; # 67ffc4766319fe4 -our %IRSSI = ( - authors => 'Nei', - contact => 'Nei @ anti@conference.jabber.teamidiot.de', - url => "http://anti.teamidiot.de/", - name => 'cmdind', - description => 'Indicator for input prompt if you are inputting a command or text', - license => 'GNU GPLv2 or later', - ); - -# Usage -# ===== -# This script requires the -# -# uberprompt -# -# script to work. If you don't have it yet, /script install uberprompt - -# Options -# ======= -# /set cmdind_text <string> -# * string : Text to show in prompt when typing a command -# -# /set cmdind_warn_text <string> -# * string : Text to show in prompt when typing a command with spaces in front - -use Irssi; - -my $cmd_state = 0; -my $cmdchars; -my @text; - -sub check_input { - my $inputline = Irssi::parse_special('$L'); - my $c1 = length $inputline > 0 ? substr $inputline, 0, 1 : ''; - my $c2 = length $inputline > 1 ? substr $inputline, 1, 1 : ''; - my $old_state = $cmd_state; - my $x_state = length $c2 && (-1 != index $cmdchars, $c1) && $c2 ne ' '; - my $warn_state = - ($inputline =~ /^\s+(\S)/ && (-1 != index $cmdchars, $1)) - || ($x_state && $inputline =~ /^(.)\1?+\S*[\Q$cmdchars\E]/); - $cmd_state = $warn_state ? 2 : $x_state ? 1 : 3; - if ($cmd_state ne $old_state) { - Irssi::signal_emit('change prompt', $text[ $cmd_state ], 'UP_POST'); - } -} -sub setup_changed { - $cmdchars = Irssi::settings_get_str('cmdchars'); - @text = ('', - Irssi::settings_get_str('cmdind_text'), - Irssi::settings_get_str('cmdind_warn_text'), - ''); -} -Irssi::settings_add_str('cmdind', 'cmdind_text', '%gCmd:'); -Irssi::settings_add_str('cmdind', 'cmdind_warn_text', '%RMsg?'); -setup_changed(); -Irssi::signal_add_last('gui key pressed', 'check_input'); -Irssi::signal_add('setup changed', 'setup_changed'); diff --git a/.config/irssi/scripts/autorun/ctcpspoof.pl b/.config/irssi/scripts/autorun/ctcpspoof.pl @@ -1,277 +0,0 @@ -#!/usr/bin/perl -w - -## Bugreports and Licence disclaimer. -# -# For bugreports and other improvements contact Geert Hauwaerts <geert@irssi.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this script; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -## - -use strict; -use Irssi; -use vars qw($VERSION %IRSSI); - -$VERSION = "1.04"; - -%IRSSI = ( - authors => 'Geert Hauwaerts', - contact => 'geert@irssi.org', - name => 'fakectcp.pl', - description => 'This script sends fake ctcp replies to a client using a fake ctcp list.', - license => 'GNU General Public License', - url => 'http://irssi.hauwaerts.be/default.pl', - changed => '2018-09-17', -); - -my @fakectcp = (); -my $fakectcp_file = "fctcplist"; -my $irssidir = Irssi::get_irssi_dir(); - -my $help = <<EOF; - -Usage: (all on one line) -/FCTCP [-add||-replace <ctcp-item> <ctcp-reply>] [-del <ctcp-item>] [-list] [-help] - --add: Add a new fake ctcp-reply to the list. --del: Delete a fake ctcp-reply from the list. --list: Display the contents of the fake ctcp-reply list. --help: Display this useful little helpfile. --replace: Replace an existing fake reply with a new one. If the old one doesn't exist, the new one will be added by default. - -Examples: (all on one line) -/FCTCP -add CHRISTEL We all love christel, don't we! :) -/FCTCP -add LOCATION I'm at home, reading some helpfiles. - -/FCTCP -del CHRISTEL -/FCTCP -del LOCATION - -Note: The caps are not obligated. The default parameter is -list. -EOF - -Irssi::theme_register([ - 'fctcp_info', ' # ctcpitem ctcpreply', - 'fctcp_empty', '%R>>%n %_FCTCP:%_ Your fake ctcp list is empty.', - 'fctcp_added', '%R>>%n %_FCTCP:%_ Added %_$0%_ ($1) to the fake ctcp list.', - 'fctcp_replaced', '%R>>%n %_FCTCP:%_ Replaced the old fake reply %_$0%_ with the new one ($1)', - 'fctcp_delled', '%R>>%n %_FCTCP:%_ Deleted %_$0%_ from the fake ctcp list.', - 'fctcp_nfound', '%R>>%n %_FCTCP:%_ Can\'t find $0 in the fake ctcp list.', - 'fctcp_delusage', '%R>>%n %_FCTCP:%_ Usage: /FCTCP -del <ctcp-item>', - 'fctcp_usage', '%R>>%n %_FCTCP:%_ Usage: /FCTCP -add <ctcp-item> <ctcp-reply>', - 'fctcp_repusage', '%R>>%n %_FCTCP:%_ Usage: /FCTCP -replace <ctcp-item> <ctcp-reply>', - 'fctcp_nload', '%R>>%n %_FCTCP:%_ Could not load the fake ctcp list.', - 'fctcp_request', '%R>>%n %_FCTCP:%_ Used the fake reply %_$1%_ on %_$0%_', - 'fctcp_loaded', '%R>>%n %_FCTCP:%_ The fake reply %_$0%_ already exists, use %_/FCTCP -del $0%_ to remove it from the list.', - 'fctcp_print', '$[!-2]0 $[20]1 $2', - 'fctcp_help', '$0', - 'loaded', '%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.' -]); - -sub ctcpreply { - - my ($server, $data, $nick, $address, $target) = @_; - my ($findex); - - $data = lc($data); - - return unless (lc($server->{nick}) eq lc($target)); - - if (!already_loaded($data)) { - $findex = check_loaded($data); - $server->command("^NCTCP $nick $data $fakectcp[$findex]->{reply}"); - Irssi::printformat(MSGLEVEL_CTCPS, 'fctcp_request', $nick, $data); - Irssi::signal_stop(); - } -} - -sub new_fctcp { - - my $fctcp = {}; - - $fctcp->{item} = shift; - $fctcp->{reply} = shift; - - return $fctcp; -} - -sub already_loaded { - - my ($item) = @_; - my $loaded = check_loaded($item); - - if ($loaded > -1) { - return 0; - } - - return 1; -} - -sub check_loaded { - - my ($item) = @_; - - $item = lc($item); - - for (my $loaded = 0; $loaded < @fakectcp; ++$loaded) { - return $loaded if (lc($fakectcp[$loaded]->{item}) eq $item); - } - - return -1; -} - -sub load_fakectcplist { - - my ($file) = @_; - - @fakectcp = (); - - if (-e $file) { - local *F; - open(F, "<", $file); - local $/ = "\n"; - - while (<F>) { - chop; - my $new_fctcp = new_fctcp(split("\t")); - - if (($new_fctcp->{item} ne "") && ($new_fctcp->{reply} ne "")) { - push(@fakectcp, $new_fctcp); - } - } - - close(F); - } else { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_nload'); - } -} - -sub save_fakectcplist { - - my ($file) = @_; - - local *F; - open(F, ">", $file) or die "Could not load the fake ctcpreply list for writing"; - - for (my $n = 0; $n < @fakectcp; ++$n) { - print(F join("\t", $fakectcp[$n]->{item}, $fakectcp[$n]->{reply}) . "\n"); - } - - close(F); -} - -sub addfakectcp { - - my ($ctcpitem, $ctcpreply) = split (" ", $_[0], 2); - - if (($ctcpitem eq "") || ($ctcpreply eq "")) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_usage'); - return; - } elsif (!already_loaded($ctcpitem)) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_loaded', $ctcpitem); - return; - } - - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_added', $ctcpitem, $ctcpreply); - push(@fakectcp, new_fctcp($ctcpitem, $ctcpreply)); - save_fakectcplist("$irssidir/$fakectcp_file"); -} - -sub delfakectcp { - - my ($fdata) = @_; - my ($fdataindex); - - if ($fdata eq "") { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_delusage'); - return; - } - - for (my $index = 0; $index < @fakectcp; ++$index) { - if (lc($fakectcp[$index]->{item}) eq $fdata) { - $fdataindex = splice(@fakectcp, $index, 1); - } - } - - if ($fdataindex) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_delled', $fdata); - save_fakectcplist("$irssidir/$fakectcp_file"); - } else { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_nfound', $fdata); - } -} - -sub replacefakectcp { - - my ($ctcpitem, $ctcpreply) = split (" ", $_[0], 2); - my ($fdataindex); - - if (($ctcpitem eq "") || ($ctcpreply eq "")) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_repusage'); - return; - } - - if (!already_loaded($ctcpitem)) { - for (my $index = 0; $index < @fakectcp; ++$index) { - if (lc($fakectcp[$index]->{item}) eq $ctcpitem) { - $fdataindex = splice(@fakectcp, $index, 1); - } elsif ($fdataindex) { - save_fakectcplist("$irssidir/$fakectcp_file"); - } - } - } - - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_replaced', $ctcpitem, $ctcpreply); - push(@fakectcp, new_fctcp($ctcpitem, $ctcpreply)); - save_fakectcplist("$irssidir/$fakectcp_file"); -} - -sub fakectcp { - - my ($cmdoption, $ctcpitem, $ctcpreply) = split (" ", $_[0], 3); - - $ctcpitem = lc($ctcpitem); - $cmdoption = lc($cmdoption); - - if ($cmdoption eq "-add") { - addfakectcp("$ctcpitem $ctcpreply"); - return; - } elsif ($cmdoption eq "-del") { - delfakectcp("$ctcpitem"); - return; - } elsif ($cmdoption eq "-help") { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_help', $help); - return; - } elsif ($cmdoption eq "-replace") { - replacefakectcp("$ctcpitem $ctcpreply"); - return; - } - - if (@fakectcp == 0) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_empty'); - } else { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_info'); - - for (my $n = 0; $n < @fakectcp ; ++$n) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'fctcp_print', $n, $fakectcp[$n]->{item}, $fakectcp[$n]->{reply}); - } - } -} - -load_fakectcplist("$irssidir/$fakectcp_file"); - -Irssi::signal_add('ctcp msg', 'ctcpreply'); -Irssi::command_bind('fctcp', 'fakectcp'); -Irssi::command_set_options('fctcp','add del list help replace'); -Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'loaded', $IRSSI{name}, $VERSION, $IRSSI{authors}); diff --git a/.config/irssi/scripts/autorun/dim_nicks.pl b/.config/irssi/scripts/autorun/dim_nicks.pl @@ -1,431 +0,0 @@ -use strict; -use warnings; - -our $VERSION = '0.4.9'; -our %IRSSI = ( - authors => 'Nei', - contact => 'Nei @ anti@conference.jabber.teamidiot.de', - url => "http://anti.teamidiot.de/", - name => 'dim_nicks', - description => 'Dims nicks that are not in channel anymore.', - license => 'GNU GPLv2 or later', - ); - -# Usage -# ===== -# Once loaded, this script will record the nicks of each new -# message. If the user leaves the room, the messages will be rewritten -# with the nick in another colour/style. -# -# Depending on your theme, tweaking the forms settings may be -# necessary. With the default irssi theme, this script should just -# work. - -# Options -# ======= -# /set dim_nicks_color <colour> -# * the colour code to use for dimming the nick, or a string of format -# codes with the special token $* in place of the nick (e.g. %I$*%I -# for italic) -# -# /set dim_nicks_history_lines <num> -# * only this many lines of messages are remembered/rewritten (per -# window) -# -# /set dim_nicks_ignore_hilights <ON|OFF> -# * ignore lines with hilight when dimming -# -# /set dim_nicks_forms_skip <num> -# /set dim_nicks_forms_search_max <num> -# * these two settings limit the range where to search for the -# nick. -# It sets how many forms (blocks of irssi format codes or -# non-letters) to skip at the beginning of line before starting to -# search for the nick, and from then on how many forms to search -# before stopping. -# You should set this to the appropriate values to avoid (a) dimming -# your timestamp (b) dimming message content instead of the nick. -# To check your settings, you can use the command -# /script exec Irssi::Script::dim_nicks::debug_forms - - -no warnings 'redefine'; -use constant IN_IRSSI => __PACKAGE__ ne 'main' || $ENV{IRSSI_MOCK}; -use Irssi 20140701; -use Irssi::TextUI; -use Encode; - - -sub setc () { - $IRSSI{name} -} - -sub set ($) { - setc . '_' . $_[0] -} - -my $history_lines = 100; -my $skip_forms = 1; -my $search_forms_max = 5; -my $ignore_hilights = 1; -my $color_letter = 'K'; -my @color_code = ("\cD8/"); # update this when you change $color_letter - -# nick object cache, chan object cache, line id cache, line id -> window map, -> channel, -> nick, -> nickname, channel -> line ids, channel->nickname->departure time, channel->nickname->{parts of line} -my (%nick_reg, %chan_reg, %history_w, %history_c, %history_n, %history_nn, %history_st, %lost_nicks, %lost_nicks_fs, %lost_nicks_fc, %lost_nicks_bc, %lost_nicks_bs); - -our ($dest, $chanref, $nickref); - - -sub msg_line_tag { - my ($srv, $msg, $nick, $addr, $targ) = @_; - local $chanref = $srv->channel_find($targ); - local $nickref = ref $chanref ? $chanref->nick_find($nick) : undef; - &Irssi::signal_continue; -} - -sub color_to_code { - my $win = Irssi::active_win; - my $view = $win->view; - my $cl = $color_letter; - if (-1 == index $cl, '$*') { - $cl = "%$cl\$*"; - } - $win->print_after(undef, MSGLEVEL_NEVER, "$cl "); - my $lp = $win->last_line_insert; - my $color_code = $lp->get_text(1); - $color_code =~ s/ $//; - $view->remove_line($lp); - @color_code = split /\$\*/, $color_code, 2; -} - -sub setup_changed { - $history_lines = Irssi::settings_get_int( set 'history_lines' ); - $skip_forms = Irssi::settings_get_int( set 'forms_skip' ); - $search_forms_max = Irssi::settings_get_int( set 'forms_search_max' ); - $ignore_hilights = Irssi::settings_get_bool( set 'ignore_hilights' ); - my $new_color = Irssi::settings_get_str( set 'color' ); - if ($new_color ne $color_letter) { - $color_letter = $new_color; - color_to_code(); - } -} - -sub init_dim_nicks { - setup_changed(); -} - -sub prt_text_issue { - my ($ld) = @_; - local $dest = $ld; - &Irssi::signal_continue; -} - -sub expire_hist { - for my $ch (keys %history_st) { - if (@{$history_st{$ch}} > 2 * $history_lines) { - my @del = splice @{$history_st{$ch}}, 0, $history_lines; - delete @history_w{ @del }; - delete @history_c{ @del }; - delete @history_n{ @del }; - delete @history_nn{ @del }; - } - } -} - -sub prt_text_ref { - return unless $nickref; - return unless $dest && defined $dest->{target}; - return unless $dest->{level} & MSGLEVEL_PUBLIC; - return if $ignore_hilights && $dest->{level} & MSGLEVEL_HILIGHT; - - my ($win) = @_; - my $view = $win->view; - my $line_id = $view->{buffer}{_irssi} .','. $view->{buffer}{cur_line}{_irssi}; - $chan_reg{ $chanref->{_irssi} } = $chanref; - $nick_reg{ $nickref->{_irssi} } = $nickref; - if (exists $history_w{ $line_id }) { - } - $history_w{ $line_id } = $win->{_irssi}; - $history_c{ $line_id } = $chanref->{_irssi}; - $history_n{ $line_id } = $nickref->{_irssi}; - $history_nn{ $line_id } = $nickref->{nick}; - push @{$history_st{ $chanref->{_irssi} }}, $line_id; - expire_hist(); - my @lost_forever = grep { $view->{buffer}{first_line}{info}{time} > $lost_nicks{ $chanref->{_irssi} }{ $_ } } - keys %{$lost_nicks{ $chanref->{_irssi} }}; - delete @{$lost_nicks{ $chanref->{_irssi} }}{ @lost_forever }; - delete @{$lost_nicks_fs{ $chanref->{_irssi} }}{ @lost_forever }; - delete @{$lost_nicks_fc{ $chanref->{_irssi} }}{ @lost_forever }; - delete @{$lost_nicks_bc{ $chanref->{_irssi} }}{ @lost_forever }; - delete @{$lost_nicks_bs{ $chanref->{_irssi} }}{ @lost_forever }; - return; -} - -sub win_del { - my ($win) = @_; - for my $ch (keys %history_st) { - @{$history_st{$ch}} = grep { exists $history_w{ $_ } && - $history_w{ $_ } != $win->{_irssi} } @{$history_st{$ch}}; - } - my @del = grep { $history_w{ $_ } == $win->{_irssi} } keys %history_w; - delete @history_w{ @del }; - delete @history_c{ @del }; - delete @history_n{ @del }; - delete @history_nn{ @del }; - return; -} - -sub _alter_lines { - my ($chan, $check_lr, $ad) = @_; - my $win = $chan->window; - return unless ref $win; - my $view = $win->view; - my $count = $history_lines; - my $buffer_id = $view->{buffer}{_irssi} .','; - my $lp = $view->{buffer}{cur_line}; - my %check_lr = map { $_ => undef } @$check_lr; - my $redraw; - my $bottom = $view->{bottom}; - while ($lp && $count) { - my $line_id = $buffer_id . $lp->{_irssi}; - if (exists $check_lr{ $line_id }) { - $lp = _alter_line($buffer_id, $line_id, $win, $view, $lp, $chan->{_irssi}, $ad); - unless ($lp) { - last; - } - $redraw = 1; - } - } continue { - --$count; - $lp = $lp->prev; - } - if ($redraw) { - $win->command('^scrollback end') if $bottom && !$win->view->{bottom}; - $view->redraw; - } -} - -my $irssi_mumbo = qr/\cD[`-i]|\cD[&-@\xff]./; -my $irssi_mumbo_no_partial = qr/(?<!\cD)(?<!\cD[&-@\xff])/; -my $irssi_skip_form_re = qr/((?:$irssi_mumbo|[.,*@%+&!#$()=~'";:?\/><]+(?=$irssi_mumbo|\s))+|\s+)/; - -sub debug_forms { - my $win = Irssi::active_win; - my $view = $win->view; - my $lp = $view->{buffer}{cur_line}; - my $count = $history_lines; - my $buffer_id = $view->{buffer}{_irssi} .','; - while ($lp && $count) { - my $line_id = $buffer_id . $lp->{_irssi}; - if (exists $history_w{ $line_id }) { - my $line_nick = $history_nn{ $line_id }; - my $text = $lp->get_text(1); - pos $text = 0; - my $from = 0; - for (my $i = 0; $i < $skip_forms; ++$i) { - last unless - scalar $text =~ /$irssi_skip_form_re/g; - $from = pos $text; - } - my $to = $from; - for (my $i = 0; $i < $search_forms_max; ++$i) { - last unless - scalar $text =~ /$irssi_skip_form_re/g; - $to = pos $text; - } - my $pre = substr $text, 0, $from; - my $search = substr $text, $from, $to-$from; - my $post = substr $text, $to; - unless ($to > $from) { - } else { - my @nick_reg; - unshift @nick_reg, quotemeta substr $line_nick, 0, $_ for 1 .. length $line_nick; - no warnings 'uninitialized'; - for my $nick_reg (@nick_reg) { - last if $search - =~ s/(\Q$color_code[0]\E\s*)?((?:$irssi_mumbo)+)?$irssi_mumbo_no_partial($nick_reg)((?:$irssi_mumbo)+)?(\s*\Q$color_code[0]\E)?/<match>$1$2<nick>$3<\/nick>$4$5<\/match>/; - last if $search - =~ s/(?:\Q$color_code[0]\E)?(?:(?:$irssi_mumbo)+?)?$irssi_mumbo_no_partial($nick_reg)(?:(?:$irssi_mumbo)+?)?(?:\Q$color_code[1]\E)?/<nick>$1<\/nick>/; - } - } - my $msg = "$pre<search>$search</search>$post"; - #$msg =~ s/([^[:print:]])/sprintf '\\x%02x', ord $1/ge; - $msg =~ s/\cDe/%|/g; $msg =~ s/%/%%/g; - $win->print(setc." form debug: [$msg]", MSGLEVEL_CLIENTCRAP); - return; - } - } continue { - --$count; - $lp = $lp->prev; - } - $win->print(setc." form debug: no usable line found", MSGLEVEL_CLIENTCRAP); -} - -sub _alter_line { - my ($buffer_id, $lrp, $win, $view, $lp, $cid, $ad) = @_; - my $line_nick = $history_nn{ $lrp }; - my $text = $lp->get_text(1); - pos $text = 0; - my $from = 0; - for (my $i = 0; $i < $skip_forms; ++$i) { - last unless - scalar $text =~ /$irssi_skip_form_re/g; - $from = pos $text; - } - my $to = $from; - for (my $i = 0; $i < $search_forms_max; ++$i) { - last unless - scalar $text =~ /$irssi_skip_form_re/g; - $to = pos $text; - } - return $lp unless $to > $from; - my @nick_reg; - unshift @nick_reg, quotemeta substr $line_nick, 0, $_ for 1 .. length $line_nick; - { no warnings 'uninitialized'; - if ($ad) { - if (exists $lost_nicks_fs{ $cid }{ $line_nick }) { - my ($fs, $fc, $bc, $bs) = ($lost_nicks_fs{ $cid }{ $line_nick }, $lost_nicks_fc{ $cid }{ $line_nick }, $lost_nicks_bc{ $cid }{ $line_nick }, $lost_nicks_bs{ $cid }{ $line_nick }); - my $sen = length $bs ? $color_code[0] : ''; - for my $nick_reg (@nick_reg) { - last if - (substr $text, $from, $to-$from) - =~ s/(?:\Q$color_code[0]\E)?(?:(?:$irssi_mumbo)+?)?$irssi_mumbo_no_partial($nick_reg)(?:(?:$irssi_mumbo)+?)?(?:\Q$color_code[1]\E)?/$fc$1$bc$sen/; - } - } - } - else { - for my $nick_reg (@nick_reg) { - if ( - (substr $text, $from, $to-$from) - =~ s/(\Q$color_code[0]\E\s*)?((?:$irssi_mumbo)+)?$irssi_mumbo_no_partial($nick_reg)((?:$irssi_mumbo)+)?(\s*\Q$color_code[0]\E)?/$1$2$color_code[0]$3$color_code[1]$4$5/) { - $lost_nicks_fs{ $cid }{ $line_nick } = $1; - $lost_nicks_fc{ $cid }{ $line_nick } = $2; - $lost_nicks_bc{ $cid }{ $line_nick } = $4; - $lost_nicks_bs{ $cid }{ $line_nick } = $5; - last; - } - } - } } - $win->gui_printtext_after($lp->prev, $lp->{info}{level} | MSGLEVEL_NEVER, "$text\n", $lp->{info}{time}); - my $ll = $win->last_line_insert; - my $line_id = $buffer_id . $ll->{_irssi}; - if (exists $history_w{ $line_id }) { - } - grep { $_ eq $lrp and $_ = $line_id } @{$history_st{ $cid }}; - $history_w{ $line_id } = delete $history_w{ $lrp }; - $history_c{ $line_id } = delete $history_c{ $lrp }; - $history_n{ $line_id } = delete $history_n{ $lrp }; - $history_nn{ $line_id } = delete $history_nn{ $lrp }; - $view->remove_line($lp); - $ll; -} - -sub nick_add { - my ($chan, $nick) = @_; - if (delete $lost_nicks{ $chan->{_irssi} }{ $nick->{nick} }) { - my @check_lr = grep { $history_c{ $_ } == $chan->{_irssi} && - $history_n{ $_ } eq $nick->{nick} } keys %history_w; - if (@check_lr) { - $nick_reg{ $nick->{_irssi} } = $nick; - for my $li (@check_lr) { - $history_n{ $li } = $nick->{_irssi}; - } - _alter_lines($chan, \@check_lr, 1); - } - } - delete $lost_nicks_fs{ $chan->{_irssi} }{ $nick->{nick} }; - delete $lost_nicks_fc{ $chan->{_irssi} }{ $nick->{nick} }; - delete $lost_nicks_bc{ $chan->{_irssi} }{ $nick->{nick} }; - delete $lost_nicks_bs{ $chan->{_irssi} }{ $nick->{nick} }; - return; -} - -sub nick_del { - my ($chan, $nick) = @_; - my @check_lr = grep { $history_n{ $_ } eq $nick->{_irssi} } keys %history_w; - for my $li (@check_lr) { - $history_n{ $li } = $nick->{nick}; - } - if (@check_lr) { - $lost_nicks{ $chan->{_irssi} }{ $nick->{nick} } = time; - _alter_lines($chan, \@check_lr, 0); - } - delete $nick_reg{ $nick->{_irssi} }; - return; -} - -sub nick_change { - my ($chan, $nick, $oldnick) = @_; - nick_add($chan, $nick); -} - -sub chan_del { - my ($chan) = @_; - if (my $del = delete $history_st{ $chan->{_irssi} }) { - delete @history_w{ @$del }; - delete @history_c{ @$del }; - delete @history_n{ @$del }; - delete @history_nn{ @$del }; - } - delete $chan_reg{ $chan->{_irssi} }; - delete $lost_nicks{$chan->{_irssi}}; - delete $lost_nicks_fs{$chan->{_irssi}}; - delete $lost_nicks_fc{$chan->{_irssi}}; - delete $lost_nicks_bc{$chan->{_irssi}}; - delete $lost_nicks_bs{$chan->{_irssi}}; - return; -} - -Irssi::settings_add_int( setc, set 'history_lines', $history_lines); -Irssi::settings_add_bool( setc, set 'ignore_hilights', $ignore_hilights); -Irssi::signal_add_last({ - 'setup changed' => 'setup_changed', -}); -Irssi::signal_add({ - 'print text' => 'prt_text_issue', - 'gui print text finished' => 'prt_text_ref', - 'nicklist new' => 'nick_add', - 'nicklist changed' => 'nick_change', - 'nicklist remove' => 'nick_del', - 'window destroyed' => 'win_del', - 'message public' => 'msg_line_tag', - 'channel destroyed' => 'chan_del', -}); - -sub dumphist { - my $win = Irssi::active_win; - my $view = $win->view; - my $buffer_id = $view->{buffer}{_irssi} .','; - for (my $lp = $view->{buffer}{first_line}; $lp; $lp = $lp->next) { - my $line_id = $buffer_id . $lp->{_irssi}; - if (exists $history_w{ $line_id }) { - my $k = $history_c{ $line_id }; - my $kn = $history_n{ $line_id }; - if (exists $chan_reg{ $k }) { - } - if (exists $nick_reg{ $kn }) { - } - if (exists $lost_nicks{ $k } && exists $lost_nicks{ $k }{ $kn }) { - } - } - } -} -Irssi::settings_add_str( setc, set 'color', $color_letter); -Irssi::settings_add_int( setc, set 'forms_skip', $skip_forms); -Irssi::settings_add_int( setc, set 'forms_search_max', $search_forms_max); - -init_dim_nicks(); - -{ package Irssi::Nick } - -# Changelog -# ========= -# 0.4.9 -# - fix default setting not working -# 0.4.8 -# - optionally ignore hilighted lines -# 0.4.7 -# - fix useless re-reading of settings colour -# 0.4.6 -# - fix crash on some lines reported by pierrot diff --git a/.config/irssi/scripts/autorun/escape.pl b/.config/irssi/scripts/autorun/escape.pl @@ -1,58 +0,0 @@ -# Usage: -# Do /escape (or /esc) just like you would use /lastlog -# this then prints the lines, which you can use in /eval. -# see /help lastlog for options -# -# For example: -# <someone> Hey! join #fooX (where X is some char you can't copy-paste) -# then you do /esc #foo -# and you'll get something like 19:50 \x048/<\x04g \x04gsomeone\x04g\x048/>\x04g \x04ehey! join #foo\x12 -# ignore the stuff in the first part of the message, that's irssi's internal color format for the line printed. -# doing /eval join #foo\x12 will make you join the right channel -# /esc -clear makes your scrollback clean again - -use Irssi; -use strict; -use vars qw($VERSION %IRSSI); -$VERSION = '1.0'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'wouter@coekaerts.be, coekie@#irssi', - name => 'escape', - description => 'displays lines in your scrollback in escaped form, so you can copy and paste them including colors and special characters', - license => 'GPL v2', - url => 'http://wouter.coekaerts.be/irssi/', -); - -sub escape { - my ($text) = @_; - $text =~ s/(.)/escape_char($1)/eg; - return $text; -} - -sub escape_char { - my ($char) = @_; - my $ord = ord($char); - if ($char eq '\\' || $char eq '$' || $char eq ';') { - return "\\$char"; - } elsif ($ord < 32 || $ord > 126) { - return '\\x' . sprintf("%02x", ord($char)); - } else { - return $char; - } -} - -Irssi::command_bind("escape", sub { - my ($data, $server, $item) = @_; - my $context = $item ? $item : Irssi::active_win; - - Irssi::signal_add_first('print text', 'sig_print_text'); - $context->command("lastlog $data"); - Irssi::signal_remove('print text', 'sig_print_text'); -}); - -sub sig_print_text { - my ($dest, $text, $stripped_text) = @_; - $_[1] = escape($text); - Irssi::signal_continue(@_); -} diff --git a/.config/irssi/scripts/autorun/hilightwin.pl b/.config/irssi/scripts/autorun/hilightwin.pl @@ -1,86 +0,0 @@ -# -# Print hilighted messages & private messages to window named "hilight" for -# irssi 0.7.99 by Timo Sirainen -# -# Modded a tiny bit by znx to stop private messages entering the hilighted -# window (can be toggled) and to put up a timestamp. -# -# Changed a little by rummik to optionally show network name. Enable with -# `/set hilightwin_show_network on` -# - -use strict; -use Irssi; -use POSIX; -use vars qw($VERSION %IRSSI); - -$VERSION = "1.00"; -%IRSSI = ( - authors => "Timo \'cras\' Sirainen, Mark \'znx\' Sangster, Kimberly \'rummik\' Zick", - contact => "tss\@iki.fi, znxster\@gmail.com, git\@zick.kim", - name => "hilightwin", - description => "Print hilighted messages to window named \"hilight\"", - license => "Public Domain", - url => "http://irssi.org/", - changed => "Thu Apr 6 15:30:25 EDT 2017" -); - -sub is_ignored { - my ($dest) = @_; - - my @ignore = split(' ', Irssi::settings_get_str('hilightwin_ignore_targets')); - return 0 if (!@ignore); - - my %targets = map { $_ => 1 } @ignore; - - return 1 if exists($targets{"*"}); - return 1 if exists($targets{$dest->{target}}); - - if ($dest->{server}) { - my $tag = $dest->{server}->{tag}; - return 1 if exists($targets{$tag . "/*"}); - return 1 if exists($targets{$tag . "/" . $dest->{target}}); - } - - return 0; -} - -sub sig_printtext { - my ($dest, $text, $stripped) = @_; - - my $opt = MSGLEVEL_HILIGHT; - my $shownetwork = Irssi::settings_get_bool('hilightwin_show_network'); - - if(Irssi::settings_get_bool('hilightwin_showprivmsg')) { - $opt = MSGLEVEL_HILIGHT|MSGLEVEL_MSGS; - } - - if( - ($dest->{level} & ($opt)) && - ($dest->{level} & MSGLEVEL_NOHILIGHT) == 0 && - (!is_ignored($dest)) - ) { - my $window = Irssi::window_find_name('[hilights]'); - $text =~ s/^[[:space:]]*/ /; # fix nm2.pl output - - if ($dest->{level} & MSGLEVEL_PUBLIC) { - $text = $dest->{target} . '14]' . $text; - $text = '14[' . $dest->{server}->{tag} . "14/" . $text if ($shownetwork); - } elsif ($shownetwork) { - $text = $dest->{server}->{tag} . ": " . $text; - } - $text =~ s/%/%%/g; - $window->print($text, MSGLEVEL_CLIENTCRAP) if ($window); - } -} - -my $window = Irssi::window_find_name('[hilights]'); -Irssi::print("Create a window named 'hilight'") if (!$window); - -Irssi::settings_add_bool('hilightwin','hilightwin_showprivmsg',1); -Irssi::settings_add_str('hilightwin', 'hilightwin_ignore_targets', ''); -Irssi::settings_add_bool('hilightwin','hilightwin_show_network', 0); - -Irssi::signal_add('print text', 'sig_printtext'); - -# vim:set ts=4 sw=4 et: diff --git a/.config/irssi/scripts/autorun/history.pl b/.config/irssi/scripts/autorun/history.pl @@ -1,146 +0,0 @@ -# Search within your typed history as you type (like ctrl-R in bash) -# Usage: -# * First do: /bind ^R /history_search -# * Then type ctrl-R and type what you're searching for -# * Optionally, you can bind something to "/history_search -forward" to go forward in the results - -# Copyright 2007-2009 Wouter Coekaerts <coekie@irssi.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -use strict; -use Irssi 20070804; -use Irssi::TextUI; - -use vars qw($VERSION %IRSSI); -$VERSION = '2.1'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'coekie@irssi.org', - name => 'history_search', - description => 'Search within your typed history as you type (like ctrl-R in bash)', - license => 'GPLv2 or later', - url => 'http://wouter.coekaerts.be/irssi/', -); - -# is the searching enabled? -my $enabled = 0; -# the typed text (the query) last time a key was pressed -my $prev_typed; -# the position in the input of where the typed text started. -# everything before it is not typed by the user but added by this script as part of the result -my $prev_startpos; -# the current list of matches -my @matches; -# at what place are we in @matches? -my $current_match_index; - -Irssi::command_bind('history_search', sub { - my ($data, $server, $item) = @_; - if ($data !~ /^ *(-forward)? *$/) { - Irssi::print("history_search: Unknown arguments: $data"); - return; - } - my $forward = $1 eq '-forward'; - - if (! $enabled) { - $enabled = 1; - $prev_typed = ''; - $prev_startpos = 0; - @matches = (); - $current_match_index = -1; - } else { - if ($forward) { - if ($current_match_index + 1 < scalar(@matches)) { - $current_match_index++; - } - } else { # backwards - if ($current_match_index > 0) { - $current_match_index--; - } - } - } -}); - -Irssi::signal_add_last 'gui key pressed' => sub { - my ($key) = @_; - - if ($key == 10 || $key == 13 || $key == 27) { # enter or escape - $enabled = 0; - } - - return unless $enabled; - - # get the content of the input line - my $prompt = Irssi::parse_special('$L'); - my $pos = Irssi::gui_input_get_pos(); - - # stop if the cursor is before the position where the typing started (e.g. if user pressed backspace more than he typed characters) - if ($pos < $prev_startpos) { - $enabled = 0; - return; - } - - # get the part of the input line that the user typed (strip the part before and after which this script added) - my $typed = substr($prompt, $prev_startpos, ($pos-$prev_startpos)); - - if ($typed ne $prev_typed) { # something changed - # find matches - find_matches($typed); - - # start searching from the end again - $current_match_index = scalar(@matches) - 1; - } - - # if nothing was found, just show what the user typed - # else, show the current match - my $result = ($current_match_index == -1) ? $typed : $matches[$current_match_index]; - - # update the input line - my $startpos = index(lc($result), lc($typed)); - Irssi::gui_input_set($result); - Irssi::gui_input_set_pos($startpos + length($typed)); - - # remember for next time - $prev_typed = $typed; - $prev_startpos = $startpos; -}; - -# find matches for the given user-typed text, and put it in @matches -sub find_matches($) { - my ($typed) = @_; - if (Irssi::version() > 20090117) { - $typed = lc($typed); - my @history; - if ($prev_typed ne '' && index($typed, lc($prev_typed)) != -1) { # previous typed plus more - @history = @matches; # only search in previous results - } else { - @history = Irssi::active_win->get_history_lines(); - } - @matches = (); - for my $history_line (@history) { - my $startpos = index(lc($history_line), $typed); - if ($startpos != -1) { - push @matches, $history_line; - } - } - } else { # older irssi version, can only get the last match - @matches = (); - my $last_match = Irssi::parse_special('$!' . $typed . '!'); - if ($last_match ne '') { - push @matches, $last_match; - } - } -} diff --git a/.config/irssi/scripts/autorun/keepnick.pl b/.config/irssi/scripts/autorun/keepnick.pl @@ -1,458 +0,0 @@ -# keepnick - irssi 0.7.98.CVS -# -# $Id: keepnick.pl,v 1.19 2013/05/23 05:08:34 peder Exp $ -# -# Copyright (C) 2001, 2002, 2006, 2013 by Peder Stray <peder@ninja.no> -# - -use strict; -use Irssi 20011118.1727; -use Irssi::Irc; - -# ======[ Script Header ]=============================================== - -use vars qw{$VERSION %IRSSI}; -($VERSION) = '$Revision: 1.19 $' =~ / (\d+\.\d+) /; -%IRSSI = ( - name => 'keepnick', - authors => 'Peder Stray', - contact => 'peder@ninja.no', - url => 'http://ninja.no/irssi/keepnick.pl', - license => 'GPL', - description => 'Try to get your nick back when it becomes available.', - ); - -# ======[ Variables ]=================================================== - -my(%keepnick); # nicks we want to keep -my(%getnick); # nicks we are currently waiting for -my(%inactive); # inactive chatnets -my(%manual); # manual nickchanges - -# ======[ Helper functions ]============================================ - -# --------[ change_nick ]----------------------------------------------- - -sub change_nick { - my($server,$nick) = @_; - $server->redirect_event('keepnick nick', 1, ":$nick", -1, undef, - { - "event nick" => "redir keepnick nick", - "" => "event empty", - }); - $server->send_raw("NICK :$nick"); -} - -# --------[ check_nick ]------------------------------------------------ - -sub check_nick { - my($server,$net,$nick); - - %getnick = (); # clear out any old entries - - for $net (keys %keepnick) { - next if $inactive{$net}; - $server = Irssi::server_find_chatnet($net); - next unless $server; - next if lc $server->{nick} eq lc $keepnick{$net}; - - $getnick{$net} = $keepnick{$net}; - } - - for $net (keys %getnick) { - $server = Irssi::server_find_chatnet($net); - next unless $server; - next unless ref($server) eq 'Irssi::Irc::Server'; # this only work on IRC - $nick = $getnick{$net}; - if (lc $server->{nick} eq lc $nick) { - delete $getnick{$net}; - next; - } - $server->redirect_event('keepnick ison', 1, '', -1, undef, - { "event 303" => "redir keepnick ison" }); - $server->send_raw("ISON :$nick"); - } -} - -# --------[ load_nicks ]------------------------------------------------ - -sub load_nicks { - my($file) = Irssi::get_irssi_dir."/keepnick"; - my($count) = 0; - local(*CONF); - - %keepnick = (); - open CONF, "<", $file; - while (<CONF>) { - my($net,$nick) = split; - if ($net && $nick) { - $keepnick{lc $net} = $nick; - $count++; - } - } - close CONF; - - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_crap', - "Loaded $count nicks from $file"); -} - -# --------[ save_nicks ]------------------------------------------------ - -sub save_nicks { - my($auto) = @_; - my($file) = Irssi::get_irssi_dir."/keepnick"; - my($count) = 0; - local(*CONF); - - return if $auto && !Irssi::settings_get_bool('keepnick_autosave'); - - open CONF, ">", $file; - for my $net (sort keys %keepnick) { - print CONF "$net\t$keepnick{$net}\n"; - $count++; - } - close CONF; - - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_crap', - "Saved $count nicks to $file") - unless $auto; -} - -# --------[ server_printformat ]---------------------------------------- - -sub server_printformat { - my($server,$level,$format,@params) = @_; - my($emitted) = 0; - for my $win (Irssi::windows) { - for my $item ($win->items) { - next unless ref $item; - if ($item->{server}{chatnet} eq $server->{chatnet}) { - $item->printformat($level,$format,@params); - $emitted++; - last; - } - } - } - $server->printformat(undef,$level,$format,@params) - unless $emitted; -} - -# ======[ Signal Hooks ]================================================ - -# --------[ sig_message_nick ]------------------------------------------ - -# if anyone changes their nick, check if we want their old one. -sub sig_message_nick { - my($server,$newnick,$oldnick) = @_; - my($chatnet) = lc $server->{chatnet}; - if (lc $oldnick eq lc $getnick{$chatnet}) { - change_nick($server, $getnick{$chatnet}); - } -} - -# --------[ sig_message_own_nick ]-------------------------------------- - -# if we change our nick, check it to see if we wanted it and if so -# remove it from the list. -sub sig_message_own_nick { - my($server,$newnick,$oldnick) = @_; - my($chatnet) = lc $server->{chatnet}; - if (lc $newnick eq lc $keepnick{$chatnet}) { - delete $getnick{$chatnet}; - if ($inactive{$chatnet}) { - delete $inactive{$chatnet}; - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_unhold', - $newnick, $chatnet); - } - } elsif (lc $oldnick eq lc $keepnick{$chatnet} && - lc $newnick eq lc $manual{$chatnet}) { - $inactive{$chatnet} = 1; - delete $getnick{$chatnet}; - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_hold', - $oldnick, $chatnet); - } -} - -# --------[ sig_message_own_nick_block ]-------------------------------- - -sub sig_message_own_nick_block { - my($server,$new,$old,$addr) = @_; - Irssi::signal_stop(); - if (Irssi::settings_get_bool('keepnick_quiet')) { - Irssi::printformat(MSGLEVEL_NICKS | MSGLEVEL_NO_ACT, - 'keepnick_got_nick', $new, $server->{chatnet}); - } else { - server_printformat($server, MSGLEVEL_NICKS | MSGLEVEL_NO_ACT, - 'keepnick_got_nick', $new, $server->{chatnet}); - } -} - -# --------[ sig_message_quit ]------------------------------------------ - -# if anyone quits, check if we want their nick. -sub sig_message_quit { - my($server,$nick) = @_; - my($chatnet) = lc $server->{chatnet}; - if (lc $nick eq lc $getnick{$chatnet}) { - change_nick($server, $getnick{$chatnet}); - } -} - -# --------[ sig_redir_keepnick_ison ]----------------------------------- - -sub sig_redir_keepnick_ison { - my($server,$text) = @_; - my $nick = $getnick{lc $server->{chatnet}}; - change_nick($server, $nick) - unless $text =~ /:\Q$nick\E\s?$/i; -} - -# --------[ sig_redir_keepnick_nick ]----------------------------------- - -sub sig_redir_keepnick_nick { - my($server,$args,$nick,$addr) = @_; - Irssi::signal_add_first('message own_nick', 'sig_message_own_nick_block'); - Irssi::signal_emit('event nick', @_); - Irssi::signal_remove('message own_nick', 'sig_message_own_nick_block'); -} - -# --------[ sig_setup_reread ]------------------------------------------ - -# main setup is reread, so let us do it too -sub sig_setup_reread { - load_nicks; -} - -# --------[ sig_setup_save ]-------------------------------------------- - -# main config is saved, and so we should save too -sub sig_setup_save { - my($mainconf,$auto) = @_; - save_nicks($auto); -} - -# ======[ Commands ]==================================================== - -# --------[ KEEPNICK ]-------------------------------------------------- - -# Usage: /KEEPNICK [-net <chatnet>] [<nick>] -sub cmd_keepnick { - my(@params) = split " ", shift; - my($server) = @_; - my($chatnet,$nick,@opts); - - # parse named parameters from the parameterlist - while (@params) { - my($param) = shift @params; - if ($param =~ /^-(chat|irc)?net$/i) { - $chatnet = shift @params; - } elsif ($param =~ /^-/) { - Irssi::print("Unknown parameter $param"); - } else { - push @opts, $param; - } - } - $nick = shift @opts; - - # check if the ircnet specified (if any) is valid, and if so get the - # server for it - if ($chatnet) { - my($cn) = Irssi::chatnet_find($chatnet); - unless ($cn) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_crap', - "Unknown chat network: $chatnet"); - return; - } - $chatnet = $cn->{name}; - $server = Irssi::server_find_chatnet($chatnet); - } - - # if we need a server, check if the one we got is connected. - unless ($server || ($nick && $chatnet)) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_crap', - "Not connected to server"); - return; - } - - # lets get the chatnet, and the nick we want - $chatnet ||= $server->{chatnet}; - $nick ||= $server->{nick}; - - # check that we really have a chatnet - unless ($chatnet) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_crap', - "Unable to find server network, maybe you forgot /server add before connecting?"); - return; - } - - if ($inactive{lc $chatnet}) { - delete $inactive{lc $chatnet}; - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_unhold', - $nick, $chatnet); - } - - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_add', $nick, - $chatnet); - - $keepnick{lc $chatnet} = $nick; - - save_nicks(1); - check_nick(); -} - -# --------[ UNKEEPNICK ]------------------------------------------------ - -# Usage: /UNKEEPNICK [<chatnet>] -sub cmd_unkeepnick { - my($chatnet,$server) = @_; - - # check if the ircnet specified (if any) is valid, and if so get the - # server for it - if ($chatnet) { - my($cn) = Irssi::chatnet_find($chatnet); - unless ($cn) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_crap', - "Unknown chat network: $chatnet"); - return; - } - $chatnet = $cn->{name}; - } else { - $chatnet = $server->{chatnet}; - } - - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_remove', - $keepnick{lc $chatnet}, $chatnet); - - delete $keepnick{lc $chatnet}; - delete $getnick{lc $chatnet}; - - save_nicks(1); -} - -# --------[ LISTNICK ]-------------------------------------------------- - -# Usage: /LISTNICK -sub cmd_listnick { - my(@nets) = sort keys %keepnick; - my $net; - if (@nets) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_list_header'); - for (@nets) { - $net = Irssi::chatnet_find($_); - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_list_line', - $keepnick{$_}, - $net ? $net->{name} : ">$_<", - $inactive{$_}?'inactive':'active'); - } - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_list_footer'); - } else { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'keepnick_list_empty'); - } -} - -# --------[ NICK ]------------------------------------------------------ - -sub cmd_nick { - my($data,$server) = @_; - my($nick) = split " ", $data; - return unless $server; - $manual{lc $server->{chatnet}} = $nick; -} - -# ======[ Setup ]======================================================= - -# --------[ Register settings ]----------------------------------------- - -Irssi::settings_add_bool('keepnick', 'keepnick_autosave', 1); -Irssi::settings_add_bool('keepnick', 'keepnick_quiet', 0); - -# --------[ Register formats ]------------------------------------------ - -Irssi::theme_register( -[ - 'keepnick_crap', - '{line_start}{hilight Keepnick:} $0', - - 'keepnick_add', - '{line_start}{hilight Keepnick:} Now keeping {nick $0} on [$1]', - - 'keepnick_remove', - '{line_start}{hilight Keepnick:} Stopped trying to keep {nick $0} on [$1]', - - 'keepnick_hold', - '{line_start}{hilight Keepnick:} Nickkeeping deactivated on [$1]', - - 'keepnick_unhold', - '{line_start}{hilight Keepnick:} Nickkeeping reactivated on [$1]', - - 'keepnick_list_empty', - '{line_start}{hilight Keepnick:} No nicks in keep list', - - 'keepnick_list_header', - '', - - 'keepnick_list_line', - '{line_start}{hilight Keepnick:} Keeping {nick $0} in [$1] ($2)', - - 'keepnick_list_footer', - '', - - 'keepnick_got_nick', - '{hilight Keepnick:} Nickstealer left [$1], got {nick $0} back', - -]); - -# --------[ Register signals ]------------------------------------------ - -Irssi::signal_add('message quit', 'sig_message_quit'); -Irssi::signal_add('message nick', 'sig_message_nick'); -Irssi::signal_add('message own_nick', 'sig_message_own_nick'); - -Irssi::signal_add('redir keepnick ison', 'sig_redir_keepnick_ison'); -Irssi::signal_add('redir keepnick nick', 'sig_redir_keepnick_nick'); - -Irssi::signal_add('setup saved', 'sig_setup_save'); -Irssi::signal_add('setup reread', 'sig_setup_reread'); - -# --------[ Register commands ]----------------------------------------- - -Irssi::command_bind("keepnick", "cmd_keepnick"); -Irssi::command_bind("unkeepnick", "cmd_unkeepnick"); -Irssi::command_bind("listnick", "cmd_listnick"); -Irssi::command_bind("nick", "cmd_nick"); - -# --------[ Register timers ]------------------------------------------- - -Irssi::timeout_add(12000, 'check_nick', ''); - -# --------[ Register redirects ]---------------------------------------- - -Irssi::Irc::Server::redirect_register('keepnick ison', 0, 0, - undef, - { - "event 303" => -1, - }, - undef ); - -Irssi::Irc::Server::redirect_register('keepnick nick', 0, 0, - undef, - { - "event nick" => 0, - "event 432" => -1, # ERR_ERRONEUSNICKNAME - "event 433" => -1, # ERR_NICKNAMEINUSE - "event 437" => -1, # ERR_UNAVAILRESOURCE - "event 484" => -1, # ERR_RESTRICTED - }, - undef ); - -# --------[ Load config ]----------------------------------------------- - -load_nicks; - -# ======[ END ]========================================================= - -# Local Variables: -# header-initial-hide: t -# mode: header-minor -# end: -# vim:set ts=8 sw=4: diff --git a/.config/irssi/scripts/autorun/lastspoke.pl b/.config/irssi/scripts/autorun/lastspoke.pl @@ -1,46 +0,0 @@ -use strict; -use vars qw($VERSION %IRSSI); - -use Irssi; -$VERSION = '2.1'; -%IRSSI = ( - authors => 'Daenyth', - contact => 'Daenyth /at/ gmail /dot/ com', - name => 'Complete Last-Spoke', - description => 'When using tab completion on an empty input buffer, complete to the nick of the person who spoke most recently.', - license => 'GPL2', -); - -my %list_of_speakers; - -sub complete_to_last_nick { - my ($strings, $window, $word, $linestart, $want_space) = @_; - return unless ($linestart eq '' && $word eq ''); - - my $last_speaker = get_last_speaker($window); - return unless defined $last_speaker; - my $suffix = Irssi::settings_get_str('completion_char'); - @$strings = $last_speaker . $suffix; - $$want_space = 1; - Irssi::signal_stop(); -} - -sub get_last_speaker { - my $window = shift; - return $list_of_speakers{$window->{active}->{name}}; -} - -sub store_last_speaker { - my ($server, $message, $speaker, $address, $target) = @_; - $list_of_speakers{$target} = $speaker; -} - -sub store_last_actor { - my ($server, $args, $actor, $address, $target) = @_; - $list_of_speakers{$target} = $actor; -} - -Irssi::signal_add_first( 'complete word', \&complete_to_last_nick ); -Irssi::signal_add_last ( 'message public', \&store_last_speaker ); -Irssi::signal_add_last ( 'ctcp action', \&store_last_actor ); - diff --git a/.config/irssi/scripts/autorun/ls.pl b/.config/irssi/scripts/autorun/ls.pl @@ -1,51 +0,0 @@ -use strict; -use vars qw($VERSION %IRSSI); -use Irssi 20020120; -$VERSION = "0.03"; -%IRSSI = ( - authors => "c0ffee", - contact => "c0ffee\@penguin-breeder.org", - name => "List nicks in channel", - description => "Use /ls <regex> to show all nicks (including ident\@host) matching regex in the current channel", - license => "Public Domain", - url => "http://www.penguin-breeder.org/irssi/", - changed => "Sun Sep 17 06:31 CEST 2017", -); - - -sub cmd_ls { - my ($data, $server, $channel) = @_; - - if ($channel->{type} ne "CHANNEL") { - Irssi::print("You are not on a channel"); - - return; - } - - $channel->print("--- Search results:"); - - my @nicks = $channel->nicks(); - - my $re = eval { qr/$data/i }; - if (not $re) { - chomp $@; - $channel->print("Invalid regex pattern:\n$@"); - return; - } - - my $found; - foreach my $nick (@nicks) { - my $n = $nick->{nick} . "!" . $nick->{host}; - - if ($n =~ $re) { - $channel->print($n); - $found = 1; - } - } - - if (not $found) { - $channel->print("No matches"); - } -} - -Irssi::command_bind('ls','cmd_ls'); diff --git a/.config/irssi/scripts/autorun/nickcolor.pl b/.config/irssi/scripts/autorun/nickcolor.pl @@ -1,1120 +0,0 @@ -use strict; -use warnings; - -our $VERSION = '0.4.0'; # c274f630aff9967 -our %IRSSI = ( - authors => 'Nei', - name => 'nickcolor_expando', - description => 'colourise nicks', - license => 'GPL v2', - ); - -# inspired by bc-bd's nm.pl and mrwright's nickcolor.pl - -# Usage -# ===== -# after loading the script, add the colour expando to the format -# (themes' abstracts are not supported) -# -# /format pubmsg {pubmsgnick $2 {pubnick $nickcolor$0}}$1 -# -# alternatively, use it together with nm2 script - -# Options -# ======= -# /set neat_colors <list of colours> -# * the list of colours for automatic colouring (you can edit it more -# conveniently with /neatcolor colors) -# -# /set neat_ignorechars <regex> -# * regular expression of characters to remove from nick before -# calculating the hash function -# -# /set neat_color_reassign_time <time> -# * if the user has not spoken for so long, the assigned colour is -# forgotten and another colour may be picked next time the user -# speaks -# -# /set neat_global_colors <ON|OFF> -# * more strongly prefer one global colour per nickname regardless of -# channel - -# Commands -# ======== -# /neatcolor -# * show the current colour distribution of nicks -# -# /neatcolor set [<network>/<#channel>] <nick> <colour> -# * set a fixed colour for nick -# -# /neatcolor reset [<network>/<#channel>] <nick> -# * remove a set colour of nick -# -# /neatcolor get [<network>/<#channel>] <nick> -# * query the current or set colour of nick -# -# /neatcolor re [<network>/<#channel>] <nick> -# * force change the colour of nick to a random other colour (to -# manually resolve clashes) -# -# /neatcolor save -# * save the colours to ~/.irssi/saved_nick_colors -# -# /neatcolor reset --all -# * re-set all colours -# -# /neatcolor colors -# * show currently configured colours, in colour -# -# /neatcolor colors add <list of colours> -# /neatcolor colors remove <list of colours> -# * add or remove these colours from the neat_colors setting - - -sub cmd_help_neatcolor { - print CLIENTCRAP <<HELP -%9Syntax:%9 - -NEATCOLOR -NEATCOLOR SET [<network>/<#channel>] <nick> <colour> -NEATCOLOR RESET [<network>/<#channel>] <nick> -NEATCOLOR GET [<network>/<#channel>] <nick> -NEATCOLOR RE [<network>/<#channel>] <nick> -NEATCOLOR SAVE -NEATCOLOR RESET --all -NEATCOLOR COLORS -NEATCOLOR COLORS ADD <list of colours> -NEATCOLOR COLORS REMOVE <list of colours> - -%9Parameters:%9 - - SET: set a fixed colour for nick - RESET: remove a set colour of nick - GET: query the current or set colour of nick - RE: force change the colour of nick to a random other - colour (to manually resolve clashes) - SAVE: save the colours to ~/.irssi/saved_nick_colors - RESET --all: re-set all colours - COLORS: show currently configured colours, in colour - COLORS ADD/REMOVE: add or remove these colours from the - neat_colors setting - - If no parameters are given, the current colour distribution of - nicks is shown. - -%9Description:%9 - - Manages nick based colouring - -HELP -} - -use Hash::Util qw(lock_keys); -use Irssi; - - -{ package Irssi::Nick } - -my @action_protos = qw(irc silc xmpp); -my (%set_colour, %avoid_colour, %has_colour, %last_time, %netchan_hist); -my ($expando, $iexpando, $ignore_re, $ignore_setting, $global_colours, $retain_colour_time, @colours, $exited, $session_load_time); -($expando, $iexpando) = ('', ''); # Initialise to empty - -# the numbers for the scoring system, highest colour value will be chosen -my %scores = ( - set => 200, - keep => 5, - global => 4, - hash => 3, - - avoid => -20, - hist => -10, - used => -2, - ); -lock_keys(%scores); - -my $history_lines = 40; -my $global_mode = 1; # start out with global nick colour - -my @colour_bags = ( - [qw[20 30 40 50 04 66 0C 61 60 67 6L]], # RED - [qw[37 3D 36 4C 46 5C 56 6C 6J 47 5D 6K 6D 57 6E 5E 4E 4K 4J 5J 4D 5K 6R]], # ORANGE - [qw[3C 4I 5I 6O 6I 06 4O 5O 3U 0E 5U 6U 6V 6P 6Q 6W 5P 4P 4V 4W 5W 4Q 5Q 5R 6Y 6X]], # YELLOW - [qw[26 2D 2C 3I 3O 4U 5V 2J 3V 3P 3J 5X]], # YELLOW-GREEN - [qw[16 1C 2I 2U 2O 1I 1O 1V 1P 02 0A 1U 2V 4X]], # GREEN - [qw[1D 1J 1Q 1W 1X 2Y 2S 2R 3Y 3Z 3S 3R 2K 3K 4S 5Z 5Y 4R 3Q 2Q 2X 2W 3X 3W 2P 4Y]], # GREEN-TURQUOIS - [qw[17 1E 1L 1K 1R 1S 03 1M 1N 1T 0B 1Y 1Z 2Z 4Z]], # TURQUOIS - [qw[28 2E 18 1F 19 1G 1A 1B 1H 2N 2H 09 3H 3N 2T 3T 2M 2G 2A 2F 2L 3L 3F 4M 3M 3G 29 4T 5T]], # LIGHT-BLUE - [qw[11 12 23 25 24 13 14 01 15 2B 4N]], # DARK-BLUE - [qw[22 33 44 0D 45 5B 6A 5A 5H 3B 4H 3A 4G 39 4F 6S 6T 5L 5N]], # VIOLET - [qw[21 32 42 53 63 52 43 34 35 55 65 6B 4B 4A 48 5G 6H 5M 6M 6N]], # PINK - [qw[38 31 05 64 54 41 51 62 69 68 59 5F 6F 58 49 6G]], # ROSE - [qw[7A 00 10 7B 7C 7D 7E 7G 7F]], # DARK-GRAY - [qw[7H 7I 27 7K 7J 08 7L 3E 7O 7Q 7N 7M 7P]], # GRAY - [qw[7S 7T 7R 4L 7W 7U 7V 5S 07 7X 6Z 0F]], # LIGHT-GRAY - ); -my %colour_bags; -{ my $idx = 0; - for my $bag (@colour_bags) { - @colour_bags{ @$bag } = ($idx)x@$bag; - } - continue { - ++$idx; - } -} -my @colour_list = map { @$_ } @colour_bags; -my @bases = split //, 'kbgcrmywKBGCRMYW04261537'; -my %base_map = map { $bases[$_] => sprintf '%02X', ($_ % 0x10) } 0..$#bases; -my %ext_to_base_map = map { (sprintf '%02X', $_) => $bases[$_] } 0..15; - -sub expando_neatcolour { - return $expando; -} - -sub expando_neatcolour_inv { - return $iexpando; -} - -# one-at-a-time hash -sub simple_hash { - use integer; - my $hash = 0x5065526c + length $_[0]; - for my $ord (unpack 'U*', $_[0]) { - $hash += $ord; - $hash += $hash << 10; - $hash &= 0xffffffff; - $hash ^= $hash >> 6; - } - $hash += $hash << 3; - $hash &= 0xffffffff; - $hash ^= $hash >> 11; - $hash = $hash + ($hash << 15); - $hash &= 0xffffffff; -} - -{ my %lut1; - my @z = (0 .. 9, 'A' .. 'Z'); - for my $x (16..255) { - my $idx = $x - 16; - my $col = 1+int($idx / @z); - $lut1{ $col . @z[(($col > 6 ? 10 : 0) + $idx) % @z] } = $x; - } - for my $idx (0..15) { - $lut1{ (sprintf "%02X", $idx) } = ($idx&8) | ($idx&4)>>2 | ($idx&2) | ($idx&1)<<2; - } - - sub debug_ansicolour { - my ($col, $bg) = @_; - return '' unless defined $col && exists $lut1{$col}; - $bg = $bg ? 48 : 38; - "\e[$bg;5;$lut1{$col}m" - } -} -sub debug_colour { - my ($col, $bg) = @_; - defined $col ? (debug_ansicolour($col, $bg) . $col . "\e[0m") : '(none)' -} -sub debug_score { - my ($score) = @_; - if ($score == 0) { - return $score - } - my @scale = $score > 0 ? (qw(16 1C 1I 1U 2V 4X)) : (qw(20 30 40 60 67 6L));; - my $v = (log 1+ abs $score)*(log 20); - debug_ansicolour($scale[$v >= $#scale ? -1 : $v], 1) . $score . "\e[0m" -} -sub debug_reused { - my ($netchan, $nick, $col) = @_; - my $chc = simple_hash($netchan); - my $hashcolour = @colours ? $colours[ $chc % @colours ] : 0; -} -sub debug_scores { - my ($netchan, $nick, $col, $prios, $colours) = @_; - my $inprogress; - unless (ref $prios) { - $inprogress = $prios; - $prios = [ sort { $colours->{$b} <=> $colours->{$a} } grep { exists $colours->{$_} } @colour_list ]; - } - my $chc = simple_hash($netchan); - my $hashcolour = @colours ? $colours[ $chc % @colours ] : 0; - unless ($inprogress) { - } - else { - } - for my $i (0..$#$prios) { - } -} - -sub colourise_nt { - my ($netchan, $nick, $weak) = @_; - my $time = time; - - my $g_or_n = $global_colours ? '' : $netchan; - - my $old_colour = $has_colour{$g_or_n}{$nick} // $has_colour{$netchan}{$nick}; - my $last_time = $last_time{$g_or_n}{$nick} // $last_time{$netchan}{$nick}; - - my $keep_score = $weak ? $scores{keep} + $scores{set} : $scores{keep}; - - unless ($weak) { - $last_time{$netchan}{$nick} - = $last_time{''}{$nick} = $time; - } - else { - $last_time{$netchan}{$nick} ||= 0; - } - - my $colour; - if (defined $old_colour && ($weak || (defined $last_time - && ($last_time + $retain_colour_time > $time - || ($last_time > 0 && grep { $_->[0] eq $nick } @{ $netchan_hist{$netchan} // [] }))))) { - $colour = $old_colour; - } - else { - # search for a suitable colour - my %colours = map { $_ => 0 } @colours; - my $hashnick = $nick; - $hashnick =~ s/$ignore_re//g if (defined $ignore_re && length $ignore_re); - my $hash = simple_hash($global_mode ? "/$hashnick" : "$netchan/$hashnick"); - - if (exists $set_colour{$netchan} && exists $set_colour{$netchan}{$nick}) { - $colours{ $set_colour{$netchan}{$nick} } += $scores{set}; - } - elsif (exists $set_colour{$netchan} && exists $set_colour{$netchan}{$hashnick}) { - $colours{ $set_colour{$netchan}{$hashnick} } += $scores{set}; - } - elsif (exists $set_colour{''} && exists $set_colour{''}{$nick}) { - $colours{ $set_colour{''}{$nick} } += $scores{set}; - } - elsif (exists $set_colour{''} && exists $set_colour{''}{$hashnick}) { - $colours{ $set_colour{''}{$hashnick} } += $scores{set}; - } - - if (exists $avoid_colour{$netchan} && exists $avoid_colour{$netchan}{$nick}) { - for (@{ $avoid_colour{$netchan}{$nick} }) { - $colours{ $_ } += $scores{avoid} if exists $colours{ $_ }; - } - } - elsif (exists $avoid_colour{$g_or_n} && exists $avoid_colour{$g_or_n}{$nick}) { - for (@{ $avoid_colour{$g_or_n}{$nick} }) { - $colours{ $_ } += $scores{avoid} if exists $colours{ $_ }; - } - } - - if (defined $old_colour) { - $colours{$old_colour} += $keep_score - if exists $colours{$old_colour}; - } - elsif (exists $has_colour{''}{$nick}) { - $colours{ $has_colour{''}{$nick} } += $scores{global} - if exists $colours{ $has_colour{''}{$nick} }; - } - - if (@colours) { - my $hashcolour = $colours[ $hash % @colours ]; - if (!defined $old_colour || $hashcolour ne $old_colour) { - $colours{ $hashcolour } += $scores{hash}; - } - } - - { my @netchans = $global_mode ? keys %has_colour : $netchan; - my $total; - my %colour_pens; - for my $gnc (@netchans) { - for my $onick (keys %{ $has_colour{$gnc} }) { - next if $gnc ne $netchan && exists $has_colour{$netchan}{$onick}; - next unless exists $last_time{$gnc}{$onick}; - if ($last_time{$gnc}{$onick} + $retain_colour_time > $time # XXX - || ($last_time{$gnc}{$onick} == 0 && $session_load_time + $retain_colour_time > $time)) { - if (exists $colours{ $has_colour{$gnc}{$onick} }) { - $colour_pens{ $has_colour{$gnc}{$onick} } += $scores{used}; - ++$total; - } - } - } - } - for (keys %colour_pens) { - $colours{ $_ } += $colour_pens{ $_ } / $total * @colours - if @colours; - } - } - - { my $fac = 1; - for my $gnetchan ($netchan, '') { - my $idx = exp(-log($history_lines)/$scores{hist}); - for my $hent (reverse @{ $netchan_hist{$gnetchan} // [] }) { - next unless defined $hent->[1]; - if ($hent->[0] ne $nick) { - my $pen = 1; - $pen *= 3 if length $nick == length $hent->[0]; - $pen *= 2 if (substr $nick, 0, 1) eq (substr $hent->[0], 0, 1) - || 1 == abs +(length $nick) - (length $hent->[0]); - $colours{ $hent->[1] } -= log($pen*$history_lines)/log($idx) / $fac - if exists $colours{ $hent->[1] }; - } - ++$idx; - last if $idx > $history_lines; - } - ++$fac; - } - } - - { my %bag_pens; - for my $co (keys %colours) { - $bag_pens{ $colour_bags{$co} } -= $colours{$co}/2 if $colours{$co} < 0; - } - for my $bag (keys %bag_pens) { - for my $co (@{ $colour_bags[$bag] }) { - $colours{$co} -= $bag_pens{$bag} / @colours - if @colours && exists $colours{$co}; - } - } - } - - my @prio_colours = sort { $colours{$b} <=> $colours{$a} } grep { exists $colours{$_} } @colour_list; - my $stop_at = 0; - while ($stop_at < $#prio_colours - && $colours{ $prio_colours[$stop_at] } <= $colours{ $prio_colours[$stop_at + 1] }) { - ++$stop_at; - } - $colour = $prio_colours[ $hash % ($stop_at + 1) ] - if @prio_colours; - - } - - unless ($weak) { - expire_hist($netchan, ''); - - my $ent = [$nick, $colour]; - push @{ $netchan_hist{$netchan} }, $ent; - push @{ $netchan_hist{''} }, $ent; - } - - defined $colour ? ($has_colour{$g_or_n}{$nick} = $has_colour{$netchan}{$nick} = $colour) : $colour -} - -sub expire_hist { - for my $ch (@_) { - if ($netchan_hist{$ch} - && @{$netchan_hist{$ch}} > 2 * $history_lines) { - splice @{$netchan_hist{$ch}}, 0, $history_lines; - } - } -} - -sub msg_line_tag { - my ($srv, $msg, $nick, $addr, $targ) = @_; - my $colour = colourise_nt('/'.$nick, $nick); - $expando = $colour ? format_expand('%X'.$colour) : ''; - $iexpando = $colour ? format_expand('%x'.$colour) : ''; -} - -# messy stuff below, hacked together by a non-perler (haydenh) -sub join2mlt { - my ($srv, $channel, $nick, $addr, $acc, $real) = @_; - msg_line_tag($srv, $acc, $nick, $acc); -} - -sub part2mlt { - my ($srv, $channel, $nick, $addr, $reason) = @_; - msg_line_tag($srv, $addr, $nick, $reason); -} - -sub quit2mlt { - my ($srv, $nick, $addr, $reason) = @_; - msg_line_tag($srv, $addr, $nick, $reason); -} - -sub kick2mlt { - my ($srv, $channel, $nick, $kicker, $address, $reason) = @_; - msg_line_tag($srv, $nick, $kicker, $reason); -} - -sub nick2mlt { - my ($srv, $nnick, $onick, $addr) = @_; - msg_line_tag($srv, $addr, $onick, $addr); -} - -sub invite2mlt { - my ($srv, $chan, $nick, $addr) = @_; - msg_line_tag($srv, $chan, $nick, $addr); -} - -sub inviteo2mlt { - my ($srv, $chan, $inv, $nick, $addr) = @_; - msg_line_tag($srv, $chan, $inv, $addr); -} - -sub topic2mlt { - my ($srv, $chan, $topic, $nick, $addr) = @_; - msg_line_tag($srv, $chan, $nick, $addr); -} - -sub notice2mlt { - my ($srv, $msg, $nick, $addr, $chan) = @_; - msg_line_tag($srv, $chan, $nick, $addr); -} - -sub msg_line_tag_xmppaction { - clear_ref(), return unless @_; - my ($srv, $msg, $nick, $targ) = @_; - msg_line_tag($srv, $msg, $nick, undef, $targ); -} - -sub msg_line_clear { - clear_ref(); -} - -sub prnt_clear_public { - my ($dest) = @_; - clear_ref() if $dest->{level} & MSGLEVEL_PUBLIC; -} - -sub clear_ref { - $expando = ''; - $iexpando = ''; -} - -sub nicklist_changed { - my ($chanobj, $nickobj, $old_nick) = @_; - - my $netchan = $chanobj->{server}{tag}.'/'.$chanobj->{name}; - my $nickstr = $nickobj->{nick}; - - if (!exists $has_colour{''}{$nickstr} && exists $has_colour{''}{$old_nick}) { - $has_colour{''}{$nickstr} = delete $has_colour{''}{$old_nick}; - } - if (exists $has_colour{$netchan}{$old_nick}) { - $has_colour{$netchan}{$nickstr} = delete $has_colour{$netchan}{$old_nick}; - } - - $last_time{$netchan}{$nickstr} - = $last_time{''}{$nickstr} = time; - - for my $old_ent (@{ $netchan_hist{$netchan} }) { - $old_ent->[0] = $nickstr if $old_ent->[0] eq $old_nick; - } - -} - -{ - my %format2control = ( - 'F' => "\cDa", '_' => "\cDc", '|' => "\cDe", '#' => "\cDi", "n" => "\cDg", "N" => "\cDg", - 'U' => "\c_", '8' => "\cV", 'I' => "\cDf", - ); - my %bg_base = ( - '0' => '0', '4' => '1', '2' => '2', '6' => '3', '1' => '4', '5' => '5', '3' => '6', '7' => '7', - 'x08' => '8', 'x09' => '9', 'x0a' => ':', 'x0b' => ';', 'x0c' => '<', 'x0d' => '=', 'x0e' => '>', 'x0f' => '?', - ); - my %fg_base = ( - 'k' => '0', 'b' => '1', 'g' => '2', 'c' => '3', 'r' => '4', 'm' => '5', 'p' => '5', 'y' => '6', 'w' => '7', - 'K' => '8', 'B' => '9', 'G' => ':', 'C' => ';', 'R' => '<', 'M' => '=', 'P' => '=', 'Y' => '>', 'W' => '?', - ); - my @ext_colour_off = ( - '.', '-', ',', - '+', "'", '&', - ); - sub format_expand { - my $copy = $_[0]; - $copy =~ s{%(Z.{6}|z.{6}|X..|x..|.)}{ - my $c = $1; - if (exists $format2control{$c}) { - $format2control{$c} - } - elsif (exists $bg_base{$c}) { - "\cD/$bg_base{$c}" - } - elsif (exists $fg_base{$c}) { - "\cD$fg_base{$c}/" - } - elsif ($c =~ /^[{}%]$/) { - $c - } - elsif ($c =~ /^(z|Z)([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})$/) { - my $bg = $1 eq 'z'; - my (@rgb) = map { hex $_ } $2, $3, $4; - my $x = $bg ? 0x1 : 0; - my $out = "\cD" . (chr -13 + ord '0'); - for (my $i = 0; $i < 3; ++$i) { - if ($rgb[$i] > 0x20) { - $out .= chr $rgb[$i]; - } - else { - $x |= 0x10 << $i; $out .= chr 0x20 + $rgb[$i]; - } - } - $out .= chr 0x20 + $x; - $out - } - elsif ($c =~ /^(x)(?:0([[:xdigit:]])|([1-6])(?:([0-9])|([a-z]))|7([a-x]))$/i) { - my $bg = $1 eq 'x'; - my $col = defined $2 ? hex $2 - : defined $6 ? 232 + (ord lc $6) - (ord 'a') - : 16 + 36 * ($3 - 1) + (defined $4 ? $4 : 10 + (ord lc $5) - (ord 'a')); - if ($col < 0x10) { - my $chr = chr $col + ord '0'; - "\cD" . ($bg ? "/$chr" : "$chr/") - } - else { - "\cD" . $ext_colour_off[($col - 0x10) / 0x50 + $bg * 3] . chr (($col - 0x10) % 0x50 - 1 + ord '0') - } - } - else { - "%$c" - } - }ge; - $copy - } -} - -sub save_colours { - open my $fid, '>', Irssi::get_irssi_dir() . '/saved_nick_colors' - or do { - Irssi::print("Error saving nick colours: $!", MSGLEVEL_CLIENTERROR) - unless $exited; - return; - }; - - local $\ = "\n"; - if (%set_colour) { - print $fid '[set]'; - for my $netch (sort keys %set_colour) { - for my $nick (sort keys %{ $set_colour{$netch} }) { - print $fid "$netch/$nick:".$set_colour{$netch}{$nick}; - } - } - print $fid ''; - } - my $time = time; - print $fid '[set]'; - my %session_colour; - for my $netch (sort keys %last_time) { - for my $nick (sort keys %{ $last_time{$netch} }) { - if (exists $has_colour{$netch} && exists $has_colour{$netch}{$nick} - && ($last_time{$netch}{$nick} + $retain_colour_time > $time - || ($last_time{$netch}{$nick} == 0 && $session_load_time + $retain_colour_time > $time) - || grep { $_->[0] eq $nick } @{ $netchan_hist{$netch} // [] })) { - $session_colour{$netch}{$nick} = $has_colour{$netch}{$nick}; - if (exists $session_colour{''}{$nick}) { - if (defined $session_colour{''}{$nick} - && $session_colour{''}{$nick} ne $session_colour{$netch}{$nick}) { - $session_colour{''}{$nick} = undef; - } - } - else { - $session_colour{''}{$nick} = $session_colour{$netch}{$nick}; - } - } - } - } - for my $nick (sort keys %{ $session_colour{''} }) { - if (defined $session_colour{''}{$nick}) { - print $fid "/$nick:".$session_colour{''}{$nick}; - } - else { - for my $netch (sort keys %session_colour) { - print $fid "$netch/$nick:".$session_colour{$netch}{$nick} - if exists $session_colour{$netch}{$nick} && defined $session_colour{$netch}{$nick}; - } - } - } - - close $fid; -} - -sub load_colours { - $session_load_time = time; - - open my $fid, '<', Irssi::get_irssi_dir() . '/saved_nick_colors' - or return; - my $mode; - while (my $line = <$fid>) { - chomp $line; - if ($line =~ /^\[(.*)\]$/) { - $mode = $1; - next; - } - - my $colon = rindex $line, ':'; - next if $colon < 0; - my $slash = rindex $line, '/', $colon; - next if $slash < 0; - my $col = substr $line, $colon +1; - next unless length $col; - my $netch = substr $line, 0, $slash; - my $nick = substr $line, $slash +1, $colon-$slash -1; - if ($mode eq 'set') { - $set_colour{$netch}{$nick} = $col; - } - elsif ($mode eq 'session') { - $has_colour{$netch}{$nick} = $col; - $last_time{$netch}{$nick} = 0; - } - } - close $fid; -} - -sub UNLOAD { - return if $exited; - exit_save(); -} - -sub exit_save { - $exited = 1; - save_colours() if Irssi::settings_get_bool('settings_autosave'); -} - -sub get_nick_color2 { - my ($tag, $chan, $nick, $format) = @_; - my $col = colourise_nt('/'.$nick, $nick); - $col ? $format ? format_expand('%X'.$col) : $col : '' -} - -sub _cmd_colours_check { - my ($add, $data) = @_; - my @to_check = grep { defined && length } map { - length == 1 ? $base_map{$_} - : length == 3 ? substr $_, 1 - : $_ } map { /(?|x(..)|([0-7].)|(.))/gi } - split ' ', $data; - my @valid; - my %scolours = map { $_ => undef } @colours; - for my $c (@to_check) { - if ((grep { $_ eq $c } @colour_list)) { - if ($add) { next if exists $scolours{$c} } - else { next if !exists $scolours{$c} } - push @valid, $c; - if ($add) { $scolours{$c} = undef; } - else { delete $scolours{$c}; } - } - } - (\@valid, \%scolours) -} - -sub _cmd_colours_set { - my $scolours = shift; - Irssi::settings_set_str('neat_colors', join '', map { $ext_to_base_map{$_} // "X$_" } grep { exists $scolours->{$_} } @colour_list); -} - -sub _cmd_colours_list { - map { "%X$_".($ext_to_base_map{$_} // "X$_").'%n' } @{+shift} -} - -sub cmd_neatcolor_colors_add { - my ($data, $server, $witem) = @_; - my ($added, $scolours) = _cmd_colours_check(1, $data); - if (@$added) { - _cmd_colours_set($scolours); - Irssi::print("%_nce2%_: added @{[ _cmd_colours_list($added) ]} to neat_colors", MSGLEVEL_CLIENTCRAP); - setup_changed(); - } - else { - Irssi::print("%_nce2%_: nothing added", MSGLEVEL_CLIENTCRAP); - } -} -sub cmd_neatcolor_colors_remove { - my ($data, $server, $witem) = @_; - my ($removed, $scolours) = _cmd_colours_check(0, $data); - if (@$removed) { - _cmd_colours_set($scolours); - Irssi::print("%_nce2%_: removed @{[ _cmd_colours_list($removed) ]} from neat_colors", MSGLEVEL_CLIENTCRAP); - setup_changed(); - } - else { - Irssi::print("%_nce2%_: nothing removed", MSGLEVEL_CLIENTCRAP); - } -} - -sub cmd_neatcolor_colors { - my ($data, $server, $witem) = @_; - $data =~ s/\s+$//; - unless (length $data) { - Irssi::print("%_nce2%_: current colours: @{[ @colours ? _cmd_colours_list(\@colours) : '(none)' ]}"); - } - Irssi::command_runsub('neatcolor colors', $data, $server, $witem); -} - -sub cmd_neatcolor { - my ($data, $server, $witem) = @_; - $data =~ s/\s+$//; - unless (length $data) { - $witem ||= Irssi::active_win; - my $time = time; - my %distribution = map { $_ => 0 } @colours; - for my $netch (keys %has_colour) { - next unless length $netch; - for my $nick (keys %{ $has_colour{$netch} }) { - if (exists $last_time{$netch}{$nick} - && ($last_time{$netch}{$nick} + $retain_colour_time > $time - || grep { $_->[0] eq $nick } @{ $netchan_hist{$netch} // [] })) { - $distribution{ $has_colour{$netch}{$nick} }++ - } - } - } - $witem->print('%_nce2%_ Colour distribution: '. - (join ', ', - map { "%X$_$_:$distribution{$_}" } - sort { $distribution{$b} <=> $distribution{$a} } - grep { exists $distribution{$_} } @colour_list), MSGLEVEL_CLIENTCRAP); - } - Irssi::command_runsub('neatcolor', $data, $server, $witem); -} - -sub _cmd_check_netchan_arg { - my ($cmd, $netchan, $nick) = @_; - my %global = map { $_ => undef } qw(set get reset); - unless (length $netchan) { - Irssi::print('%_nce2%_: no network/channel argument given for neatcolor '.$cmd - .(exists $global{$cmd} ? ', use / to '.$cmd.' global colours' : ''), - MSGLEVEL_CLIENTERROR); - return; - } - elsif (-1 == index $netchan, '/') { - Irssi::print('%_nce2%_: missing network/ in argument given for neatcolor '.$cmd, MSGLEVEL_CLIENTERROR); - return; - } - elsif ($netchan =~ m\^[^/]+/$\) { - Irssi::print('%_nce2%_: missing /channel in argument given for neatcolor '.$cmd, MSGLEVEL_CLIENTERROR); - return; - } - - unless (length $nick) { - Irssi::print('%_nce2%_: no nick argument given for neatcolor '.$cmd, MSGLEVEL_CLIENTERROR); - return; - } - elsif (-1 != index $nick, '/') { - Irssi::print('%_nce2%_: / not supported in nicks in argument given for neatcolor '.$cmd, MSGLEVEL_CLIENTERROR); - return; - } - - return 1; -} - -sub _cmd_check_colour { - my ($cmd, $colour) = @_; - $colour = substr $colour, 1 if length $colour == 3; - $colour = $base_map{$colour} if length $colour == 1; - unless (length $colour && grep { $_ eq $colour } @colour_list) { - Irssi::print('%_nce2%_: no colour or invalid colour argument given for neatcolor '.$cmd, MSGLEVEL_CLIENTERROR); - return; - } - return $colour; -} - -sub cmd_neatcolor_set { - my ($data, $server, $witem) = @_; - my @args = split ' ', $data; - if (@args < 2) { - Irssi::print('%_nce2%_: not enough arguments for neatcolor set', MSGLEVEL_CLIENTERROR); - return; - } - my $netchan; - if (ref $witem) { - $netchan = $witem->{server}{tag}.'/'.$witem->{name}; - } - my $nick; - my $colour; - if (@args < 3) { - ($nick, $colour) = @args; - } - else { - ($netchan, $nick, $colour) = @args; - } - - return unless _cmd_check_netchan_arg('set', $netchan, $nick); - return unless defined ($colour = _cmd_check_colour('set', $colour)); - - $set_colour{$netchan eq '/' ? '' : $netchan}{$nick} = $colour; - for my $netch ($netchan eq '/' ? keys %has_colour - : $global_colours ? ('', $netchan) - : $netchan) { - delete $has_colour{$netch}{$nick} unless - exists $has_colour{$netch}{$nick} && $has_colour{$netch}{$nick} eq $colour; - } - Irssi::print("%_nce2%_: %X$colour$nick%n colour set to: %X$colour$colour%n ".($netchan eq '/' ? 'globally' : "in $netchan"), MSGLEVEL_CLIENTCRAP); -} -sub cmd_neatcolor_get { - my ($data, $server, $witem) = @_; - my @args = split ' ', $data; - if (@args < 1) { - Irssi::print('%_nce2%_: not enough arguments for neatcolor get', MSGLEVEL_CLIENTERROR); - return; - } - my $netchan; - if (ref $witem) { - $netchan = $witem->{server}{tag}.'/'.$witem->{name}; - } - my $nick; - if (@args < 2) { - $nick = $args[0]; - } - else { - ($netchan, $nick) = @args; - } - - return unless _cmd_check_netchan_arg('get', $netchan, $nick); - - if ($netchan ne '/') { - unless (exists $has_colour{$netchan} && exists $has_colour{$netchan}{$nick}) { - Irssi::print("%_nce2%_: $nick is not coloured (yet) in $netchan", MSGLEVEL_CLIENTCRAP); - } - else { - my $colour = $has_colour{$netchan}{$nick}; - Irssi::print("%_nce2%_: %X$colour$nick%n has colour: %X$colour$colour%n in $netchan", MSGLEVEL_CLIENTCRAP); - } - } - my $hashnick = $nick; - $hashnick =~ s/$ignore_re//g if (defined $ignore_re && length $ignore_re); - if (exists $set_colour{$netchan} && exists $set_colour{$netchan}{$nick}) { - my $colour = $set_colour{$netchan}{$nick}; - Irssi::print("%_nce2%_: set colour for %X$colour$nick%n in $netchan: %X$colour$colour%n ", MSGLEVEL_CLIENTCRAP); - } - elsif (exists $set_colour{$netchan} && exists $set_colour{$netchan}{$hashnick}) { - my $colour = $set_colour{$netchan}{$hashnick}; - Irssi::print("%_nce2%_: set colour for %X$colour$hashnick%n in $netchan: %X$colour$colour%n ", MSGLEVEL_CLIENTCRAP); - } - elsif (exists $set_colour{''} && exists $set_colour{''}{$nick}) { - my $colour = $set_colour{''}{$nick}; - Irssi::print("%_nce2%_: set colour for %X$colour$nick%n (global): %X$colour$colour%n ", MSGLEVEL_CLIENTCRAP); - } - elsif (exists $set_colour{''} && exists $set_colour{''}{$hashnick}) { - my $colour = $set_colour{''}{$hashnick}; - Irssi::print("%_nce2%_: set colour for %X$colour$hashnick%n (global): %X$colour$colour%n ", MSGLEVEL_CLIENTCRAP); - } - elsif ($netchan eq '/') { - Irssi::print("%_nce2%_: no global colour set for $nick", MSGLEVEL_CLIENTCRAP); - } -} -sub cmd_neatcolor_reset { - my ($data, $server, $witem) = @_; - my @args = split ' ', $data; - if (@args < 1) { - Irssi::print('%_nce2%_: not enough arguments for neatcolor reset', MSGLEVEL_CLIENTERROR); - return; - } - my $netchan; - if (ref $witem) { - $netchan = $witem->{server}{tag}.'/'.$witem->{name}; - } - my $nick; - if (@args == 1 && $args[0] eq '--all') { - %set_colour = %avoid_colour = %has_colour = (); - Irssi::print("%_nce2%_: re-set all colouring"); - return; - } - if (@args < 2) { - $nick = $args[0]; - } - else { - ($netchan, $nick) = @args; - } - - return unless _cmd_check_netchan_arg('reset', $netchan, $nick); - - $netchan = '' if $netchan eq '/'; - unless (exists $set_colour{$netchan} && exists $set_colour{$netchan}{$nick}) { - Irssi::print("%_nce2%_: $nick has no colour set ". (length $netchan ? "in $netchan" : "globally"), MSGLEVEL_CLIENTERROR); - return; - } - my $colour = delete $set_colour{$netchan}{$nick}; - for my $netch ($netchan eq '' ? keys %has_colour - : $global_colours ? ('', $netchan) - : $netchan) { - delete $has_colour{$netch}{$nick} if exists $has_colour{$netch} && exists $has_colour{$netch}{$nick} - && $has_colour{$netch}{$nick} eq $colour; - } - Irssi::print("%_nce2%_: ".($netchan eq '' ? 'global ' : '')."colouring re-set for $nick".($netchan eq '' ? '' : " in $netchan"), MSGLEVEL_CLIENTERROR); -} -sub cmd_neatcolor_re { - my ($data, $server, $witem) = @_; - my @args = split ' ', $data; - if (@args < 1) { - Irssi::print('%_nce2%_: not enough arguments for neatcolor re', MSGLEVEL_CLIENTERROR); - return; - } - my $netchan; - if (ref $witem) { - $netchan = $witem->{server}{tag}.'/'.$witem->{name}; - } - my $nick; - if (@args < 2) { - $nick = $args[0]; - } - else { - ($netchan, $nick) = @args; - } - - return unless _cmd_check_netchan_arg('re', $netchan, $nick); - - unless (exists $has_colour{$netchan} && exists $has_colour{$netchan}{$nick}) { - Irssi::print("%_nce2%_: could not find $nick in $netchan", MSGLEVEL_CLIENTERROR); - return; - } - my $colour = delete $has_colour{$netchan}{$nick}; - if (grep { $colour eq $_ } @{ $avoid_colour{$netchan}{$nick} || [] }) { - $avoid_colour{$netchan}{$nick} = [ $colour ] - } - else { - push @{ $avoid_colour{$netchan}{$nick} }, $colour; - } - if ($global_colours) { - delete $has_colour{''}{$nick} if defined $colour; - - if (grep { $colour eq $_ } @{ $avoid_colour{''}{$nick} || [] }) { - $avoid_colour{''}{$nick} = [ $colour ] - } - else { - push @{ $avoid_colour{''}{$nick} }, $colour; - } - } - Irssi::print("%_nce2%_: re-colouring $nick in $netchan", MSGLEVEL_CLIENTERROR); -} -sub cmd_neatcolor_save { - Irssi::print("%_nce2%_: saving colours to file", MSGLEVEL_CLIENTCRAP); - save_colours(); -} - -sub setup_changed { - $global_colours = Irssi::settings_get_bool('neat_global_colors'); - $retain_colour_time = int( abs( Irssi::settings_get_time('neat_color_reassign_time') ) / 1000 ); - my $old_ignore = $ignore_setting // ''; - $ignore_setting = Irssi::settings_get_str('neat_ignorechars'); - if ($old_ignore ne $ignore_setting) { - local $@; - eval { $ignore_re = qr/$ignore_setting/ }; - if ($@) { - $@ =~ /^(.*)/; - print '%_neat_ignorechars%_ did not compile: '.$1; - } - } - my $old_colours = "@colours"; - my %scolours = map { ($base_map{$_} // $_) => undef } Irssi::settings_get_str('neat_colors') =~ /(?|x(..)|(.))/ig; - @colours = grep { exists $scolours{$_} } @colour_list; - - if ($old_colours ne "@colours") { - my $time = time; - for my $netch (sort keys %last_time) { - for my $nick (sort keys %{ $last_time{$netch} }) { - if (exists $has_colour{$netch} && exists $has_colour{$netch}{$nick}) { - if ($last_time{$netch}{$nick} + $retain_colour_time > $time - || ($last_time{$netch}{$nick} == 0 && $session_load_time + $retain_colour_time > $time)) { - $last_time{$netch}{$nick} = 0; - } - else { - delete $last_time{$netch}{$nick}; - } - } - } - $session_load_time = $time; - } - } -} - -sub internals { - +{ - set => \%set_colour, - avoid => \%avoid_colour, - has => \%has_colour, - time => \%last_time, - hist => \%netchan_hist, - colours => \@colours - } -} - -sub init_nickcolour { - setup_changed(); - load_colours(); -} - -Irssi::settings_add_str('misc', 'neat_colors', 'rRgGybBmMcCX42X3AX5EX4NX3HX3CX32'); -Irssi::settings_add_str('misc', 'neat_ignorechars', ''); -Irssi::settings_add_time('misc', 'neat_color_reassign_time', '30min'); -Irssi::settings_add_bool('misc', 'neat_global_colors', 0); -init_nickcolour(); - -Irssi::expando_create('nickcolor', \&expando_neatcolour, { - 'message public' => 'none', - 'message own_public' => 'none', - 'message private' => 'none', - 'message own_private'=> 'none', - 'message join' => 'none', - 'message part' => 'none', - 'message quit' => 'none', - 'message kick' => 'none', - 'message nick' => 'none', - 'message invite' => 'none', - 'message invite_other' => 'none', - 'message irc notice' => 'none', - 'message topic' => 'none', - }); - -Irssi::expando_create('inickcolor', \&expando_neatcolour_inv, { - 'message public' => 'none', - 'message own_public' => 'none', - }); - -Irssi::signal_add({ - 'message public' => 'msg_line_tag', - 'message own_public' => 'msg_line_clear', - 'message private' => 'msg_line_tag', - 'message own_private'=> 'msg_line_tag', - 'message join' => 'join2mlt', - 'message part' => 'part2mlt', - 'message quit' => 'quit2mlt', - 'message kick' => 'kick2mlt', - 'message nick' => 'nick2mlt', - 'message invite' => 'invite2mlt', - 'message invite_other' => 'inviteo2mlt', - 'message irc notice' => 'notice2mlt', - 'message irc mode' => 'msg_line_clear', - "message xmpp action" => 'msg_line_tag_xmppaction', - "message xmpp own_action" => 'msg_line_clear', - 'print text' => 'prnt_clear_public', - 'nicklist changed' => 'nicklist_changed', - 'gui exit' => 'exit_save', -}); -Irssi::command_bind({ - 'help' => sub { &cmd_help_neatcolor if $_[0] =~ /^neatcolor\s*$/i;}, - 'neatcolor' => 'cmd_neatcolor', - 'neatcolor save' => 'cmd_neatcolor_save', - 'neatcolor set' => 'cmd_neatcolor_set', - 'neatcolor get' => 'cmd_neatcolor_get', - 'neatcolor reset' => 'cmd_neatcolor_reset', - 'neatcolor re' => 'cmd_neatcolor_re', - 'neatcolor colors' => 'cmd_neatcolor_colors', - 'neatcolor colors add' => 'cmd_neatcolor_colors_add', - 'neatcolor colors remove' => 'cmd_neatcolor_colors_remove', - }); - -Irssi::signal_add_last('setup changed' => 'setup_changed'); - - -# Changelog -# ========= -# 0.4.0 -# - Allow usage of the colour as a background (using $inickcolor) -# 0.3.7 -# - fix crash if xmpp action signal is not registered (just ignore it) -# 0.3.6 -# - also look up ignorechars in set colours -# 0.3.5 -# - bug fix release -# 0.3.4 -# - re/set/reset-colouring was affected by the global colour -# - set colour score too weak -# 0.3.3 -# - fix error with get / reported by Meicceli -# - now possible to reset global colour -# - check for invalid colours -# 0.3.2 -# - add global colour option -# - respect save settings setting -# - add action handling -# 0.3.1 -# - regression: reset colours after removing colour -# 0.3.0 -# - save some more colours -# 0.2.9 -# - fix incorrect calculation of used colours -# - add some sanity checks to set/get command -# - avoid random colour changes diff --git a/.config/irssi/scripts/autorun/nm2.pl b/.config/irssi/scripts/autorun/nm2.pl @@ -1,546 +0,0 @@ -use Irssi; -use strict; -use v5.14; -use List::Util qw(min max); -use Hash::Util qw(lock_keys); - -our $VERSION = '2.1'; # a42b713aaa38823 -our %IRSSI = ( - authors => 'Nei', - contact => 'Nei @ anti@conference.jabber.teamidiot.de', - url => "http://anti.teamidiot.de/", - name => 'nm2', - description => 'right aligned nicks depending on longest nick', - license => 'GPL v2', -); - -# based on bc-bd's original nm.pl -# -# use a ** nickcolor_expando ** script for nick colors! -# -# why is there no right_mode? you can do that in your theme! - -# Options -# ======= -# /set neat_dynamic <ON|OFF> -# * whether the width should be dynamically chosen on each incoming -# message -# -# /set neat_shrink <ON|OFF> -# * whether shrinking of the width is allowed, or only growing -# -# /set neat_staircase_shrink <ON|OFF> -# * whether shrinking should be done one character at a time -# -# The following styles decide if the nick is left/right aligned and -# where the colour/mode goes, they're a bit complex... -# put the desired indicator(s) between the appropriate "," and the -# default format of the public messages or actions will be rewritten -# appropriately. -# This can be used to align the nick left or right, before or after -# the nick brackets and before or between the nickmode (by using the -# pad on the correct place). To change the mode from left of the nick -# to right of the nick, you need to modify the abstracts in your theme -# however. -# By placing the colour at the end, you can even colour the message -# text in the nick colour, however it might be broken if there are -# other colour codes used inside the message or by scripts. -# -# /format neat_style , , , , , , , , -# î î î î î î î î î -# p: pad | | | | | | | | `before message -# c: colour | | | | | | | `-after msgchannel -# t: truncate indicator | | | | | | `-before msgchannel -# | | | | | `-after nick -# | | | | `-before nick -# | | | `-after mode -# | | `-before mode -# | `-before msgnick -# `-none -# -# /format neat_action_style , , , , -# î î î î î -# p: pad | | | | `-before message -# c: colour | | | `-after nick -# t: truncate indicator | | `-before nick -# | `-before action -# `-none -# -# /format neat_pad_char <char> -# * the character(s) used for padding -# -# /format neat_truncate_char -# * the format or character to indicate that nick was truncated -# -# /format neat_notruncate_char -# * the format or character to indicate that nick NOT was truncated -# -# /format neat_customize_modes @@ | ++ | ? -# * a |-separated mapping of mode prefixes and their rendition, can be -# used to replace or colourise them -# -# /set neat_color_hinick <ON|OFF> -# * whether to use colours in hilighted messages -# -# /set neat_color_menick <ON|OFF> -# * whether to use colours in hilight_nick_matches -# -# /set neat_truncate_nick <ON|OFF> -# * whether to truncate overlong nicks -# -# /set neat_custom_modes <ON|OFF> -# * whether to enable the use of neat_customize_modes format -# -# /set neat_maxlength <number> -# * number : (maximum) length to use for nick padding -# -# /set neat_melength <number> -# * number : width to substract from maxlength for /me padding -# -# /set neat_history <number> -# * number : number of formatted lines to remember for dynamic mode -# - -my @action_protos = qw(irc silc xmpp); -my (%histories, %S, @style, @astyle, %format_ok, %cmmap); - -my $align_expando = ''; -my $trunc_expando = ''; -my $cumode_expando = ''; - -my $format_re = qr/ %(?=[}%{]) - | %[04261537kbgcrmywKBGCRMYWU9_8I:|FnN>#pP[] - | %[Zz][[:xdigit:]]{6} - | %[Xx](?i:0[a-f]|[1-6][0-9a-z]|7[a-x]) /x; - -sub update_expando { - my ($mode, $server, $target, $nick, $space) = @_; - my $t_add; - if (exists $Irssi::Script::{'realnames::'} - && (my $code = 'Irssi::Script::realnames'->can('_get_nick_chan'))) { - if (my $i = $code->($server, $target, $nick)) { - $nick = $i->{n}{realname} - if length $i->{n}{realname}; - } - } - my $nl = length $nick; - my $pad_len = max(0, $space - $nl); - if ($S{truncate_nick}) { - if (($mode >= 4 && $S{trunc_in_anick}) - || ($mode < 4 && $S{trunc_in_nick})) { - $t_add = $S{tnolen}; - } - if ($nl + $t_add > $space) { - $trunc_expando = format_expand($S{tyes_char}); - $t_add = $S{tyeslen} if defined $t_add; - } - else { - $trunc_expando = format_expand($S{tno_char}); - } - $pad_len = max(0, $pad_len - $t_add) if $t_add; - } - else { - $trunc_expando = ''; - } - if ($pad_len) { - my @subs = split /($format_re)/, $S{pad_char} x $pad_len; - $align_expando = ''; - my $clen = 0; - while (@subs) { - my ($tx, $fmt) = splice @subs, 0, 2; - my $txlen = length $tx // 0; - $align_expando .= substr $tx, 0, ($pad_len - $clen) if defined $tx; - $clen += $txlen; - $align_expando .= $fmt if defined $fmt; - last if $clen >= $pad_len; - } - $align_expando = format_expand($align_expando.'%n'); - } - else { - $align_expando = ''; - } - return $t_add; -} - -sub prnt_clear_levels { - my ($dest) = @_; - clear_ref() if $dest->{level} - & (MSGLEVEL_PUBLIC|MSGLEVEL_MSGS|MSGLEVEL_ACTIONS|MSGLEVEL_DCCMSGS|MSGLEVEL_NOTICES); -} - -sub clear_ref { - $trunc_expando = $align_expando = $cumode_expando = ''; -} - -sub expando_nickalign { $align_expando } -sub expando_nicktrunc { $trunc_expando } -sub expando_nickcumode { $cumode_expando } - -Irssi::expando_create('nickalign', \&expando_nickalign, { - 'message public' => 'none', - 'message own_public' => 'none', - 'message private' => 'none', - 'message own_private' => 'none', - }); -Irssi::expando_create('nicktrunc', \&expando_nicktrunc, { - 'message public' => 'none', - 'message own_public' => 'none', - 'message private' => 'none', - 'message own_private' => 'none', - }); -Irssi::expando_create('nickcumode', \&expando_nickcumode, { - 'message public' => 'none', - 'message own_public' => 'none', - 'message private' => 'none', - 'message own_private' => 'none', - }); - -sub init_hist { - my ($server, $target) = @_; - if (my $ch = $server->channel_find($target)) { - [ max map { length } map { $_->{nick} } $ch->nicks ] - } - else { - [ max map { length } $server->{nick}, $target ] - } -} - -my %em = ( - p => '$nickalign', - c => '$nickcolor', - t => '$nicktrunc', - m => '$nickcumode', - ); - -my %formats = ( - own_msg => [1, '{ownmsgnick ' ,'%G$2', ' {ownnick ' ,'$0','}','' ,'}','$1' ], - own_msg_channel => [1, '{ownmsgnick ' ,'%G$3', ' {ownnick ' ,'$0','}','{msgchannel $1}','}','$2' ], - pubmsg_me => [0, '{pubmsgmenick ' ,'%G$2', ' {pubnick ' ,'$0','}','' ,'}','$1' ], - pubmsg_me_channel => [0, '{pubmsgmenick ' ,'%G$3', ' {pubnick ' ,'$0','}','{msgchannel $1}','}','$2' ], - pubmsg_hilight => [0, '{pubmsgmenick ' ,'%G$3', ' {pubnick ' ,'$1','}','', ,'}','$2' ], - pubmsg_hilight_channel => [0, '{pubmsgmenick ' ,'%G$4', ' {pubnick ' ,'$1', '','{msgchannel $2}','}','$3' ], - pubmsg => [0, '{pubmsgnick ' ,'%G$2', ' {pubnick ' ,'$0','}','' ,'}','$1' ], - pubmsg_channel => [0, '{pubmsgnick ' ,'%G$4', ' {pubnick ' ,'$0','}','{msgchannel $1}','}','$2' ], - ); - -sub reformat_format { - Irssi::signal_remove('command format', 'update_formats'); - Irssi::signal_remove('theme changed' => 'update_formats'); - %format_ok = () unless @_; - my ($mode, $server, $target, $nick, $size) = @_; - for my $fmt (keys %formats) { - next if defined $mode && $formats{$fmt}[0] != $mode; - - my @fs = @{ $formats{$fmt} }; - - my $ls; - if (defined $mode) { - $ls = $size; - } - else { - $ls = $fs[0] < 4 ? $S{max} : max(0, $S{max} - $S{melength}); - } - next if exists $format_ok{$fmt} && $format_ok{$fmt} == $ls; - - if ($S{truncate_nick} && $ls) { - $fs[ $fs[0] < 4 ? 4 : 2 ] =~ s/\$/\$[.$ls]/; - } - if ($S{custom_modes} && $fs[0] < 4) { - $fs[2] =~ s/\$\K\d/nickcumode/; - } - my $s; - local $em{c} = '' - if ($fs[1] =~ /menick/ && !$S{color_menick}) - || ($fs[1] =~ /hinick/ && !$S{color_hinick}); - my $sr = $fs[0] >= 4 ? \@astyle : \@style; - for my $i (1..$#fs) { - $s .= ($sr->[$i] =~ s/(.)/$em{$1}/gr) if defined $sr->[$i]; - $s .= $fs[$i]; - } - Irssi::command("^format $fmt $s"); - $format_ok{$fmt} = $ls; - } - Irssi::signal_add_last({ - 'theme changed' => 'update_formats', - 'command format' => 'update_formats', - }); -} - -sub update_nm { - my ($mode, $server, $target, $nick) = @_; - my $tg = $server->{tag}; - if (my $ch = $server->channel_find($target)) { - $target = $ch->{name}; - my $nickobj = $ch->nick_find($nick); - if ($nickobj) { - $nick = $nickobj->{nick}; - my $mode = substr $nickobj->{prefixes}.' ', 0, 1; - $cumode_expando = exists $cmmap{$mode} ? format_expand($cmmap{$mode}) : $mode; - } - else { - $cumode_expando = ''; - } - } - elsif (my $q = $server->query_find($target)) { - $target = $q->{name}; - } - - my $longest; - # if ($S{dynamic}) { - # my $hist = $histories{"$tg/$target"} ||= init_hist($server, $target); - # my $last = $histories{"$tg/$target/last"} || 1; - # unshift @$hist, length $nick; - # if (@$hist > 2*$S{history}) { - # splice @$hist, $S{history}; - # } - # my @add; - # unless ($S{shrink}) { - # push @add, $last; - # } - # if ($S{staircase}) { - # push @add, $last - 1 - # } - # $longest = $histories{"$tg/$target/last"} = max(@$hist, @add); - - # if ($S{max} && ($S{max} < $longest || !$S{shrink})) { - # $longest = $S{max}; - # } - # } - # else { - # $longest = $S{max}; - $longest = 10; - # } - - my $size = $mode < 4 ? $longest : max(0, $longest - $S{melength}); - my $t_add = update_expando($mode, $server, $target, $nick, $size); - $size = max(0, $size - $t_add) if defined $t_add; - if ($S{dynamic}) { - reformat_format($mode, $server, $target, $nick, $size); - } -} - -sub sig_setup { - my %old_S = %S; - $S{history} = Irssi::settings_get_int('neat_history'); - $S{max} = Irssi::settings_get_int('neat_maxlength'); - $S{melength} = Irssi::settings_get_int('neat_melength'); - - $S{dynamic} = Irssi::settings_get_bool('neat_dynamic'); - $S{shrink} = Irssi::settings_get_bool('neat_shrink'); - $S{staircase} = Irssi::settings_get_bool('neat_staircase_shrink'); - - $S{color_hinick} = Irssi::settings_get_bool('neat_color_hinick'); - $S{color_menick} = Irssi::settings_get_bool('neat_color_menick'); - $S{truncate_nick} = Irssi::settings_get_bool('neat_truncate_nick'); - $S{custom_modes} = Irssi::settings_get_bool('neat_custom_modes'); - - if (!defined $old_S{dynamic} || $old_S{dynamic} != $S{dynamic}) { - %histories = (); - reformat_format(); - } - elsif ($old_S{max} != $S{max} || $old_S{melength} != $S{melength} - || $old_S{color_hinick} != $S{color_hinick} || $old_S{color_menick} != $S{color_menick} - || $old_S{truncate_nick} != $S{truncate_nick} || $old_S{custom_modes} != $S{custom_modes}) { - reformat_format(); - } -} - -sub update_formats { - my $was_style = "@style"; - $S{style} = Irssi::current_theme->get_format(__PACKAGE__, 'neat_style'); - my $was_action_style = "@astyle"; - $S{action_style} = Irssi::current_theme->get_format(__PACKAGE__, 'neat_action_style'); - $S{pad_char} = Irssi::current_theme->get_format(__PACKAGE__, 'neat_pad_char'); - $S{tno_char} = Irssi::current_theme->get_format(__PACKAGE__, 'neat_notruncate_char'); - $S{tnolen} = length($S{tno_char} =~ s/$format_re//gr); - $S{tyeslen} = length($S{tyes_char} =~ s/$format_re//gr); - $S{tyes_char} = Irssi::current_theme->get_format(__PACKAGE__, 'neat_truncate_char'); - @style = map { y/pct//cd; $_ } split /,/, $S{style}; - @astyle = map { y/pctm//cd; $_ } split /,/, $S{action_style}; - $S{trunc_in_nick} = grep { /t/ } @style[2..min($#style, 6)]; - $S{trunc_in_anick} = grep { /t/ } @astyle[2..min($#astyle, 3)]; - my $custom_modes = Irssi::current_theme->get_format(__PACKAGE__, 'neat_custom_modes'); - %cmmap = map { (substr $_, 0, 1), (substr $_, 1) } $custom_modes =~ /(?:^\s?|\G\s?\|\s?)((?!\s\|)(?:[^\\|[:space:]]|\\.|\s(?!\||$))*)/sg; - if ($was_style ne "@style" || $was_action_style ne "@astyle") { - reformat_format(); - } -} - -{ - my %format2control = ( - 'F' => "\cDa", '_' => "\cDc", '|' => "\cDe", '#' => "\cDi", "n" => "\cDg", "N" => "\cDg", - 'U' => "\c_", '8' => "\cV", 'I' => "\cDf", - ); - my %bg_base = ( - '0' => '0', '4' => '1', '2' => '2', '6' => '3', '1' => '4', '5' => '5', '3' => '6', '7' => '7', - 'x08' => '8', 'x09' => '9', 'x0a' => ':', 'x0b' => ';', 'x0c' => '<', 'x0d' => '=', 'x0e' => '>', 'x0f' => '?', - ); - my %fg_base = ( - 'k' => '0', 'b' => '1', 'g' => '2', 'c' => '3', 'r' => '4', 'm' => '5', 'p' => '5', 'y' => '6', 'w' => '7', - 'K' => '8', 'B' => '9', 'G' => ':', 'C' => ';', 'R' => '<', 'M' => '=', 'P' => '=', 'Y' => '>', 'W' => '?', - ); - my @ext_colour_off = ( - '.', '-', ',', - '+', "'", '&', - ); - sub format_expand { - $_[0] =~ s{%(Z.{6}|z.{6}|X..|x..|.)}{ - my $c = $1; - if (exists $format2control{$c}) { - $format2control{$c} - } - elsif (exists $bg_base{$c}) { - "\cD/$bg_base{$c}" - } - elsif (exists $fg_base{$c}) { - "\cD$fg_base{$c}/" - } - elsif ($c =~ /^[{}%]$/) { - $c - } - elsif ($c =~ /^(z|Z)([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})$/) { - my $bg = $1 eq 'z'; - my (@rgb) = map { hex $_ } $2, $3, $4; - my $x = $bg ? 0x1 : 0; - my $out = "\cD" . (chr -13 + ord '0'); - for (my $i = 0; $i < 3; ++$i) { - if ($rgb[$i] > 0x20) { - $out .= chr $rgb[$i]; - } - else { - $x |= 0x10 << $i; $out .= chr 0x20 + $rgb[$i]; - } - } - $out .= chr 0x20 + $x; - $out - } - elsif ($c =~ /^(x)(?:0([[:xdigit:]])|([1-6])(?:([0-9])|([a-z]))|7([a-x]))$/i) { - my $bg = $1 eq 'x'; - my $col = defined $2 ? hex $2 - : defined $6 ? 232 + (ord lc $6) - (ord 'a') - : 16 + 36 * ($3 - 1) + (defined $4 ? $4 : 10 + (ord lc $5) - (ord 'a')); - if ($col < 0x10) { - my $chr = chr $col + ord '0'; - "\cD" . ($bg ? "/$chr" : "$chr/") - } - else { - "\cD" . $ext_colour_off[($col - 0x10) / 0x50 + $bg * 3] . chr (($col - 0x10) % 0x50 - 1 + ord '0') - } - } - else { - "%$c" - } - }ger; - } -} - -sub init { - update_formats(); - sig_setup(); - lock_keys(%S); - print "nm2 experimental version, please report issues. thanks!" -} - -Irssi::settings_add_bool('misc', 'neat_dynamic', 1); -Irssi::settings_add_bool('misc', 'neat_shrink', 1); -Irssi::settings_add_bool('misc', 'neat_staircase_shrink', 0); - -Irssi::settings_add_bool('misc', 'neat_color_hinick', 0); -Irssi::settings_add_bool('misc', 'neat_color_menick', 0); -Irssi::settings_add_bool('misc', 'neat_truncate_nick', 1); -Irssi::settings_add_bool('misc', 'neat_custom_modes', 0); - -Irssi::settings_add_int('misc', 'neat_maxlength', 0); -Irssi::settings_add_int('misc', 'neat_melength', 2); -Irssi::settings_add_int('misc', 'neat_history', 50); - -Irssi::signal_add('setup changed' => 'sig_setup'); -Irssi::signal_add_last({ - 'setup reread' => 'sig_setup', - 'theme changed' => 'update_formats', - 'command format' => 'update_formats', - }); - -Irssi::theme_register([ - 'neat_style' => ' , , p , , c , t , , , ', - 'neat_action_style' => ' , p , , t , ', - 'neat_pad_char' => '%K.', - 'neat_truncate_char' => '%m+', - 'neat_notruncate_char' => '', - 'neat_custom_modes' => '&%B&%n | @%g@%n | +%y+%n', - ]); - -Irssi::signal_add_first({ - 'message public' => sub { - my ($server, $msg, $nick, $address, $target) = @_; - update_nm(0, $server, $target, $nick); - }, - 'message private' => sub { - my ($server, $msg, $nick, $address) = @_; - update_nm(2, $server, $nick, $nick); - }, - }); - -sub channel_nick { - my ($server, $target) = @_; - ($server->channel_find($target)||+{ownnick=>$server})->{ownnick}{nick} -} - -Irssi::signal_add_first({ - 'message own_public' => sub { - my ($server, $msg, $target) = @_; - update_nm(1, $server, $target, channel_nick($server, $target)); - }, - 'message own_private' => sub { - my ($server, $msg, $target) = @_; - update_nm(3, $server, $target, $server->{nick}); - }, - 'message join' => sub { - my ($server, $target, $nick) = @_; - update_nm(2, $server, $target, $server->{nick}); - }, - 'message part' => sub { - my ($server, $target, $nick) = @_; - update_nm(2, $server, $target, $server->{nick}); - }, - 'message kick' => sub { - my ($server, $target, $nick) = @_; - update_nm(2, $server, $target, $server->{nick}); - }, - }); -Irssi::signal_add_last({ - 'channel destroyed' => sub { - my ($channel) = @_; - delete $histories{ $channel->{server}{tag} . '/' . $channel->{name} }; - delete $histories{ $channel->{server}{tag} . '/' . $channel->{name} . '/last' }; - }, - 'query destroyed' => sub { - my ($query) = @_; - delete $histories{ $query->{server}{tag} . '/' . $query->{name} }; - delete $histories{ $query->{server}{tag} . '/' . $query->{name} . '/last' }; - }, - 'query nick changed' => sub { - my ($query, $old_nick) = @_; - delete $histories{ $query->{server}{tag} . '/' . $old_nick }; - delete $histories{ $query->{server}{tag} . '/' . $old_nick . '/last' }; - }, - 'query server changed' => sub { - my ($query, $old_server) = @_; - delete $histories{ $old_server->{tag} . '/' . $query->{name} }; - delete $histories{ $old_server->{tag} . '/' . $query->{name} . '/last' }; - } - }); -Irssi::signal_add({ - 'print text' => 'prnt_clear_levels', -}); - -init(); - -# Changelog -# ========= -# 2.1 - support realnames script -# -# 2.0 -# - fix crash if xmpp action signal is not registered (just ignore it) -# - do not grow either when using no-shrink with maxlength -# - hopefully fix alignment in xmpp muc diff --git a/.config/irssi/scripts/autorun/nojointext.pl b/.config/irssi/scripts/autorun/nojointext.pl @@ -1,35 +0,0 @@ -# vim:ft=perl:et:sw=2:ts=2: -use strict; -use Irssi; - -our $VERSION = '0.02'; -our %IRSSI = ( - authors => q{Magnus Woldrich}, - contact => q{m@japh.se}, - name => q{ignore_join_blob}, - description => q{Ignore the blob of text displayed when (re)joining a channel}, - license => q{MIT}, -); - -## ignores this: -# > Topic for #ubuntu: hi -# > Topic set by DalekSec -# > Home page for #ubuntu: https://www.ubuntu.com -# > Channel #ubuntu created Sun Nov 26 07:42:41 2006 -# -# These lines have the CRAP MSGLEVEL (because they are crap) but they don't -# respond to an /ignore * CRAP: -# https://github.com/irssi/irssi/issues/992 -# https://github.com/trapd00r/irssi/commit/87f38a20beda81e409a72efd323f5db45d824927 - -sub sig_print_text { - my ($dest, $string, $stripped) = @_; - - if($dest->{level} & MSGLEVEL_CRAP) { - if($stripped =~ m/Topic (for|set)|Channel [#]\S+ created|Home page for [#]\S+/) { - Irssi::signal_stop(); - } - } -} - -Irssi::signal_add_first('print text', \&sig_print_text); diff --git a/.config/irssi/scripts/autorun/pwp.pl b/.config/irssi/scripts/autorun/pwp.pl @@ -1,109 +0,0 @@ -# Keeps a prompt per window. - -# Copyright 2007 Wouter Coekaerts <coekie@irssi.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -use strict; -use Irssi 20070804; -use Irssi::TextUI; - -use vars qw($VERSION %IRSSI); -$VERSION = '1.0'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'coekie@irssi.org', - name => 'per_window_prompt', - description => 'Keeps a prompt per window', - license => 'GPLv2 or later', - url => 'http://wouter.coekaerts.be/irssi/', - changed => '04/08/07' -); - -my %prompts; - -my $in_command = 0; -my $win_before_command; -my $win_before_command_deleted; -my $unloading = 0; - -# key to use to identify window -sub winkey { - my ($win) = @_; - return defined($win) ? $win->{'_irssi'} : 0; -} - -sub get_prompt { - return { - text => Irssi::parse_special('$L'), - pos => Irssi::gui_input_get_pos() - }; -} - -sub set_prompt { - my ($prompt) = @_; - if (defined($prompt)) { - Irssi::gui_input_set($prompt->{text}); - Irssi::gui_input_set_pos($prompt->{pos}); - } else { - Irssi::gui_input_set(''); - } -} - -Irssi::signal_add_last 'window changed' => sub { - my ($win, $oldwin)= @_; - if (!$in_command) { - if ($oldwin) { - $prompts{winkey($oldwin)} = get_prompt(); - } - set_prompt($prompts{winkey($win)}); - } -}; - -sub UNLOAD { - $unloading = 1; -} - -# needed when switching windows by command -Irssi::signal_add_first 'gui key pressed' => sub { - my ($key) = @_; - - if ($key == 10 && ! $in_command) { - $win_before_command = winkey(Irssi::active_win); - $win_before_command_deleted = 0; - $in_command = 1; - Irssi::signal_continue(@_); - if ($unloading) { - return; # avoid crash when unloading by command - } - $in_command = 0; - my $win_after_command = winkey(Irssi::active_win); - - if ($win_before_command != $win_after_command) { - if (! $win_before_command_deleted) { - $prompts{$win_before_command} = get_prompt(); - } - set_prompt($prompts{$win_after_command}) - } - } -}; - -Irssi::signal_add_first 'window destroyed' => sub { - my ($win) = @_; - delete $prompts{winkey($win)}; - if ($win_before_command == winkey($win)) { - $win_before_command_deleted = 1; - } -}; diff --git a/.config/irssi/scripts/autorun/servercomplete.pl b/.config/irssi/scripts/autorun/servercomplete.pl @@ -1,86 +0,0 @@ -use strict; -use Irssi 20020101.0250 (); -use vars qw($VERSION %IRSSI); -$VERSION = "2"; -%IRSSI = ( - authors => 'David Leadbeater', - contact => 'dgl@dgl.cx', - name => 'servercomplete', - description => 'Tab complete servers and userhosts (irc. -> irc server, user@ -> user@host). Useful for lazy ircops for /squit and so on :)', - license => 'GNU GPLv2 or later', - url => 'http://irssi.dgl.cx/', -); - -my %servers; - -sub sig_complete { - my ($complist, $window, $word, $linestart, $want_space) = @_; - my $tag = $window->{active_server}->{tag}; - - if($word =~ /[!*@]/) { - my $wi = Irssi::active_win()->{active}; - return unless ref $wi and $wi->{type} eq 'CHANNEL'; - my $server = $wi->{server}; - return unless ref $server; - - my($nick,$ident,$host) = ('','',''); - - $nick = $1 if $word =~ /([^!]+)!/ && $1; - $ident = $1 if $word !~ /!$/ && $word =~ /!?([^@]+)(@|$)/ && $1; - $host = $1 if $word =~ /@(.*)$/ && $1; - - for my $n ($wi->nicks()) { - next if not_wild($nick) and $n->{nick} !~ /^\Q$nick\E/i; - - my($user,$addr) = split(/@/, $n->{host}); - - next if not_wild($ident) and $user !~ /^\Q$ident\E/i; - next if not_wild($host) and $addr !~ /^\Q$host\E/i; - - if($word =~ /!/) { - push @$complist, get_match($n->{nick}, $nick) . '!' . get_match($user, $ident) . '@' . get_match($addr,$host); - }else{ - push @$complist, get_match($user, $ident) . '@' . get_match($addr,$host); - } - } - } - - return unless $servers{$tag}; - for (keys %{$servers{$tag}}) { - push @$complist, $_ if /^\Q$word\E/; - } -} - -sub get_match { - my($match, $thing) = @_; - return $thing eq '*' ? '*' : $match; -} - -sub not_wild { - return 0 if($_[0] eq '*' || $_[0] eq ''); - 1; -} - -sub add_server { - my($tag,$data,$offset) = @_; - $servers{$tag}{(split(/ /,$data))[$offset]} = 1; -} - -Irssi::signal_add_last('complete word', 'sig_complete'); - -Irssi::signal_add('event 352', sub { - my($server,$data) = @_; - add_server($server->{tag}, $data, 4); -} ); - -Irssi::signal_add('event 312', sub { - my($server,$data) = @_; - add_server($server->{tag}, $data, 2); -} ); - -Irssi::signal_add('event 364', sub { - my($server,$data) = @_; - add_server($server->{tag}, $data, 1); - add_server($server->{tag}, $data, 2); -} ); - diff --git a/.config/irssi/scripts/autorun/special_complete.pl b/.config/irssi/scripts/autorun/special_complete.pl @@ -1,30 +0,0 @@ -use strict; -use vars qw($VERSION %IRSSI); -use Irssi; -$VERSION = '1.1'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'wouter@coekaerts.be, coekie@#irssi', - name => 'special_complete', - description => '(tab)complete irssi special variables (words that start with $) by evaluating them', - license => 'GPLv2', - url => 'http://wouter.coekaerts.be/irssi/', - changed => '28/07/03', -); - -Irssi::signal_add_last 'complete word', sub { - my ($complist, $window, $word, $linestart, $want_space) = @_; - if ($word =~ /^\$/){ - my $evaluated; - if (Irssi::active_win->{'active'}) { - $evaluated = Irssi::active_win->{'active'}->parse_special($word); - } elsif (Irssi::active_win->{'active_server'}) { - $evaluated = Irssi::active_win->{'active_server'}->parse_special($word); - } else { - $evaluated = Irssi::parse_special($word); - } - if ($evaluated ne '') { - push @$complist, $evaluated; - } - } -}; diff --git a/.config/irssi/scripts/autorun/tmux-nicklist-portable.pl b/.config/irssi/scripts/autorun/tmux-nicklist-portable.pl @@ -1,432 +0,0 @@ -# based on the nicklist.pl script -################################################################################ -# tmux_nicklist.pl -# This script integrates tmux and irssi to display a list of nicks in a -# vertical right pane with 20% width. Right now theres no configuration -# or setup, simply initialize the script with irssi and by default you -# will get the nicklist for every channel(customize by altering -# the regex in /set nicklist_channel_re) -# -# /set nicklist_channel_re <regex> -# * only show on channels matching this regular expression -# -# /set nicklist_max_users <num> -# * only show when the channel has so many users or less (0 = always) -# -# /set nicklist_smallest_main <num> -# * only show when main window is larger than this (0 = always) -# -# /set nicklist_pane_width <num> -# * width of the nicklist pane -# -# /set nicklist_color <ON|OFF> -# * colourise the nicks in the nicklist (required nickcolor script -# with get_nick_color2 and debug_ansicolour functions) -# -# /set nicklist_gone_sort <ON|OFF> -# * sort away people below -# -# It supports mouse scrolling and the following keys: -# k/up arrow: up one line -# j/down arrow: down one line -# u/pageup: up 50% lines -# d/pagedown: down 50% lines -# gg: go to top -# G: go to bottom -# -# For better integration, unrecognized sequences will be sent to irssi and -# its pane will be focused. -# -# to toggle the nicklist if it is in the way you can make a key binding: -# /bind meta-Z /script exec Irssi::Script::tmux_nicklist_portable::toggle_nicklist -################################################################################ - -use strict; -use warnings; -use IO::Handle; -use IO::Select; -use POSIX; -use File::Temp qw/ :mktemp /; -use File::Basename; -our $VERSION = '0.1.8'; -our %IRSSI = ( - authors => 'Thiago de Arruda', - contact => 'tpadilha84@gmail.com', - name => 'tmux-nicklist', - description => 'displays a list of nicks in a separate tmux pane', - license => 'WTFPL', -); - -# "other" prefixes by danielg4 <daniel@gimpelevich.san-francisco.ca.us> -# added 'd' and 'u' navigation as in vim, by @gerardbm (github) - -{ package Irssi::Nick } - -if ($#ARGV == -1) { -require Irssi; - -my $enabled = 0; -my $nicklist_toggle = 1; -my $script_path = __FILE__; -my $tmpdir; -my $fifo_path; -my $fifo; -my $just_launched; -my $resize_timer; - -sub enable_nicklist { - return if ($enabled); - $tmpdir = mkdtemp Irssi::get_irssi_dir()."/nicklist-XXXXXXXX"; - $fifo_path = "$tmpdir/fifo"; - POSIX::mkfifo($fifo_path, 0600) or die "can't mkfifo $fifo_path: $!"; - my $cmd = "perl $script_path $fifo_path $ENV{TMUX_PANE}"; - my $width = Irssi::settings_get_int('nicklist_pane_width'); - system('tmux', 'split-window', '-dh', '-l', $width, '-t', $ENV{TMUX_PANE}, $cmd); - open_fifo(); - Irssi::timeout_remove($just_launched) if defined $just_launched; - $just_launched = Irssi::timeout_add_once(300, sub { $just_launched = undef; }, ''); -} - -sub open_fifo { - # The next system call will block until the other pane has opened the pipe - # for reading, so synchronization is not an issue here. - open $fifo, ">", $fifo_path or do { - if ($! == 4) { - Irssi::timeout_add_once(300, \&open_fifo, ''); - $enabled = -1 unless $enabled; - return; - } - die "can't open $fifo_path: $!"; - }; - $fifo->autoflush(1); - if ($enabled < -1) { - $enabled = 1; - disable_nicklist(); - } elsif ($enabled == -1) { - $enabled = 1; - reset_nicklist("enabled"); - } else { - $enabled = 1; - } -} - -sub disable_nicklist { - return unless ($enabled); - if ($enabled > 0) { - print $fifo "EXIT\n"; - close $fifo; - $fifo = undef; - unlink $fifo_path; - rmdir $tmpdir; - } - $enabled--; -} - -sub reset_nicklist { - my $event = shift; - my $active = Irssi::active_win(); - my $channel = $active->{active}; - return disable_nicklist unless $channel && ref $channel; - if ($event =~ /^nick/) { - # check if that nick event is for the current channel/nicklist - my ($event_channel) = @_; - return unless $channel->{_irssi} == $event_channel->{_irssi}; - } - my ($colourer, $ansifier); - if (Irssi::settings_get_bool('nicklist_color')) { - for my $script (sort map { my $z = $_; $z =~ s/::$//; $z } grep { /^nickcolor|nm/ } keys %Irssi::Script::) { - if ($colourer = "Irssi::Script::$script"->can('get_nick_color2')) { - $ansifier = "Irssi::Script::$script"->can('debug_ansicolour'); - last; - } - } - } - my $channel_pattern = Irssi::settings_get_str('nicklist_channel_re'); - { local $@; - $channel_pattern = eval { qr/$channel_pattern/ }; - $channel_pattern = qr/(?!)/ if $@; - } - my $smallest_main = Irssi::settings_get_int('nicklist_smallest_main'); - if (!$nicklist_toggle - || !$channel || !ref($channel) - || !$channel->isa('Irssi::Channel') - || !$channel->{'names_got'} - || $channel->{'name'} !~ $channel_pattern - || ($smallest_main && $channel->window->{width} < $smallest_main)) { - disable_nicklist; - } else { - my %colour; - my @nicks = $channel->nicks(); - my $max_nicks = Irssi::settings_get_int('nicklist_max_users'); - if ($max_nicks && @nicks > $max_nicks) { - disable_nicklist; - } else { - enable_nicklist; - return unless $enabled > 0; - foreach my $nick (sort { $a->{_irssi} <=> $b->{_irssi} } @nicks) { - $colour{$nick->{nick}} = ($ansifier && $colourer) ? $ansifier->($colourer->($active->{active}{server}{tag}, $channel->{name}, $nick->{nick}, 0)) : ''; - } - print($fifo "BEGIN\n"); - my $gone_sort = Irssi::settings_get_bool('nicklist_gone_sort'); - my $prefer_real; - if (exists $Irssi::Script::{'realnames::'}) { - my $code = "Irssi::Script::realnames"->can('use_realnames'); - $prefer_real = $code && $code->($channel); - } - my $_real = sub { - my $nick = shift; - $prefer_real && length $nick->{'realname'} ? $nick->{'realname'} : $nick->{'nick'} - }; - foreach my $nick (sort {($a->{'op'}?'1':$a->{'halfop'}?'2':$a->{'voice'}?'3':$a->{'other'}>32?'0':'4').($gone_sort?($a->{'gone'}?1:0):'').lc($_real->($a)) - cmp ($b->{'op'}?'1':$b->{'halfop'}?'2':$b->{'voice'}?'3':$b->{'other'}>32?'0':'4').($gone_sort?($b->{'gone'}?1:0):'').lc($_real->($b))} @nicks) { - my $colour = $colour{$nick->{nick}} || "\e[39m"; - $colour = "\e[37m" if $nick->{'gone'}; - print($fifo "NICK"); - if ($nick->{'op'}) { - print($fifo "\e[92m\@$colour".$_real->($nick)."\e[39m"); - } elsif ($nick->{'halfop'}) { - print($fifo "\e[92m%$colour".$_real->($nick)."\e[39m"); - } elsif ($nick->{'voice'}) { - print($fifo "\e[92m+$colour".$_real->($nick)."\e[39m"); - } elsif ($nick->{'other'}>32) { - print($fifo "\e[92m".(chr $nick->{'other'})."$colour".$_real->($nick)."\e[39m"); - } else { - print($fifo " $colour".$_real->($nick)."\e[39m"); - } - print($fifo "\n"); - } - print($fifo "END\n"); - } - } -} - -sub toggle_nicklist { - if ($enabled) { - $nicklist_toggle = undef - } else { - $nicklist_toggle = 1; - } - reset_nicklist("toggle"); -} - -sub switch_channel { - print $fifo "SWITCH_CHANNEL\n" if $fifo; - &reset_nicklist; -} - -sub resized_timed { - Irssi::timeout_remove($resize_timer) if defined $resize_timer; - return if defined $just_launched; - $resize_timer = Irssi::timeout_add_once(1100, \&resized, ''); - #resized(); -} -sub resized { - $resize_timer = undef; - return if defined $just_launched; - return unless $enabled >= 0; - disable_nicklist; - Irssi::timeout_add_once(200, sub{reset_nicklist("terminal resized")}, ''); -} -sub UNLOAD { - disable_nicklist; -} - -Irssi::settings_add_str('tmux_nicklist', 'nicklist_channel_re', '.*'); -Irssi::settings_add_int('tmux_nicklist', 'nicklist_max_users', 0); -Irssi::settings_add_int('tmux_nicklist', 'nicklist_smallest_main', 0); -Irssi::settings_add_int('tmux_nicklist', 'nicklist_pane_width', 13); -Irssi::settings_add_bool('tmux_nicklist', 'nicklist_color', 1); -Irssi::settings_add_bool('tmux_nicklist', 'nicklist_gone_sort', 0); -Irssi::signal_add_last('window item changed', sub{switch_channel("window item changed",@_)}); -Irssi::signal_add_last('window changed', sub{switch_channel("window changed",@_)}); -Irssi::signal_add_last('channel joined', sub{switch_channel("channel joined",@_)}); -Irssi::signal_add('nicklist new', sub{reset_nicklist("nicklist new",@_)}); -Irssi::signal_add('nicklist remove', sub{reset_nicklist("nicklist remove",@_)}); -Irssi::signal_add('nicklist changed', sub{reset_nicklist("nicklist changed",@_)}); -Irssi::signal_add_first('nick mode changed', sub{reset_nicklist("nick mode changed",@_)}); -Irssi::signal_add('gui exit', \&disable_nicklist); -Irssi::signal_add_last('terminal resized', \&resized_timed); - -} else { -my $fifo_path = $ARGV[0]; -my $irssi_pane = $ARGV[1]; -# array to store the current channel nicknames -my @nicknames = (); - -# helper functions for manipulating the terminal -# escape sequences taken from -# http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html -sub enable_mouse { print "\e[?1000h"; } -# recognized sequences -my $MOUSE_SCROLL_DOWN="\e[Ma"; -my $MOUSE_SCROLL_UP="\e[M`"; -my $ARROW_DOWN="\e[B"; -my $ARROW_UP="\e[A"; -my $DOWN="j"; -my $UP="k"; -my $PAGE_DOWN="\e[6~"; -my $PAGE_UP="\e[5~"; -my $PAGE_DOWN_D="d"; -my $PAGE_UP_U="u"; -my $GO_TOP="gg"; -my $GO_BOTTOM="G"; - -my $current_line = 0; -my $sequence = ''; -my ($rows, $cols); - -sub term_size { - split ' ', `stty size`; -} - -sub redraw { - my $last_nick_idx = @nicknames; - my $last_idx = $current_line + $rows; - # normalize last visible index - if ($last_idx > ($last_nick_idx)) { - $last_idx = $last_nick_idx; - } - # redraw visible nicks - for my $i (reverse 1..$rows) { - print "\e[$i;1H\e[K"; - my $idx = $current_line + $i - 1; - if ($idx < $last_idx) { - my $z = 0; my $col = $cols; - for (split /(\e\[(?:\d|;|:|\?|\s)*.)/, $nicknames[$idx]) { - if ($z ^= 1) { - print +(substr $_, 0, $col) if $col > 0; - $col -= length; - } else { - print - } - } - } - } -} - -sub move_down { - $sequence = ''; - my $count = int $_[0]; - my $nickcount = $#nicknames; - return if ($nickcount <= $rows); - if ($count == -1) { - $current_line = $nickcount - $rows + 1; - redraw; - return; - } - my $visible = $nickcount - $current_line - $count + 1; - if ($visible > $rows) { - $current_line += $count; - redraw; - } elsif (($visible + $count) > $rows) { - # scroll the maximum we can - $current_line = $nickcount - $rows + 1; - redraw; - } -} - -sub move_up { - $sequence = ''; - my $count = int $_[0]; - if ($count == -1) { - $current_line = 0; - redraw; - return; - } - return if ($current_line == 0); - $count = 1 if $count == 0; - $current_line -= $count; - $current_line = 0 if $current_line < 0; - redraw; -} - -$SIG{INT} = 'IGNORE'; - -STDOUT->autoflush(1); -# setup terminal so we can listen for individual key presses without echo -`stty -icanon -echo`; - -# open named pipe and setup the 'select' wrapper object for listening on both -# fds(fifo and sdtin) -open my $fifo, "<", $fifo_path or die "can't open $fifo_path: $!"; -my $select = IO::Select->new(); -my @ready; -$select->add($fifo); -$select->add(\*STDIN); - -enable_mouse; -system('tput', 'smcup'); -print "\e[?7l"; #system('tput', 'rmam'); -system('tput', 'civis'); -MAIN: { - while (@ready = $select->can_read) { - foreach my $fd (@ready) { - ($rows, $cols) = term_size; - if ($fd == $fifo) { - while (<$fifo>) { - my $line = $_; - if ($line =~ /^BEGIN/) { - @nicknames = (); - } elsif ($line =~ /^SWITCH_CHANNEL/) { - $current_line = 0; - } elsif ($line =~ /^NICK(.+)$/) { - push @nicknames, $1; - } elsif ($line =~ /^END$/) { - redraw; - last; - } elsif ($line =~ /^EXIT$/) { - last MAIN; - } - } - } else { - my $key = ''; - sysread(STDIN, $key, 1); - $sequence .= $key; - if ($MOUSE_SCROLL_DOWN =~ /^\Q$sequence\E/) { - if ($MOUSE_SCROLL_DOWN eq $sequence) { - move_down 3; - # mouse scroll has two more bytes that I dont use here - # so consume them now to avoid sending unwanted bytes to - # irssi - sysread(STDIN, $key, 2); - } - } elsif ($MOUSE_SCROLL_UP =~ /^\Q$sequence\E/) { - if ($MOUSE_SCROLL_UP eq $sequence) { - move_up 3; - sysread(STDIN, $key, 2); - } - } elsif ($ARROW_DOWN =~ /^\Q$sequence\E/) { - move_down 1 if ($ARROW_DOWN eq $sequence); - } elsif ($ARROW_UP =~ /^\Q$sequence\E/) { - move_up 1 if ($ARROW_UP eq $sequence); - } elsif ($DOWN =~ /^\Q$sequence\E/) { - move_down 1 if ($DOWN eq $sequence); - } elsif ($UP =~ /^\Q$sequence\E/) { - move_up 1 if ($UP eq $sequence); - } elsif ($PAGE_DOWN =~ /^\Q$sequence\E/) { - move_down $rows/2 if ($PAGE_DOWN eq $sequence); - } elsif ($PAGE_UP =~ /^\Q$sequence\E/) { - move_up $rows/2 if ($PAGE_UP eq $sequence); - } elsif ($PAGE_DOWN_D =~ /^\Q$sequence\E/) { - move_down $rows/2 if ($PAGE_DOWN_D eq $sequence); - } elsif ($PAGE_UP_U =~ /^\Q$sequence\E/) { - move_up $rows/2 if ($PAGE_UP_U eq $sequence); - } elsif ($GO_BOTTOM =~ /^\Q$sequence\E/) { - move_down -1 if ($GO_BOTTOM eq $sequence); - } elsif ($GO_TOP =~ /^\Q$sequence\E/) { - move_up -1 if ($GO_TOP eq $sequence); - } else { - # Unrecognized sequences will be send to irssi and its pane - # will be focused - system('tmux', 'send-keys', '-t', $irssi_pane, $sequence); - system('tmux', 'select-pane', '-t', $irssi_pane); - $sequence = ''; - } - } - } - } -} - -close $fifo; - -} diff --git a/.config/irssi/scripts/autorun/trackbar.pl b/.config/irssi/scripts/autorun/trackbar.pl @@ -1,606 +0,0 @@ -## trackbar.pl -# -# This little script will do just one thing: it will draw a line each time you -# switch away from a window. This way, you always know just upto where you've -# been reading that window :) It also removes the previous drawn line, so you -# don't see double lines. -# -# redraw trackbar only works on irssi 0.8.17 or higher. -# -## - -## Usage: -# -# The script works right out of the box, but if you want you can change -# the working by /set'ing the following variables: -# -# Setting: trackbar_style -# Description: This setting will be the color of your trackbar line. -# By default the value will be '%K', only Irssi color -# formats are allowed. If you don't know the color formats -# by heart, you can take a look at the formats documentation. -# You will find the proper docs on http://www.irssi.org/docs. -# -# Setting: trackbar_string -# Description: This is the string that your line will display. This can -# be multiple characters or just one. For example: '~-~-' -# The default setting is '-'. -# Here are some unicode characters you can try: -# "───" => U+2500 => a line -# "═══" => U+2550 => a double line -# "━━━" => U+2501 => a wide line -# "▭ " => U+25ad => a white rectangle -# -# Setting: trackbar_use_status_window -# Description: If this setting is set to OFF, Irssi won't print a trackbar -# in the statuswindow -# -# Setting: trackbar_ignore_windows -# Description: A list of windows where no trackbar should be printed -# -# Setting: trackbar_print_timestamp -# Description: If this setting is set to ON, Irssi will print the formatted -# timestamp in front of the trackbar. -# -# Setting: trackbar_require_seen -# Description: Only clear the trackbar if it has been scrolled to. -# -# Setting: trackbar_all_manual -# Description: Never clear the trackbar until you do /mark. -# -# /mark is a command that will redraw the line at the bottom. -# -# Command: /trackbar, /trackbar goto -# Description: Jump to where the trackbar is, to pick up reading -# -# Command: /trackbar keep -# Description: Keep this window's trackbar where it is the next time -# you switch windows (then this flag is cleared again) -# -# Command: /mark, /trackbar mark -# Description: Remove the old trackbar and mark the bottom of this -# window with a new trackbar -# -# Command: /trackbar markvisible -# Description: Like mark for all visible windows -# -# Command: /trackbar markall -# Description: Like mark for all windows -# -# Command: /trackbar remove -# Description: Remove this window's trackbar -# -# Command: /trackbar removeall -# Description: Remove all windows' trackbars -# -# Command: /trackbar redraw -# Description: Force redraw of trackbars -# -## - -## -# -# For bugreports and other improvements contact one of the authors. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this script; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -## - -use strict; -use warnings; -use vars qw($VERSION %IRSSI); - -$VERSION = "2.9"; # a4c78e85092a271 - -%IRSSI = ( - authors => "Peter 'kinlo' Leurs, Uwe Dudenhoeffer, " . - "Michiel Holtkamp, Nico R. Wohlgemuth, " . - "Geert Hauwaerts", - contact => 'peter@pfoe.be', - patchers => 'Johan Kiviniemi (UTF-8), Uwe Dudenhoeffer (on-upgrade-remove-line)', - name => 'trackbar', - description => 'Shows a bar where you have last read a window.', - license => 'GNU General Public License', - url => 'http://www.pfoe.be/~peter/trackbar/', - commands => 'trackbar', -); - -## Comments and remarks. -# -# This script uses settings. -# Use /SET to change the value or /TOGGLE to switch it on or off. -# -# -# Tip: The command 'trackbar' is very useful if you bind that to a key, -# so you can easily jump to the trackbar. Please see 'help bind' for -# more information about keybindings in Irssi. -# -# Command: /BIND meta2-P key F1 -# /BIND F1 command trackbar -# -## - -## Bugfixes and new items in this rewrite. -# -# * Remove all the trackbars before upgrading. -# * New setting trackbar_use_status_window to control the statuswindow trackbar. -# * New setting trackbar_print_timestamp to print a timestamp or not. -# * New command 'trackbar' to scroll up to the trackbar. -# * When resizing your terminal, Irssi will update all the trackbars to the new size. -# * When changing trackbar settings, change all the trackbars to the new settings. -# * New command 'trackbar mark' to draw a new trackbar (The old '/mark'). -# * New command 'trackbar markall' to draw a new trackbar in each window. -# * New command 'trackbar remove' to remove the trackbar from the current window. -# * New command 'trackbar removeall' to remove all the trackbars. -# * Don't draw a trackbar in empty windows. -# * Added a version check to prevent Irssi redraw errors. -# * Fixed a bookmark NULL versus 0 bug. -# * Fixed a remove-line bug in Uwe Dudenhoeffer his patch. -# * New command 'help trackbar' to display the trackbar commands. -# * Fixed an Irssi startup bug, now processing each auto-created window. -# -## - -## Known bugs and the todolist. -# -# Todo: * Instead of drawing a line, invert the line. -# -## - -## Authors: -# -# - Main maintainer & author: Peter 'kinlo' Leurs -# - Many thanks to Timo 'cras' Sirainen for placing me on my way -# - on-upgrade-remove-line patch by Uwe Dudenhoeffer -# - trackbar resizing by Michiel Holtkamp (02 Jul 2012) -# - scroll to trackbar, window excludes, and timestamp options by Nico R. -# Wohlgemuth (22 Sep 2012) -# -## - -## Version history: -# -# 2.9: - fix crash on /mark in empty window -# 2.8: - fix /^join bug -# 2.7: - add /set trackbar_all_manual option -# 2.5: - merge back on scripts.irssi.org -# - fix /trackbar redraw broken in 2.4 -# - fix legacy encodings -# - add workaround for irssi issue #271 -# 2.4: - add support for horizontal splits -# 2.3: - add some features for seen tracking using other scripts -# 2.0: - big rewrite based on 1.4 -# * removed /tb, you can have it with /alias tb trackbar if you want -# * subcommand and settings changes: -# /trackbar vmark => /trackbar markvisible -# /trackbar scroll => /trackbar goto (or just /trackbar) -# /trackbar help => /help trackbar -# /set trackbar_hide_windows => /set trackbar_ignore_windows -# /set trackbar_timestamp => /set trackbar_print_timestamp -# * magic line strings were removed, just paste the unicode you want! -# * trackbar_timestamp_styled is not currently supported -# 1.9: - add version guard -# 1.8: - sub draw_bar -# 1.7: - Added /tb scroll, trackbar_hide_windows, trackbar_timestamp_timestamp -# and trackbar_timestamp_styled -# 1.6: - Work around Irssi resize bug, please do /upgrade! (see below) -# 1.5: - Resize trackbars in all windows when terminal is resized -# 1.4: - Changed our's by my's so the irssi script header is valid -# - Removed utf-8 support. In theory, the script should work w/o any -# problems for utf-8, just set trackbar_string to a valid utf-8 character -# and everything *should* work. However, this script is being plagued by -# irssi internal bugs. The function Irssi::settings_get_str does NOT handle -# unicode strings properly, hence you will notice problems when setting the bar -# to a unicode char. For changing your bar to utf-8 symbols, read the line sub. -# 1.3: - Upgrade now removes the trackbars. -# - Some code cleanups, other defaults -# - /mark sets the line to the bottom -# 1.2: - Support for utf-8 -# - How the bar looks can now be configured with trackbar_string -# and trackbar_style -# 1.1: - Fixed bug when closing window -# 1.0: - Initial release -# -## - -use Irssi; -use Irssi::TextUI; -use Encode; - -use POSIX qw(strftime); - -sub cmd_help { - my ($args) = @_; - if ($args =~ /^trackbar *$/i) { - print CLIENTCRAP <<HELP -%9Syntax:%9 - -TRACKBAR -TRACKBAR GOTO -TRACKBAR KEEP -TRACKBAR MARK -TRACKBAR MARKVISIBLE -TRACKBAR MARKALL -TRACKBAR REMOVE -TRACKBAR REMOVEALL -TRACKBAR REDRAW - -%9Parameters:%9 - - GOTO: Jump to where the trackbar is, to pick up reading - KEEP: Keep this window's trackbar where it is the next time - you switch windows (then this flag is cleared again) - MARK: Remove the old trackbar and mark the bottom of this - window with a new trackbar - MARKVISIBLE: Like mark for all visible windows - MARKALL: Like mark for all windows - REMOVE: Remove this window's trackbar - REMOVEALL: Remove all windows' trackbars - REDRAW: Force redraw of trackbars - -%9Description:%9 - - Manage a trackbar. Without arguments, it will scroll up to the trackbar. - -%9Examples:%9 - - /TRACKBAR MARK - /TRACKBAR REMOVE -HELP - } -} - -Irssi::theme_register([ - 'trackbar_loaded', '%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.', - 'trackbar_wrong_version', '%R>>%n %_Trackbar:%_ Please upgrade your client to 0.8.17 or above if you would like to use this feature of trackbar.', - 'trackbar_all_removed', '%R>>%n %_Trackbar:%_ All the trackbars have been removed.', - 'trackbar_not_found', '%R>>%n %_Trackbar:%_ No trackbar found in this window.', -]); - -my $old_irssi = Irssi::version < 20140701; -sub check_version { - if ($old_irssi) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_wrong_version'); - return; - } else { - return 1; - } -} - -sub is_utf8 { - lc Irssi::settings_get_str('term_charset') eq 'utf-8' -} - -my (%config, %keep_trackbar, %unseen_trackbar); - -sub remove_one_trackbar { - my $win = shift; - my $view = shift || $win->view; - my $line = $view->get_bookmark('trackbar'); - if (defined $line) { - my $bottom = $view->{bottom}; - $view->remove_line($line); - $win->command('^scrollback end') if $bottom && !$win->view->{bottom}; - $view->redraw; - } -} - -sub add_one_trackbar_pt1 { - my $win = shift; - my $view = shift || $win->view; - - my $last_cur_line = ($view->{buffer}{cur_line}||+{})->{_irssi}; - $win->print(line($win->{width}), MSGLEVEL_NEVER); - - my $cur_line = ($win->view->{buffer}{cur_line}||+{})->{_irssi}; # get a fresh buffer - - ($last_cur_line//'') ne ($cur_line//'') # printing was successful -} - -sub add_one_trackbar_pt2 { - my $win = shift; - my $view = $win->view; - - $view->set_bookmark_bottom('trackbar'); - $unseen_trackbar{ $win->{_irssi} } = 1; - Irssi::signal_emit("window trackbar added", $win); - $view->redraw; -} - -sub update_one_trackbar { - my $win = shift; - my $view = shift || $win->view; - my $force = shift; - my $ignored = win_ignored($win, $view); - my $success; - - $success = add_one_trackbar_pt1($win, $view) ? 1 : 0 - if $force || !$ignored; - - remove_one_trackbar($win, $view) - if ( $success || !defined $success ) && ( $force || !defined $force || !$ignored ); - - add_one_trackbar_pt2($win) - if $success; -} - -sub win_ignored { - my $win = shift; - my $view = shift || $win->view; - return 1 unless $view->{buffer}{lines_count}; - return 1 if $win->{name} eq '(status)' && !$config{use_status_window}; - no warnings 'uninitialized'; - return 1 if grep { $win->{name} eq $_ || $win->{refnum} eq $_ - || $win->get_active_name eq $_ } @{ $config{ignore_windows} }; - return 0; -} - -sub sig_window_changed { - my ($newwindow, $oldwindow) = @_; - return unless $oldwindow; - redraw_one_trackbar($newwindow) unless $old_irssi; - trackbar_update_seen($newwindow); - return if delete $keep_trackbar{ $oldwindow->{_irssi} }; - trackbar_update_seen($oldwindow); - return if $config{require_seen} && $unseen_trackbar{ $oldwindow->{_irssi } }; - return if $config{all_manual}; - update_one_trackbar($oldwindow, undef, 0); -} - -sub trackbar_update_seen { - my $win = shift; - return unless $win; - return unless $unseen_trackbar{ $win->{_irssi} }; - - my $view = $win->view; - my $line = $view->get_bookmark('trackbar'); - unless ($line) { - delete $unseen_trackbar{ $win->{_irssi} }; - Irssi::signal_emit("window trackbar seen", $win); - return; - } - my $startline = $view->{startline}; - return unless $startline; - - if ($startline->{info}{time} < $line->{info}{time} - || $startline->{_irssi} == $line->{_irssi}) { - delete $unseen_trackbar{ $win->{_irssi} }; - Irssi::signal_emit("window trackbar seen", $win); - } -} - -sub screen_length; -{ local $@; - eval { require Text::CharWidth; }; - unless ($@) { - *screen_length = sub { Text::CharWidth::mbswidth($_[0]) }; - } - else { - *screen_length = sub { - my $temp = shift; - Encode::_utf8_on($temp) if is_utf8(); - length($temp) - }; - } -} - -{ my %strip_table = ( - (map { $_ => '' } (split //, '04261537' . 'kbgcrmyw' . 'KBGCRMYW' . 'U9_8I:|FnN>#[' . 'pP')), - (map { $_ => $_ } (split //, '{}%')), - ); - sub c_length { - my $o = Irssi::strip_codes($_[0]); - $o =~ s/(%(%|Z.{6}|z.{6}|X..|x..|.))/exists $strip_table{$2} ? $strip_table{$2} : - $2 =~ m{x(?:0[a-f]|[1-6][0-9a-z]|7[a-x])|z[0-9a-f]{6}}i ? '' : $1/gex; - screen_length($o) - } -} - -sub line { - my ($width, $time) = @_; - my $string = $config{string}; - $string = ' ' unless length $string; - $time ||= time; - - Encode::_utf8_on($string) if is_utf8(); - my $length = c_length($string); - - my $format = ''; - if ($config{print_timestamp}) { - $format = $config{timestamp_str}; - $format =~ y/%/\01/; - $format =~ s/\01\01/%/g; - $format = strftime($format, localtime $time); - $format =~ y/\01/%/; - } - - my $times = $width / $length; - $times += 1 if $times != int $times; - my $style = "$config{style}"; - Encode::_utf8_on($style) if is_utf8(); - $format .= $style; - $width -= c_length($format); - $string x= $times; - chop $string while length $string && c_length($string) > $width; - return $format . $string; -} - -sub remove_all_trackbars { - for my $window (Irssi::windows) { - next unless ref $window; - remove_one_trackbar($window); - } -} - -sub UNLOAD { - remove_all_trackbars(); -} - -sub redraw_one_trackbar { - my $win = shift; - my $view = $win->view; - my $line = $view->get_bookmark('trackbar'); - return unless $line; - my $bottom = $view->{bottom}; - $win->print_after($line, MSGLEVEL_NEVER, line($win->{width}, $line->{info}{time}), - $line->{info}{time}); - $view->set_bookmark('trackbar', $win->last_line_insert); - $view->remove_line($line); - $win->command('^scrollback end') if $bottom && !$win->view->{bottom}; - $view->redraw; -} - -sub redraw_trackbars { - return unless check_version(); - for my $win (Irssi::windows) { - next unless ref $win; - redraw_one_trackbar($win); - } -} - -sub goto_trackbar { - my $win = Irssi::active_win; - my $line = $win->view->get_bookmark('trackbar'); - - if ($line) { - $win->command("scrollback goto ". strftime("%d %H:%M:%S", localtime($line->{info}{time}))); - } else { - $win->printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_not_found'); - } -} - -sub cmd_mark { - update_one_trackbar(Irssi::active_win, undef, 1); -} - -sub cmd_markall { - for my $window (Irssi::windows) { - next unless ref $window; - update_one_trackbar($window); - } -} - -sub signal_stop { - Irssi::signal_stop; -} - -sub cmd_markvisible { - my @wins = Irssi::windows; - my $awin = - my $bwin = Irssi::active_win; - my $awin_counter = 0; - Irssi::signal_add_priority('window changed' => 'signal_stop', -99); - do { - Irssi::active_win->command('window up'); - $awin = Irssi::active_win; - update_one_trackbar($awin); - ++$awin_counter; - } until ($awin->{refnum} == $bwin->{refnum} || $awin_counter >= @wins); - Irssi::signal_remove('window changed' => 'signal_stop'); -} - -sub cmd_trackbar_remove_one { - remove_one_trackbar(Irssi::active_win); -} - -sub cmd_remove_all_trackbars { - remove_all_trackbars(); - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_all_removed'); -} - -sub cmd_keep_once { - $keep_trackbar{ Irssi::active_win->{_irssi} } = 1; -} - -sub trackbar_runsub { - my ($data, $server, $item) = @_; - $data =~ s/\s+$//g; - - if ($data) { - Irssi::command_runsub('trackbar', $data, $server, $item); - } else { - goto_trackbar(); - } -} - -sub update_config { - my $was_status_window = $config{use_status_window}; - $config{style} = Irssi::settings_get_str('trackbar_style'); - $config{string} = Irssi::settings_get_str('trackbar_string'); - $config{require_seen} = Irssi::settings_get_bool('trackbar_require_seen'); - $config{all_manual} = Irssi::settings_get_bool('trackbar_all_manual'); - $config{ignore_windows} = [ split /[,\s]+/, Irssi::settings_get_str('trackbar_ignore_windows') ]; - $config{use_status_window} = Irssi::settings_get_bool('trackbar_use_status_window'); - $config{print_timestamp} = Irssi::settings_get_bool('trackbar_print_timestamp'); - if (defined $was_status_window && $was_status_window != $config{use_status_window}) { - if (my $swin = Irssi::window_find_name('(status)')) { - if ($config{use_status_window}) { - update_one_trackbar($swin); - } - else { - remove_one_trackbar($swin); - } - } - } - if ($config{print_timestamp}) { - my $ts_format = Irssi::settings_get_str('timestamp_format'); - my $ts_theme = Irssi::current_theme->get_format('fe-common/core', 'timestamp'); - my $render_str = Irssi::current_theme->format_expand($ts_theme); - (my $ts_escaped = $ts_format) =~ s/([%\$])/$1$1/g; - $render_str =~ s/(?|\$(.)(?!\w)|\$\{(\w+)\})/$1 eq 'Z' ? $ts_escaped : $1/ge; - $config{timestamp_str} = $render_str; - } - redraw_trackbars() unless $old_irssi; -} - -Irssi::settings_add_str('trackbar', 'trackbar_string', is_utf8() ? "\x{2500}" : '-'); -Irssi::settings_add_str('trackbar', 'trackbar_style', '%K'); -Irssi::settings_add_str('trackbar', 'trackbar_ignore_windows', ''); -Irssi::settings_add_bool('trackbar', 'trackbar_use_status_window', 1); -Irssi::settings_add_bool('trackbar', 'trackbar_print_timestamp', 0); -Irssi::settings_add_bool('trackbar', 'trackbar_require_seen', 0); -Irssi::settings_add_bool('trackbar', 'trackbar_all_manual', 0); - -update_config(); - -Irssi::signal_add_last( 'mainwindow resized' => 'redraw_trackbars') - unless $old_irssi; - -Irssi::signal_register({'window trackbar added' => [qw/Irssi::UI::Window/]}); -Irssi::signal_register({'window trackbar seen' => [qw/Irssi::UI::Window/]}); -Irssi::signal_register({'gui page scrolled' => [qw/Irssi::UI::Window/]}); -Irssi::signal_add_last('gui page scrolled' => 'trackbar_update_seen'); - -Irssi::signal_add('setup changed' => 'update_config'); -Irssi::signal_add_priority('session save' => 'remove_all_trackbars', Irssi::SIGNAL_PRIORITY_HIGH-1); - -Irssi::signal_add('window changed' => 'sig_window_changed'); - -Irssi::command_bind('trackbar goto' => 'goto_trackbar'); -Irssi::command_bind('trackbar keep' => 'cmd_keep_once'); -Irssi::command_bind('trackbar mark' => 'cmd_mark'); -Irssi::command_bind('trackbar markvisible' => 'cmd_markvisible'); -Irssi::command_bind('trackbar markall' => 'cmd_markall'); -Irssi::command_bind('trackbar remove' => 'cmd_trackbar_remove_one'); -Irssi::command_bind('trackbar removeall' => 'cmd_remove_all_trackbars'); -Irssi::command_bind('trackbar redraw' => 'redraw_trackbars'); -Irssi::command_bind('trackbar' => 'trackbar_runsub'); -Irssi::command_bind('mark' => 'cmd_mark'); -Irssi::command_bind_last('help' => 'cmd_help'); - -Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trackbar_loaded', $IRSSI{name}, $VERSION, $IRSSI{authors}); - -# workaround for issue #271 -{ package Irssi::Nick } diff --git a/.config/irssi/scripts/autorun/trigger.pl b/.config/irssi/scripts/autorun/trigger.pl @@ -1,1257 +0,0 @@ -# trigger.pl - execute a command or replace text, triggered by an event in irssi -# Do /TRIGGER HELP or look at http://wouter.coekaerts.be/irssi/ for help - -# Copyright (C) 2002-2010 Wouter Coekaerts <wouter@coekaerts.be> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -use strict; -use Irssi 20020324 qw(command_bind command_runsub command signal_add_first signal_continue signal_stop signal_remove); -use Text::ParseWords; -use IO::File; -use vars qw($VERSION %IRSSI); - -$VERSION = '1.2.4'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'wouter@coekaerts.be', - name => 'trigger', - description => 'execute a command or replace text, triggered by an event in irssi', - license => 'GPLv2 or later', - url => 'http://wouter.coekaerts.be/irssi/', - changed => '2020-03-10', -); - -sub cmd_help { - Irssi::print (<<'SCRIPTHELP_EOF', MSGLEVEL_CLIENTCRAP); - -TRIGGER LIST -TRIGGER SAVE -TRIGGER RELOAD -TRIGGER MOVE <number> <number> -TRIGGER DELETE <number> -TRIGGER CHANGE <number> ... -TRIGGER ADD ... - -%U%_When to match%_%U -%UOn which types of event to trigger%U - These are simply specified by -name_of_the_type - The normal IRC event types are: - publics, %|privmsgs, (pub|priv)actions, (pub|priv)notices, (pub|priv)ctcps, (pub|priv)ctcpreplies, joins, parts, quits, kicks, topics, invites, nick_changes, dcc_msgs, dcc_actions, dcc_ctcps - mode_channel: %|a mode on the (whole) channel (like +t, +i, +b) - mode_nick: %|a mode on someone in the channel (like +o, +v) - -all is an alias for all of those. - Additionally, there is: - rawin: %|raw text incoming from the server - send_command: %|commands you give to irssi - send_text: %|lines you type that aren't commands - beep: %|when irssi beeps - notify_join: %|someone in you notify list comes online - notify_part: %|someone in your notify list goes offline - notify_away: %|someone in your notify list goes away - notify_unaway: %|someone in your notify list goes unaway - notify_unidle: %|someone in your notify list stops idling - (pub|priv)flood: %|flood in a channel or in private detected. See /set flood. Be careful, these flood signals can trigger many times for one flood (unless you have autoignore enabled) - -%UFilters (conditions) the event has to satisfy%U -They all take one parameter. If you can give a list, seperate elements by space and use quotes around the list. -All filters except for -pattern and -regexp can also be inversed by prefixing with -not_. - -pattern: %|The message must match the given pattern. ? and * can be used as wildcards - -regexp: %|The message must match the given regexp. (see man perlre) - %|if -nocase is given as an option, the regexp or pattern is matched case insensitive - -tags: %|The servertag must be in the given list of tags - -channels: %|The event must be in one of the given list of channels. - Examples: %|-channels '#chan1 #chan2' or -channels 'IRCNet/#channel' - %|-channels 'EFNet/' means every channel on EFNet and is the same as -tags 'EFNet' - -masks: %|The person who triggers it must match one of the given list of masks - -hasmode: %|The person who triggers it must have the give mode - Examples: %|'-o' means not opped, '+ov' means opped OR voiced, '-o&-v' means not opped AND not voiced - -hasflag: %|Only trigger if friends.pl (friends_shasta.pl) or people.pl is loaded and the person who triggers it has the given flag in the script (same syntax as -hasmode) - -other_masks - -other_hasmode - -other_hasflag: %|Same as above but for the victim for kicks or mode_nick. - -%U%_What to do when it matches%_%U - -command: Execute the given Irssi-command - %|You are able to use $1, $2 and so on generated by your regexp pattern. - %|For multiple commands ; can be used as seperator - %|The following variables are also expanded: - $T: %|Server tag - $C: %|Channel name - $O: %|Your nick - $N: %|Nickname of the person who triggered this command - $A: %|His address (foo@bar.com), - $I: %|His ident (foo) - $H: %|His hostname (bar.com) - $M: %|The complete message - ${other}: %|The victim for kicks or mode_nick - ${mode_type}: %|The type ('+' or '-') for a mode_channel or mode_nick - ${mode_char}: %|The mode char ('o' for ops, 'b' for ban,...) - ${mode_arg} : %|The argument to the mode (if there is one) - %|$\X, with X being one of the above expands (e.g. $\M), escapes all non-alphanumeric characters, so it can be used with /eval or /exec. Don't use /eval or /exec without this, it's not safe. - -replace: %|replaces the matching part with the given replacement in the event (requires a -regexp or -pattern) - -once: %|remove the trigger if it is triggered, so it only executes once and then is forgotten. - -stop: %|stops the signal. It won't get displayed by Irssi. Like /IGNORE - -debug: %|print some debugging info - -last: %|Don't process any more triggers for this message - -%U%_Other options%_%U - -disabled: %|Same as removing it, but keeps it in case you might need it later - -name: %|Give the trigger a name. You can refer to the trigger with this name in add/del/change commands - -%U%_Examples%_%U - Knockout people who do a !list: - %#/TRIGGER ADD %|-publics -channels "#channel1 #channel2" -nocase -regexp ^!list -command "KN $N This is not a warez channel!" - React to !echo commands from people who are +o in your friends-script: - %#/TRIGGER ADD %|-publics -regexp '^!echo (.*)' -hasflag '+o' -command 'say echo: $1' - Ignore all non-ops on #channel: - %#/TRIGGER ADD %|-publics -actions -channels "#channel" -hasmode '-o' -stop - Send a mail to yourself every time a topic is changed: - %#/TRIGGER ADD %|-topics -command 'exec echo $\N changed topic of $\C to: $\M | mail you@somewhere.com -s topic' - - -%U%_Examples with -replace%_%U - %|Replace every occurence of shit with sh*t, case insensitive: - %#/TRIGGER ADD %|-all -nocase -regexp shit -replace sh*t - %|Strip all colorcodes from *!lamer@*: - %#/TRIGGER ADD %|-all -masks *!lamer@* -regexp '\x03\d?\d?(,\d\d?)?|\x02|\x1f|\x16|\x06' -replace '' - %|Never let *!bot1@foo.bar or *!bot2@foo.bar hilight you - %|(this works by cutting your nick in 2 different parts, 'myn' and 'ick' here) - %|you don't need to understand the -replace argument, just trust that it works if the 2 parts separately don't hilight: - %#/TRIGGER ADD %|-all masks '*!bot1@foo.bar *!bot2@foo.bar' -regexp '(myn)(ick)' -nocase -replace '$1\x02\x02$2' - %|Avoid being hilighted by !top10 in eggdrops with stats.mod (but show your nick in bold): - %#/TRIGGER ADD %|-publics -regexp '(Top.0\(.*\): 1.*)(my)(nick)' -replace '$1\x02$2\x02\x02$3\x02' - %|Convert a Windows-1252 Euro to an ISO-8859-15 Euro (same effect as euro.pl): - %#/TRIGGER ADD %|-regexp '\x80' -replace '\xA4' - %|Show tabs as spaces, not the inverted I (same effect as tab_stop.pl): - %#/TRIGGER ADD %|-all -regexp '\t' -replace ' ' -SCRIPTHELP_EOF -} # / - -my @triggers; # array of all triggers -my %triggers_by_type; # hash mapping types on triggers of that type -my $recursion_depth = 0; -my $changed_since_last_save = 0; - -############### -### formats ### -############### - -Irssi::theme_register([ - 'trigger_header' => 'Triggers:', - 'trigger_line' => '%#$[-4]0 $1', - 'trigger_added' => 'Trigger $0 added: $1', - 'trigger_not_found' => 'Trigger {hilight $0} not found', - 'trigger_saved' => 'Triggers saved to $0', - 'trigger_loaded' => 'Triggers loaded from $0' -]); - -######################################### -### catch the signals & do your thing ### -######################################### - -# trigger types with a message and a channel -my @allchanmsg_types = qw(publics pubactions pubnotices pubctcps pubctcpreplies parts kicks topics); -# trigger types with a message -my @allmsg_types = (@allchanmsg_types, qw(privmsgs privactions privnotices privctcps privctcpreplies dcc_msgs dcc_actions dcc_ctcps quits)); -# trigger types with a channel -my @allchan_types = (@allchanmsg_types, qw(mode_channel mode_nick joins invites pubflood send_text)); -# trigger types in -all -my @all_types = (@allmsg_types, qw(mode_channel mode_nick joins invites nick_changes)); -# trigger types that can use -masks -my @mask_types = (@all_types, qw(notify_join notify_part notify_away notify_unaway notify_unidle)); -# trigger types with a server -my @all_server_types = (@mask_types, qw(rawin pubflood privflood)); -# all trigger types -my @trigger_types = (@all_server_types, qw(send_command send_text beep)); -#trigger types that are not in -all -#my @notall_types = grep {my $a=$_; return (!grep {$_ eq $a} @all_types);} @trigger_types; -my @notall_types = qw(rawin notify_join notify_part notify_away notify_unaway notify_unidle send_command send_text beep pubflood privflood); - -my @signals = ( -# "message public", SERVER_REC, char *msg, char *nick, char *address, char *target -{ - 'types' => ['publics'], - 'signal' => 'message public', - 'sub' => sub {check_signal_message(\@_,1,$_[0],$_[4],$_[2],$_[3],'publics');}, -}, -# "message private", SERVER_REC, char *msg, char *nick, char *address -{ - 'types' => ['privmsgs'], - 'signal' => 'message private', - 'sub' => sub {check_signal_message(\@_,1,$_[0],undef,$_[2],$_[3],'privmsgs');}, -}, -# "message irc action", SERVER_REC, char *msg, char *nick, char *address, char *target -{ - 'types' => ['privactions','pubactions'], - 'signal' => 'message irc action', - 'sub' => sub { - if ($_[4] eq $_[0]->{nick}) { - check_signal_message(\@_,1,$_[0],undef,$_[2],$_[3],'privactions'); - } else { - check_signal_message(\@_,1,$_[0],$_[4],$_[2],$_[3],'pubactions'); - } - }, -}, -# "message irc notice", SERVER_REC, char *msg, char *nick, char *address, char *target -{ - 'types' => ['privnotices','pubnotices'], - 'signal' => 'message irc notice', - 'sub' => sub { - if ($_[4] eq $_[0]->{nick}) { - check_signal_message(\@_,1,$_[0],undef,$_[2],$_[3],'privnotices'); - } else { - check_signal_message(\@_,1,$_[0],$_[4],$_[2],$_[3],'pubnotices'); - } - } -}, -# "message join", SERVER_REC, char *channel, char *nick, char *address -{ - 'types' => ['joins'], - 'signal' => 'message join', - 'sub' => sub {check_signal_message(\@_,-1,$_[0],$_[1],$_[2],$_[3],'joins');} -}, -# "message part", SERVER_REC, char *channel, char *nick, char *address, char *reason -{ - 'types' => ['parts'], - 'signal' => 'message part', - 'sub' => sub {check_signal_message(\@_,4,$_[0],$_[1],$_[2],$_[3],'parts');} -}, -# "message quit", SERVER_REC, char *nick, char *address, char *reason -{ - 'types' => ['quits'], - 'signal' => 'message quit', - 'sub' => sub {check_signal_message(\@_,3,$_[0],undef,$_[1],$_[2],'quits');} -}, -# "message kick", SERVER_REC, char *channel, char *nick, char *kicker, char *address, char *reason -{ - 'types' => ['kicks'], - 'signal' => 'message kick', - 'sub' => sub {check_signal_message(\@_,5,$_[0],$_[1],$_[3],$_[4],'kicks',{'other'=>$_[2]});} -}, -# "message topic", SERVER_REC, char *channel, char *topic, char *nick, char *address -{ - 'types' => ['topics'], - 'signal' => 'message topic', - 'sub' => sub {check_signal_message(\@_,2,$_[0],$_[1],$_[3],$_[4],'topics');} -}, -# "message invite", SERVER_REC, char *channel, char *nick, char *address -{ - 'types' => ['invites'], - 'signal' => 'message invite', - 'sub' => sub {check_signal_message(\@_,-1,$_[0],$_[1],$_[2],$_[3],'invites');} -}, -# "message nick", SERVER_REC, char *newnick, char *oldnick, char *address -{ - 'types' => ['nick_changes'], - 'signal' => 'message nick', - 'sub' => sub {check_signal_message(\@_,-1,$_[0],undef,$_[1],$_[3],'nick_changes',{'other'=>$_[2]});} -}, -# "message dcc", DCC_REC *dcc, char *msg -{ - 'types' => ['dcc_msgs'], - 'signal' => 'message dcc', - 'sub' => sub {check_signal_message(\@_,1,$_[0]->{'server'},undef,$_[0]->{'nick'},undef,'dcc_msgs'); - } -}, -# "message dcc action", DCC_REC *dcc, char *msg -{ - 'types' => ['dcc_actions'], - 'signal' => 'message dcc action', - 'sub' => sub {check_signal_message(\@_,1,$_[0]->{'server'},undef,$_[0]->{'nick'},undef,'dcc_actions');} -}, -# "message dcc ctcp", DCC_REC *dcc, char *cmd, char *data -{ - 'types' => ['dcc_ctcps'], - 'signal' => 'message dcc ctcp', - 'sub' => sub {check_signal_message(\@_,1,$_[0]->{'server'},undef,$_[0]->{'nick'},undef,'dcc_ctcps');} -}, -# "server incoming", SERVER_REC, char *data -{ - 'types' => ['rawin'], - 'signal' => 'server incoming', - 'sub' => sub {check_signal_message(\@_,1,$_[0],undef,undef,undef,'rawin');} -}, -# "send command", char *args, SERVER_REC, WI_ITEM_REC -{ - 'types' => ['send_command'], - 'signal' => 'send command', - 'sub' => sub { - sig_send_text_or_command(\@_,1); - } -}, -# "send text", char *line, SERVER_REC, WI_ITEM_REC -{ - 'types' => ['send_text'], - 'signal' => 'send text', - 'sub' => sub { - sig_send_text_or_command(\@_,0); - } -}, -# "beep" -{ - 'types' => ['beep'], - 'signal' => 'beep', - 'sub' => sub {check_signal_message(\@_,-1,undef,undef,undef,undef,'beep');} -}, -# "event "<cmd>, SERVER_REC, char *args, char *sender_nick, char *sender_address -{ - 'types' => ['mode_channel', 'mode_nick'], - 'signal' => 'event mode', - 'sub' => sub { - my ($server, $event_args, $nickname, $address) = @_; - my ($target, $modes, $modeargs) = split(/ /, $event_args, 3); - return if (!$server->ischannel($target)); - my (@modeargs) = split(/ /,$modeargs); - my ($pos, $type, $event_type, $arg) = (0, '+'); - foreach my $char (split(//,$modes)) { - if ($char eq "+" || $char eq "-") { - $type = $char; - } else { - if ($char =~ /[Oovh]/) { # mode_nick - $event_type = 'mode_nick'; - $arg = $modeargs[$pos++]; - } elsif ($char =~ /[beIqdk]/ || ( $char =~ /[lfJ]/ && $type eq '+')) { # chan_mode with arg - $event_type = 'mode_channel'; - $arg = $modeargs[$pos++]; - } else { # chan_mode without arg - $event_type = 'mode_channel'; - $arg = undef; - } - check_signal_message(\@_,-1,$server,$target,$nickname,$address,$event_type,{ - 'mode_type' => $type, - 'mode_char' => $char, - 'mode_arg' => $arg, - 'other' => ($event_type eq 'mode_nick') ? $arg : undef - }); - } - } - } -}, -# "notifylist joined", SERVER_REC, char *nick, char *user, char *host, char *realname, char *awaymsg -{ - 'types' => ['notify_join'], - 'signal' => 'notifylist joined', - 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], 'notify_join', {'realname' => $_[4]});} -}, -{ - 'types' => ['notify_part'], - 'signal' => 'notifylist left', - 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], 'notify_left', {'realname' => $_[4]});} -}, -{ - 'types' => ['notify_unidle'], - 'signal' => 'notifylist unidle', - 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], 'notify_unidle', {'realname' => $_[4]});} -}, -{ - 'types' => ['notify_away', 'notify_unaway'], - 'signal' => 'notifylist away changed', - 'sub' => sub {check_signal_message(\@_, 5, $_[0], undef, $_[1], $_[2].'@'.$_[3], ($_[5] ? 'notify_away' : 'notify_unaway'), {'realname' => $_[4]});} -}, -# "ctcp msg", SERVER_REC, char *args, char *nick, char *addr, char *target -{ - 'types' => ['pubctcps', 'privctcps'], - 'signal' => 'ctcp msg', - 'sub' => sub { - my ($server, $args, $nick, $addr, $target) = @_; - if ($target eq $server->{'nick'}) { - check_signal_message(\@_, 1, $server, undef, $nick, $addr, 'privctcps'); - } else { - check_signal_message(\@_, 1, $server, $target, $nick, $addr, 'pubctcps'); - } - } -}, -# "ctcp reply", SERVER_REC, char *args, char *nick, char *addr, char *target -{ - 'types' => ['pubctcpreplies', 'privctcpreplies'], - 'signal' => 'ctcp reply', - 'sub' => sub { - my ($server, $args, $nick, $addr, $target) = @_; - if ($target eq $server->{'nick'}) { - check_signal_message(\@_, 1, $server, undef, $nick, $addr, 'privctcpreplies'); - } else { - check_signal_message(\@_, 1, $server, $target, $nick, $addr, 'pubctcpreplies'); - } - } -}, -# "flood", SERVER_REC, char *nick, char *host, int level, char *target -{ - 'types' => ['pubflood', 'privflood'], - 'signal' => 'flood', - 'sub' => sub { - my ($server, $nick, $host, $level, $target) = @_; - if ($target eq $server->{'nick'}) { - check_signal_message(\@_, -1, $server, undef, $nick, $host, 'privflood'); - } else { - check_signal_message(\@_, -1, $server, $target, $nick, $host, 'pubflood'); - } - } -} -); - -sub sig_send_text_or_command { - my ($signal, $iscommand) = @_; - my ($line, $server, $item) = @$signal; - my ($channelname,$nickname,$address) = (undef,undef,undef); - if ($item && (ref($item) eq 'Irssi::Irc::Channel' || ref($item) eq 'Irssi::Silc::Channel')) { - $channelname = $item->{'name'}; - } elsif ($item && ref($item) eq 'Irssi::Irc::Query') { # TODO Silc query ? - $nickname = $item->{'name'}; - $address = $item->{'address'} - } - # TODO pass context also for non-channels (queries and other stuff) - check_signal_message($signal,0,$server,$channelname,$nickname,$address,$iscommand ? 'send_command' : 'send_text'); - -} - -my %filters = ( -'tags' => { - 'types' => \@all_server_types, - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - - if (!defined($server)) { - return 0; - } - my $matches = 0; - foreach my $tag (split(/ /,$param)) { - if (lc($server->{'tag'}) eq lc($tag)) { - $matches = 1; - last; - } - } - return $matches; - } -}, -'channels' => { - 'types' => \@allchan_types, - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - - if (!defined($channelname) || !defined($server)) { - return 0; - } - my $matches = 0; - foreach my $trigger_channel (split(/ /,$param)) { - if (lc($channelname) eq lc($trigger_channel) - || lc($server->{'tag'}.'/'.$channelname) eq lc($trigger_channel) - || lc($server->{'tag'}.'/') eq lc($trigger_channel)) { - $matches = 1; - last; # this channel matches, stop checking channels - } - } - return $matches; - } -}, -'masks' => { - 'types' => \@mask_types, - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - $address //= ''; - return (defined($nickname) && defined($server) && $server->masks_match($param, $nickname, $address)); - } -}, -'other_masks' => { - 'types' => ['kicks', 'mode_nick', 'nick_changes'], - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return 0 unless defined($extra->{'other'}); - my $other_address = ($condition ne 'nick_changes') ? get_address($extra->{'other'}, $server, $channelname) : $address; - return defined($other_address) && $server->masks_match($param, $extra->{'other'}, $other_address); - } -}, -'hasmode' => { - 'types' => \@all_types, - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return hasmode($param, $nickname, $server, $channelname); - } -}, -'other_hasmode' => { - 'types' => ['kicks', 'mode_nick'], - 'sub' => sub { - my ($param,$signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return defined($extra->{'other'}) && hasmode($param, $extra->{'other'}, $server, $channelname); - } -}, -'hasflag' => { - 'types' => \@all_types, - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return 0 unless defined($nickname) && defined($address) && defined($server); - my $flags = get_flags ($server->{'chatnet'},$channelname,$nickname,$address); - return defined($flags) && check_modes($flags,$param); - } -}, -'other_hasflag' => { - 'types' => ['kicks', 'mode_nick'], - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return 0 unless defined($extra->{'other'}); - my $other_address = get_address($extra->{'other'}, $server, $channelname); - return 0 unless defined($other_address); - my $flags = get_flags ($server->{'chatnet'},$channelname,$extra->{'other'},$other_address); - return defined($flags) && check_modes($flags,$param); - } -}, -'mode_type' => { - 'types' => ['mode_channel', 'mode_nick'], - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return (($param) eq $extra->{'mode_type'}); - } -}, -'mode_char' => { - 'types' => ['mode_channel', 'mode_nick'], - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return (($param) eq $extra->{'mode_char'}); - } -}, -'mode_arg' => { - 'types' => ['mode_channel', 'mode_nick'], - 'sub' => sub { - my ($param, $signal,$parammessage,$server,$channelname,$nickname,$address,$condition,$extra) = @_; - return (($param) eq $extra->{'mode_arg'}); - } -} -); - -sub get_address { - my ($nick, $server, $channel) = @_; - my $nickrec = get_nickrec($nick, $server, $channel); - return $nickrec ? $nickrec->{'host'} : undef; -} -sub get_nickrec { - my ($nick, $server, $channel) = @_; - return unless defined($server) && defined($channel) && defined($nick); - my $chanrec = $server->channel_find($channel); - return $chanrec ? $chanrec->nick_find($nick) : undef; -} - -sub hasmode { - my ($param, $nickname, $server, $channelname) = @_; - my $nickrec = get_nickrec($nickname, $server, $channelname); - return 0 unless defined $nickrec; - my $modes = - ($nickrec->{'op'} ? 'o' : '') - . ($nickrec->{'voice'} ? 'v' : '') - . ($nickrec->{'halfop'} ? 'h' : '') - ; - return check_modes($modes, $param); -} - -# list of all switches -my @trigger_switches = (@trigger_types, qw(all nocase stop once debug disabled last)); -# parameters (with an argument) -my @trigger_params = qw(pattern regexp command replace name); -# all options that can be used to set filters, including negative matches (not_<filter>) -my @trigger_filter_options = map(($_,'not_'.$_), keys(%filters)); -# list of all options (including switches) for /TRIGGER ADD -my @trigger_add_options = (@trigger_switches, @trigger_params, @trigger_filter_options); -# same for /TRIGGER CHANGE, this includes the -no<option>'s -my @trigger_options = map(($_,'no'.$_) ,@trigger_add_options); - -# check the triggers on $signal's $parammessage parameter, for triggers with $condition set -# on $server in $channelname, for $nickname!$address -# set $parammessage to -1 if the signal doesn't have a message -# for signal without channel, nick or address, set to undef -sub check_signal_message { - my ($signal, $parammessage, $server, $channelname, $nickname, $address, $condition, $extra) = @_; - my ($changed, $stopped, $context, $need_rebuild); - my $message = ($parammessage == -1) ? '' : $signal->[$parammessage]; - - return if (!$triggers_by_type{$condition}); - - if ($recursion_depth > 10) { - Irssi::print("Trigger error: Maximum recursion depth reached, aborting trigger.", MSGLEVEL_CLIENTERROR); - return; - } - $recursion_depth++; - -TRIGGER: - foreach my $trigger (@{$triggers_by_type{$condition}}) { - # check filters - foreach my $trigfilter (filters_for_trigger($trigger)) { - my $filter_sub = $trigfilter->{'filter'}->{'sub'}; - my $filter_matches = !!(&$filter_sub($trigfilter->{'param'}, $signal, $parammessage, $server, $channelname, $nickname, $address, $condition, $extra)); - if ($filter_matches != $trigfilter->{'must_match'}) { # if it didn't match, or if it's a -not_* filter and it did match - next TRIGGER; - } - } - - # check regexp (and keep matches in @- and @+, so don't make a this a {block}) - next if ($trigger->{'compregexp'} && ($parammessage == -1 || $message !~ m/$trigger->{'compregexp'}/)); - - # if we got this far, it fully matched, and we need to do the replace/command/stop/once - my $expands = $extra; - $expands->{'M'} = $message,; - $expands->{'T'} = (defined($server)) ? $server->{'tag'} : ''; - $expands->{'C'} = $channelname; - $expands->{'O'} = (defined($server)) ? $server->{'nick'} : ''; - $expands->{'N'} = $nickname; - $expands->{'A'} = $address; - $expands->{'I'} = ((!defined($address)) ? '' : substr($address,0,index($address,'@'))); - $expands->{'H'} = ((!defined($address)) ? '' : substr($address,index($address,'@')+1)); - $expands->{'$'} = '$'; - $expands->{';'} = ';'; - - if (defined($trigger->{'replace'})) { # it's a -replace - $message =~ s/$trigger->{'compregexp'}/do_expands(0,$trigger->{'compreplace'},$expands,$message)/ge; - $changed = 1; - } - - if ($trigger->{'command'}) { # it's a (nonempty) -command - my $command = $trigger->{'command'}; - # $1 = the stuff behind the $ we want to expand: a number, or a character from %expands - $command = do_expands(1, $command, $expands, $message); - - if (defined($server)) { - if (defined($channelname) && $server->channel_find($channelname)) { - $context = $server->channel_find($channelname); - } else { - $context = $server; - } - } else { - $context = undef; - } - - if (defined($context)) { - $context->command("eval $command"); - } else { - Irssi::command("eval $command"); - } - } - - if ($trigger->{'debug'}) { - print("DEBUG: trigger $condition pmesg=$parammessage message=$message server=$server->{tag} channel=$channelname nick=$nickname address=$address " . join(' ',map {$_ . '=' . $extra->{$_}} keys(%$extra))); - } - - if ($trigger->{'stop'}) { - $stopped = 1; - } - - if ($trigger->{'once'}) { - # find this trigger in the real trigger list, and remove it - for (my $realindex=0; $realindex < scalar(@triggers); $realindex++) { - if ($triggers[$realindex] == $trigger) { - splice (@triggers,$realindex,1); - last; - } - } - $need_rebuild = 1; - } - if ($trigger->{'last'}) { - last TRIGGER; - } - } - - if ($need_rebuild) { - rebuild(); - $changed_since_last_save = 1; - } - if ($stopped) { # stopped with -stop - signal_stop(); - } elsif ($changed) { # changed with -replace - $signal->[$parammessage] = $message; - signal_continue(@$signal); - } - $recursion_depth--; -} - -# return array of filters for the given trigger -sub filters_for_trigger($) { - my ($trigger) = @_; - return values(%{$trigger->{'filters'}}); -} - -# used in check_signal_message to expand $'s -# $inthis is a string that can contain $ stuff (like 'foo$1bar$N') -sub do_expands { - my ($escape, $inthis, $expands, $from) = @_; - # @+ and @- are copied because there are two s/// nested, and the inner needs the $1 and $2,... of the outer one - my @plus = @+; - my @min = @-; - my $p = \@plus; my $m = \@min; - $inthis =~ s/\$(\\*(\d+|[^0-9x{]|x[0-9a-fA-F][0-9a-fA-F]|{.*?}))/expand_and_escape($escape,$1,$expands,$m,$p,$from)/ge; - return $inthis; -} - -# \ $ and ; may need extra escaping because we use eval for -command -sub expand_and_escape { - my $escape = shift; - my $retval = expand(@_); - if ($escape) { - $retval =~ s/([\\\$;])/\\\1/g; - } - return $retval; -} - -# used in do_expands (via expand_and_escape), to_expand is the part after the $ -sub expand { - my ($to_expand, $expands, $min, $plus, $from) = @_; - if ($to_expand =~ /^\d+$/) { # a number => look up in $vars - # from man perlvar: - # $3 is the same as "substr $var, $-[3], $+[3] - $-[3])" - return ($to_expand > @{$min} ? '' : substr($from,$min->[$to_expand],$plus->[$to_expand]-$min->[$to_expand])); - } elsif ($to_expand =~ s/^\\//) { # begins with \, so strip that from to_expand - my $exp = expand($to_expand,$expands,$min,$plus,$from); # first expand without \ - $exp =~ s/([^a-zA-Z0-9])/\\\1/g; # escape non-word chars - return $exp; - } elsif ($to_expand =~ /^x([0-9a-fA-F]{2})/) { # $xAA - return chr(hex($1)); - } elsif ($to_expand =~ /^{(.*?)}$/) { # ${foo} - return expand($1, $expands, $min, $plus, $from); - } else { # look up in $expands - return $expands->{$to_expand}; - } -} - -sub check_modes { - my ($has_modes, $need_modes) = @_; - my $matches; - my $switch = 1; # if a '-' if found, will be 0 (meaning the modes should not be set) - foreach my $need_mode (split /&/, $need_modes) { - $matches = 0; - foreach my $char (split //, $need_mode) { - if ($char eq '-') { - $switch = 0; - } elsif ($char eq '+') { - $switch = 1; - } elsif ((index($has_modes, $char) != -1) == $switch) { - $matches = 1; - last; - } - } - if (!$matches) { - return 0; - } - } - return 1; -} - -# get someones flags from people.pl or friends(_shasta).pl -sub get_flags { - my ($chatnet, $channel, $nick, $address) = @_; - my $flags; - no strict 'refs'; - if (%{ 'Irssi::Script::people::' }) { - if (defined ($channel)) { - $flags = (&{ 'Irssi::Script::people::find_local_flags' }($chatnet,$channel,$nick,$address)); - } else { - $flags = (&{ 'Irssi::Script::people::find_global_flags' }($chatnet,$nick,$address)); - } - $flags = join('',keys(%{$flags})); - } else { - my $shasta; - if (%{ 'Irssi::Script::friends_shasta::' }) { - $shasta = 'friends_shasta'; - } elsif (defined &{ 'Irssi::Script::friends::get_idx' }) { - $shasta = 'friends'; - } else { - return undef; - } - my $idx = (&{ 'Irssi::Script::'.$shasta.'::get_idx' }($nick, $address)); - if ($idx == -1) { - return ''; - } - $flags = (&{ 'Irssi::Script::'.$shasta.'::get_friends_flags' }($idx,undef)); - if ($channel) { - $flags .= (&{ 'Irssi::Script::'.$shasta.'::get_friends_flags' }($idx,$channel)); - } - } - return $flags; -} - -######################################################## -### internal stuff called by manage, needed by above ### -######################################################## - -my %mask_to_regexp = (); -foreach my $i (0..255) { - my $ch = chr $i; - $mask_to_regexp{$ch} = "\Q$ch\E"; -} -$mask_to_regexp{'?'} = '(.)'; -$mask_to_regexp{'*'} = '(.*)'; - -sub compile_trigger { - my ($trigger) = @_; - my $regexp; - - if ($trigger->{'regexp'}) { - $regexp = $trigger->{'regexp'}; - } elsif ($trigger->{'pattern'}) { - $regexp = $trigger->{'pattern'}; - $regexp =~ s/(.)/$mask_to_regexp{$1}/g; - } else { - delete $trigger->{'compregexp'}; - return; - } - - if ($trigger->{'nocase'}) { - $regexp = '(?i)' . $regexp; - } - - $trigger->{'compregexp'} = qr/$regexp/; - - if(defined($trigger->{'replace'})) { - (my $replace = $trigger->{'replace'}) =~ s/\$/\$\$/g; - $trigger->{'compreplace'} = Irssi::parse_special($replace); - } -} - -# rebuilds triggers_by_type and updates signal binds -sub rebuild { - %triggers_by_type = (); - foreach my $trigger (@triggers) { - if (!$trigger->{'disabled'}) { - if ($trigger->{'all'}) { - # -all is an alias for all types in @all_types for which the filters can apply -ALLTYPES: - foreach my $type (@all_types) { - # check if all filters can apply to $type - foreach my $trigfilter (filters_for_trigger($trigger)) { - if (! grep {$_ eq $type} @{$trigfilter->{'filter'}->{'types'}}) { - next ALLTYPES; - } - } - push @{$triggers_by_type{$type}}, ($trigger); - } - } - - foreach my $type ($trigger->{'all'} ? @notall_types : @trigger_types) { - if ($trigger->{$type}) { - push @{$triggers_by_type{$type}}, ($trigger); - } - } - } - } - - foreach my $signal (@signals) { - my $should_bind = 0; - foreach my $type (@{$signal->{'types'}}) { - if (defined($triggers_by_type{$type})) { - $should_bind = 1; - } - } - if ($should_bind && !$signal->{'bind'}) { - signal_add_first($signal->{'signal'}, $signal->{'sub'}); - $signal->{'bind'} = 1; - } elsif (!$should_bind && $signal->{'bind'}) { - signal_remove($signal->{'signal'}, $signal->{'sub'}); - $signal->{'bind'} = 0; - } - } -} - -################################ -### manage the triggers-list ### -################################ - -my $trigger_file; # cached setting - -sub sig_setup_changed { - $trigger_file = Irssi::settings_get_str('trigger_file'); -} - -sub autosave { - cmd_save() if ($changed_since_last_save); -} - -# TRIGGER SAVE -sub cmd_save { - my $io = new IO::File $trigger_file, "w"; - if (defined $io) { - $io->print("#Triggers file version $VERSION\n"); - foreach my $trigger (@triggers) { - $io->print(to_string($trigger) . "\n"); - } - $io->close; - } - Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'trigger_saved', $trigger_file); - $changed_since_last_save = 0; -} - -# save on unload -sub UNLOAD { - cmd_save(); -} - -# TRIGGER LOAD -sub cmd_load { - sig_setup_changed(); # make sure we've read the trigger_file setting - my $converted = 0; - my $io = new IO::File $trigger_file, "r"; - if (not defined $io) { - if (-e $trigger_file) { - Irssi::print("Error opening triggers file", MSGLEVEL_CLIENTERROR); - } - return; - } - if (defined $io) { - @triggers = (); - my $text; - $text = $io->getline; - my $file_version = ''; - if ($text =~ /^#Triggers file version (.*)\n/) { - $file_version = $1; - } - if ($file_version lt '0.6.1+2') { - no strict 'vars'; - $text .= $_ foreach ($io->getlines); - my $rep = eval "$text"; - if (! ref $rep) { - Irssi::print("Error in triggers file"); - return; - } - my @old_triggers = @$rep; - - for (my $index=0;$index < scalar(@old_triggers);$index++) { - my $trigger = $old_triggers[$index]; - - if ($file_version lt '0.6.1') { - # convert old names: notices => pubnotices, actions => pubactions - foreach $oldname ('notices','actions') { - if ($trigger->{$oldname}) { - delete $trigger->{$oldname}; - $trigger->{'pub'.$oldname} = 1; - $converted = 1; - } - } - } - if ($file_version lt '0.6.1+1' && $trigger->{'modifiers'}) { - if ($trigger->{'modifiers'} =~ /i/) { - $trigger->{'nocase'} = 1; - Irssi::print("Trigger: trigger ".($index+1)." had 'i' in it's modifiers, it has been converted to -nocase"); - } - if ($trigger->{'modifiers'} !~ /^[ig]*$/) { - Irssi::print("Trigger: trigger ".($index+1)." had unrecognised modifier '". $trigger->{'modifiers'} ."', which couldn't be converted."); - } - delete $trigger->{'modifiers'}; - $converted = 1; - } - - # convert to text with compat, and then to new trigger hash - $text = to_string($trigger,1); - my @args = &shellwords($text . ' a'); - my $trigger = parse_options({},@args); - if ($trigger) { - push @triggers, $trigger; - } - } - } else { # new format - while ( $text = $io->getline ) { - chop($text); - next if ($text =~ /^[ ]*$|^#/); - my @args = &shellwords($text . ' a'); - my $trigger = parse_options({},@args); - if ($trigger) { - push @triggers, $trigger; - } - } - } - } - Irssi::printformat(MSGLEVEL_CLIENTNOTICE, 'trigger_loaded', $trigger_file); - if ($converted) { - Irssi::print("Trigger: Triggers file will be in new format next time it's saved."); - } - rebuild(); -} - -# escape for printing with to_string -# <<abcdef>> => << 'abcdef' >> -# <<abc'def>> => << "abc'def" >> -# <<abc'def\x02>> => << 'abc'\''def\x02' >> -sub param_to_string { - my ($text) = @_; - # avoid ugly escaping if we can use "-quotes without other escaping (no " or \) - if ($text =~ /^[^"\\]*'[^"\\]$/) { - return ' "' . $text . '" '; - } - # "'" signs without a (odd number of) \ in front of them, need be to escaped as '\'' - # this is ugly :( - $text =~ s/(^|[^\\](\\\\)*)'/$1'\\''/g; - return " '$text' "; -} - -# converts a trigger back to "-switch -options 'foo'" form -# if $compat, $trigger is in the old format (used to convert) -sub to_string { - my ($trigger, $compat) = @_; - my $string; - - foreach my $switch (@trigger_switches) { - if ($trigger->{$switch}) { - $string .= '-'.$switch.' '; - } - } - - if ($compat) { - foreach my $filter (keys(%filters)) { - if ($trigger->{$filter}) { - $string .= '-' . $filter . param_to_string($trigger->{$filter}); - } - } - } else { - foreach my $trigfilter (filters_for_trigger($trigger)) { - $string .= '-' . $trigfilter->{'option'} . param_to_string($trigfilter->{'param'}); - } - } - - foreach my $param (@trigger_params) { - if ($trigger->{$param} || ($param eq 'replace' && defined($trigger->{'replace'}))) { - $string .= '-' . $param . param_to_string($trigger->{$param}); - } - } - return $string; -} - -# find a trigger (for REPLACE and DELETE), returns index of trigger, or -1 if not found -sub find_trigger { - my ($data) = @_; - if ($data =~ /^[0-9]*$/ and defined($triggers[$data-1])) { - return $data-1; - } else { - for (my $i=0; $i < scalar(@triggers); $i++) { - if ($triggers[$i]->{'name'} eq $data) { - return $i; - } - } - } - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_not_found', $data); - return -1; # not found -} - - -# TRIGGER ADD <options> -sub cmd_add { - my ($data, $server, $item) = @_; - my @args = shellwords($data . ' a'); - - my $trigger = parse_options({}, @args); - if ($trigger) { - push @triggers, $trigger; - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_added', scalar(@triggers), to_string($trigger)); - rebuild(); - $changed_since_last_save = 1; - } -} - -# TRIGGER CHANGE <nr> <options> -sub cmd_change { - my ($data, $server, $item) = @_; - my @args = shellwords($data . ' a'); - my $index = find_trigger(shift @args); - if ($index != -1) { - if(parse_options($triggers[$index], @args)) { - Irssi::print("Trigger " . ($index+1) ." changed to: ". to_string($triggers[$index])); - } - rebuild(); - $changed_since_last_save = 1; - } -} - -# parses options for TRIGGER ADD and TRIGGER CHANGE -# if invalid args returns undef, else changes $thetrigger and returns it -sub parse_options { - my ($thetrigger,@args) = @_; - my ($trigger, $option); - - if (pop(@args) ne 'a') { - Irssi::print("Syntax error, probably missing a closing quote", MSGLEVEL_CLIENTERROR); - return undef; - } - - %$trigger = %$thetrigger; # make a copy to prevent changing the given trigger if args doesn't parse -ARGS: for (my $arg = shift @args; $arg; $arg = shift @args) { - # expand abbreviated options, put in $option - $arg =~ s/^-//; - $option = undef; - foreach my $ioption (@trigger_options) { - if (index($ioption, $arg) == 0) { # -$opt starts with $arg - if ($option) { # another already matched - Irssi::print("Ambiguous option: $arg", MSGLEVEL_CLIENTERROR); - return undef; - } - $option = $ioption; - last if ($arg eq $ioption); # exact match is unambiguous - } - } - if (!$option) { - Irssi::print("Unknown option: $arg", MSGLEVEL_CLIENTERROR); - return undef; - } - - # -<param> <value> or -no<param> - foreach my $param (@trigger_params) { - if ($option eq $param) { - $trigger->{$param} = shift @args; - next ARGS; - } - if ($option eq 'no'.$param) { - $trigger->{$param} = undef; - next ARGS; - } - } - - # -[no]<switch> - foreach my $switch (@trigger_switches) { - # -<switch> - if ($option eq $switch) { - $trigger->{$switch} = 1; - next ARGS; - } - # -no<switch> - elsif ($option eq 'no'.$switch) { - $trigger->{$switch} = undef; - next ARGS; - } - } - - # -[not_]<filter> <value> - if ($option =~ /^(not_)?(.*)$/ && $filters{$2}) { - $trigger->{'filters'}->{$option} = { - option => $option, - must_match => ($1 ne 'not_'), # if false, trigger must only be done if filter sub returns false - filter_name => $2, - filter => $filters{$2}, - param => shift @args - }; - - next ARGS; - } - - # -no<filter> - if ($option =~ /^no(.*)$/ && $filters{$1}) { - delete $trigger->{'filters'}->{$1}; - } - } - - if (defined($trigger->{'replace'}) && ! $trigger->{'regexp'} && !$trigger->{'pattern'}) { - Irssi::print("Trigger error: Can't have -replace without -regexp", MSGLEVEL_CLIENTERROR); - return undef; - } - - if ($trigger->{'pattern'} && $trigger->{'regexp'}) { - Irssi::print("Trigger error: Can't have -pattern and -regexp in same trigger", MSGLEVEL_CLIENTERROR); - return undef; - } - - # remove types that are implied by -all - if ($trigger->{'all'}) { - foreach my $type (@all_types) { - delete $trigger->{$type}; - } - } - - # remove types for which the filters don't apply - foreach my $type (@trigger_types) { - if ($trigger->{$type}) { - foreach my $trigfilter (filters_for_trigger($trigger)) { - if (!grep {$_ eq $type} @{$trigfilter->{'filter'}->{'types'}}) { - Irssi::print("Warning: the filter -" . $trigfilter->{'option'} . " can't apply to an event of type -$type, so I'm removing that type from this trigger."); - delete $trigger->{$type}; - } - } - } - } - - # check if it has at least one type - my $has_a_type; - foreach my $type (@trigger_types) { - if ($trigger->{$type}) { - $has_a_type = 1; - last; - } - } - if (!$has_a_type && !$trigger->{'all'}) { - Irssi::print("Warning: this trigger doesn't trigger on any type of message. you probably want to add -publics or -all"); - } - - compile_trigger($trigger); - %$thetrigger = %$trigger; # copy changes to real trigger - return $thetrigger; -} - -# TRIGGER DELETE <num> -sub cmd_del { - my ($data, $server, $item) = @_; - my @args = shellwords($data); - my $index = find_trigger(shift @args); - if ($index != -1) { - Irssi::print("Deleted ". ($index+1) .": ". to_string($triggers[$index])); - splice (@triggers,$index,1); - rebuild(); - $changed_since_last_save = 1; - } -} - -# TRIGGER MOVE <num> <num> -sub cmd_move { - my ($data, $server, $item) = @_; - my @args = &shellwords($data); - my $index = find_trigger(shift @args); - if ($index != -1) { - my $newindex = find_trigger(shift @args); - if ($newindex != -1) { - Irssi::print("Moved from " . ($index+1) . " to " . ($newindex+1) . ": " . to_string($triggers[$index])); - my $trigger = splice (@triggers,$index,1); # remove from old place - splice (@triggers,$newindex,0,($trigger)); # insert at new place - rebuild(); - $changed_since_last_save = 1; - } - } -} - -# TRIGGER LIST -sub cmd_list { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_header'); - my $i=1; - foreach my $trigger (@triggers) { - Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'trigger_line', $i++, to_string($trigger)); - } -} - -###################### -### initialisation ### -###################### - -command_bind('trigger help',\&cmd_help); -command_bind('help trigger',\&cmd_help); -command_bind('trigger add',\&cmd_add); -command_bind('trigger change',\&cmd_change); -command_bind('trigger move',\&cmd_move); -command_bind('trigger list',\&cmd_list); -command_bind('trigger delete',\&cmd_del); -command_bind('trigger save',\&cmd_save); -command_bind('trigger reload',\&cmd_load); -command_bind 'trigger' => sub { - my ( $data, $server, $item ) = @_; - $data =~ s/\s+$//g; - command_runsub('trigger', $data, $server, $item); -}; - -Irssi::signal_add('setup saved', \&autosave); -Irssi::signal_add('setup changed', \&sig_setup_changed); - -# This makes tab completion work -Irssi::command_set_options('trigger add',join(' ',@trigger_add_options)); -Irssi::command_set_options('trigger change',join(' ',@trigger_options)); - -Irssi::settings_add_str($IRSSI{'name'}, 'trigger_file', Irssi::get_irssi_dir()."/triggers"); - -cmd_load(); diff --git a/.config/irssi/scripts/autorun/uberprompt.pl b/.config/irssi/scripts/autorun/uberprompt.pl @@ -1,774 +0,0 @@ -=pod - -=head1 NAME - -uberprompt.pl - -=head1 DESCRIPTION - -This script replaces the default prompt status-bar item with one capable of -displaying additional information, under either user control or via scripts. - -=head1 INSTALLATION - -Copy into your F<~/.irssi/scripts/> directory and load with -C</SCRIPT LOAD F<filename>>. - -It is recommended that you make it autoload in one of the -L<usual ways|https://github.com/shabble/irssi-docs/wiki/Guide#Autorunning_Scripts>. - -=head1 SETUP - -If you have a custom prompt format, you may need to copy it to the -uberprompt_format setting. See below for details. - -=head1 USAGE - -Although the script is designed primarily for other scripts to set -status information into the prompt, the following commands are available: - -=over 4 - -=item * C</prompt set [-inner|-pre|-post|only] E<lt>msgE<gt>> - -Sets the prompt to the given argument. Any use of C<$p> in the argument will -be replaced by the original prompt content. - -A parameter corresponding to the C<UP_*> constants listed below is required, in -the format C</prompt set -inner Hello!> - -=item * C</prompt clear> - -Clears the additional data provided to the prompt. - -=item * C</prompt on> - -Eenables the uberprompt (things may get confused if this is used -whilst the prompt is already enabled) - -=item * C</prompt off> - -Restore the original irssi prompt and prompt_empty statusbars. unloading the -script has the same effect. - -=item * C</help prompt> - -show help for uberprompt commands - -=back - -=head1 SETTINGS - -=head2 UBERPROMPT FORMAT - -C</set uberprompt_format E<lt>formatE<gt>> - -The default is C<[$*$uber]>, which is the same as the default provided in -F<default.theme>. - -Changing this setting will update the prompt immediately, unlike editing your theme. - -An additional variable available within this format is C<$uber>, which expands to -the content of prompt data provided with the C<UP_INNER> or C</prompt set -inner> -placement argument. - -For all other placement arguments, it will expand to the empty string. - -B<Note:> This setting completely overrides the C<prompt="...";> line in your -.theme file, and may cause unexpected behaviour if your theme wishes to set a -different form of prompt. It can be simply copied from the theme file into the -above setting. - -=head2 OTHER SETTINGS - -=over 4 - -=item * C<uberprompt_autostart> - -Boolean value, which determines if uberprompt should enable itself automatically -upon loading. If Off, it must be enabled manually with C</prompt on>. Defaults to On. - -=item * C<uberprompt_debug> - -Boolean value, which determines if uberprompt should print debugging information. -Defaults to Off, and should probably be left that way unless requested for bug-tracing -purposes. - -=item * C<uberprompt_format> - -String value containing the format-string which uberprompt uses to display the -prompt. Defaults to "C<[$*$uber] >", where C<$*> is the content the prompt would -normally display, and C<$uber> is a placeholder variable for dynamic content, as -described in the section above. - -=item * C<uberprompt_load_hook> - -String value which can contain one or more commands to be run whenever the uberprompt -is enabled, either via autostart, or C</prompt on>. Defaults to the empty string, in -which case no commands are run. Some examples include: - -C</set uberprompt_load_hook /echo prompt enabled> or - -C</^sbar prompt add -after input vim_mode> for those using vim_mode.pl who want -the command status indicator on the prompt line. - -=item * C<uberprompt_unload_hook> - -String value, defaulting to the empty string, which can contain commands which -are executed when the uberprompt is disabled, either by unloading the script, -or by the command C</prompt off>. - -=item * C<uberprompt_use_replaces> - -Boolean value, defaults to Off. If enabled, the format string for the prompt -will be subject to the I<replaces> section of the theme. The most obvious -effect of this is that bracket characters C<[ ]> are displayed in a different -colour, typically quite dark. - -=back - -B<Note:> For both C<uberprompt_*_hook> settings above, multiple commands can -be chained together in the form C</eval /^cmd1 ; /^cmd2>. The C<^> prevents -any output from the commands (such as error messages) being displayed. - -=head2 SCRIPTING USAGE - -The primary purpose of uberprompt is to be used by other scripts to -display information in a way that is not possible by printing to the active -window or using statusbar items. - -The content of the prompt can be set from other scripts via the C<"change prompt"> -signal. - -For Example: - - signal_emit 'change prompt' 'some_string', UberPrompt::UP_INNER; - -will set the prompt to include that content, by default 'C<[$* some_string]>' - -The possible position arguments are the following strings: - -=over 4 - -=item * C<UP_PRE> - place the provided string before the prompt - C<$string$prompt> - -=item * C<UP_INNER> - place the provided string inside the prompt - C<{prompt $* $string}> - -=item * C<UP_POST> - place the provided string after the prompt - C<$prompt$string> - -=item * C<UP_ONLY> - replace the prompt with the provided string - C<$string> - -=back - -All strings may use the special variable 'C<$prompt>' to include the prompt -verbatim at that position in the string. It is probably only useful for -the C<UP_ONLY> mode however. '$C<prompt_nt>' will include the prompt, minus any -trailing whitespace. - -=head2 CHANGE NOTIFICATIONS - -You can also be notified when the prompt changes in response to the previous -signal or manual C</prompt> commands via: - - signal_add 'prompt changed', sub { my ($text, $len) = @_; ... do something ... }; - -This callback will occur whenever the contents of the prompt is changed. - - -=head2 NOTES FOR SCRIPT WRITERS: - -The following code snippet can be used within your own script as a preamble -to ensure that uberprompt is loaded before your script to avoid -any issues with loading order. It first checks if uberprompt is loaded, and -if not, attempts to load it. If the load fails, the script will die -with an error message, otherwise it will call your app_init() function. - -I<---- start of snippet ----> - - my $DEBUG_ENABLED = 0; - sub DEBUG () { $DEBUG_ENABLED } - - # check we have uberprompt loaded. - - sub script_is_loaded { - return exists($Irssi::Script::{$_[0] . '::'}); - } - - if (not script_is_loaded('uberprompt')) { - - print "This script requires 'uberprompt.pl' in order to work. " - . "Attempting to load it now..."; - - Irssi::signal_add('script error', 'load_uberprompt_failed'); - Irssi::command("script load uberprompt.pl"); - - unless(script_is_loaded('uberprompt')) { - load_uberprompt_failed("File does not exist"); - } - app_init(); - } else { - app_init(); - } - - sub load_uberprompt_failed { - Irssi::signal_remove('script error', 'load_uberprompt_failed'); - - print "Script could not be loaded. Script cannot continue. " - . "Check you have uberprompt.pl installed in your path and " - . "try again."; - - die "Script Load Failed: " . join(" ", @_); - } - -I<---- end of snippet ----> - -=head1 AUTHORS - -Copyright E<copy> 2011 Tom Feist C<E<lt>shabble+irssi@metavore.orgE<gt>> - -=head1 LICENCE - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -=head1 BUGS - -=over 4 - -=item * - -Resizing the terminal rapidly whilst using this script in debug mode may cause -irssi to crash. See bug report at http://bugs.irssi.org/index.php?do=details&task_id=772 for details. - -=back - -=head1 TODO - -=over 4 - -=item * report failure (somehow) to clients if hte prompt is disabled. - -=item * fix issue at autorun startup with sbar item doesn't exist. - -=back - -=cut - -use strict; -use warnings; - -use Irssi; -use Irssi::TextUI; -use Data::Dumper; - -{ package Irssi::Nick } # magic. - -our $VERSION = "0.2"; -our %IRSSI = - ( - authors => "shabble", - contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', - name => "uberprompt", - description => "Helper script for dynamically adding text " - . "into the input-bar prompt.", - license => "MIT", - changed => "24/7/2010" - ); - - -my $DEBUG_ENABLED = 0; -sub DEBUG { $DEBUG_ENABLED } - -my $prompt_data = ''; -my $prompt_data_pos = 'UP_INNER'; - -my $prompt_last = ''; -my $prompt_format = ''; -my $prompt_format_empty = ''; - -# flag to indicate whether rendering of hte prompt should allow the replaces -# theme formats to be applied to the content. -my $use_replaces = 0; -my $trim_data = 0; - -my $emit_request = 0; - -my $expando_refresh_timer; -my $expando_vars = {}; - -my $init_callbacks = {load => '', unload => ''}; - -pre_init(); - -sub pre_init { - Irssi::command('statusbar prompt reset'); - init(); -} - -sub prompt_subcmd_handler { - my ($data, $server, $item) = @_; - #$data =~ s/\s+$//g; # strip trailing whitespace. - Irssi::command_runsub('prompt', $data, $server, $item); -} - -sub _error($) { - my ($msg) = @_; - Irssi::active_win->print($msg, MSGLEVEL_CLIENTERROR); -} - -sub _debug_print($) { - return unless DEBUG; - my ($msg) = @_; - Irssi::active_win->print($msg, MSGLEVEL_CLIENTCRAP); -} - -sub _print_help { - my ($args) = @_; - if ($args =~ m/^\s*prompt/i) { - my @help_lines = - ( - "", - "PROMPT ON", - "PROMPT OFF", - "PROMPT CLEAR", - "PROMPT SET { -pre | -post | -only | -inner } <content>", - "", - "Commands for manipulating the UberPrompt.", - "", - "/PROMPT ON enables uberprompt, replacing the existing prompt ", - " statusbar-item", - "/PROMPT OFF disables it, and restores the original prompt item", - "/PROMPT CLEAR resets the value of any additional data set by /PROMPT SET", - " or a script", - "/PROMPT SET changes the contents of the prompt, according to the mode", - " and content provided.", - " { -inner sets the value of the \$uber psuedo-variable in the", - " /set uberprompt_format setting.", - " | -pre places the content before the current prompt string", - " | -post places the content after the prompt string", - " | -only replaces the entire prompt contents with the given string }", - "", - "See Also:", - '', - '/SET uberprompt_format -- defaults to "[$*$uber] "', - '/SET uberprompt_format_empty -- defaults to "[$*] "', - "/SET uberprompt_autostart -- determines whether /PROMPT ON is run", - " automatically when the script loads", - "/SET uberprompt_use_replaces -- toggles the use of the current theme", - " \"replaces\" setting. Especially", - " noticeable on brackets \"[ ]\" ", - "/SET uberprompt_trim_data -- defaults to off. Removes whitespace from", - " both sides of the \$uber result.", - "", - ); - - Irssi::print($_, MSGLEVEL_CLIENTCRAP) for @help_lines; - Irssi::signal_stop; - } -} - -sub UNLOAD { - deinit(); -} - -sub exp_lbrace() { '{' } -sub exp_rbrace() { '}' } - -sub deinit { - Irssi::expando_destroy('lbrace'); - Irssi::expando_destroy('rbrace'); - - if (Irssi::settings_get_bool('uberprompt_restore_on_exit')) { - # remove uberprompt and return the original ones. - print "Removing uberprompt and restoring original"; - restore_prompt_items(); - } -} - -sub init { - Irssi::statusbar_item_register('uberprompt', 0, 'uberprompt_draw'); - - # TODO: flags to prevent these from being recomputed? - Irssi::expando_create('lbrace', \&exp_lbrace, {}); - Irssi::expando_create('rbrace', \&exp_rbrace, {}); - - Irssi::settings_add_str ('uberprompt', 'uberprompt_format', '[$*$uber] '); - Irssi::settings_add_str ('uberprompt', 'uberprompt_format_empty', '[$*] '); - - Irssi::settings_add_str ('uberprompt', 'uberprompt_load_hook', ''); - Irssi::settings_add_str ('uberprompt', 'uberprompt_unload_hook', ''); - - Irssi::settings_add_bool('uberprompt', 'uberprompt_debug', 0); - Irssi::settings_add_bool('uberprompt', 'uberprompt_autostart', 1); - Irssi::settings_add_bool ('uberprompt', 'uberprompt_restore_on_exit', 1); - - Irssi::settings_add_bool('uberprompt', 'uberprompt_use_replaces', 0); - Irssi::settings_add_bool('uberprompt', 'uberprompt_trim_data', 0); - - Irssi::command_bind("prompt", \&prompt_subcmd_handler); - Irssi::command_bind('prompt on', \&replace_prompt_items); - Irssi::command_bind('prompt off', \&restore_prompt_items); - Irssi::command_bind('prompt set', \&cmd_prompt_set); - Irssi::command_bind('prompt clear', - sub { - Irssi::signal_emit 'change prompt', '$p', 'UP_POST'; - }); - - my $prompt_set_args_format = "inner pre post only"; - Irssi::command_set_options('prompt set', $prompt_set_args_format); - - Irssi::command_bind('help', \&_print_help); - - Irssi::signal_add('setup changed', \&reload_settings); - - # intialise the prompt format. - reload_settings(); - - # make sure we redraw when necessary. - Irssi::signal_add('window changed', \&uberprompt_refresh); - Irssi::signal_add('window name changed', \&uberprompt_refresh); - Irssi::signal_add('window changed automatic', \&uberprompt_refresh); - Irssi::signal_add('window item changed', \&uberprompt_refresh); - Irssi::signal_add('window item server changed', \&uberprompt_refresh); - Irssi::signal_add('window server changed', \&uberprompt_refresh); - Irssi::signal_add('server nick changed', \&uberprompt_refresh); - - Irssi::signal_add('nick mode changed', \&refresh_if_me); - - # install our statusbars if required. - if (Irssi::settings_get_bool('uberprompt_autostart')) { - replace_prompt_items(); - } - - # API signals - - Irssi::signal_register({'change prompt' => [qw/string string/]}); - Irssi::signal_add('change prompt' => \&change_prompt_handler); - - # other scripts (specifically overlay/visual) can subscribe to - # this event to be notified when the prompt changes. - # arguments are new contents (string), new length (int) - Irssi::signal_register({'prompt changed' => [qw/string int/]}); - Irssi::signal_register({'prompt length request' => []}); - - Irssi::signal_add('prompt length request', \&length_request_handler); -} - -sub cmd_prompt_set { - my $args = shift; - my @options_list = Irssi::command_parse_options "prompt set", $args; - if (@options_list) { - my ($options, $rest) = @options_list; - - my @opt_modes = keys %$options; - if (@opt_modes != 1) { - _error '%_/prompt set%_ must specify exactly one mode of' - . ' {-inner, -only, -pre, -post}'; - return; - } - - my $mode = 'UP_' . uc($opt_modes[0]); - - Irssi::signal_emit 'change prompt', $rest, $mode; - } else { - _error ('%_/prompt set%_ must specify a mode {-inner, -only, -pre, -post}'); - } -} - -sub refresh_if_me { - my ($channel, $nick) = @_; - - return unless $channel and $nick; - - my $server = Irssi::active_server; - my $window = Irssi::active_win; - - return unless $server and $window; - - my $my_chan = $window->{active}->{name}; - my $my_nick = $server->parse_special('$N'); - - return unless $my_chan and $my_nick; - - _debug_print "Chan: $channel->{name}, " - . "nick: $nick->{nick}, " - . "me: $my_nick, chan: $my_chan"; - - if ($my_chan eq $channel->{name} and $my_nick eq $nick->{nick}) { - uberprompt_refresh(); - } -} - -sub length_request_handler { - $emit_request = 1; - uberprompt_render_prompt(); - $emit_request = 0; -} - -sub reload_settings { - - $use_replaces = Irssi::settings_get_bool('uberprompt_use_replaces'); - $DEBUG_ENABLED = Irssi::settings_get_bool('uberprompt_debug'); - - $init_callbacks = { - load => Irssi::settings_get_str('uberprompt_load_hook'), - unload => Irssi::settings_get_str('uberprompt_unload_hook'), - }; - - if (DEBUG) { - Irssi::signal_add 'prompt changed', 'debug_prompt_changed'; - } else { - Irssi::signal_remove 'prompt changed', 'debug_prompt_changed'; - } - - my $new = Irssi::settings_get_str('uberprompt_format'); - - if ($prompt_format ne $new) { - _debug_print("Updated prompt format"); - $prompt_format = $new; - $prompt_format =~ s/\$uber/\$\$uber/; - Irssi::abstracts_register(['uberprompt', $prompt_format]); - - $expando_vars = {}; - - # TODO: something clever here to check if we need to schedule - # an update timer or something, rather than just refreshing on - # every possible activity in init() - while ($prompt_format =~ m/(?<!\$)(\$[A-Za-z,.:;][a-z_]*)/g) { - _debug_print("Detected Irssi expando variable $1"); - my $var_name = substr $1, 1; # strip the $ - $expando_vars->{$var_name} = Irssi::parse_special($1); - } - } - - $new = Irssi::settings_get_str('uberprompt_format_empty'); - - if ($prompt_format_empty ne $new) { - _debug_print("Updated prompt format"); - $prompt_format_empty = $new; - $prompt_format_empty =~ s/\$uber/\$\$uber/; - Irssi::abstracts_register(['uberprompt_empty', $prompt_format_empty]); - - $expando_vars = {}; - - # TODO: something clever here to check if we need to schedule - # an update timer or something, rather than just refreshing on - # every possible activity in init() - while ($prompt_format_empty =~ m/(?<!\$)(\$[A-Za-z,.:;][a-z_]*)/g) { - _debug_print("Detected Irssi expando variable $1"); - my $var_name = substr $1, 1; # strip the $ - $expando_vars->{$var_name} = Irssi::parse_special($1); - } - } - - $trim_data = Irssi::settings_get_bool('uberprompt_trim_data'); -} - -sub debug_prompt_changed { - my ($text, $len) = @_; - - $text =~ s/%/%%/g; - - print "DEBUG_HANDLER: Prompt Changed to: \"$text\", length: $len"; -} - -sub change_prompt_handler { - my ($text, $pos) = @_; - - # fix for people who used prompt_info and hence the signal won't - # pass the second argument. - $pos = 'UP_INNER' unless defined $pos; - _debug_print("Got prompt change signal with: $text, $pos"); - - my ($changed_text, $changed_pos); - $changed_text = defined $prompt_data ? $prompt_data ne $text : 1; - $changed_pos = defined $prompt_data_pos ? $prompt_data_pos ne $pos : 1; - - $prompt_data = $text; - $prompt_data_pos = $pos; - - if ($changed_text || $changed_pos) { - _debug_print("Redrawing prompt"); - uberprompt_refresh(); - } -} - -sub _escape_prompt_special { - my $str = shift; - $str =~ s/\$/\$\$/g; - $str =~ s/\\/\\\\/g; - #$str =~ s/%/%%/g; - $str =~ s/{/\${lbrace}/g; - $str =~ s/}/\${rbrace}/g; - - return $str; -} - -sub uberprompt_render_prompt { - - my $window = Irssi::active_win; - my $prompt_arg = ''; - - # default prompt sbar arguments (from config) - if (scalar( () = $window->items )) { - $prompt_arg = '$[.15]{itemname}'; - } else { - $prompt_arg = '${winname}'; - } - - my $prompt = ''; # rendered content of the prompt. - my $theme = Irssi::current_theme; - - my $arg = $use_replaces ? 0 : Irssi::EXPAND_FLAG_IGNORE_REPLACES; - - if ($prompt_data && (!$trim_data || trim($prompt_data))) { - $prompt = $theme->format_expand("{uberprompt $prompt_arg}", $arg); - } - else { - $prompt = $theme->format_expand("{uberprompt_empty $prompt_arg}", $arg); - } - - if ($prompt_data_pos eq 'UP_ONLY') { - $prompt =~ s/\$\$uber//; # no need for recursive prompting, I hope. - - # TODO: only compute this if necessary? - my $prompt_nt = $prompt; - $prompt_nt =~ s/\s+$//; - - my $pdata_copy = $prompt_data; - - $pdata_copy =~ s/\$prompt_nt/$prompt_nt/; - $pdata_copy =~ s/\$prompt/$prompt/; - - $prompt = $pdata_copy; - - } elsif ($prompt_data_pos eq 'UP_INNER' && defined $prompt_data) { - - my $esc = _escape_prompt_special($prompt_data); - $esc = $trim_data ? trim($esc) : $esc; - $prompt =~ s/\$\$uber/$esc/; - - } else { - # remove the $uber marker - $prompt =~ s/\$\$uber//; - - # and add the additional text at the appropriate position. - if ($prompt_data_pos eq 'UP_PRE') { - $prompt = $prompt_data . $prompt; - } elsif ($prompt_data_pos eq 'UP_POST') { - $prompt .= $prompt_data; - } - } - - _debug_print("rendering with: $prompt"); - - - if (($prompt ne $prompt_last) or $emit_request) { - - # _debug_print("Emitting prompt changed signal"); - # my $exp = Irssi::current_theme()->format_expand($text, 0); - my $ps = Irssi::parse_special($prompt); - - Irssi::signal_emit('prompt changed', $ps, length($ps)); - $prompt_last = $prompt; - } - return $prompt; -} - -sub uberprompt_draw { - my ($sb_item, $get_size_only) = @_; - - my $prompt = uberprompt_render_prompt(); - - my $ret = $sb_item->default_handler($get_size_only, $prompt, '', 0); - _debug_print("redrawing with: $prompt"); - return $ret; -} - -sub uberprompt_refresh { - Irssi::statusbar_items_redraw('uberprompt'); -} - -sub replace_prompt_items { - # remove existing ones. - _debug_print("Removing original prompt"); - - _sbar_command('prompt', 'remove', 'prompt'); - _sbar_command('prompt', 'remove', 'prompt_empty'); - - # add the new one. - - _sbar_command('prompt', 'add', 'uberprompt', - qw/-alignment left -before input -priority '-1'/); - - _sbar_command('prompt', 'position', '100'); - - my $load_hook = $init_callbacks->{load}; - if (defined $load_hook and length $load_hook) { - eval { - Irssi::command($load_hook); - }; - if ($@) { - _error("Uberprompt user load-hook command ($load_hook) failed: $@"); - } - } - -} - -sub restore_prompt_items { - - _sbar_command('prompt', 'remove', 'uberprompt'); - - _debug_print("Restoring original prompt"); - - _sbar_command('prompt', 'reset'); - - my $unload_hook = $init_callbacks->{unload}; - - if (defined $unload_hook and length $unload_hook) { - eval { - Irssi::command($unload_hook); - }; - if ($@) { - _error("Uberprompt user unload-hook command ($unload_hook) failed: $@"); - } - } -} - -sub _sbar_command { - my ($bar, $cmd, $item, @args) = @_; - - my $args_str = join ' ', @args; - - $args_str .= ' ' if length $args_str && defined $item; - - my $command = sprintf 'STATUSBAR %s %s %s%s', - $bar, $cmd, $args_str, defined $item ? $item : ''; - - _debug_print("Running command: $command"); - Irssi::command($command); -} - -sub trim { - my $string = shift; - - $string =~ s/^\s*//; - $string =~ s/\s*$//; - - return $string; -} diff --git a/.config/irssi/scripts/autorun/vim_mode.pl b/.config/irssi/scripts/autorun/vim_mode.pl @@ -1,3781 +0,0 @@ -=pod - -=head1 NAME - -vim_mode.pl - -=head1 DESCRIPTION - -An Irssi script to emulate some of the vi(m) features for the Irssi inputline. - -=head1 INSTALLATION - -Copy into your F<~/.irssi/scripts/> directory and load with -C</SCRIPT LOAD vim_mode.pl>. You may wish to have it autoload in one of the -L<usual ways|https://github.com/shabble/irssi-docs/wiki/Guide#Autorunning_Scripts>. - -=head2 DEPENDENCIES - -For proper :ex mode support, vim-mode requires the installation of F<uberprompt.pl> -Uberprompt can be downloaded from: - -L<https://github.com/shabble/irssi-scripts/raw/master/prompt_info/uberprompt.pl> - -and follow the instructions at the top of that file for installation. - -If you don't need Ex-mode, you can run vim_mode.pl without the -uberprompt.pl script, but it is strongly recommended that you use it. - -=head3 Irssi requirements - -0.8.12 and above should work fine. However the following features are -disabled in irssi < 0.8.13: - -=over 4 - -=item * C<j> C<k> (only with count, they work fine without count in older versions) - -=item * C<gg>, C<G> - -=back - -It is intended to work with at Irssi 0.8.12 and later versions. However some -features are disabled in older versions (see below for details). - -Perl >= 5.8.1 is recommended for UTF-8 support (which can be disabled if -necessary). Please report bugs in older versions as well, we'll try to fix -them. Later versions of Perl are also faster, which is probably beneficial -to a script of this size and complexity. - -=head2 SETUP - -Vim Mode provides certain feedback to the user, such as the currently active -mode (command, insert, ex), and if switching buffers, which buffer(s) currently -match the search terms. - -There are two ways to go about displaying this information, as described in -the following sections: - -=head3 Statusbar Items - -Run the following command to add a statusbar item that shows which mode -you're in. - -C</statusbar window add vim_mode> - -And the following to let C<:b [str]> display a list of channels matching your -search string. - -C</statusbar window add vim_windows> - -B<Note:> Remember to C</save> after adding these statusbar items to make them -permanent. - -B<Note:> If you would rather have these statusbar items on your prompt -line rather than thte window statusbar, please follow these steps. - -For technical reasons, I<uberprompt> must occasionally call C</statusbar prompt -reset>, which will remove or deactivate any manually added items on the prompt -statusbar. To get around this, uberprompt provides two command hooks, -C<uberprompt_load_hook> and C<uberprompt_unload_hook>. Both of these settings -can contain one (or more, using C</EVAL>) commands to be executed when the prompt -is enabled and disabled, respectively. - -See the L<uberprompt documentation|https://github.com/shabble/irssi-scripts/blob/master/prompt_info/README.pod> for further details. - -For I<right-aligned> items (that is, after the input field: - -=over 4 - -=item 1 C</alias vm_add /^statusbar prompt add -after input -alignment right vim_mode> - -=item 2 C</alias vm_del /^statusbar prompt remove vim_mode> - -=item 3 C</set uberprompt_load_hook /^vm_add> - -=item 4 C</set uberprompt_unload_hook /^vm_del> - -=back - -For I<left-aligned> items (before the prompt): - -=over 4 - -=item 1 C</alias vm_add /^statusbar prompt add -before prompt -alignment left vim_mode> - -=item 2 C</alias vm_del /^statusbar prompt remove vim_mode> - -=item 3 C</set uberprompt_load_hook /^vm_add> - -=item 4 C</set uberprompt_unload_hook /^vm_del> - -=back - -If you wish to add both C<vim_mode> and C<vim_windows> items, replace steps 1 and 2 -above with the following (right-aligned): - -=over 4 - -=item 1 C</alias vm_add /^eval /^statusbar prompt add -after input -alightment right vim_mode ; /^statusbar prompt add -after input -alignment right vim_windows> - -=item 2 C</alias vm_del /^eval /^statusbar prompt remove vim_mode ; /^statusbar prompt remove vim_windows> - -=back - -and then complete stages 3 and 4 as above. Replace the C<-after> and C<-alignment> -to suit your location preferences. - -B<Note:> It is also possible to place the items between the prompt and input field, -by specifying C<-after prompt> or C<-before input> as appropriate. - -=head3 Expando Variables - -Vim mode augments the existing Irssi expando (automatic variables) with two -additional ones: C<$vim_cmd_mode> and C<$vim_wins>. - -C<$vim_cmd_mode> is the equivalent of the C<vim_mode> statusbar item, and -C<$vim_wins> is the counterpart of C<vim_windows>. - -They can be added to your theme, or inserted into your uberprompt using -a command such as: - -"C</set uberprompt_format [$vim_cmd_mode] $*$uber] >" - -=head3 FILE-BASED CONFIGURATION - -Additionally to the irssi settings described in L<settings|/SETTINGS>, vim_mode -can be configured through an external configuration file named "vim_moderc" -located in F<~/.irssi/vim_moderc>. If available it's loaded on startup and every -supported ex-command is run. Its syntax is similar to "vimrc". To (re)load it -while vim_mode is running use C<:so[urce]>. - -Currently Supported ex-commands: - -=over 4 - -=item * C<:map> - -=back - -=head1 USAGE - -The following section is divided into the different modes as supported by Vim itself: - -=head2 COMMAND MODE - -It supports most commonly used command mode features: - -=over 2 - -=item * Insert/Command mode. - -C<Esc> and C<Ctrl-C> enter command mode. C</set vim_mode_cmd_seq j> allows -to use C<jj> as Escape (any other character can be used as well). - -=item * Cursor motion: - -C<h l 0 ^ $ E<lt>SpaceE<gt> E<lt>BSE<gt> f t F T> - -=item * History motion: - -C<j k gg G> C<gg> moves to the oldest (first) history line. C<G> without a -count moves to the current input line, with a count it goes to the I<count-th> -history line (1 is the oldest). - -=item * Cursor word motion: - -C<w b ge e W gE B E> - -=item * Word objects (only the following work yet): - -C<aw aW> - -=item * Yank and paste: - - C<y p P> - -=item * Change and delete: - -C<c d> - -=item * Delete at cursor: - -C<x X> - -=item * Replace at cursor: - -C<r> - -=item * Insert mode: - -C<i a I A> - -=item * Switch case: - -C<~> - -=item * Repeat change: - -C<.> - -=item * Repeat - -C<ftFT: ; ,> - -=item * Registers: - -C<"a-"z "" "0 "* "+ "_> (black hole) - -=item * Line-wise shortcuts: - -C<dd cc yy> - -=item * Shortcuts: - -C<s S C D> - -=item * Scroll the scrollback buffer: - -C<Ctrl-E Ctrl-D Ctrl-Y Ctrl-U Ctrl-F Ctrl-B> - -=item * Switch to last active window: - -C<Ctrl-6/Ctrl-^> - -=item * Switch split windows: - -<Ctrl-W j Ctrl-W k> - -=item * Undo/Redo: - -C<u Ctrl-R> - -=back - -Counts and combinations work as well, e.g. C<d5fx> or C<3iabcE<lt>escE<gt>>. Counts also work with mapped ex-commands (see below), e.g. if you map C<gb> to do C<:bn>, then C<2gb> will switch to the second next buffer. Repeat also supports counts. - -=head3 REGISTERS - -=over 4 - -=item * Appending to register with C<"A-"Z> - -=item * C<""> is the default yank/delete register. - -=item * C<"0> contains the last yank (if no register was specified). - -=item * The special registers C<"* "+> both contain irssi's internal cut-buffer. - -=back - -=head2 INSERT MODE - -The following insert mode mappings are supported: - -=over 4 - -=item * Insert register content: Ctrl-R x (where x is the register to insert) - -=back - -=head2 EX-MODE - -Ex-mode (activated by C<:> in command mode) supports the following commands: - -=over 4 - -=item * Command History: - -C<E<lt>uparrowE<gt>> - cycle backwards through history - -C<E<lt>downarrowE<gt>> - cycle forwards through history - -C<:eh> - show ex history - -=item * Switching buffers: - -C<:[N]b [N]> - switch to channel number - -C<:b#> - switch to last channel - -C<:b> E<lt>partial-channel-nameE<gt> - -C<:b> <partial-server>/<partial-channel> - -C<:buffer {args}> (same as C<:b>) - -C<:[N]bn[ext] [N]> - switch to next window - -C<:[N]bp[rev] [N]> - switch to previous window - -=item * Close window: - -C<:[N]bd[elete] [N]> - -=item * Display windows: - -C<:ls>, C<:buffers> - -=item * Display registers: - -C<:reg[isters] {args}>, C<:di[splay] {args}> - -=item * Display undolist: - -C<:undol[ist]> (mostly used for debugging) - -=item * Source files: - -C<:so[urce]> - only sources vim_moderc at the moment, - F<{file}> not supported - -=item * Mappings: - -C<:map> - display custom mappings - -=item * Saving mappings: - -C<:mkv[imrc][!]> - like in Vim, but [file] not supported - -=item * Substitution: - -C<:s///> - I<i> and I<g> are supported as flags, only C<///> can be used as -eparator, and it uses Perl regex syntax instead of Vim syntax. - -=item * Settings: - -C<:se[t]> - display all options - -C<:se[t] {option}> - display all matching options - -C<:se[t] {option} {value}> - change option to value - -=back - -=head3 MAPPINGS - -=head4 Commands - -=over 4 - -=item * C<:map {lhs}> - display mappings starting with {lhs} - -=item * C<:map {lhs} {rhs}> - add mapping - -=item * C<:unm[ap] {lhs}> - remove custom mapping - -=back - -=head4 Parameters - -I<{lhs}> is the key combination to be mapped, I<{rhs}> the target. The -C<E<lt>E<gt>> notation is used - -(e.g. C<E<lt>C-FE<gt>> is I<Ctrl-F>), case is ignored. - Supported C<E<lt>E<gt>> keys are: - -=over 4 - -=item * C<E<lt>C-AE<gt>> - C<E<lt>C-ZE<gt>>, - -=item * C<E<lt>C-^E<gt>>, C<E<lt>C-6E<gt>> - -=item * C<E<lt>SpaceE<gt>> - -=item * C<E<lt>CRE<gt>> - Enter - -=item * C<E<lt>BSE<gt>> - Backspace - -=item * C<E<lt>NopE<gt>> - No-op (Do Nothing). - -=back - -Mapping ex-mode and irssi commands is supported. When mapping ex-mode commands -the trailing C<E<lt>CrE<gt>> is not necessary. Only default mappings can be used -in I<{rhs}>. - -Examples: - -=over 4 - -=item * C<:map w W> - to remap w to work like W - -=item * C<:map gb :bnext> - to map gb to call :bnext - -=item * C<:map gB :bprev> - -=item * C<:map g1 :b 1> - to map g1 to switch to buffer 1 - -=item * C<:map gb :b> - to map gb to :b, 1gb switches to buffer 1, 5gb to 5 - -=item * C<:map E<lt>C-LE<gt> /clear> - map Ctrl-L to irssi command /clear - -=item * C<:map E<lt>C-GE<gt> /window goto 1> - -=item * C<:map E<lt>C-EE<gt> <Nop>> - disable E<lt>C-EE<gt>, it does nothing now - -=item * C<:unmap E<lt>C-EE<gt>> - restore default behavior of C<E<lt>C-EE<gt>> -after disabling it - -=back - -Note that you must use C</> for irssi commands (like C</clear>), the current value -of Irssi's cmdchars does B<not> work! This is necessary do differentiate between -ex-commands and irssi commands. - -=head2 SETTINGS - -The settings are stored as irssi settings and can be set using C</set> as usual -(prepend C<vim_mode_> to setting name) or using the C<:set> ex-command. The -following settings are available: - -=over 4 - -=item * utf8 - Support UTF-8 characters, boolean, default on - -=item * debug - Enable debug output, boolean, default off - -=item * cmd_seq - Char that when double-pressed simulates C<E<lt>EscE<gt>>, string, default '' (disabled) - -=item * start_cmd - Start every line in command mode, boolean, default off - -=item * max_undo_lines - Sze of the undo buffer. Integer, default 50 items. - -=item * ex_history_size - Number of items stored in the ex-mode history. Integer, default 100. - -=item * prompt_leading_space - Ddetermines whether ex mode prepends a space to the displayed input. Boolean, default on - -=back - -In contrast to irssi's settings, C<:set> accepts 0 and 1 as values for boolean -settings, but only vim_mode's settings can be set/displayed. - -Examples: - - :set cmd_seq=j # set cmd_seq to j - :set cmd_seq= # disable cmd_seq - :set debug=on # enable debug - :set debug=off # disable debug - -=head1 KNOWN ISSUES - -If you use tmux and want to use <esc> to exit insert mode you might want to -reduce the escape-time for a better experience (500 is the default value): - - set -s escape-time 100 - -A similar problem exist in GNU screen, the following settings in ~/.screenrc -fix it (thanks to jsbronder for reporting the screen issue and fix): - - maptimeout 0 - defc1 off - -defc1 might not be necessary. - -=head1 SUPPORT - -Any behavior different from Vim (unless explicitly documented) should be -considered a bug and reported. - -B<NOTE:> This script is still under heavy development, and there may be bugs. -Please submit reproducible sequences to the bug-tracker at: -L<http://github.com/shabble/irssi-scripts/issues/new> - -or contact rudi_s or shabble on irc.freenode.net (#irssi and #irssi_vim) - -=head1 AUTHORS - -Copyright E<copy> 2010-2011 Tom Feist C<E<lt>shabble+irssi@metavore.orgE<gt>> and - -Copyright E<copy> 2010-2011 Simon Ruderich C<E<lt>simon@ruderich.orgE<gt>> - -=head1 THANKS - -Particular thanks go to - -=over 4 - -=item * estragib: a lot of testing and many bug reports and feature requests - -=item * iaj: testing - -=item * tmr: explaining how various bits of vim work - -=back - -as well as the rest of C<#irssi> and C<#irssi_vim> on Freenode IRC. - -=head1 LICENCE - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -=head1 BUGS - -=over 4 - -=item * - -count before register doesn't work: e.g. 3"ap doesn't work, but "a3p does - -=item * - -mapping an incomplete ex-command doesn't open the ex-mode with the partial -command (e.g. C<:map gb :b> causes an error instead of opening the ex-mode and -displaying C<:bE<lt>cursorE<gt>>) - -=item * - - undo/redo cursor positions are mostly wrong - -=back - -=head1 TODO - -=over 4 - -=item * - -Make sure the input line is empty when entering ex mode. Stuff hanging around -just looks silly. - -=item * - -History: - -=over 4 - -=item * - - C< * /,?,n,N> to search through history (like rl_history_search.pl) - -=back - -=item * - -Window switching (C<:b>) - -=over 4 - -=item * - -Tab completion of window(-item) names - -=item * - -non-sequential matches(?) - -=back - -=back - -See also the TODO file at -L<github|https://github.com/shabble/irssi-scripts/blob/master/vim-mode/TODO> for -many many more things. - -=head2 WONTFIX - -Things we're not ever likely to do: - -=over 4 - -=item * Macros - -=back - -=cut - -use strict; -use warnings; - -use Encode; -use List::Util; - -use Irssi; -use Irssi::TextUI; # for sbar_items_redraw -use Irssi::Irc; # necessary for 0.8.14 - - - -our $VERSION = "1.1.0"; -our %IRSSI = - ( - authors => "Tom Feist (shabble), Simon Ruderich (rudi_s)", - contact => 'shabble+irssi@metavore.org, ' - . 'shabble@#irssi/Freenode, simon@ruderich.org' - . 'rudi_s@#irssi/Freenode', - name => "vim_mode", - description => "Give Irssi Vim-like commands for editing the inputline", - license => "MIT", - changed => "3/2/2012" - ); - - -# CONSTANTS - -# command mode -sub M_CMD () { 1 } -# insert mode -sub M_INS () { 0 } -# extended mode (after a :?) -sub M_EX () { 2 } - -# operator command -sub C_OPERATOR () { 0 } -# normal command, no special handling necessary -sub C_NORMAL () { 1 } -# command taking another key as argument -sub C_NEEDSKEY () { 2 } -# text-object command (i a) -sub C_TEXTOBJECT () { 3 } -# commands entering insert mode -sub C_INSERT () { 4 } -# ex-mode commands -sub C_EX () { 5 } -# irssi commands -sub C_IRSSI () { 6 } -# does nothing -sub C_NOP () { 7 } - -# setting types, match irssi types as they are stored as irssi settings -sub S_BOOL () { 0 } -sub S_INT () { 1 } -sub S_STR () { 2 } -sub S_TIME () { 3 } - -# word and non-word regex, keep in sync with setup_changed()! -my $word = qr/[\w_]/o; -my $non_word = qr/[^\w_\s]/o; - -# COMMANDS - -# All available commands in command mode, they are stored with a char as key, -# but this is not necessarily the key the command is currently mapped to. -my $commands - = { - # operators - c => { char => 'c', func => \&cmd_operator_c, type => C_OPERATOR, - repeatable => 1 }, - d => { char => 'd', func => \&cmd_operator_d, type => C_OPERATOR, - repeatable => 1 }, - y => { char => 'y', func => \&cmd_operator_y, type => C_OPERATOR, - repeatable => 1 }, - - # arrow like movement - h => { char => 'h', func => \&cmd_h, type => C_NORMAL }, - l => { char => 'l', func => \&cmd_l, type => C_NORMAL }, - "\x08" => { char => '<BS>', func => \&cmd_h, type => C_NORMAL }, - "\x7F" => { char => '<BS>', func => \&cmd_h, type => C_NORMAL }, - ' ' => { char => '<Space>', func => \&cmd_l, type => C_NORMAL }, - # history movement - j => { char => 'j', func => \&cmd_j, type => C_NORMAL, - no_operator => 1 }, - k => { char => 'k', func => \&cmd_k, type => C_NORMAL, - no_operator => 1 }, - gg => { char => 'gg', func => \&cmd_gg, type => C_NORMAL, - no_operator => 1 }, - G => { char => 'G', func => \&cmd_G, type => C_NORMAL, - needs_count => 1, no_operator => 1 }, - # char movement, take an additional parameter and use $movement - f => { char => 'f', func => \&cmd_f, type => C_NEEDSKEY, - selection_needs_move_right => 1 }, - t => { char => 't', func => \&cmd_t, type => C_NEEDSKEY, - selection_needs_move_right => 1 }, - F => { char => 'F', func => \&cmd_F, type => C_NEEDSKEY }, - T => { char => 'T', func => \&cmd_T, type => C_NEEDSKEY }, - ';' => { char => ';', func => \&cmd_semicolon, type => C_NORMAL }, - ',' => { char => ',', func => \&cmd_comma, type => C_NORMAL }, - # word movement - w => { char => 'w', func => \&cmd_w, type => C_NORMAL }, - b => { char => 'b', func => \&cmd_b, type => C_NORMAL }, - e => { char => 'e', func => \&cmd_e, type => C_NORMAL, - selection_needs_move_right => 1 }, - ge => { char => 'ge', func => \&cmd_ge, type => C_NORMAL, - selection_needs_move_right => 1 }, - W => { char => 'W', func => \&cmd_W, type => C_NORMAL }, - B => { char => 'B', func => \&cmd_B, type => C_NORMAL }, - E => { char => 'E', func => \&cmd_E, type => C_NORMAL }, - gE => { char => 'gE', func => \&cmd_gE, type => C_NORMAL, - selection_needs_move_right => 1 }, - # text-objects, leading _ means can't be mapped! - _i => { char => 'i', func => \&cmd__i, type => C_TEXTOBJECT }, - _a => { char => 'a', func => \&cmd__a, type => C_TEXTOBJECT }, - # line movement - '0' => { char => '0', func => \&cmd_0, type => C_NORMAL }, - '^' => { char => '^', func => \&cmd_caret, type => C_NORMAL }, - '$' => { char => '$', func => \&cmd_dollar, type => C_NORMAL }, - # delete chars - x => { char => 'x', func => \&cmd_x, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - X => { char => 'X', func => \&cmd_X, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - # C_NORMAL is correct, operator c takes care of insert mode - s => { char => 's', func => \&cmd_s, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - # C_NORMAL is correct, operator c takes care of insert mode - S => { char => 'S', func => \&cmd_S, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - # insert mode - i => { char => 'i', func => \&cmd_i, type => C_INSERT, - repeatable => 1, no_operator => 1 }, - I => { char => 'I', func => \&cmd_I, type => C_INSERT, - repeatable => 1, no_operator => 1 }, - a => { char => 'a', func => \&cmd_a, type => C_INSERT, - repeatable => 1, no_operator => 1 }, - A => { char => 'A', func => \&cmd_A, type => C_INSERT, - repeatable => 1, no_operator => 1 }, - # replace - r => { char => 'r', func => \&cmd_r, type => C_NEEDSKEY, - repeatable => 1, no_operator => 1 }, - # paste - p => { char => 'p', func => \&cmd_p, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - P => { char => 'P', func => \&cmd_P, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - # to end of line - C => { char => 'C', func => \&cmd_C, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - D => { char => 'D', func => \&cmd_D, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - # scrolling - "\x05" => { char => '<C-E>', func => \&cmd_ctrl_d, type => C_NORMAL, - no_operator => 1 }, - "\x04" => { char => '<C-D>', func => \&cmd_ctrl_d, type => C_NORMAL, - needs_count => 1, no_operator => 1 }, - "\x19" => { char => '<C-Y>', func => \&cmd_ctrl_u, type => C_NORMAL, - no_operator => 1 }, - "\x15" => { char => '<C-U>', func => \&cmd_ctrl_u, type => C_NORMAL, - needs_count => 1, no_operator => 1 }, - "\x06" => { char => '<C-F>', func => \&cmd_ctrl_f, type => C_NORMAL, - no_operator => 1 }, - "\x02" => { char => '<C-B>', func => \&cmd_ctrl_b, type => C_NORMAL, - no_operator => 1 }, - # window switching - "\x17j" => { char => '<C-W>j', func => \&cmd_ctrl_wj, type => C_NORMAL, - no_operator => 1 }, - "\x17k" => { char => '<C-W>k', func => \&cmd_ctrl_wk, type => C_NORMAL, - no_operator => 1 }, - "\x1e" => { char => '<C-^>', func => \&cmd_ctrl_6, type => C_NORMAL, - no_operator => 1 }, - # misc - '~' => { char => '~', func => \&cmd_tilde, type => C_NORMAL, - repeatable => 1, no_operator => 1 }, - '"' => { char => '"', func => \&cmd_register, type => C_NEEDSKEY, - no_operator => 1 }, - '.' => { char => '.', type => C_NORMAL, repeatable => 1, - no_operator => 1 }, - ':' => { char => ':', type => C_NORMAL }, - "\n" => { char => '<CR>', type => C_NORMAL }, # return - # undo - 'u' => { char => 'u', func => \&cmd_undo, type => C_NORMAL, - no_operator => 1 }, - "\x12" => { char => '<C-R>', func => \&cmd_redo, type => C_NORMAL, - no_operator => 1 }, - }; - -# All available commands in Ex-Mode. -my $commands_ex - = { - # arrow keys - not actually used, see handle_input_buffer() - # TODO: make these work. - "\e[A" => { char => ':exprev', func => \&ex_history_back, - type => C_EX }, - "\e[B" => { char => ':exnext', func => \&ex_history_fwd, - type => C_EX }, - - # normal Ex mode commands. - eh => { char => ':exhist', func => \&ex_history_show, - type => C_EX }, - s => { char => ':s', func => \&ex_substitute, - type => C_EX }, - bnext => { char => ':bnext', func => \&ex_bnext, - type => C_EX, uses_count => 1 }, - bn => { char => ':bn', func => \&ex_bnext, - type => C_EX, uses_count => 1 }, - bprev => { char => ':bprev', func => \&ex_bprev, - type => C_EX, uses_count => 1 }, - bp => { char => ':bp', func => \&ex_bprev, - type => C_EX, uses_count => 1 }, - bdelete => { char => ':bdelete', func => \&ex_bdelete, - type => C_EX, uses_count => 1 }, - bd => { char => ':bd', func => \&ex_bdelete, - type => C_EX, uses_count => 1 }, - buffer => { char => ':buffer', func => \&ex_buffer, - type => C_EX, uses_count => 1 }, - b => { char => ':b', func => \&ex_buffer, - type => C_EX, uses_count => 1 }, - registers => { char => ':registers', func => \&ex_registers, - type => C_EX }, - reg => { char => ':reg', func => \&ex_registers, - type => C_EX }, - display => { char => ':display', func => \&ex_registers, - type => C_EX }, - di => { char => ':di', func => \&ex_registers, - type => C_EX }, - buffers => { char => ':buffer', func => \&ex_buffers, - type => C_EX }, - ls => { char => ':ls', func => \&ex_buffers, - type => C_EX }, - undolist => { char => ':undolist', func => \&ex_undolist, - type => C_EX }, - undol => { char => ':undol', func => \&ex_undolist, - type => C_EX }, - map => { char => ':map', func => \&ex_map, - type => C_EX }, - unmap => { char => ':unmap', func => \&ex_unmap, - type => C_EX }, - unm => { char => ':unm', func => \&ex_unmap, - type => C_EX }, - source => { char => ':source', func => \&ex_source, - type => C_EX }, - so => { char => ':so', func => \&ex_source, - type => C_EX }, - mkvimrc => { char => ':mkvimrc', func => \&ex_mkvimrc, - type => C_EX }, - mkv => { char => ':mkv', func => \&ex_mkvimrc, - type => C_EX }, - se => { char => ':se', func => \&ex_set, - type => C_EX }, - set => { char => ':set', func => \&ex_set, - type => C_EX }, - itemnext => { char => ':itemnext', func => \&ex_item_next, - type => C_EX }, - inext => { char => ':itemnext', func => \&ex_item_next, - type => C_EX }, - itemprev => { char => ':itemprev', func => \&ex_item_prev, - type => C_EX }, - iprev => { char => ':itemprev', func => \&ex_item_prev, - type => C_EX }, - servernext => { char => ':servernext', func => \&ex_server_next, - type => C_EX }, - snext => { char => ':servernext', func => \&ex_server_next, - type => C_EX }, - serverprev => { char => ':serverprev', func => \&ex_server_prev, - type => C_EX }, - sprev => { char => ':serverprev', func => \&ex_server_prev, - type => C_EX }, - - }; - -# MAPPINGS - -# default command mode mappings -my $maps = {}; - -# current imap still pending (first character entered) -my $imap = undef; - -# maps for insert mode -my $imaps - = { - # CTRL-R, insert register - "\x12" => { map => undef, func => \&insert_ctrl_r }, - }; - - -# GLOBAL VARIABLES - -# all vim_mode settings, must be enabled in vim_mode_init() before usage -my $settings - = { - # print debug output - debug => { type => S_BOOL, value => 0 }, - # use UTF-8 internally for string calculations/manipulations - utf8 => { type => S_BOOL, value => 1 }, - # esc-shortcut in insert mode - cmd_seq => { type => S_STR, value => '' }, - # start every line in command mode - start_cmd => { type => S_BOOL, value => 0 }, - # not used yet - max_undo_lines => { type => S_INT, value => 50 }, - # size of history buffer for Ex mode. - ex_history_size => { type => S_INT, value => 100 }, - # prompt_leading_space - prompt_leading_space => { type => S_BOOL, value => 1 }, - # <Leader> value for prepending to commands. - map_leader => { type => S_STR, value => '\\' }, - # timeout for keys following esc. In milliseconds. - esc_buf_timeout => { type => S_TIME, value => '10ms' }, - - }; - -sub DEBUG { $settings->{debug}->{value} } - -# buffer to keep track of the last N keystrokes, used for Esc detection and -# insert mode mappings -my @input_buf; -my $input_buf_timer; -my $input_buf_enabled = 0; - -# insert mode repeat buffer, used to repeat (.) last insert -my @insert_buf; - -# flag to allow us to emulate keystrokes without re-intercepting them -my $should_ignore = 0; - -# ex mode buffer -my @ex_buf; - -# ex mode history storage. -my @ex_history; -my $ex_history_index = 0; - -# we are waiting for another mapped key (e.g. g pressed, but there are -# multiple mappings like gg gE etc.) -my $pending_map = undef; - -# for commands like 10x -my $numeric_prefix = undef; -# current operator as $command hash -my $operator = undef; -# vi movements, only used when a movement needs more than one key (like f t). -my $movement = undef; -# last vi command, used by . -my $last - = { - 'cmd' => $commands->{i}, # = i to support . when loading the script - 'numeric_prefix' => undef, - 'operator' => undef, - 'movement' => undef, - 'register' => '"', - }; -# last ftFT movement, used by ; and , -my $last_ftFT - = { - type => undef, # f, t, F or T - char => undef, - }; - -# what Vi mode we're in. We start in insert mode. -my $mode = M_INS; - -# current active register -my $register = '"'; - -# vi registers -my $registers - = { - '"' => '', # default register - '0' => '', # yank register - '+' => '', # contains irssi's cut buffer - '*' => '', # same - '_' => '', # black hole register, always empty - }; - -# index into the history list (for j,k) -my $history_index = undef; -# current line, necessary for j,k or the current input line gets destroyed -my $history_input = undef; -# position in input line -my $history_pos = 0; - -# Undo/redo buffer. - -my @undo_buffer; -my $undo_index = undef; - -# tab completion state vars - -my @tab_candidates; -my $completion_active = 0; -my $completion_string = ''; - -sub script_is_loaded { - return exists($Irssi::Script::{shift(@_) . '::'}); -} - - - - -# INSERT MODE COMMANDS - -sub insert_ctrl_r { - my ($key) = @_; - _debug("ctrl-r called"); - my $char = chr($key); - _debug("ctrl-r called with $char"); - - return if not defined $registers->{$char} or $registers->{$char} eq ''; - - my $pos = _insert_at_position($registers->{$char}, 1, _input_pos()); - _input_pos($pos + 1); -} - - -# COMMAND MODE OPERATORS - -sub cmd_operator_c { - my ($old_pos, $new_pos, $move_cmd, $repeat) = @_; - - # Changing a word or WORD doesn't delete the last space before a word, but - # not if we are on that whitespace before the word. - if ($move_cmd and ($move_cmd == $commands->{w} or - $move_cmd == $commands->{W})) { - my $input = _input(); - if ($new_pos - $old_pos > 1 and - substr($input, $new_pos - 1, 1) =~ /\s/) { - $new_pos--; - } - } - - cmd_operator_d($old_pos, $new_pos, $move_cmd, $repeat, 1); - - if (!$repeat) { - _update_mode(M_INS); - } else { - my $pos = _input_pos(); - $pos = _insert_buffer(1, $pos); - _input_pos($pos); - } -} - -sub cmd_operator_d { - my ($old_pos, $new_pos, $move_cmd, $repeat, $change) = @_; - - my ($pos, $length) = _get_pos_and_length($old_pos, $new_pos, $move_cmd); - - # Remove the selected string from the input. - my $input = _input(); - my $string = substr $input, $pos, $length, ''; - if ($register =~ /[A-Z]/) { - $registers->{lc $register} .= $string; - print "Deleted into $register: ", $registers->{lc $register} if DEBUG; - } else { - $registers->{$register} = $string; - print "Deleted into $register: ", $registers->{$register} if DEBUG; - } - _input($input); - - # Prevent moving after the text when we delete the last character. But not - # when changing (C). - $pos-- if $pos == length($input) and !$change; - - _input_pos($pos); -} - -sub cmd_operator_y { - my ($old_pos, $new_pos, $move_cmd, $repeat) = @_; - - my ($pos, $length) = _get_pos_and_length($old_pos, $new_pos, $move_cmd); - - # Extract the selected string and put it in the " register. - my $input = _input(); - my $string = substr $input, $pos, $length; - if ($register =~ /[A-Z]/) { - $registers->{lc $register} .= $string; - print "Yanked into $register: ", $registers->{lc $register} if DEBUG; - } else { - $registers->{$register} = $string; - print "Yanked into $register: ", $registers->{$register} if DEBUG; - if ($register eq '"') { - $registers->{0} = $string; - print "Yanked into 0: ", $registers->{0} if DEBUG; - } - } - - # Always move to the lower position. - if ($old_pos > $new_pos) { - _input_pos($new_pos); - } else { - _input_pos($old_pos); - } -} - -sub _get_pos_and_length { - my ($old_pos, $new_pos, $move_cmd) = @_; - - my $length = $new_pos - $old_pos; - # We need a positive length and $old_pos must be smaller. - if ($length < 0) { - $old_pos = $new_pos; - $length *= -1; - } - - # Some commands don't move one character after the deletion area which is - # necessary for all commands moving to the right. Fix it. - if ($move_cmd->{selection_needs_move_right}) { - $length += 1; - } - - return ($old_pos, $length); -} - -# COMMAND MODE COMMANDS - -sub cmd_h { - my ($count, $pos, $repeat) = @_; - - $pos -= $count; - $pos = 0 if $pos < 0; - return (undef, $pos); -} - -sub cmd_l { - my ($count, $pos, $repeat) = @_; - - my $length = _input_len(); - $pos += $count; - $pos = _fix_input_pos($pos, $length); - return (undef, $pos); -} - -# later history (down) -sub cmd_j { - my ($count, $pos, $repeat) = @_; - - if (Irssi::version < 20090117) { - # simulate a down-arrow - _emulate_keystrokes(0x1b, 0x5b, 0x42); - return (undef, undef); - } - - my @history = Irssi::active_win->get_history_lines(); - - if (defined $history_index) { - $history_index += $count; - print "History Index: $history_index" if DEBUG; - # Prevent destroying the current input when pressing j after entering - # command mode. Not exactly like in default irssi, but simplest solution - # (and S can be used to clear the input line fast, which is what <down> - # does in plain irssi). - } else { - return (undef, undef); - } - - if ($history_index > $#history) { - # Restore the input line. - _input($history_input); - _input_pos($history_pos); - $history_index = $#history + 1; - } elsif ($history_index >= 0) { - my $history = $history[$history_index]; - # History is not in UTF-8! - if ($settings->{utf8}->{value}) { - $history = decode_utf8($history); - } - _input($history); - _input_pos(0); - } - return (undef, undef); -} - -# earlier history (up) -sub cmd_k { - my ($count, $pos, $repeat) = @_; - - if (Irssi::version < 20090117) { - # simulate an up-arrow - _emulate_keystrokes(0x1b, 0x5b, 0x41); - return (undef, undef); - } - - my @history = Irssi::active_win->get_history_lines(); - - if (defined $history_index) { - $history_index -= $count; - $history_index = 0 if $history_index < 0; - } else { - $history_index = $#history; - $history_input = _input(); - $history_pos = _input_pos(); - } - print "History Index: $history_index" if DEBUG; - if ($history_index >= 0) { - my $history = $history[$history_index]; - # History is not in UTF-8! - if ($settings->{utf8}->{value}) { - $history = decode_utf8($history); - } - _input($history); - _input_pos(0); - } - return (undef, undef); -} - -sub cmd_G { - my ($count, $pos, $repeat) = @_; - - if (Irssi::version < 20090117) { - _warn("G and gg not supported in irssi < 0.8.13"); - return; - } - - my @history = Irssi::active_win->get_history_lines(); - - # Go to the current input line if no count was given or it's too big. - if (not $count or $count - 1 >= scalar @history) { - if (defined $history_input and defined $history_pos) { - _input($history_input); - _input_pos($history_pos); - $history_index = undef; - } - return; - } else { - # Save input line so it doesn't get lost. - if (not defined $history_index) { - $history_input = _input(); - $history_pos = _input_pos(); - } - $history_index = $count - 1; - } - - my $history = $history[$history_index]; - # History is not in UTF-8! - if ($settings->{utf8}->{value}) { - $history = decode_utf8($history); - } - _input($history); - _input_pos(0); - - return (undef, undef); -} - -sub cmd_gg { - my ($count, $pos, $repeat) = @_; - - return cmd_G(1, $pos, $repeat); -} - -sub cmd_f { - my ($count, $pos, $repeat, $char) = @_; - - $pos = _next_occurrence(_input(), $char, $count, $pos); - - $last_ftFT = { type => 'f', char => $char }; - return (undef, $pos); -} - -sub cmd_t { - my ($count, $pos, $repeat, $char) = @_; - - $pos = _next_occurrence(_input(), $char, $count, $pos); - if (defined $pos) { - $pos--; - } - - $last_ftFT = { type => 't', char => $char }; - return (undef, $pos); -} - -sub cmd_F { - my ($count, $pos, $repeat, $char) = @_; - - my $input = reverse _input(); - $pos = _next_occurrence($input, $char, $count, length($input) - $pos - 1); - if (defined $pos) { - $pos = length($input) - $pos - 1; - } - - $last_ftFT = { type => 'F', char => $char }; - return (undef, $pos); -} - -sub cmd_T { - my ($count, $pos, $repeat, $char) = @_; - - my $input = reverse _input(); - $pos = _next_occurrence($input, $char, $count, length($input) - $pos - 1); - if (defined $pos) { - $pos = length($input) - $pos - 1 + 1; - } - - $last_ftFT = { type => 'T', char => $char }; - return (undef, $pos); -} - -# Find $count-th next occurrence of $char. -sub _next_occurrence { - my ($input, $char, $count, $pos) = @_; - - while ($count-- > 0) { - $pos = index $input, $char, $pos + 1; - if ($pos == -1) { - return undef; - } - } - return $pos; -} - -sub cmd_semicolon { - my ($count, $pos, $repeat) = @_; - - return (undef, undef) if not defined $last_ftFT->{type}; - - (undef, $pos) - = $commands->{$last_ftFT->{type}} - ->{func}($count, $pos, $repeat, $last_ftFT->{char}); - return (undef, $pos); -} - -sub cmd_comma { - my ($count, $pos, $repeat) = @_; - - return (undef, undef) if not defined $last_ftFT->{type}; - - # Change direction. - my $save = $last_ftFT->{type}; - my $type = $save; - $type =~ tr/ftFT/FTft/; - - (undef, $pos) - = $commands->{$type} - ->{func}($count, $pos, $repeat, $last_ftFT->{char}); - # Restore type as the move functions overwrites it. - $last_ftFT->{type} = $save; - return (undef, $pos); -} - -sub cmd_w { - my ($count, $pos, $repeat) = @_; - - my $input = _input(); - $pos = _beginning_of_word($input, $count, $pos); - $pos = _fix_input_pos($pos, length $input); - return (undef, $pos); -} - -sub cmd_b { - my ($count, $pos, $repeat) = @_; - - my $input = reverse _input(); - $pos = length($input) - $pos - 1; - $pos = 0 if ($pos < 0); - - $pos = _end_of_word($input, $count, $pos); - $pos = length($input) - $pos - 1; - $pos = 0 if ($pos < 0); - return (undef, $pos); -} - -sub cmd_e { - my ($count, $pos, $repeat) = @_; - - my $input = _input(); - $pos = _end_of_word($input, $count, $pos); - $pos = _fix_input_pos($pos, length $input); - return (undef, $pos); -} - -sub cmd_ge { - my ($count, $pos, $repeat, $char) = @_; - - my $input = reverse _input(); - $pos = length($input) - $pos - 1; - $pos = 0 if ($pos < 0); - - $pos = _beginning_of_word($input, $count, $pos); - $pos = length($input) - $pos - 1; - $pos = 0 if ($pos < 0); - - return (undef, $pos); -} - -# Go to the beginning of $count-th word, like vi's w. -sub _beginning_of_word { - my ($input, $count, $pos) = @_; - - while ($count-- > 0) { - # Go to end of next word/non-word. - if (substr($input, $pos) =~ /^$word+/ or - substr($input, $pos) =~ /^$non_word+/) { - $pos += $+[0]; - } - # And skip over any whitespace if necessary. This also happens when - # we're inside whitespace. - if (substr($input, $pos) =~ /^\s+/) { - $pos += $+[0]; - } - } - - return $pos; -} - -# Go to the end of $count-th word, like vi's e. -sub _end_of_word { - my ($input, $count, $pos) = @_; - - while ($count-- > 0 and length($input) > $pos) { - my $skipped = 0; - # Skip over whitespace if in the middle of it or directly after the - # current word/non-word. - if (substr($input, $pos + 1) =~ /^\s+/) { - $pos += $+[0] + 1; - $skipped = 1; - } - elsif (substr($input, $pos) =~ /^\s+/) { - $pos += $+[0]; - $skipped = 1; - } - # We are inside a word/non-word, skip to the end of it. - if (substr($input, $pos) =~ /^$word{2,}/ or - substr($input, $pos) =~ /^$non_word{2,}/) { - $pos += $+[0] - 1; - # We are the border of word/non-word. Skip to the end of the next one. - # But not if we've already jumped over whitespace because there could - # be only one word/non-word char after the whitespace. - } elsif (!$skipped and (substr($input, $pos) =~ /^$word($non_word+)/ or - substr($input, $pos) =~ /^$non_word($word+)/)) { - $pos += $+[0] - 1; - } - } - - # Necessary for correct deletion at the end of the line. - if (length $input == $pos + 1) { - $pos++; - } - - return $pos; -} - -sub cmd_W { - my ($count, $pos, $repeat) = @_; - - my $input = _input(); - $pos = _beginning_of_WORD($input, $count, $pos); - $pos = _fix_input_pos($pos, length $input); - return (undef, $pos); -} - -sub cmd_B { - my ($count, $pos, $repeat) = @_; - - my $input = reverse _input(); - $pos = _end_of_WORD($input, $count, length($input) - $pos - 1); - if ($pos == -1) { - return cmd_0(); - } else { - return (undef, length($input) - $pos - 1); - } -} - -sub cmd_E { - my ($count, $pos, $repeat) = @_; - - $pos = _end_of_WORD(_input(), $count, $pos); - if ($pos == -1) { - return cmd_dollar(); - } else { - return (undef, $pos); - } -} - -sub cmd_gE { - my ($count, $pos, $repeat, $char) = @_; - - my $input = reverse _input(); - $pos = _beginning_of_WORD($input, $count, length($input) - $pos - 1); - if ($pos == -1 or length($input) - $pos - 1 == -1) { - return cmd_0(); - } else { - $pos = length($input) - $pos - 1; - } - - return (undef, $pos); -} - -# Go to beginning of $count-th WORD, like vi's W. -sub _beginning_of_WORD { - my ($input, $count, $pos) = @_; - - # Necessary for correct movement between two words with only one - # whitespace. - if (substr($input, $pos) =~ /^\s\S/) { - $pos++; - $count--; - } - - while ($count-- > 0 and length($input) > $pos) { - if (substr($input, $pos + 1) !~ /\s+/) { - return length($input); - } - $pos += $+[0] + 1; - } - - return $pos; -} - -# Go to end of $count-th WORD, like vi's E. -sub _end_of_WORD { - my ($input, $count, $pos) = @_; - - return $pos if $pos >= length($input); - - # We are inside a WORD, skip to the end of it. - if (substr($input, $pos + 1) =~ /^\S+(\s)/) { - $pos += $-[1]; - $count--; - } - - while ($count-- > 0) { - if (substr($input, $pos) !~ /\s+\S+(\s+)/) { - return -1; - } - $pos += $-[1] - 1; - } - return $pos; -} - -sub cmd__i { - my ($count, $pos, $repeat, $char) = @_; - - _warn("i_ not implemented yet"); - return (undef, undef); -} - -sub cmd__a { - my ($count, $pos, $repeat, $char) = @_; - - my $cur_pos; - my $input = _input(); - - # aw and aW - if ($char eq 'w' or $char eq 'W') { - while ($count-- > 0 and length($input) > $pos) { - if (substr($input, $pos, 1) =~ /\s/) { - # Any whitespace before the word/WORD must be removed. - if (not defined $cur_pos) { - $cur_pos = _find_regex_before($input, '\S', $pos, 0); - if ($cur_pos < 0) { - $cur_pos = 0; - } else { - $cur_pos++; - } - } - # Move before the word/WORD. - if (substr($input, $pos + 1) =~ /^\s+/) { - $pos += $+[0]; - } - # And delete the word. - if ($char eq 'w') { - if (substr($input, $pos) =~ /^\s($word+|$non_word+)/) { - $pos += $+[0]; - } else { - $pos = length($input); - } - # WORD - } else { - if (substr($input, $pos + 1) =~ /\s/) { - $pos += $-[0] + 1; - } else { - $pos = length($input); - } - } - - # word - } elsif ($char eq 'w') { - # Start at the beginning of this WORD. - if (not defined $cur_pos and $pos > 0 - and substr($input, $pos - 1, 2) - !~ /(\s.|$word$non_word|$non_word$word)/) { - - $cur_pos = _find_regex_before - ( - $input, - "^($word+$non_word|$non_word+$word|$word+\\s|$non_word+\\s)", - $pos, 1 - ); - - if ($cur_pos < 0) { - $cur_pos = 0; - } else { - $cur_pos += 2; - } - } - # Delete to the end of the word. - if (substr($input, $pos) =~ - /^($word+$non_word|$non_word+$word|$word+\s+\S|$non_word+\s+\S)/) { - - $pos += $+[0] - 1; - } else { - $pos = length($input); - # If we are at the end of the line, whitespace before - # the word is also deleted. - my $new_pos = _find_regex_before - ($input, - "^($word+\\s+|$non_word+\\s+)", - $pos, 1); - - if ($new_pos != -1 and - (not defined $cur_pos or - $cur_pos > $new_pos + 1)) { - - $cur_pos = $new_pos + 1; - } - } - - # WORD - } else { - # Start at the beginning of this WORD. - if (not defined $cur_pos and $pos > 0 and - substr($input, $pos - 1, 1) !~ /\s/) { - $cur_pos = _find_regex_before($input, '\s', $pos - 1, 0); - if ($cur_pos < 0) { - $cur_pos = 0; - } else { - $cur_pos++; - } - } - # Delete to the end of the word. - if (substr($input, $pos + 1) =~ /^\S*\s+\S/) { - $pos += $+[0]; - } else { - $pos = length($input); - # If we are at the end of the line, whitespace before - # the WORD is also deleted. - my $new_pos = _find_regex_before($input, '\s+', $pos, 1); - if (not defined $cur_pos or $cur_pos > $new_pos + 1) { - $cur_pos = $new_pos + 1; - } - } - } - } - } - - return ($cur_pos, $pos); -} - -# Find regex as close as possible before the current position. If $end is true -# the end of the match is returned, otherwise the beginning. -sub _find_regex_before { - my ($input, $regex, $pos, $end) = @_; - - $input = reverse $input; - $pos = length($input) - $pos - 1; - $pos = 0 if $pos < 0; - - if (substr($input, $pos) =~ /$regex/) { - if (!$end) { - $pos += $-[0]; - } else { - $pos += $+[0]; - } - return length($input) - $pos - 1; - } else { - return -1; - } -} - -sub cmd_0 { - return (undef, 0); -} - -sub cmd_caret { - my $input = _input(); - my $pos; - # No whitespace at all. - if ($input !~ m/^\s/) { - $pos = 0; - # Some non-whitespace, go to first one. - } elsif ($input =~ m/[^\s]/) { - $pos = $-[0]; - # Only whitespace, go to the end. - } else { - $pos = _fix_input_pos(length $input, length $input); - } - return (undef, $pos); -} - -sub cmd_dollar { - my $length = _input_len(); - return (undef, _fix_input_pos($length, $length)); -} - -sub cmd_x { - my ($count, $pos, $repeat) = @_; - - cmd_operator_d($pos, $pos + $count, $commands->{x}, $repeat); - return (undef, undef); -} - -sub cmd_X { - my ($count, $pos, $repeat) = @_; - - return (undef, undef) if $pos == 0; - - my $new = $pos - $count; - $new = 0 if $new < 0; - cmd_operator_d($pos, $new, $commands->{X}, $repeat); - return (undef, undef); -} - -sub cmd_s { - my ($count, $pos, $repeat) = @_; - - $operator = $commands->{c}; - return (undef, $pos + $count); -} - -sub cmd_S { - my ($count, $pos, $repeat) = @_; - - $operator = $commands->{c}; - return (0, _input_len()); -} - -sub cmd_i { - my ($count, $pos, $repeat) = @_; - - if (!$repeat) { - _update_mode(M_INS); - } else { - $pos = _insert_buffer($count, $pos); - } - return (undef, $pos); -} - -sub cmd_I { - my ($count, $pos, $repeat) = @_; - - $pos = cmd_caret(); - if (!$repeat) { - _update_mode(M_INS); - } else { - $pos = _insert_buffer($count, $pos); - } - return (undef, $pos); -} - -sub cmd_a { - my ($count, $pos, $repeat) = @_; - - # Move after current character. Can't use cmd_l() because we need to mover - # after last character at the end of the line. - my $length = _input_len(); - $pos += 1; - $pos = $length if $pos > $length; - - if (!$repeat) { - _update_mode(M_INS); - } else { - $pos = _insert_buffer($count, $pos); - } - return (undef, $pos); -} - -sub cmd_A { - my ($count, $pos, $repeat) = @_; - - $pos = _input_len(); - - if (!$repeat) { - _update_mode(M_INS); - } else { - $pos = _insert_buffer($count, $pos); - } - return (undef, $pos); -} - -# Add @insert_buf to _input() at the given position. -sub _insert_buffer { - my ($count, $pos) = @_; - return _insert_at_position(join('', @insert_buf), $count, $pos); -} - -sub _insert_at_position { - my ($string, $count, $pos) = @_; - - $string = $string x $count; - - my $input = _input(); - # Check if we are not at the end of the line to prevent substr outside of - # string error. - if (length $input > $pos) { - substr($input, $pos, 0) = $string; - } else { - $input .= $string; - } - _input($input); - - return $pos - 1 + length $string; -} - -sub cmd_r { - my ($count, $pos, $repeat, $char) = @_; - - my $input = _input(); - - # Abort if at end of the line. - return (undef, undef) if length($input) < $pos + $count; - - substr $input, $pos, $count, $char x $count; - _input($input); - return (undef, $pos + $count - 1); -} - -sub cmd_p { - my ($count, $pos, $repeat) = @_; - $pos = _paste_at_position($count, $pos + 1); - return (undef, $pos); -} - -sub cmd_P { - my ($count, $pos, $repeat) = @_; - $pos = _paste_at_position($count, $pos); - return (undef, $pos); -} - -sub _paste_at_position { - my ($count, $pos) = @_; - - return if $registers->{$register} eq ''; - return _insert_at_position($registers->{$register}, $count, $pos); -} - -sub cmd_C { - my ($count, $pos, $repeat) = @_; - - $operator = $commands->{c}; - return (undef, _input_len()); -} - -sub cmd_D { - my ($count, $pos, $repeat) = @_; - - $operator = $commands->{d}; - return (undef, _input_len()); -} - -sub cmd_ctrl_d { - my ($count, $pos, $repeat) = @_; - - my $window = Irssi::active_win(); - # no count = half of screen - if (not defined $count) { - $count = $window->{height} / 2; - } - $window->view()->scroll($count); - - Irssi::statusbar_items_redraw('more'); - return (undef, undef); -} - -sub cmd_ctrl_u { - my ($count, $pos, $repeat) = @_; - - my $window = Irssi::active_win(); - # no count = half of screen - if (not defined $count) { - $count = $window->{height} / 2; - } - $window->view()->scroll($count * -1); - - Irssi::statusbar_items_redraw('more'); - return (undef, undef); -} - -sub cmd_ctrl_f { - my ($count, $pos, $repeat) = @_; - - my $window = Irssi::active_win(); - $window->view()->scroll($count * $window->{height}); - - Irssi::statusbar_items_redraw('more'); - return (undef, undef); -} - -sub cmd_ctrl_b { - my ($count, $pos, $repeat) = @_; - - return cmd_ctrl_f($count * -1, $pos, $repeat); -} - -sub cmd_ctrl_wj { - my ($count, $pos, $repeat) = @_; - - while ($count-- > 0) { - Irssi::command('window down'); - } - - return (undef, undef); -} - -sub cmd_ctrl_wk { - my ($count, $pos, $repeat) = @_; - - while ($count-- > 0) { - Irssi::command('window up'); - } - - return (undef, undef); -} - -sub cmd_ctrl_6 { - # like :b# - Irssi::command('window last'); - return (undef, undef); -} - -sub cmd_tilde { - my ($count, $pos, $repeat) = @_; - - my $input = _input(); - my $string = substr $input, $pos, $count; - $string =~ s/(.)/(uc($1) eq $1) ? lc($1) : uc($1)/ge; - substr $input, $pos, $count, $string; - - _input($input); - return (undef, _fix_input_pos($pos + $count, length $input)); -} - -sub cmd_register { - my ($count, $pos, $repeat, $char) = @_; - - if (not exists $registers->{$char} and not exists $registers->{lc $char}) { - print "Wrong register $char, ignoring." if DEBUG; - return (undef, undef); - } - - # make sure black hole register is always empty - if ($char eq '_') { - $registers->{_} = ''; - } - - # + and * contain both irssi's cut-buffer - if ($char eq '+' or $char eq '*') { - $registers->{'+'} = Irssi::parse_special('$U'); - $registers->{'*'} = $registers->{'+'}; - } - - $register = $char; - print "Changing register to $register" if DEBUG; - return (undef, undef); -} - -sub cmd_undo { - print "Undo!" if DEBUG; - - if ($undo_index != $#undo_buffer) { - $undo_index++; - _restore_undo_entry($undo_index); - print "Undoing entry index: $undo_index of " . scalar(@undo_buffer) - if DEBUG; - } else { - print "No further undo." if DEBUG; - } - return (undef, undef); -} - -sub cmd_redo { - print "Redo!" if DEBUG; - - if ($undo_index != 0) { - $undo_index--; - print "Undoing entry index: $undo_index of " . scalar(@undo_buffer) - if DEBUG; - _restore_undo_entry($undo_index); - } else { - print "No further Redo." if DEBUG; - } - return (undef, undef); -} - -# Adapt the input position depending if an operator is active or not. -sub _fix_input_pos { - my ($pos, $length) = @_; - - # Allow moving past the last character when an operator is active to allow - # correct handling of last character in line. - if ($operator) { - $pos = $length if $pos > $length; - # Otherwise forbid it. - } else { - $pos = $length - 1 if $pos > $length - 1; - } - - return $pos; -} - - -# EX MODE COMMANDS - -sub cmd_ex_command { - my $arg_str = join '', @ex_buf; - - if ($arg_str !~ /^(\d*)?([a-z]+)/) { - return _warn("Invalid Ex-mode command!"); - } - - # Abort if command doesn't exist or used with count for unsupported - # commands. - if (not exists $commands_ex->{$2} or - ($1 ne '' and not $commands_ex->{$2}->{uses_count})) { - return _warn("Ex-mode $1$2 doesn't exist!"); - } - - # add this item to the ex mode history - ex_history_add($arg_str); - $ex_history_index = 0; # and reset the history position. - - my $count = $1; - if ($count eq '') { - $count = undef; - } - $commands_ex->{$2}->{func}($arg_str, $count); -} - -sub ex_substitute { - my ($arg_str, $count) = @_; - - # :s/// - if ($arg_str =~ m|^s/(.+)/(.*)/([ig]*)|) { - my ($search, $replace, $flags) = ($1, $2, $3); - print "Searching for $search, replace: $replace, flags; $flags" - if DEBUG; - - my $rep_fun = sub { $replace }; - - my $line = _input(); - my @re_flags = split '', defined $flags?$flags:''; - - if (scalar grep { $_ eq 'i' } @re_flags) { - $search = '(?i)' . $search; - } - - print "Search is $search" if DEBUG; - - my $re_pattern = qr/$search/; - - if (scalar grep { $_ eq 'g' } @re_flags) { - $line =~ s/$re_pattern/$rep_fun->()/eg; - } else { - print "Single replace: $replace" if DEBUG; - $line =~ s/$re_pattern/$rep_fun->()/e; - } - - print "New line is: $line" if DEBUG; - _input($line); - } else { - _warn_ex('s'); - } -} - -sub ex_bnext { - my ($arg_str, $count) = @_; - - if (not defined $count) { - if ($arg_str =~ /^bn(?:ext)?\s(\d+)$/) { - $count = $1; - } else { - $count = 1; - } - } - - while ($count-- > 0) { - Irssi::command('window next'); - } -} - -sub ex_bprev { - my ($arg_str, $count) = @_; - - if (not defined $count) { - if ($arg_str =~ /^bp(?:rev)?\s(\d+)$/) { - $count = $1; - } else { - $count = 1; - } - } - - while ($count-- > 0) { - Irssi::command('window previous'); - } -} - -sub ex_bdelete { - my ($arg_str, $count) = @_; - - if (not defined $count) { - if ($arg_str =~ /^bd(?:elete)?\s(\d+)$/) { - $count = $1; - } - } - - if (defined $count) { - my $window = Irssi::window_find_refnum($count); - if (not $window) { - return; - } - $window->set_active(); - } - Irssi::command('window close'); -} - -sub ex_buffer { - my ($arg_str, $count) = @_; - - # :b[buffer] {args} - if ($arg_str =~ m|^b(?:uffer)?\s*(.+)$| or defined $count) { - my $window; - my $item; - my $buffer = $1; - - # :[N]:b[uffer] - if (defined $count) { - $window = Irssi::window_find_refnum($count); - # Go to window number. - } elsif ($buffer =~ /^[0-9]+$/) { - $window = Irssi::window_find_refnum($buffer); - # Go to previous window. - } elsif ($buffer eq '#') { - Irssi::command('window last'); - # Go to best regex matching window. - } else { - eval { - my $matches = _matching_windows($buffer); - if (scalar @$matches > 0) { - $window = @$matches[0]->{window}; - $item = @$matches[0]->{item}; - } - }; - # Catch errors in /$buffer/ regex. - if ($@) { - _warn($@); - } - } - - if ($window) { - $window->set_active(); - if ($item) { - $item->set_active(); - } - } - } else { - _warn_ex('buffer'); - } -} - -sub ex_item_next { - my ($arg_str, $count) = @_; - my $win = Irssi::active_win; - $count = 1 unless defined $count; - - $win->item_next for (1..$count); -} - -sub ex_item_prev { - my ($arg_str, $count) = @_; - my $win = Irssi::active_win; - $count = 1 unless defined $count; - - $win->item_prev for (1..$count); -} - -# TODO: factor out the shared search code for server next/prev. -sub ex_server_next { - my ($arg_str, $count) = @_; - - my @server_ids = map { $_->{tag} . "\x1d" . $_->{nick} } Irssi::servers; - my $server = Irssi::active_server; - - return unless $server; - - my $current_id = $server->{tag} . "\x1d" . $server->{nick}; - my $next = 0; - my $server_count = scalar @server_ids; - for my $i (0..$server_count - 1) { - my $s_id = $server_ids[$i]; - if (defined($s_id) and ($s_id eq $current_id)) { - print "Found match at $i" if DEBUG; - $next = ($i + 1) % $server_count; - last; - } - } - - my $next_server = $server_ids[$next]; - $next_server =~ s|^([^\x1d]+)\x1d.*$|$1|; - - print "Changing to server: $next: $next_server" if DEBUG; - Irssi::command("window server $next_server"); -} - -sub ex_server_prev { - my ($arg_str, $count) = @_; - - my @server_ids = map { $_->{tag} . "\x1d" . $_->{nick} } Irssi::servers; - my $server = Irssi::active_server; - - return unless $server; - - my $current_id = $server->{tag} . "\x1d" . $server->{nick}; - my $prev = 0; - my $server_count = scalar @server_ids; - - for my $i (0..$server_count - 1) { - my $s_id = $server_ids[$i]; - if (defined($s_id) and ($s_id eq $current_id)) { - print "Found match at $i" if DEBUG; - $prev = ($i - 1) % $server_count; - last; - } - } - - my $prev_server = $server_ids[$prev]; - $prev_server =~ s|^([^\x1d]+)\x1d.*$|$1|; - - print "Changing to server: $prev: $prev_server" if DEBUG; - Irssi::command("window server $prev_server"); - -} - -sub ex_registers { - my ($arg_str, $count) = @_; - - # :reg[isters] {arg} and :di[splay] {arg} - if ($arg_str =~ /^(?:reg(?:isters)?|di(?:splay)?)(?:\s+(.+)$)?/) { - my @regs; - if ($1) { - my $regs = $1; - $regs =~ s/\s+//g; - @regs = split //, $regs; - } else { - @regs = keys %$registers; - } - - # Update "+ and "* registers so correct values are displayed. - $registers->{'+'} = Irssi::parse_special('$U'); - $registers->{'*'} = $registers->{'+'}; - - my @empty_regs; - my $special_regs = { '+' => 1, '*' => 1, '_' => 1, '"' => 1, '0' => 1 }; - - my $active_window = Irssi::active_win; - foreach my $key (sort @regs) { - next if $key eq '_'; # skip black hole - if (defined $registers->{$key}) { - my $register_val = $registers->{$key}; - if (length $register_val or exists $special_regs->{$key}) { - $register_val =~ s/%/%%/g; - $active_window->print("register $key: $register_val"); - } else { - push @empty_regs, $key; - } - } - } - - # coalesce empty registers into a single line. - if (@empty_regs) { - my @runs; - my $run_start; - foreach my $i (0..$#empty_regs) { - my $cur = $empty_regs[$i]; - my $next = $empty_regs[$i+1]; - - $run_start = $cur unless $run_start; - if (defined $next and ord($cur) + 1 == ord($next)) { - # extend range. - } else { - # terminate range and restart - my $run_str = $run_start; - - if ($cur ne $run_start) { - $run_str .= "-$cur"; - } - push @runs, $run_str; - $run_start = undef; - } - } - $active_window->print("Empty registers: " . join(', ', @runs)); - } - } else { - _warn_ex(':registers'); - } -} - -sub ex_buffers { - my ($arg_str, $count) = @_; - - Irssi::command('window list'); -} - -sub ex_undolist { - my ($arg_str, $count) = @_; - - _print_undo_buffer(); -} - -sub ex_map { - my ($arg_str, $count) = @_; - - # :map {lhs} {rhs} - if ($arg_str =~ /^map (\S+) (\S.*)$/) { - my $lhs = _parse_mapping($1); - my $rhs = $2; - - if (not defined $lhs) { - return _warn_ex('map', 'invalid {lhs}'); - } - - # Add new mapping. - my $command; - # Ex-mode command - if (index($rhs, ':') == 0) { - $rhs =~ /^:(\S+)(\s.+)?$/; - if (not exists $commands_ex->{$1}) { - return _warn_ex('map', "$rhs not found"); - } else { - $command = { char => $rhs, - func => $commands_ex->{$1}->{func}, - type => C_EX, - }; - } - # Irssi command - } elsif (index($rhs, '/') == 0) { - $command = { char => $rhs, - func => substr($rhs, 1), - type => C_IRSSI, - }; - # <Nop> does nothing - } elsif (lc $rhs eq '<nop>') { - $command = { char => '<Nop>', - func => undef, - type => C_NOP, - }; - # command-mode command - } else { - $rhs = _parse_mapping($2); - if (not defined $rhs) { - return _warn_ex('map', 'invalid {rhs}'); - } elsif (not exists $commands->{$rhs}) { - return _warn_ex('map', "$2 not found"); - } else { - $command = $commands->{$rhs}; - } - } - add_map($lhs, $command); - - # :map [lhs] - } elsif ($arg_str =~ m/^map\s*$/ or $arg_str =~ m/^map (\S+)$/) { - # Necessary for case insensitive matchings. lc alone won't work. - my $search = $1; - $search = '' if not defined $search; - $search = _parse_mapping_reverse(_parse_mapping($search)); - - my $active_window = Irssi::active_win(); - foreach my $key (sort keys %$maps) { - my $map = $maps->{$key}; - my $cmd = $map->{cmd}; - if (defined $cmd) { - next if $map->{char} eq $cmd->{char}; # skip default mappings - # FIXME: Hack so <C-H> doesn't show up as mapped to <BS>. - next if $map->{char} eq '<C-H>' and $cmd->{char} eq '<BS>'; - next if $map->{char} !~ /^\Q$search\E/; # skip non-matches - $active_window->print(sprintf "%-15s %s", $map->{char}, - $cmd->{char}); - } - } - } else { - _warn_ex('map'); - } -} -sub ex_unmap { - my ($arg_str, $count) = @_; - - # :unm[ap] {lhs} - if ($arg_str !~ /^unm(?:ap)? (\S+)$/) { - return _warn_ex('unmap'); - } - - my $lhs = _parse_mapping($1); - if (not defined $lhs) { - return _warn_ex('unmap', 'invalid {lhs}'); - # Prevent unmapping of unknown or default mappings. - } elsif (not exists $maps->{$lhs} or not defined $maps->{$lhs}->{cmd} or - ($commands->{$lhs} and $maps->{$lhs}->{cmd} == $commands->{$lhs})) { - return _warn_ex('unmap', "$1 not found"); - } - - delete_map($lhs); -} -sub _parse_mapping { - my ($string) = @_; - - $string =~ s/<([^>]+)>/_parse_mapping_bracket($1)/ge; - _debug("Parse mapping: $string"); - if (index($string, '<invalid>') != -1) { - return undef; - } - return $string; -} -sub _parse_mapping_bracket { - my ($string) = @_; - - $string = lc $string; - - # <C-X>, get corresponding CTRL char. - if ($string =~ /^c-([a-z])$/i) { - $string = chr(ord($1) - 96); - # <C-6> and <C-^> - } elsif ($string =~ /^c-[6^]$/i) { - $string = chr(30); - # <Space> - } elsif ($string eq 'space') { - $string = ' '; - # <CR> - } elsif ($string eq 'cr') { - $string = "\n"; - # <BS> - } elsif ($string eq 'bs') { - $string = chr(127); - } elsif ($string eq 'leader') { - $string = $settings->{map_leader}->{value}; - # Invalid char, return special string to recognize the error. - } else { - $string = '<invalid>'; - } - return $string; -} -sub _parse_mapping_reverse { - my ($string) = @_; - - if (not defined $string) { - _warn("Unable to reverse-map command: " . join('', @ex_buf)); - return; - } - - my $escaped_leader = quotemeta($settings->{map_leader}->{value}); - $string =~ s/$escaped_leader/<Leader>/g; - - # Convert char to <char-name>. - $string =~ s/ /<Space>/g; - $string =~ s/\n/<CR>/g; - $string =~ s/\x7F/<BS>/g; - # Convert Ctrl-X to <C-X>. - $string =~ s/([\x01-\x1A])/"<C-" . chr(ord($1) + 64) . ">"/ge; - # Convert Ctrl-6 and Ctrl-^ to <C-^>. - $string =~ s/\x1E/<C-^>/g; - - return $string; -} -sub _parse_partial_command_reverse { - my ($string) = @_; - - my $escaped_leader = quotemeta($settings->{map_leader}->{value}); - $string =~ s/$escaped_leader/<Leader>/g; - - # Convert Ctrl-X to ^X. - $string =~ s/([\x01-\x1A])/"^" . chr(ord($1) + 64)/ge; - # Convert Ctrl-6 and Ctrl-^ to <C-^>. - $string =~ s/\x1E/^^/g; - - return $string; -} - -sub ex_source { - my ($arg_str, $count) = @_; - - # :so[urce], but only loads the vim_moderc file at the moment - - open my $file, '<', Irssi::get_irssi_dir() . '/vim_moderc' or return; - - while (my $line = <$file>) { - next if $line =~ /^\s*$/ or $line =~ /^\s*"/; - - chomp $line; - # :map {lhs} {rhs}, keep in sync with ex_map() - if ($line =~ /^\s*map (\S+) (\S.*)$/) { - ex_map($line); - } else { - _warn_ex('source', "command not supported: $line"); - } - } -} - -sub ex_mkvimrc { - my ($arg_str, $count) = @_; - - # :mkv[imrc][!], [file] not supported - - my $vim_moderc = Irssi::get_irssi_dir(). '/vim_moderc'; - if (-f $vim_moderc and $arg_str !~ /^mkv(?:imrc)?!$/) { - return _warn_ex('mkvimrc', "$vim_moderc already exists"); - } - - open my $file, '>', $vim_moderc or return; - - # copied from ex_map() - foreach my $key (sort keys %$maps) { - my $map = $maps->{$key}; - my $cmd = $map->{cmd}; - if (defined $cmd) { - next if $map->{char} eq $cmd->{char}; # skip default mappings - print $file "map $map->{char} $cmd->{char}\n"; - } - } - - close $file; -} - -sub ex_set { - my ($arg_str, $count) = @_; - - # :se[t] [option] [value] - if ($arg_str =~ /^se(?:t)?(?:\s([^=]+)(?:=(.*)$)?)?/) { - # :se[t] {option} {value} - if (defined $1 and defined $2) { - if (not exists $settings->{$1}) { - return _warn_ex('map', "setting '$1' not found"); - } - my $name = $1; - my $value = $2; - # Also accept numeric values for boolean options. - if ($settings->{$name}->{type} == S_BOOL) { - if ($value =~ /^(on|off)$/i) { - $value = lc $value eq 'on' ? 1 : 0; - } elsif ($value eq '') { - $value = 0; - } - } - _setting_set($name, $value); - setup_changed(); - - # :se[t] [option] - } else { - my $search = defined $1 ? $1 : ''; - my $active_window = Irssi::active_win(); - foreach my $setting (sort keys %$settings) { - next if $setting !~ /^\Q$search\E/; # skip non-matches - my $value = $settings->{$setting}->{value}; - # Irssi only accepts 'on' and 'off' as values for boolean - # options. - if ($settings->{$setting}->{type} == S_BOOL) { - $value = $value ? 'on' : 'off'; - } - $active_window->print($setting . '=' . $value); - } - } - } else { - _warn_ex('map'); - } -} - -sub _warn_ex { - my ($command, $description) = @_; - my $message = "Error in ex-mode command $command"; - if (defined $description) { - $message .= ": $description"; - } - _warn($message); -} - -sub _matching_windows { - my ($buffer) = @_; - - my $server; - - if ($buffer =~ m{^(.+)/(.+)}) { - $server = $1; - $buffer = $2; - } - - print ":b searching for channel $buffer" if DEBUG; - print ":b on server $server" if $server and DEBUG; - - my @matches; - foreach my $window (Irssi::windows()) { - # Matching window names. - if ($window->{name} =~ /$buffer/i) { - my $win_ratio = ($+[0] - $-[0]) / length($window->{name}); - push @matches, { window => $window, - item => undef, - ratio => $win_ratio, - text => $window->{name} }; - print ":b $window->{name}: $win_ratio" if DEBUG; - } - # Matching Window item names (= channels). - foreach my $item ($window->items()) { - # Wrong server. - if ($server and (!$item->{server} or - $item->{server}->{chatnet} !~ /^$server/i)) { - next; - } - if ($item->{name} =~ /$buffer/i) { - my $length = length($item->{name}); - $length-- if index($item->{name}, '#') == 0; - my $item_ratio = ($+[0] - $-[0]) / $length; - push @matches, { window => $window, - item => $item, - ratio => $item_ratio, - text => $item->{name} }; - print ":b $window->{name} $item->{name}: $item_ratio" if DEBUG; - } - } - } - - @matches = sort {$b->{ratio} <=> $a->{ratio}} @matches; - - return \@matches; -} - - -# STATUS ITEMS - -#TODO: give these things better names. -sub vim_mode_cmd { - - my $mode_str = ''; - if ($mode == M_INS) { - $mode_str = 'Insert'; - } elsif ($mode == M_EX) { - $mode_str = '%_Ex%_'; - } else { - $mode_str = 'Normal'; - if ($register ne '"' or $numeric_prefix or $operator or $movement or - $pending_map) { - my $partial = ''; - if ($register ne '"') { - $partial .= '"' . $register; - } - if ($numeric_prefix) { - $partial .= $numeric_prefix; - } - if ($operator) { - $partial .= $operator->{char}; - } - if ($movement) { - $partial .= $movement->{char}; - } - if (defined $pending_map) { - $partial .= $pending_map; - } - $partial = _parse_partial_command_reverse($partial); - $partial =~ s/\\/\\\\\\\\/g; - $mode_str .= " ($partial)"; - } - } - return $mode_str; -} - -sub vim_wins_data { - my $windows = ''; - - # A little code duplication of cmd_ex_command(), but \s+ instead of \s* so - # :bd doesn't display buffers matching d. - my $arg_str = join '', @ex_buf; - if ($arg_str =~ m|^b(?:uffer)?\s+(.+)$|) { - my $buffer = $1; - if ($buffer !~ /^[0-9]$/ and $buffer ne '#') { - # Display matching windows. - eval { - my $matches = _matching_windows($buffer); - $windows = join ',', map { $_->{text} } @$matches; - }; - # Catch errors in /$buffer/ regex. - if ($@) { - _warn($@); - } - } - } - return $windows; -} - -sub vim_exp_mode { - my ($server, $witem, $arg) = @_; - return vim_mode_cmd(); -} - -sub vim_exp_wins { - my ($server, $witem, $arg) = @_; - return vim_wins_data(); -} - -# vi mode status item. -sub vim_mode_cb { - my ($sb_item, $get_size_only) = @_; - my $mode_str = vim_mode_cmd(); - $sb_item->default_handler($get_size_only, "{sb $mode_str}", '', 0); -} - -# :b window list item. -sub b_windows_cb { - my ($sb_item, $get_size_only) = @_; - - my $windows = vim_wins_data(); - - $sb_item->default_handler($get_size_only, "{sb $windows}", '', 0); -} - - -# INPUT HANDLING - -sub got_key { - my ($key) = @_; - - return if ($should_ignore); - - # Esc key - if ($key == 27) { - print "Esc seen, starting buffer" if DEBUG; - $input_buf_enabled = 1; - - # NOTE: this timeout might be too low on laggy systems, but - # it comes at the cost of keystroke latency for things that - # contain escape sequences (arrow keys, etc) - my $esc_buf_timeout = $settings->{esc_buf_timeout}->{value}; - - $input_buf_timer - = Irssi::timeout_add_once($esc_buf_timeout, - \&handle_input_buffer, undef); - - print "Buffer Timer tag: $input_buf_timer" if DEBUG; - - } elsif ($mode == M_INS) { - if ($key == 5) { # Ctrl-C enters command mode - _update_mode(M_CMD); - _stop(); - return; - } elsif ($key == 10) { # enter. - _commit_line(); - - } elsif ($input_buf_enabled and $imap) { - print "Imap $imap active" if DEBUG; - my $map = $imaps->{$imap}; - if (not defined $map->{map} or chr($key) eq $map->{map}) { - $map->{func}($key); - # Clear the buffer so the imap is not printed. - @input_buf = (); - } else { - push @input_buf, $key; - } - flush_input_buffer(); - _stop(); - $imap = undef; - return; - - } elsif (exists $imaps->{chr($key)}) { - print "Imap " . chr($key) . " seen, starting buffer" if DEBUG; - - # start imap pending mode - $imap = chr($key); - - $input_buf_enabled = 1; - push @input_buf, $key; - $input_buf_timer - = Irssi::timeout_add_once(1000, \&flush_input_buffer, undef); - - _stop(); - return; - - # Pressing delete resets insert mode repetition (8 = BS, 127 = DEL). - # TODO: maybe allow it - } elsif ($key == 8 || $key == 127) { - @insert_buf = (); - # All other entered characters need to be stored to allow repeat of - # insert mode. Ignore delete and control characters. - } elsif ($key > 31) { - push @insert_buf, chr($key); - } - } - - if ($input_buf_enabled) { - push @input_buf, $key; - _stop(); - return; - } - - if ($mode == M_CMD) { - my $should_stop = handle_command_cmd($key); - _stop() if $should_stop; - Irssi::statusbar_items_redraw("vim_mode"); - - } elsif ($mode == M_EX) { - - if ($key == 3) { # C-c cancels Ex mdoe as well. - _update_mode(M_CMD); - _stop(); - return; - } - - handle_command_ex($key); - } -} - -# TODO: merge this with 'flush_input_buffer' below. - -sub handle_input_buffer { - - #Irssi::timeout_remove($input_buf_timer); - $input_buf_timer = undef; - # see what we've collected. - print "Input buffer contains: ", join(", ", @input_buf) if DEBUG; - - if (@input_buf == 1 && $input_buf[0] == 27) { - - print "Enter Normal Mode" if DEBUG; - _update_mode(M_CMD); - - } else { - # we have more than a single esc, implying an escape sequence - # (meta-* or esc-*) - - # currently, we only extract escape sequences if: - # a) we're in ex mode - # b) they're arrow keys (for history control) - - if ($mode == M_EX) { - # ex mode - my $key_str = join '', map { chr } @input_buf; - if ($key_str =~ m/^\e\[([ABCD])/) { - my $arrow = $1; - _debug( "Arrow key: $arrow"); - if ($arrow eq 'A') { # up - ex_history_back(); - } elsif ($arrow eq 'B') { # down - ex_history_fwd(); - } else { - $arrow =~ s/C/right/; - $arrow =~ s/D/left/; - _debug("Arrow key $arrow not supported"); - } - } - } else { - # otherwise, we just forward them to irssi. - _emulate_keystrokes(@input_buf); - } - - # Clear insert buffer, pressing "special" keys (like arrow keys) - # resets it. - @insert_buf = (); - } - - @input_buf = (); - $input_buf_enabled = 0; -} - -sub flush_input_buffer { - Irssi::timeout_remove($input_buf_timer) if defined $input_buf_timer; - $input_buf_timer = undef; - # see what we've collected. - print "Input buffer flushed" if DEBUG; - - # Add the characters to @insert_buf so they can be repeated. - push @insert_buf, map chr, @input_buf; - - _emulate_keystrokes(@input_buf); - - @input_buf = (); - $input_buf_enabled = 0; - - $imap = undef; -} - -sub flush_pending_map { - my ($old_pending_map) = @_; - - print "flush_pending_map(): ", $pending_map, ' ', $old_pending_map - if DEBUG; - - return if not defined $pending_map or - $pending_map ne $old_pending_map; - - handle_command_cmd(undef); - Irssi::statusbar_items_redraw("vim_mode"); -} - -sub handle_numeric_prefix { - my ($char) = @_; - my $num = 0+$char; - - if (defined $numeric_prefix) { - $numeric_prefix *= 10; - $numeric_prefix += $num; - } else { - $numeric_prefix = $num; - } -} - -sub handle_command_cmd { - my ($key) = @_; - - my $pending_map_flushed = 0; - - my $char; - if (defined $key) { - $char = chr($key); - # We were called from flush_pending_map(). - } else { - $char = $pending_map; - $key = 0; - $pending_map_flushed = 1; - } - - # Counts - if (!$movement and !$pending_map and - ($char =~ m/[1-9]/ or ($numeric_prefix && $char =~ m/[0-9]/))) { - print "Processing numeric prefix: $char" if DEBUG; - handle_numeric_prefix($char); - return 1; # call _stop() - } - - if (defined $pending_map and not $pending_map_flushed) { - $pending_map = $pending_map . $char; - $char = $pending_map; - } - - my $map; - if ($movement) { - $map = { char => $movement->{char}, - cmd => $movement, - maps => {}, - }; - - } elsif (exists $maps->{$char}) { - $map = $maps->{$char}; - - # We have multiple mappings starting with this key sequence. - if (!$pending_map_flushed and scalar keys %{$map->{maps}} > 0) { - if (not defined $pending_map) { - $pending_map = $char; - } - - # The current key sequence has a command mapped to it, run if - # after a timeout. - if (defined $map->{cmd}) { - Irssi::timeout_add_once(1000, \&flush_pending_map, - $pending_map); - } - return 1; # call _stop() - } - - } else { - print "No mapping found for $char" if DEBUG; - $pending_map = undef; - $numeric_prefix = undef; - return 1; # call _stop() - } - - $pending_map = undef; - - my $cmd = $map->{cmd}; - - # Make sure we have a valid $cmd. - if (not defined $cmd) { - print "Bug in pending_map_flushed() $map->{char}" if DEBUG; - return 1; # call _stop() - } - - # Ex-mode commands can also be bound in command mode. - if ($cmd->{type} == C_EX) { - print "Processing ex-command: $map->{char} ($cmd->{char})" if DEBUG; - - $cmd->{func}->(substr($cmd->{char}, 1), $numeric_prefix); - $numeric_prefix = undef; - - return 1; # call _stop() - # As can irssi commands. - } elsif ($cmd->{type} == C_IRSSI) { - print "Processing irssi-command: $map->{char} ($cmd->{char})" if DEBUG; - - _command_with_context($cmd->{func}); - - $numeric_prefix = undef; - return 1; # call _stop(); - # <Nop> does nothing. - } elsif ($cmd->{type} == C_NOP) { - print "Processing <Nop>: $map->{char}" if DEBUG; - - $numeric_prefix = undef; - return 1; # call _stop(); - } - - # text-objects (i a) are simulated with $movement - if (!$movement and ($cmd->{type} == C_NEEDSKEY or - ($operator and ($char eq 'i' or $char eq 'a')))) { - print "Processing movement: $map->{char} ($cmd->{char})" if DEBUG; - if ($char eq 'i') { - $movement = $commands->{_i}; - } elsif ($char eq 'a') { - $movement = $commands->{_a}; - } else { - $movement = $cmd; - } - - } elsif (!$movement and $cmd->{type} == C_OPERATOR) { - print "Processing operator: $map->{char} ($cmd->{char})" if DEBUG; - # Abort operator if we already have one pending. - if ($operator) { - # But allow cc/dd/yy. - if ($operator == $cmd) { - print "Processing line operator: ", - $map->{char}, " (", - $cmd->{char} ,")" - if DEBUG; - - my $pos = _input_pos(); - $cmd->{func}->(0, _input_len(), undef, 0); - # Restore position for yy. - if ($cmd == $commands->{y}) { - _input_pos($pos); - # And save undo for other operators. - } else { - _add_undo_entry(_input(), _input_pos()); - } - if ($register ne '"') { - print 'Changing register to "' if DEBUG; - $register = '"'; - } - } - $numeric_prefix = undef; - $operator = undef; - $movement = undef; - # Set new operator. - } else { - $operator = $cmd; - } - - # Start Ex mode. - } elsif ($cmd == $commands->{':'}) { - - if (not script_is_loaded('uberprompt')) { - _warn("Warning: Ex mode requires the 'uberprompt' script. " . - "Please load it and try again."); - } else { - _update_mode(M_EX); - _set_prompt(':'); - } - - # Enter key sends the current input line in command mode as well. - } elsif ($key == 10) { - _commit_line(); - return 0; # don't call _stop() - - } else { - print "Processing command: $map->{char} ($cmd->{char})" if DEBUG; - - my $skip = 0; - my $repeat = 0; - - if (!$movement) { - # . repeats the last command. - if ($cmd == $commands->{'.'} and defined $last->{cmd}) { - $cmd = $last->{cmd}; - $char = $last->{char}; - # If . is given a count then it replaces original count. - if (not defined $numeric_prefix) { - $numeric_prefix = $last->{numeric_prefix}; - } - $operator = $last->{operator}; - $movement = $last->{movement}; - $register = $last->{register}; - $repeat = 1; - } elsif ($cmd == $commands->{'.'}) { - print '. pressed but $last->{char} not set' if DEBUG; - $skip = 1; - } - } - - # Ignore invalid operator/command combinations. - if ($operator and $cmd->{no_operator}) { - print "Invalid operator/command: $operator->{char} $cmd->{char}" - if DEBUG; - $skip = 1; - } - - if ($skip) { - print "Skipping movement and operator." if DEBUG; - } else { - # Make sure count is at least 1 except for functions which need to - # know if no count was used. - if (not $numeric_prefix and not $cmd->{needs_count}) { - $numeric_prefix = 1; - } - - my $cur_pos = _input_pos(); - - # If defined $cur_pos will be changed to this. - my $old_pos; - # Position after the move. - my $new_pos; - # Execute the movement (multiple times). - if (not $movement) { - ($old_pos, $new_pos) - = $cmd->{func}->($numeric_prefix, $cur_pos, $repeat); - } else { - ($old_pos, $new_pos) - = $cmd->{func}->($numeric_prefix, $cur_pos, $repeat, - $char); - } - if (defined $old_pos) { - print "Changing \$cur_pos from $cur_pos to $old_pos" if DEBUG; - $cur_pos = $old_pos; - } - if (defined $new_pos) { - _input_pos($new_pos); - } else { - $new_pos = _input_pos(); - } - - # Update input position of last undo entry so that undo/redo - # restores correct position. - if (@undo_buffer and _input() eq $undo_buffer[0]->[0] and - ((defined $operator and $operator == $commands->{d}) or - $cmd->{repeatable})) { - print "Updating history position: $undo_buffer[0]->[0]" - if DEBUG; - $undo_buffer[0]->[1] = $cur_pos; - } - - # If we have an operator pending then run it on the handled text. - # But only if the movement changed the position (this prevents - # problems with e.g. f when the search string doesn't exist). - if ($operator and $cur_pos != $new_pos) { - print "Processing operator: ", $operator->{char} if DEBUG; - $operator->{func}->($cur_pos, $new_pos, $cmd, $repeat); - } - - # Save an undo checkpoint here for operators, all repeatable - # movements, operators and repetition. - if ((defined $operator and $operator == $commands->{d}) or - $cmd->{repeatable}) { - # TODO: why do history entries still show up in undo - # buffer? Is avoiding the commands here insufficient? - - _add_undo_entry(_input(), _input_pos()); - } - - # Store command, necessary for . - if ($operator or $cmd->{repeatable}) { - $last->{cmd} = $cmd; - $last->{char} = $char; - $last->{numeric_prefix} = $numeric_prefix; - $last->{operator} = $operator; - $last->{movement} = $movement; - $last->{register} = $register; - } - } - - # Reset the count unless we go into insert mode, _update_mode() needs - # to know it when leaving insert mode to support insert with counts - # (like 3i). - if ($repeat or $cmd->{type} != C_INSERT) { - $numeric_prefix = undef; - } - $operator = undef; - $movement = undef; - - if ($cmd != $commands->{'"'} and $register ne '"') { - print 'Changing register to "' if DEBUG; - $register = '"'; - } - - } - - return 1; # call _stop() -} - -sub handle_command_ex { - my ($key) = @_; - - # BS key (8) or DEL key (127) - remove last character. - if ($key == 8 || $key == 127) { - print "Delete" if DEBUG; - if (@ex_buf > 0) { - pop @ex_buf; - _set_prompt(':' . join '', @ex_buf); - # Backspacing over : exits ex-mode. - } else { - _update_mode(M_CMD); - } - - # Return key - execute command - } elsif ($key == 10) { - print "Run ex-mode command" if DEBUG; - cmd_ex_command(); - _update_mode(M_CMD); - - } elsif ($key == 9) { # TAB - print "Tab pressed" if DEBUG; - print "Ex buf contains: " . join('', @ex_buf) if DEBUG; - @tab_candidates = _tab_complete(join('', @ex_buf), [keys %$commands_ex]); - _debug("Candidates: " . join(", ", @tab_candidates)); - if (@tab_candidates == 1) { - @ex_buf = ( split('', $tab_candidates[0]), ' '); - _set_prompt(':' . join '', @ex_buf); - } - # Ignore control characters for now. - } elsif ($key > 0 && $key < 32) { - # TODO: use them later, e.g. completion - - # Append entered key - } else { - if ($key != -1) { - # check we're not called from an ex_history_* function - push @ex_buf, chr $key; - } - _set_prompt(':' . join '', @ex_buf); - } - - Irssi::statusbar_items_redraw("vim_windows"); - - _stop(); -} - -sub _tab_complete { - my ($input, $source) = @_; - my @out; - foreach my $item (@$source) { - if ($item =~ m/^\Q$input\E/) { - push @out, $item; - } - } - - return sort { $a cmp $b } @out; -} - -sub vim_mode_init { - Irssi::signal_add_first 'gui key pressed' => \&got_key; - Irssi::statusbar_item_register ('vim_mode', 0, 'vim_mode_cb'); - Irssi::statusbar_item_register ('vim_windows', 0, 'b_windows_cb'); - - Irssi::expando_create('vim_cmd_mode' => \&vim_exp_mode, {}); - Irssi::expando_create('vim_wins' => \&vim_exp_wins, {}); - - - # Register all available settings. - foreach my $name (keys %$settings) { - _setting_register($name); - } - - foreach my $char ('a' .. 'z') { - $registers->{$char} = ''; - } - - setup_changed(); - - Irssi::signal_add 'setup changed' => \&setup_changed; - - # Add all default mappings. - foreach my $char (keys %$commands) { - next if $char =~ /^_/; # skip private commands (text-objects for now) - add_map($char, $commands->{$char}); - } - - # Load the vim_moderc file if it exists. - ex_source('source'); - - setup_changed(); - _reset_undo_buffer(); - - if ($settings->{start_cmd}->{value}) { - _update_mode(M_CMD); - } else { - _update_mode(M_INS); - } -} - -sub setup_changed { - my $value; - - if ($settings->{cmd_seq}->{value} ne '') { - delete $imaps->{$settings->{cmd_seq}->{value}}; - } - $value = _setting_get('cmd_seq'); - if ($value eq '') { - $settings->{cmd_seq}->{value} = $value; - } else { - if (length $value == 1) { - $imaps->{$value} = { 'map' => $value, - 'func' => sub { _update_mode(M_CMD) } - }; - $settings->{cmd_seq}->{value} = $value; - } else { - _warn("Error: vim_mode_cmd_seq must be a single character"); - # Restore the value so $settings and irssi settings are - # consistent. - _setting_set('cmd_seq', $settings->{cmd_seq}->{value}); - } - } - - my $new_utf8 = _setting_get('utf8'); - if ($new_utf8 != $settings->{utf8}->{value}) { - # recompile the patterns when switching to/from utf-8 - $word = qr/[\w_]/o; - $non_word = qr/[^\w_\s]/o; - - $settings->{utf8}->{value} = $new_utf8; - } - if ($new_utf8 and (!$^V or $^V lt v5.8.1)) { - _warn("Warning: UTF-8 isn't supported very well in perl < 5.8.1! " . - "Please disable the vim_mode_utf8 setting."); - } - - # Sync $settings with current irssi values. - foreach my $name (keys %$settings) { - # These were already handled above. - next if $name eq 'cmd_seq' or $name eq 'cmd_seq'; - - $settings->{$name}->{value} = _setting_get($name); - } -} - -sub UNLOAD { - Irssi::signal_remove('gui key pressed' => \&got_key); - Irssi::signal_remove('setup changed' => \&setup_changed); - Irssi::statusbar_item_unregister ('vim_mode'); - Irssi::statusbar_item_unregister ('vim_windows'); -} - -sub _add_undo_entry { - my ($line, $pos) = @_; - - # If we aren't at the top of the history stack, then drop newer entries as - # we can't branch (yet). - while ($undo_index > 0) { - shift @undo_buffer; - $undo_index--; - } - - # check it's not a dupe of the list head - my $current = $undo_buffer[$undo_index]; - if ($line eq $current->[0] && $pos == $current->[1]) { - print "Not adding duplicate to undo list" if DEBUG; - } elsif ($line eq $current->[0]) { - print "Updating position of undo list at $undo_index" if DEBUG; - $undo_buffer[$undo_index]->[1] = $pos; - } else { - print "adding $line ($pos) to undo list" if DEBUG; - # add to the front of the buffer - unshift @undo_buffer, [$line, $pos]; - $undo_index = 0; - } - my $max = $settings->{max_undo_lines}->{value}; -} - -sub _restore_undo_entry { - my $entry = $undo_buffer[$undo_index]; - _input($entry->[0]); - _input_pos($entry->[1]); -} - -sub _print_undo_buffer { - - my $i = 0; - my @buf; - foreach my $entry (@undo_buffer) { - my $str = ''; - if ($i == $undo_index) { - $str .= '* '; - } else { - $str .= ' '; - } - my ($line, $pos) = @$entry; - substr($line, $pos, 0) = '*'; - # substr($line, $pos+3, 0) = '%_'; - - $str .= sprintf('%02d %s [%d]', $i, $line, $pos); - push @buf, $str; - $i++; - } - print "------ undo buffer ------"; - print join("\n", @buf); - print "------------------ ------"; - -} - -sub _reset_undo_buffer { - my ($line, $pos) = @_; - $line = _input() unless defined $line; - $pos = _input_pos() unless defined $pos; - - print "Clearing undo buffer" if DEBUG; - @undo_buffer = ([$line, $pos]); - $undo_index = 0; -} - -sub add_map { - my ($keys, $command) = @_; - - # To allow multiple mappings starting with the same key (like gg, ge, gE) - # also create maps for the keys "leading" to this key (g in this case, but - # can be longer for this like ,ls). When looking for the mapping these - # "leading" maps are followed. - my $tmp = $keys; - while (length $tmp > 1) { - my $map = substr $tmp, -1, 1, ''; - if (not exists $maps->{$tmp}) { - $maps->{$tmp} = { char => _parse_mapping_reverse($tmp), - cmd => undef, - maps => {} - }; - } - if (not exists $maps->{$tmp}->{maps}->{$tmp . $map}) { - $maps->{$tmp}->{maps}->{$tmp . $map} = undef; - } - } - - if (not exists $maps->{$keys}) { - $maps->{$keys} = { char => undef, - cmd => undef, - maps => {} - }; - } - $maps->{$keys}->{char} = _parse_mapping_reverse($keys); - $maps->{$keys}->{cmd} = $command; -} - -sub delete_map { - my ($keys) = @_; - - # Abort for non-existent mappings or placeholder mappings. - return if not exists $maps->{$keys} or not defined $maps->{$keys}->{cmd}; - - my @add = (); - - # If no maps need the current key, then remove it and all other - # unnecessary keys in the "tree". - if (keys %{$maps->{$keys}->{maps}} == 0) { - my $tmp = $keys; - while (length $tmp > 1) { - my $map = substr $tmp, -1, 1, ''; - delete $maps->{$tmp}->{maps}->{$tmp . $map}; - if (not $maps->{$tmp}->{cmd} and keys %{$maps->{$tmp}->{maps}} == 0) { - push @add, $tmp; - delete $maps->{$tmp}; - } else { - last; - } - } - } - - if (keys %{$maps->{$keys}->{maps}} > 0) { - $maps->{$keys}->{cmd} = undef; - } else { - delete $maps->{$keys}; - } - push @add, $keys; - - # Restore default keybindings in case we :unmapped a <Nop> or a remapped - # key. - foreach my $key (@add) { - if (exists $commands->{$key}) { - add_map($key, $commands->{$key}); - } - } -} - - -sub _commit_line { - _update_mode(M_INS); - - # separate from call above as _update_mode() does additional internal work - # and we need to make sure it gets correctly called. - _update_mode(M_CMD) if $settings->{start_cmd}->{value}; - - _reset_undo_buffer('', 0); -} - -sub _input { - my ($data) = @_; - - my $current_data = Irssi::parse_special('$L', 0, 0); - - if ($settings->{utf8}->{value}) { - $current_data = decode_utf8($current_data); - } - - if (defined $data) { - if ($settings->{utf8}->{value}) { - Irssi::gui_input_set(encode_utf8($data)); - } else { - Irssi::gui_input_set($data); - } - } else { - $data = $current_data; - } - - return $data; -} - -sub _input_len { - return length _input(); -} - -sub _input_pos { - my ($pos) = @_; - my $cur_pos = Irssi::gui_input_get_pos(); - # my $dpos = defined $pos?$pos:'undef'; - # my @call = caller(1); - # my $cfunc = $call[3]; - # $cfunc =~ s/^.*?::([^:]+)$/$1/; - # print "pos called from line: $call[2] sub: $cfunc pos: $dpos, cur_pos: $cur_pos" - # if DEBUG; - - if (defined $pos) { - #print "Input pos being set from $cur_pos to $pos" if DEBUG; - Irssi::gui_input_set_pos($pos) if $pos != $cur_pos; - } else { - $pos = $cur_pos; - #print "Input pos retrieved as $pos" if DEBUG; - } - - return $pos; -} - -sub _emulate_keystrokes { - my @keys = @_; - $should_ignore = 1; - for my $key (@keys) { - Irssi::signal_emit('gui key pressed', $key); - } - $should_ignore = 0; -} - -sub _stop() { - Irssi::signal_stop_by_name('gui key pressed'); -} - -sub _update_mode { - my ($new_mode) = @_; - - my $pos; - - if ($mode == M_INS and $new_mode == M_CMD) { - # Support counts with insert modes, like 3i. - if ($numeric_prefix and $numeric_prefix > 1) { - $pos = _insert_buffer($numeric_prefix - 1, _input_pos()); - _input_pos($pos); - $numeric_prefix = undef; - - # In insert mode we are "between" characters, in command mode "on top" - # of keys. When leaving insert mode we have to move on key left to - # accomplish that. - } else { - $pos = _input_pos(); - if ($pos != 0) { - _input_pos($pos - 1); - } - } - # Store current line to allow undo of i/a/I/A. - _add_undo_entry(_input(), _input_pos()); - - # Change mode to i to support insert mode repetition. This doesn't affect - # commands like i/a/I/A because handle_command_cmd() sets $last->{cmd}. - # It's necessary when pressing enter so the next line can be repeated. - } elsif ($mode == M_CMD and $new_mode == M_INS) { - $last->{cmd} = $commands->{i}; - # Make sure prompt is cleared when leaving ex mode. - } elsif ($mode == M_EX and $new_mode != M_EX) { - _set_prompt(''); - } - - $mode = $new_mode; - if ($mode == M_INS) { - $history_index = undef; - $register = '"'; - @insert_buf = (); - # Reset every command mode related status as a fallback in case something - # goes wrong. - } elsif ($mode == M_CMD) { - $numeric_prefix = undef; - $operator = undef; - $movement = undef; - $register = '"'; - - $pending_map = undef; - - # Also clear ex-mode buffer. - @ex_buf = (); - } - - Irssi::statusbar_items_redraw("vim_mode"); - Irssi::statusbar_items_redraw ('uberprompt'); - -} - -sub _set_prompt { - my $msg = shift; - - # add a leading space unless we're trying to clear it entirely. - if (length($msg) and $settings->{prompt_leading_space}->{value}) { - $msg = ' ' . $msg; - } - - # escape % symbols. This prevents any _set_prompt calls from using - # colouring sequences. - $msg =~ s/%/%%/g; - - Irssi::signal_emit('change prompt', $msg, 'UP_INNER'); -} - -sub _setting_get { - my ($name) = @_; - - my $type = $settings->{$name}->{type}; - $name = "vim_mode_$name"; - - my $ret = undef; - - if ($type == S_BOOL) { - $ret = Irssi::settings_get_bool($name); - } elsif ($type == S_INT) { - $ret = Irssi::settings_get_int($name); - } elsif ($type == S_STR) { - $ret = Irssi::settings_get_str($name); - } elsif ($type == S_TIME) { - $ret = Irssi::settings_get_time($name); - } else { - _warn("Unknown setting type '$type', please report."); - } - - return $ret; -} - -sub _setting_set { - my ($name, $value) = @_; - - my $type = $settings->{$name}->{type}; - $name = "vim_mode_$name"; - - if ($type == S_BOOL) { - Irssi::settings_set_bool($name, $value); - } elsif ($type == S_INT) { - Irssi::settings_set_int($name, $value); - } elsif ($type == S_STR) { - Irssi::settings_set_str($name, $value); - } elsif ($type == S_TIME) { - Irssi::settings_set_time($name, $value); - } else { - _warn("Unknown setting type '$type', please report."); - } -} -sub _setting_register { - my ($name) = @_; - - my $value = $settings->{$name}->{value}; - my $type = $settings->{$name}->{type}; - $name = "vim_mode_$name"; - - if ($type == S_BOOL) { - Irssi::settings_add_bool('vim_mode', $name, $value); - } elsif ($type == S_INT) { - Irssi::settings_add_int('vim_mode', $name, $value); - } elsif ($type == S_STR) { - Irssi::settings_add_str('vim_mode', $name, $value); - } elsif ($type == S_TIME) { - Irssi::settings_add_time('vim_mode', $name, $value); - } else { - _warn("Unknown setting type '$type', please report."); - } -} - -sub _warn { - my ($warning) = @_; - - print '%_vim_mode: ', $warning, '%_'; -} - -sub _debug { - return unless DEBUG; - - my ($format, @args) = @_; - my $str = sprintf($format, @args); - print $str; -} - -sub _command_with_context { - my ($command) = @_; - my $context; - my $window = Irssi::active_win; - if (defined $window) { - my $witem = $window->{active}; - if (defined $witem and ref($witem) eq 'Irssi::Windowitem') { - $context = $witem; - } else { - $context = $window; - } - } else { - my $server = Irssi::active_server; - if (defined $server) { - $context = $server; - } - } - if (defined $context) { - print "Command $command Using context: " . ref($context) if DEBUG; - $context->command($command); - } else { - print "Command $command has no context" if DEBUG; - Irssi::command($command); - } -} - -sub ex_history_add { - my ($line) = @_; - - # check it's not an exact dupe of the previous history line - - my $last_hist = $ex_history[$ex_history_index]; - $last_hist = '' unless defined $last_hist; - - return if $last_hist eq $line; - - _debug("Adding $line to ex command history"); - - # add it to the history - unshift @ex_history, $line; - - if ($settings->{ex_history_size}->{value} < @ex_history) { - pop @ex_history; # junk the last entry if we've hit the max. - } -} - -sub ex_history_fwd { - - my $hist_max = $#ex_history; - $ex_history_index++; - if ($ex_history_index > $hist_max) { - $ex_history_index = 0; - _debug("ex history hit top, wrapping to 0"); - } - - my $line = $ex_history[$ex_history_index]; - $line = '' if not defined $line; - - _debug("Ex history line: $line"); - - @ex_buf = split '', $line; - handle_command_ex(-1); -} - -sub ex_history_back { - my $hist_max = $#ex_history; - $ex_history_index--; - if ($ex_history_index == -1) { - $ex_history_index = $hist_max; - _debug("ex history hit bottom, wrapping to $hist_max"); - - } - - my $line = $ex_history[$ex_history_index]; - $line = '' if not defined $line; - - _debug("Ex history line: $line"); - @ex_buf = split '', $line; - handle_command_ex(-1); - -} - -sub ex_history_show { - my $win = Irssi::active_win(); - $win->print("Ex command history:"); - for my $i (0 .. $#ex_history) { - my $flag = $i == $ex_history_index - ? ' <' - : ''; - $win->print("$i " . $ex_history[$i] . $flag); - } -} -vim_mode_init(); diff --git a/.config/irssi/scripts/autorun/window_switcher.pl b/.config/irssi/scripts/autorun/window_switcher.pl @@ -1,146 +0,0 @@ -# window_switcher: makes switching windows easy -# -# Usage: -# * Add the statusbar item: -# /STATUSBAR window add window_switcher -# * Type /ws followed by a window number or part of a window or channel name. -# * When the right item is at the first place in the statusbar, press enter. -# * For faster usage, do "/BIND ^G multi erase_line;insert_text /ws ", -# type ctrl-G, and start typing... - -# Copyright 2007 Wouter Coekaerts <coekie@irssi.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -use strict; -use Irssi; -use Irssi::TextUI; - -use vars qw($VERSION %IRSSI); -$VERSION = '1.0'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'coekie@irssi.org', - name => 'window_switcher', - description => 'makes switching windows easy', - license => 'GPLv2 or later', - url => 'http://wouter.coekaerts.be/irssi/', - changed => '29/07/07' -); - -sub window_switcher_sb { - my ($sbItem, $get_size_only) = @_; - - my $prompt = Irssi::parse_special('$L'); - my $cmdchars = Irssi::parse_special('$K'); - - my $sb = ''; - - if ($prompt =~ /^(.)ws (.+)$/i && index($cmdchars,$1) != -1) { - my $arg = $2; - my $wins = find_wins($arg); - - foreach my $win (@$wins) { - $sb .= $win->{text} . ' '; - } - $sb =~ s/ $//; - } - - $sbItem->default_handler($get_size_only, "{sb $sb}", undef, 1); -} - -sub find_wins { - my ($arg) = @_; - my @wins; - foreach my $window (Irssi::windows()) { - my @items = $window->items(); - my $regex = qr/^(.*?)(\Q$arg\E)(.*)$/i; - - my $match = 0; - my $text; - my $refnumtext = $window->{refnum}; - my $itemname; - - if ($window->{refnum} eq $arg) { - $match = 1; - if ($window->{name} ne '') { - $text = $window->{name}; - } elsif (scalar(@items) > 0) { - $text = $items[0]->{visible_name}; - } else { - $text = ''; - } - $refnumtext = "%G$refnumtext%n"; - } elsif ($window->{name} =~ $regex) { - ($match, $text) = do_match($1, $2, $3); - } else { - foreach my $item (@items) { - if ($item->{visible_name} =~ $regex) { - ($match, $text) = do_match($1, $2, $3); - $itemname = $item->{name}; - last; - } - } - } - - if ($match) { - push @wins, { - match => 1000 * $match + $window->{refnum}, - refnum => $window->{refnum}, - text => "$refnumtext:$text", - itemname => $itemname - }; - } - } - - @wins = sort {$a->{match} <=> $b->{match}} @wins; - return \@wins; -} - -sub do_match { - my ($begin, $mid, $end) = @_; - my $match; - if ($begin eq '' || $begin eq '#') { - $match = ($end eq '') ? 2 : 3; - } else { - $match = 4; - } - return ($match, "%g$begin%G$mid%g$end%n"); -} - -Irssi::command_bind('ws', sub { - my ($data, $server, $win) = @_; - my $wins = find_wins($data); - if (scalar(@$wins) > 0) { - my $win = $wins->[0]; - Irssi::command('window goto ' . $win->{refnum}); - if (defined($win->{itemname})) { - Irssi::command('window item goto ' . $win->{itemname}); - } - } -}); - -Irssi::statusbar_item_register ('window_switcher', 0, 'window_switcher_sb'); - -my $scheduled = 0; -Irssi::signal_add_last 'gui key pressed' => sub { - unless ($scheduled) { - $scheduled = 1; - Irssi::timeout_add_once(100, sub { - Irssi::statusbar_items_redraw ('window_switcher'); - $scheduled = 0; - }, []); - } -}; diff --git a/.config/irssi/scripts/printlevel.pl b/.config/irssi/scripts/printlevel.pl @@ -1,19 +0,0 @@ -use Irssi; -use strict; -use vars qw($VERSION %IRSSI); -$VERSION = '1.1'; -%IRSSI = ( - authors => 'Wouter Coekaerts', - contact => 'wouter@coekaerts.be', - name => 'printlevels', - description => 'prints the message level before every line. useful for debugging your level settings', - license => 'GPLv2', - url => 'http://wouter.coekaerts.be/irssi', - changed => '09/09/2003' -); - -Irssi::signal_add('print text', sub { - my ($dest, $text, $stripped) = @_; - $_[1] = '|' . Irssi::bits2level($dest->{'level'}) . '| ' . $text; - Irssi::signal_continue(@_); -}); diff --git a/.config/irssi/startup b/.config/irssi/startup @@ -1,2 +0,0 @@ -/load perl -/sbar modify -type window -position 0 -visible active prompt diff --git a/.config/irssi/triggers b/.config/irssi/triggers @@ -1,59 +0,0 @@ -#Triggers file version 1.2.4 --all -regexp '\t' -replace ' ' --all -regexp '([[:alnum:]]) ([[:punct:]])[[:space:]]*$' -replace '$1$2' --rawin -regexp 'Client connecting:' -replace '0CONNECT:' --rawin -regexp 'Client exiting:' -replace '9QUIT:' --rawin -regexp 'OperOverride --' -replace '14OPEROVERRIDE:' --all -pattern '¯\_(ツ)_/¯' -replace '*shrug*' --all -pattern '(╯°□°)╯︵ ┻━┻' -replace '*flips table*' --publics -privmsgs -masks 'wfnintr!*@example.com. *!*@irc.haydenvh.com mys!*@mys.' -regexp '^halfop #hlircnet' -command '^msg -hlircnet chanhold halfop #hlircnet $N' -name 'AUTOHOP-#hlircnet' --all -regexp '\t' -replace ' ' --all -pattern '00' -replace '99' --all -pattern '01' -replace '88' --all -pattern '02' -replace '48' --all -pattern '03' -replace '56' --all -pattern '04' -replace '52' --all -pattern '05' -replace '40' --all -pattern '06' -replace '50' --all -pattern '07' -replace '18' --all -pattern '08' -replace '42' --all -pattern '09' -replace '56' --all -pattern '10' -replace '46' --all -pattern '11' -replace '58' --all -pattern '12' -replace '48' --all -pattern '13' -replace '62' --all -pattern '14' -replace '90' --all -pattern '15' -replace '96' --all -pattern '(..),00' -replace '\1,99' --all -pattern '(..),01' -replace '\1,88' --all -pattern '(..),02' -replace '\1,48' --all -pattern '(..),03' -replace '\1,56' --all -pattern '(..),04' -replace '\1,52' --all -pattern '(..),05' -replace '\1,40' --all -pattern '(..),06' -replace '\1,50' --all -pattern '(..),07' -replace '\1,18' --all -pattern '(..),08' -replace '\1,42' --all -pattern '(..),09' -replace '\1,56' --all -pattern '(..),10' -replace '\1,46' --all -pattern '(..),11' -replace '\1,58' --all -pattern '(..),12' -replace '\1,48' --all -pattern '(..),13' -replace '\1,62' --all -pattern '(..),14' -replace '\1,90' --all -pattern '(..),15' -replace '\1,96' --all -pattern '(.),00' -replace '\1,99' --all -pattern '(.),01' -replace '\1,88' --all -pattern '(.),02' -replace '\1,48' --all -pattern '(.),03' -replace '\1,56' --all -pattern '(.),04' -replace '\1,52' --all -pattern '(.),05' -replace '\1,40' --all -pattern '(.),06' -replace '\1,50' --all -pattern '(.),07' -replace '\1,18' --all -pattern '(.),08' -replace '\1,42' --all -pattern '(.),09' -replace '\1,56' --all -pattern '(.),10' -replace '\1,46' --all -pattern '(.),11' -replace '\1,58' --all -pattern '(.),12' -replace '\1,48' --all -pattern '(.),13' -replace '\1,62' --all -pattern '(.),14' -replace '\1,90' --all -pattern '(.),15' -replace '\1,96' --all -nocase -channels '#general #test' -regexp '^!hilight (.*)' -command '^wait $1\x100\x100\x100; msg $C $N'