🢀︎ weechat :: 186f4d9


commit 186f4d9695b4be4f15953609b63536ae77cbd3a6
Author: acidvegas <acid.vegas@acid.vegas>
Date:   Wed Feb 26 21:23:54 2020 -0500

    Initial commit

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e6d5f74
--- /dev/null
+++ b/README.md
@@ -0,0 +1,217 @@
+# WeeChat
+> backup of my weechat setup
+
+## Table of Contents
+- [Setup](#setup)
+  - [WeeChat](#weechat)
+  - [Relay](#relay)
+- [Settings](#settings)
+- [Triggers](#triggers)
+- [Servers](#servers)
+- [Services](#services)
+- [Proxy](#proxy)
+- [Relay](#relay)
+
+### Setup
+###### WeeChat
+```
+weechat -P "alias,buflist,charset,exec,fset,irc,perl,python,relay,script,trigger" -r "/set weechat.plugin.autoload alias,buflist,charset,exec,fset,irc,perl,python,relay,script,trigger;/save;/quit"
+rm $HOME/.weechat/weechat.log
+chmod 700 $HOME/.weechat
+git clone --depth 1 https://github.com/acidvegas/weechat.git $HOME/weechat
+mv $HOME/weechat/alias.conf $HOME/.weechat/alias.conf
+mv $HOME/weechat/scripts/perl/*.pl $HOME/.weechat/perl/autoload/
+mv $HOME/weechat/scripts/python/*.py $HOME/.weechat/python/autoload/
+mkdir $HOME/.weechat/ssl
+nano $HOME/.weechat/cert.pem
+chmod 400 $HOME/.weechat/cert.pem
+```
+
+###### Relay
+```
+pacman -S certbot
+certbot certonly --standalone -d chat.acid.vegas -m acid.vegas@acid.vegas
+
+echo -e "[Unit]\nDescription=cerbot renewal\n\n[Service]\nType=oneshot\nExecStart=/usr/bin/certbot renew -n --quiet --agree-tos --deploy-hook \"above\"" > /etc/systemd/system/certbot.service
+echo -e "[Unit]\nDescription=cerbot renewal timer\n\n[Timer]\nOnCalendar=0/12:00:00\nRandomizedDelaySec=1h\nPersistent=true\n\n[Install]\nWantedBy=timers.target" > /etc/systemd/system/certbot.timer
+systemctl enable certbot.timer && systemctl start certbot.timer
+
+cat /etc/letsencrypt/live/chat.acid.vegas/{fullchain,privkey}.pem > /home/acidvegas/.weechat/ssl/relay.pem
+chown -R acidvegas:acidvegas /homw/acidvegas/.weechat/ssl/*
+printf '%b' '*/relay sslcertkey\n' > /home/acidvegas/.weechat/weechat_fifo
+```
+Note: Still need to handle post renew actions
+
+### Settings
+/key bind meta-c /bar toggle buflist
+/key bind meta-n /bar toggle nicklist
+/set buflist.format.buffer						"${if:${type}==server?${if:${window[gui_current_window].buffer.local_variables.server}==${buffer.local_variables.server}?${if:${irc_server.is_connected}?${color:green,235}:${color:lightred,235}}• ${color:default,235}${name}:${if:${irc_server.is_connected}?${color:green,235}:${color:lightred,235}}• ${color:default,235}${indent}${name}}:}${if:${type}=~(channel|private)?${color_hotlist}${indent}${name}:}${if:${type}!~(channel|private|server)?${color:gray}${name}:}"
+/set buflist.format.buffer_current				"${if:${type}==server?${if:${window[gui_current_window].buffer.local_variables.server}==${buffer.local_variables.server}?${color:lightred}${if:${irc_server.is_connected}?${color:green,235}:${color:lightred,235}}• ${name}${format_hotlist}:${color:237}${if:${irc_server.is_connected}?${color:green,235}:${color:lightred,235}}• ${name}}${format_lag}${format_hotlist}:${if:${type}=~(channel|private)?• ${name}:${if:${type}!~(channel|private|server)?${color:lightblue}${name}:}}}"
+/set buflist.format.hotlist_highlight			"${color:yellow}"
+/set buflist.format.hotlist_message				"${color:cyan}"
+/set buflist.format.hotlist_private				"${color:yellow}"
+/set buflist.look.mouse_wheel					off
+/set irc.color.input_nick						default
+/set irc.color.nick_prefixes					"y:green;q:green;a:lightred;o:red;h:yellow;v:lightblue;*:lightmagenta"
+/set irc.color.reason_quit						darkgray
+/set irc.color.topic_new						lightblue
+/set irc.ctcp.clientinfo						""
+/set irc.ctcp.finger							""
+/set irc.ctcp.ping								""
+/set irc.ctcp.source							""
+/set irc.ctcp.time								""
+/set irc.ctcp.userinfo							""
+/set irc.ctcp.version							""
+/set irc.look.ctcp_time_format					""
+/set irc.look.display_ctcp_blocked				off
+/set irc.look.display_ctcp_reply				off
+/set irc.look.display_ctcp_unknown				off
+/set irc.look.display_join_message				""
+/set irc.look.display_old_topic					off
+/set irc.look.item_nick_modes					off
+/set irc.look.join_auto_add_chantype			on
+/set irc.look.server_buffer						independent
+/set irc.look.smart_filter						off
+/set irc.network.ban_mask_default				"*!*@$host"
+/set irc.server_default.anti_flood_prio_high	0
+/set irc.server_default.anti_flood_prio_low		0 
+/set irc.server_default.autorejoin				on
+/set irc.server_default.autorejoin_delay		3
+/set irc.server_default.capabilities			account-notify,away-notify,cap-notify,multi-prefix,server-time
+/set irc.server_default.command_delay			3
+/set irc.server_default.msg_part				"G-line: User has been permanently banned from this network."
+/set irc.server_default.msg_quit				"G-line: User has been permanently banned from this network."
+/set irc.server_default.nicks					"acidvegas,acid_vegas,acidvegas_"
+/set irc.server_default.realname				"MOST DANGEROUS MOTHERFUCK"
+/set irc.server_default.sasl_mechanism			external
+/set irc.server_default.sasl_username			"acidvegas"
+/set irc.server_default.ssl_cert				"%h/cert.pem"
+/set irc.server_default.ssl_password			"REDACTED"
+/set irc.server_default.ssl_verify				off
+/set irc.server_default.username				"stillfree"
+/set plugins.var.perl.antifuck.autopart			1
+/set plugins.var.perl.antifuck.nobufs			1
+/set plugins.var.perl.fuckyou.forcejoin			sajoin
+/set plugins.var.perl.fuckyou.forcepart			sapart
+/set plugins.var.perl.fuckyou.parallel			5
+/set plugins.var.perl.highmon.first_run			false
+/set plugins.var.perl.highmon.short_names		on
+/set plugins.var.perl.keepnick.default_enable	1
+/set sec.crypt.hash_algo						sha512
+/set weechat.bar.buflist.size_max				20
+/set weechat.bar.fset.separator					off
+/set weechat.bar.input.color_delim				darkgray
+/set weechat.bar.input.conditions				"${window.buffer.full_name} != perl.highmon"
+/set weechat.bar.input.items					"[input_prompt]+(away),[input_search],[input_paste],input_text"
+/set weechat.bar.input.separator				off
+/set weechat.bar.nicklist.size_max				15
+/set weechat.bar.status.color_bg				default
+/set weechat.bar.status.color_delim				darkgray
+/set weechat.bar.status.conditions				"${window.buffer.full_name} != perl.highmon"
+/set weechat.bar.status.items					"buffer_name+(buffer_modes)+[buffer_nicklist_count]"
+/set weechat.bar.status.separator				off
+/set weechat.bar.title.color_bg					black
+/set weechat.bar.title.separator				off
+/set weechat.bar.title.size_max					2
+/set weechat.color.chat_delimiters				darkgray
+/set weechat.color.chat_highlight_bg			default
+/set weechat.color.chat_host					darkgray
+/set weechat.color.chat_nick					white
+/set weechat.color.chat_nick_colors				"cyan,magenta,green,brown,lightblue,default,lightcyan,lightmagenta,lightgreen,blue,31,35,38,40,49,63,70,80,92,99,112,126,130,138,142,148,160,162,167,169,174,176,178,184,186,210,212,215,247"
+/set weechat.color.chat_prefix_error			lightred
+/set weechat.color.chat_prefix_network			lightblue
+/set weechat.color.chat_prefix_suffix			darkgray
+/set weechat.color.chat_read_marker				darkgray
+/set weechat.color.chat_time					235
+/set weechat.color.chat_time_delimiters			235
+/set weechat.color.separator					darkgray
+/set weechat.color.status_name_ssl				white
+/set weechat.look.bar_more_down					"▼"
+/set weechat.look.bar_more_left					"◀"
+/set weechat.look.bar_more_right				"▶"
+/set weechat.look.bar_more_up					"▲"
+/set weechat.look.buffer_time_format			" %H:%M"
+/set weechat.look.confirm_quit					on
+/set weechat.look.day_change					off
+/set weechat.look.highlight						acidvegas,supernets
+/set weechat.look.item_buffer_filter			"•"
+/set weechat.look.mouse							on
+/set weechat.look.prefix_align_max				15
+/set weechat.look.prefix_join					"▬▬▶"
+/set weechat.look.prefix_quit					"◀▬▬"
+/set weechat.look.prefix_suffix					"│"
+/set weechat.look.quote_time_format				"%H:%M"
+/set weechat.look.read_marker_string			"─"
+/set weechat.look.separator_horizontal			"─"
+/set weechat.look.separator_vertical			"│"
+/set weechat.look.window_title					"hardchats"
+/set weechat.plugin.autoload					"alias,buflist,charset,exec,fset,irc,perl,python,relay,script,trigger"
+/set weechat.startup.display_logo				off
+/set weechat.startup.display_version			off
+```
+
+### Triggers
+```
+/trigger add hate					modifier	irc_out1_PRIVMSG			"" "/hate/${color:red}${color:underline} HATE ${color:reset}"
+/trigger add input_command_color	modifier	"500|input_text_display"	"${tg_string} =~ ^/($|[^/])" "#/(.+)#${color:39}/${color:74}${re:1}#"
+/trigger add url_color				modifier	"weechat_print"				"${tg_tags} !~ irc_quit" ";[a-z]+://\S+;${color:32}${color:underline}${re:0}${color:-underline}${color:reset};" ""
+```
+
+### Servers
+```
+/server add blackhat	breaking.technology/6697 -ssl
+/server add efnet		efnet.port80.se/6697,irc.choopa.net/6697 -ssl
+/server add freenode	irc.freenode.com/6697 -ssl
+/server add ircstorm	irc.ircstorm.net/6699 -ssl
+/server add oftc		irc.oftc.net/6697 -ssl
+/server add sandnet		irc.sandngz.net/6697 -ssl
+/server add silph		irc.silph.co/6697 -ssl
+/server add supernets	irc.supernets.org/6697 -ssl
+/server add unreal		irc.unrealircd.org/6697 -ssl
+/server add wtfux		irc.wtfux.org/6697 -ssl
+
+/set irc.server.efnet.autojoin		#2600,#efnetnews,#exchange,#irc30,#lrh
+/set irc.server.freenode.autojoin	#archlinux,#ircv3,#music-theory,#python,#raspberrypi,#weechat
+/set irc.server.silph.autojoin		#ramen
+```
+
+### Services
+```
+/secure passphrase CHANGEME
+/secure set networkname CHANGEME
+/set irc.server.networkname.command "/msg NickServ IDENTIFY ${sec.data.networkname}
+
+/msg NickServ register PASSWORD EMAIL
+/msg NickServ ACCESS DEL CHANGEME
+/msg NickServ ACCESS ADD *@big.dick.acid.vegas
+/msg NickServ AJOIN ADD <channel>
+/msg NickServ CERT ADD
+/msg NickServ SET AUTOOP ON
+/msg NickServ SET HIDE EMAIL ON
+/msg NickServ SET HIDE STATUS ON
+/msg NickServ SET HIDE USERMASK ON
+/msg NickServ SET HIDE QUIT ON
+/msg NickServ SET KEEPMODES ON
+/msg NickServ SET KILL QUICK
+/msg NickServ SET PRIVATE ON
+/msg NickServ SET SECURE ON
+/msg HostServ REQUEST MOST.DANGEROUS.MOTHER.FUCK
+/msg HostServ ON
+```
+
+### Proxy
+```
+/proxy add tor socks5 127.0.0.1 9050
+/set irc.server.CHANGEME.proxy tor
+```
+
+### Relay
+```
+/secure set relay PASSWORD
+/secure set totp SECRET
+/set relay.network.max_clients 2
+/set relay.network.password ${sec.data.relay}
+/set relay.network.totp_secret ${sec.data.totp}
+/relay sslcertkey
+/relay add ssl.weechat PORT
+```
\ No newline at end of file
diff --git a/alias.conf b/alias.conf
new file mode 100644
index 0000000..744e40e
--- /dev/null
+++ b/alias.conf
@@ -0,0 +1,95 @@
+#  bold |  color |  underline |  reset
+
+[cmd]
+# Art
+derp     = "say 0,1    10,10  11,10 10,10  0,1  1,1 ; say 0,1   11,10______0,1  1,1 ; say 0,1  11,10|10,10 11,10|10,10 11,10|10,10 11,10|10,10 0,1 1,1 ; say 0,1 8,8 1,8__8,8   1,8__8,8 0,1 1,1 ; say 8,8   1,0o8,8   1,0.8,8   1,1 ; say 0,1 8,8   1,8<.8,8     1,1 ; say 0,1 8,8         0,1 1,1 ; say 0,1  8,8  0,1,'8,8   0,1  1,1 ; say 0,1   8,8    0,1    1,1.;"
+lovecock = "say 0,1                                                  ; say 0,1      5,7#######0,1                                     ; say 0,1   5,7#####0       0,1   hey guys im $1, let me tell  ; say 0,1  5,7#####0     5_1  5)0,1  you a little about myself...        ; say 0,1  5,7#####0     0100  1o0 0,1                                1 ; say 0,1  5,7###1@5# 0       1 0  0,1  i LOVE cock                   ; say 0,1  5,7#0   5# 0       1>0   0,1                               ; say 0,1  5,7#0        5\;\;\;\;\;\;\;\;0,1     i LOVE cock               ; say 0,1  0,7      0,1                                          ; say 0,1  0,7           0,1                              1 0      ; say 0,1  0,7          1 5...W.0,1    I ROMANTICIZE THE NOTION    ; say 0,1  0,7          1 5...0,1      OF HAVING COCKS AND BALLS   ; say 0,1 0,7           0,1          ON ME AT ALL TIMES OF MY    ; say 0,7     1 >0,1               LIFE.                       ; say 0,7      0,1;"
+pump     = "exec -o curl -s ascii/$1.txt | awk '{print \$0\; system("sleep $0")\;}'"
+pumpstop = "exec pkill -9 awk"
+umad     = "say 0,1<$1> umadyet?        0,7     0,1                                 ; say 0,1<$1> hemad         0,7  0,8   0,1 0,8 0,1  4hehe am ownin these fkn noobs; say 0,1<$1> umad          0,8        0,1                              ; say 0,1<$1> umad           0,8      0,1                               ; say 0,1<$1> umadyet?      0,5 0,8       0,1                    0,15   0,1       ; say 0,1<$1> nou           0,5 0,2         0,1                 0,11 0,15     0,1     ; say 0,1<$1> umad?         0,5 0,2     0,8       0,1              0,11 0,15      0,1    ; say 0,1<$1> umad          0,5 0,2      0,8              0,1      0,11 0,15       0,1   ; say 0,1<$1> cum @ me bra  0,5 0,2          0,8              0,1   0,15        0,1  ; say 0,1<$1> umad          0,5 0,2               0,1       0,8 0,1 0,8 0,1 0,5           ; say 0,1<$1> umadyet?      0,5 0,2               0,1       0,15    0,5 0,1         0,5 ; say 0,1<$1> umad          0,5 0,8                0,1      0,5     0,1         0,5 ; say 0,1<$1> somad         0,5 0,8                 0,1         0,5 0,1         0,5 ; say 0,1<$1> umadyet?      0,5 0,14                  0,1        0,5 0,1    0,15     0,5 ; say 0,1<$1> umad          0,5              0,1  0,14    0,1       0,5 0,1    0,15     0,5 ; say 0,1<$1> hes ragin     0,5 0,1            0,5 0,1  0,14    0,1      5 0,5 0,1    0,15     0,5 ; say 0,1<$1> umad          0,5 0,1            0,5 0,1  0,4  0,14  0,1      5 0,5 0,1    0,15     0,5 ; say 0,1<$1> umadyet?      0,5 0,1            0,5 0,1  0,4      0,1    5 0,5 0,1    0,15     0,5 ;"
+
+# Alerts
+chat_norm = "say 8,5▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄ NORMAL CHATS 8,5▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄"
+chat_srs  = "say 8,5▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄ SERIOUS CHATS 8,5▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄"
+emergency = "say 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!0,4 IRC EMERGENCY 8!1,8!8!"
+flashbang = "cflood -fg 0 -bg 8 FLASHBANG"
+prison    = "say 04----------------------------------------------------------------------[IMPENETRABLE IRC PRISON WALL]-----------------------------------------------------------------------"
+terminate = "kick $1 08,04                    T E R M I N A T E D                    "
+warning   = "say 1,8/!\08,04 WARNING 1,8/!\ 04$*"
+
+# Chatters
+dzl_credit  = "say im with a credit union"
+dzl_26      = "say i dont troll because im 26"
+dzl_job     = "say i need a better job im too good at entry level shit"
+dzl_reality = "say nice perception of reality"
+tp_boom     = "say just wait till i get a supernets then enough http requests then boom"
+tp_dumb     = "say your suck a dumb fucking idiot..."
+
+# Faces
+shrug  = "say ¯\_(ツ)_/¯"
+shades = "say (⌐■_■)"
+srs    = "say (ಠ_ಠ)"
+
+# Random
+beer     = "me throws $1 an ice cold 0,0 0,2 BUD 1,0c =)"
+beer2    = "me throw $1 an ice cold 0,0 0,5 BUD 1,0c =)"
+blog     = "say Hi! It looks like you're blogging on IRC. Would you like to: 2[Add Comments] 2[e-Mail this to a Friend] 2[Digg This!] 6[Submit to Slashdot] 2[Add to del.icio.us] 5[Kill yourself because0⬉5 nobody cares]"
+chatrain = "say              ya                                                                                                                                                                                          nice; say                                             chillin                                                                                                                                                                                 u?; say                                                                                     nice                                                                            ty                                                              np; say                                              ok                                                                                                                nice                                                                 %%                                                                                                       true; say                                                                                      same"
+cig      = "say 8,7\;.`-,:.`\;15,0||||||||||||||||||||4,14&8,14@14-\;`,-\;`"
+coffee   = "me hands $1 a 5,2""] of coffee! =)"
+cooldown = "say 1,8/!\8,4 WARNING 1,8/!\ 4This keyboard is currently on 12COOL DOWN4 until $1 can handle it."
+cooled   = "say [9ALERT] This keyboard is no longer on fire. Chats may proceed accordingly."
+doritos  = "say ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄ ▲ ▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ ◄▼ ◄ ▲ ► ▼ ◄ ▲ ► ▼ Ah Mannn! I dropped my bag of Doritos!!!"
+en_gold  = "say You must have an EFNet 8,7GOLD account to view this message."
+fadeop   = "me 14<02Mode14> [-o $114] by $nick"
+fakick   = "me 14<05Kick14> $1 was kicked by $nick 14[$2-14]"
+fbi      = "notice $channel The Federal Bureau of Investigation logged a record of your entry into this illegal chatroom along with your IP address due to potential violations of 18 U.S.C. º 1030. Your IP address is entered into our criminaldatabase as well as the Department of Homeland Security. If you are not associated with these claims we strongly advise you to type '/part'. Thank you."
+fred     = "say 4()_ <- FRED DURST'S HAT LOL"
+gotem    = "say 1,0 GOT EM "
+hate     = "say 4  HATE     4  HATE     4  HATE  "
+knuckz   = "say my knuckz: (C)(H)(A)(T)b d(L)(I)(F)(E)"
+mail     = "notice $channel You have unread messages from another user! Type /server mail read to read them."
+wave     = "cflood ▁▂▃▄▅▆▇█▇▆▅▄▃▂▁"
+weed     = "say 9DUUUUUUUUUUUUUUUUUUUUUUUUUUUUDE DUDE DUDE DUDE DUDE DUDE DUDE DUDE FUCKING WEEEEEEEEED AHAHAHAHAHAHAHA DUDE!!!!!!!!!! WEED!!!!!!!!!!!! *hits bong* FUCKING DUUUUUUDE that WEEED like just...................DUDE"
+
+# Text
+1stup     = "say YO BITCH IM THE 1ST UP IN THIS PIECE. RESPECT MY ABILITY TO BE UP EARLY AND CHAT BEFORE YOU COCK SUCKER!!!!!!!!!"
+dna       = "say i got your moms dna inserted into each of my sperms and everytime i fuck you your mom is somehow cumming inside you"
+heartbeat = "say $1: your heart will skip one (1) beat in -5 seconds; say do not read this message;"
+icmp      = "say how about i do a nice icmp ping 2 u, figure out where you are and what you are on, spawn your command.com to a port of my choice and log in with telnet and have a field day with you"
+limp      = "say OR YOULL BE LEAVIN WITH A FAT LIP; say ITS ALL ABOUT THE HE SAYS SHE SAYS BULL SHIT.; say I THINK YOU BETTER QUIT TALKIN THAT SHIT PUNK; say SO COME ON AND GET IT.; say ITS JUST ONE OF THOSE DAYS"
+linkin    = "say CRAWLING IN MY SKIN. THESE WOUNDS THEY WILL NOT HEAL. FEAR IS HOW I FALL. CONFUSING WHAT IS REAL."
+money     = "say u look like a fucking money irl"
+operscum  = "say I have like 50,000 shells/vhosts/bncs. Bans won't do a thing except fill your list. And 'get to where i am today' is a sad testament to your life apparently. On a side note, I used to op other chans that are far bigger than this chan. I didn't get ops by k/b'ing everyone in sight or anyone that carried a touch of annoyance to me. I reserved k/bs for spammers and flooders, that's it. Everyone else I /ignored"
+peep      = "say ight so boom, i told son chill ah ah ah, he like nah, this that and the 3rd, blazhee blah, so i ping ponged poofed ol boi shit then i peeped the boyz so"
+worms     = "say super models give me dome while i count stacks and play worms"
+your      = "say look its not hard, your isnt you're.. you're is YOU ARE. jesus. did you even make it out of 8th grade. can you even COUNT TO EIGHT, fuckin your an IDIOT.. and im sure right now your eaiting to CORRECT ME on using your in the wrong context now that i've TAUGHT YOU HOW TO USE IT OMG JESUS"
+
+# SuperNETs (Oper)
+botsay    = "msg BotServ SAY $channel"
+deprotect = "msg ChanServ MODE $channel LOCK DEL +eI ~a:$1 ~a:$1; mode $channel -eI ~a:$1 ~a:$1"
+protect   = "mode $channel +eI ~a:$1 ~a:$1; msg chanserv mode $channel lock add +eI ~a:$1 ~a:$1"
+sf        = "spamfilter add simple cpnN kill - "ENTER THE VOID" "$*"
+
+# SuperNETs
+sn_ad1    = "masshl 1,8/!\08,04 WARNING 1,8/!\ 04This channel has moved to 12IRC.SUPERNETS.ORG #SUPERBOWL"
+sn_ad2    = "masshl 04CAN WE CONTINUE THIS CONVERSATION AT IRC.SUPERNETS.ORG #SUPERBOWL FOR FUCKS SAKE"
+sn_auto   = "say yeah you can go ahead and add irc.supernets.org to your clients auto-connect config now."
+sn_dad    = "say this isnt your dads football channel"
+sn_gold   = "say You must have a SuperNETs 8,7GOLD account to view this message."
+
+# Useful
+clear     = "buffer clear"
+close     = "buffer close"
+exempt    = "mode +eI *!$X *!$X"
+gh        = "say https://github.com/$*"
+msgbuf    = "command -buffer $1 * /input send $2-"
+nofakelag = "/set irc.server.$server.anti_flood_prio_high 0 ; /set irc.server.$server.anti_flood_prio_low 0"
+ns_ident  = "msg NickServ IDENTIFY ${sec.data.${server}}"
+redraw    = "color reset;window refresh"
+say       = "msg *"
+v         = "voice * -yes"
+wx        = "who * n%nc"
+
+[completion]
+msgbuf = "%(buffers_plugins_names)"
\ No newline at end of file
diff --git a/scripts/perl/antifuck.pl b/scripts/perl/antifuck.pl
new file mode 100644
index 0000000..b1a7353
--- /dev/null
+++ b/scripts/perl/antifuck.pl
@@ -0,0 +1,367 @@
+use strict;
+use warnings;
+
+no strict 'subs';
+
+my $SCRIPT_NAME = 'antifuck';
+my $SCRIPT_AUTHOR = 'The Krusty Krab <wowaname@volatile.ch>';
+my $SCRIPT_VERSION = '1.1';
+my $SCRIPT_LICENCE = 'Public domain';
+my $SCRIPT_DESC = 'Defend against forcejoins (e.g. from fuckyou.pl) and '.
+	'forceparts (e.g. from /remove)';
+
+my %OPTIONS = (
+	autopart => ['Whether to automatically part forcejoined channels. '.
+		'You can always do this manually with /antifuck part', '0'],
+	delay => ['Delay in milliseconds to wait before autoparting', '5000'],
+	forward => ['Whether to allow channel forwards (+f on freenode)', '1'],
+	ignore => ['Servers to ignore (e.g. for bouncers), separated by comma', ''],
+	nobufs => ['If 1, do not create buffers for forcejoined channels', '0'],
+	timeout =>
+		['Delay in milliseconds to wait for server to send JOIN after join',
+		'60000'],
+	);
+
+# %channels: channels we joined and received JOIN / NAMES for
+# %zombie: channels we joined but aren't yet in
+# %part: channels we were forced into and will part soon
+# %partbuf: buffers belonging to parted channels, we'll close these on
+#           /antifuck part
+our (%channels, %zombie, %part, %partbuf, $fuckbuf, $timeout_cb, $gc_cb);
+
+if (weechat::register($SCRIPT_NAME, $SCRIPT_AUTHOR, $SCRIPT_VERSION,
+ $SCRIPT_LICENCE, $SCRIPT_DESC, '', '')) {
+	weechat::hook_command('antifuck', $SCRIPT_DESC, 'part', <<'HELP',
+This script defends against forced joins, such as from irssi's fuckyou.pl or
+from channel forwards, as well as forced parts, such as from the /remove
+command. You can configure certain behaviour using the options under
+"plugins.var.perl.antifuck.*". Configure rejoin-on-/remove with the
+irc.server_default.autorejoin and .autorejoin_delay commands.
+
+Running "/antifuck part" will close all forcejoined channels and part them where
+appropriate.
+HELP
+		'part', 'cmd_antifuck', '');
+	weechat::hook_signal('irc_server_connected', 'irc_connect', '');
+	weechat::hook_signal('irc_server_disconnected', 'irc_disconnect', '');
+	weechat::hook_signal('irc_channel_opened', 'buffer_opened', '');
+	weechat::hook_signal('buffer_closed', 'buffer_closed', '');
+	weechat::hook_signal('*,irc_out1_join', 'client_join', '');
+	weechat::hook_signal('*,irc_out1_part', 'client_part', '');
+	weechat::hook_signal('*,irc_raw_in_001', 'irc_001', '');
+	weechat::hook_signal('*,irc_raw_in_470', 'irc_470', '');
+	weechat::hook_modifier('irc_in_366', 'irc_366', '');
+	weechat::hook_modifier('irc_in_join', 'irc_join', '');
+	weechat::hook_modifier('irc_in_part', 'irc_part', '');
+
+	for my $option (keys %OPTIONS) {
+		weechat::config_set_plugin($option, $OPTIONS{$option}[1])
+		 unless weechat::config_is_set_plugin($option);
+		weechat::config_set_desc_plugin($option, $OPTIONS{$option}[0]);
+	}
+
+	my $iptr = weechat::infolist_get('buffer', '', '');
+
+	while (weechat::infolist_next($iptr)) {
+		next unless weechat::infolist_string($iptr, 'plugin_name') eq 'irc';
+		my $buf = weechat::infolist_pointer($iptr, 'pointer');
+		$channels{
+			lc weechat::buffer_get_string($buf, 'localvar_server')}{
+			lc weechat::buffer_get_string($buf, 'localvar_channel')} = 1;
+	}
+	weechat::infolist_free($iptr);
+}
+
+sub mynick
+{
+	my ($buf, $nick) = ($_[0], $_[1]);
+
+	return lc weechat::buffer_get_string($buf, 'localvar_nick') eq lc $nick;
+}
+
+sub ignored
+{
+	my $server = shift;
+	my $ignore_conf = lc weechat::config_get_plugin('ignore');
+
+	return $ignore_conf =~ /(^|,)$server($|,)/;
+}
+
+sub nobufs { weechat::config_get_plugin('nobufs') }
+
+sub ircbuf { weechat::buffer_search('irc', "(?i)".(join '.', @_)) }
+sub ircparse { weechat::info_get_hashtable(irc_message_parse =>
+	{ message => shift }) }
+
+sub servchan
+{
+	my $buf = shift;
+
+	return (lc weechat::buffer_get_string($buf, 'localvar_server'),
+		lc weechat::buffer_get_string($buf, 'localvar_channel'));
+}
+
+sub reset_gc
+{
+	weechat::unhook($gc_cb) if $gc_cb;
+	$gc_cb = weechat::hook_timer(weechat::config_get_plugin('timeout'), 0, 1,
+		'run_gc', '');
+}
+
+sub cmd_antifuck
+{
+	my (undef, $buffer, $args) = @_;
+
+	if ($args eq 'part') {
+		# TODO: we really need to spend more time here making sure we send the
+		# fewest PARTs possible, a la irc_join_delay
+		weechat::buffer_close($fuckbuf);
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub fuckbuf_input { return weechat::WEECHAT_RC_OK; }
+
+sub fuckbuf_close
+{
+	weechat::buffer_close($_) for (keys %partbuf);
+	%partbuf = ();
+	$fuckbuf = '';
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub irc_connect
+{
+	my $server = pop;
+	my ($autojoin) = (weechat::config_string(weechat::config_get(
+		"irc.server.$server.autojoin")) =~ /^([^ ]*)/);
+
+	$zombie{$server}{$_} = 1 for (split ',', lc($autojoin));
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub irc_disconnect
+{
+	my $server = pop;
+
+	$server = lc $server;
+	delete $channels{$server};
+	delete $zombie{$server};
+	delete $part{$server};
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub buffer_opened {
+	my $buffer = pop;
+	my ($server, $channel) = servchan($buffer);
+	return weechat::WEECHAT_RC_OK if exists $channels{$server}{$channel};
+	return weechat::WEECHAT_RC_OK if ignored($server);
+
+	$fuckbuf = weechat::buffer_new(
+		'antifuck',
+		'fuckbuf_input',
+		'',
+		'fuckbuf_close',
+		''
+		) unless $fuckbuf;
+
+	weechat::buffer_merge($buffer, $fuckbuf);
+	#return weechat::WEECHAT_RC_OK unless weechat::config_get_plugin('autopart');
+
+	$partbuf{$buffer} = 1;
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub buffer_closed {
+	my $buffer = pop;
+
+	delete $partbuf{$buffer};
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub client_join
+{
+	my (undef, $server, $channel) = (shift,
+		shift =~ /(.+),irc_out1_join/i,
+		shift =~ /^join :?([^ ]*)/i);
+	($server, $channel) = (lc $server, lc $channel);
+
+	reset_gc();
+
+	($_ eq '0' ? %{$channels{$server}} = () : $zombie{$server}{$_} = 1)
+		for (split ',', $channel);
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub client_part
+{
+	my (undef, $server, $channel) = (shift,
+		shift =~ /(.+),irc_out1_part/i,
+		shift =~ /^part ([^ ]*)/i);
+	($server, $channel) = (lc $server, lc $channel);
+
+	delete $channels{$server}{$_} for (split ',', $channel);
+	return weechat::WEECHAT_RC_OK;
+}
+
+# RPL_WELCOME
+sub irc_001
+{
+	my (undef, $server, $message) = (shift,
+		shift =~ /(.+),irc_raw_in_001/, shift);
+
+	$server = lc $server;
+	return weechat::WEECHAT_RC_OK unless $message =~ / :- Welcome to ZNC -$/;
+
+	my $ignore_conf = lc weechat::config_get_plugin('ignore');
+	return weechat::WEECHAT_RC_OK if $ignore_conf =~ /(^|,)$server($|,)/;
+
+	weechat::config_set_plugin('ignore', "$ignore_conf,$server");
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub irc_join
+{
+	my ($server, $message, $msghash) = (lc $_[2], $_[3], ircparse($_[3]));
+	my ($nick, $channel) = ($msghash->{nick}, lc $msghash->{channel});
+	my $buffer = ircbuf("$server.$channel");
+
+	return $message if exists $channels{$server}{$channel};
+	if (exists $zombie{$server}{$channel} || ignored($server)) {
+		delete $zombie{$server}{$channel};
+		$channels{$server}{$channel} = 1;
+		return $message;
+	}
+	# XXX return $message unless mynick($buffer, $nick);
+
+	$part{$server}{$channel} = 1;
+	$timeout_cb = weechat::hook_timer(
+		weechat::config_get_plugin('delay'), 0, 1, 'irc_join_delay', $buffer)
+		unless $timeout_cb || !weechat::config_get_plugin('autopart');
+
+	return $message unless nobufs();
+
+	$fuckbuf = weechat::buffer_new(
+		'antifuck',
+		'fuckbuf_input',
+		'',
+		'fuckbuf_close',
+		''
+		) unless $fuckbuf;
+	weechat::print($fuckbuf, weechat::prefix('join').
+		weechat::color('irc.color.message_join').
+		'You were forced to join '.weechat::color('chat_channel').$channel.
+		weechat::color('irc.color.message_join').', leaving');
+
+	return '';
+}
+
+# RPL_ENDOFNAMES
+sub irc_366
+{
+	my ($server, $message) = ($_[2], $_[3]);
+	my ($nick, $channel) = $message =~ /^:[^ ]* 366 ([^ ]*) ([^ ]*)/i;
+	my $buffer = ircbuf("$server.$channel");
+	($server, $channel) = (lc $server, lc $channel);
+
+	return $message if exists $channels{$server}{$channel};
+	return '' if nobufs();
+
+	weechat::print($buffer, weechat::prefix('network').
+		'Forcejoined, not syncing modes');
+
+	return '';
+}
+
+# ERR_LINKCHANNEL
+sub irc_470
+{
+	my (undef, $server, $oldchan, $newchan) = (shift,
+		shift =~ /(.+),irc_raw_in_470/,
+		shift =~ /^:[^ ]* 470 [^ ]+ ([^ ]+) ([^ ]+)/);
+	($server, $oldchan, $newchan) = (lc $server, lc $oldchan, lc $newchan);
+
+	delete $channels{$server}{$oldchan};
+	$channels{$server}{$newchan} = 1 if weechat::config_get_plugin('forward');
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub irc_join_delay
+{
+	my $buffer = shift;
+
+	for my $server (keys %part) {
+		my $chans = '';
+
+		for my $chan (keys %{$part{$server}}) {
+			if (length($chans) + length($chan) > 500) {
+				weechat::hook_signal_send('irc_input_send',
+					weechat::WEECHAT_HOOK_SIGNAL_STRING,
+					"$server;;priority_low;;/part $chans");
+				$chans = '';
+			}
+
+			$chans .= "$chan,";
+		}
+
+		weechat::hook_signal_send('irc_input_send',
+			weechat::WEECHAT_HOOK_SIGNAL_STRING,
+			"$server;;priority_low;;/part $chans");
+	}
+	$timeout_cb = '';
+	%part = ();
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub run_gc
+{
+	%zombie = ();
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub irc_part
+{
+	my ($server, $message, $msghash) = ($_[2], $_[3], ircparse($_[3]));
+	my ($arj, $arj_delay, $arjd, $arjd_delay) = (
+		weechat::config_get("irc.server.$server.autorejoin"),
+		weechat::config_get("irc.server.$server.autorejoin_delay"),
+		weechat::config_get("irc.server_default.autorejoin"),
+		weechat::config_get("irc.server_default.autorejoin_delay")
+		);
+	return $message unless (
+		weechat::config_option_is_null($arj) ?
+		weechat::config_boolean($arjd) :
+		weechat::config_boolean($arj)
+		);
+
+	my ($nick, $channel, $reason) = ($msghash->{nick}, $msghash->{channel},
+		$msghash->{text});
+
+	my $buffer = ircbuf("$server.$channel");
+	my ($lserver, $lchannel) = (lc $server, lc $channel);
+
+	return $message unless mynick($buffer, $nick);
+	return $message unless exists $channels{$lserver}{$lchannel};
+	return $message if ignored($lserver);
+
+	weechat::print($buffer, weechat::prefix('quit').
+		weechat::color('irc.color.message_quit').
+		'You were forced to part '.weechat::color('chat_channel').$channel.
+		weechat::color('chat_delimiters').' ('.weechat::color('reset').
+		$reason.weechat::color('chat_delimiters').')'.
+		weechat::color('irc.color.message_quit').', rejoining');
+	my $delay = (
+		weechat::config_option_is_null($arj_delay) ?
+		weechat::config_integer($arjd_delay) :
+		weechat::config_integer($arj_delay)
+		);
+	weechat::command($buffer, ($delay ? "/wait $delay " : "").
+		"/join $channel");
+
+	return '';
+}
diff --git a/scripts/perl/cflood.pl b/scripts/perl/cflood.pl
new file mode 100644
index 0000000..49825da
--- /dev/null
+++ b/scripts/perl/cflood.pl
@@ -0,0 +1,150 @@
+#{{{ BSD License
+# Copyright (c) 2008 hzu/zionist
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#}}}
+
+# Ported from irssi to WeeChat by the Krusty Krab
+
+use strict;
+use warnings;
+no strict 'subs';
+
+my $SCRIPT_NAME = 'colourflood';
+my $SCRIPT_AUTHOR = 'hzu';
+my $SCRIPT_VERSION = '0.3';
+my $SCRIPT_LICENCE = 'BSD';
+my $SCRIPT_DESC = 'A-rab style ircing';
+
+my $USAGE = <<EOF;
+options:
+    -r      Random back & foreground colours (default)
+    -f      Amount of times the message is flooded
+    -fg     font colour, available colours:
+                black, blue, green
+                lightred, red, magenta, orange
+                yellow, lightgreen, cyan,
+                lightcyan, lightblue,
+                lightmagenta, gray, lightgray.
+    -bg     background colour, available colours:
+                black, blue, green, red,
+                magenta, orange, green, cyan,
+                lightcyan, lightblue,
+                lightmagenta, gray, lightgray
+EOF
+
+our %clr = (
+  black        => 1,
+  blue         => 2,
+  green        => 3,
+  lightred     => 4,
+  red          => 5,
+  magenta      => 6,
+  orange       => 7,
+  yellow       => 8,
+  lightgreen   => 9,
+  cyan         => 10,
+  lightcyan    => 11,
+  lightblue    => 12,
+  lightmagenta => 13,
+  gray         => 14,
+  lightgray    => 15,
+);
+
+if (weechat::register($SCRIPT_NAME, $SCRIPT_AUTHOR, $SCRIPT_VERSION,
+ $SCRIPT_LICENCE, $SCRIPT_DESC, '', '')) {
+	weechat::hook_command('cflood', $SCRIPT_DESC, '[options] text',
+		$USAGE, '', 'cmd_cflood', '');
+
+	my %OPTIONS = (
+		dir => ['Database directory',
+			weechat::info_get('weechat_dir', '').'/yiffs'],
+		db => ['Default database', 'yiffs'],
+		solodb => ['Default database when nick is omitted', 'solos'],
+		);
+
+	for my $option (keys %OPTIONS) {
+		weechat::config_set_plugin($option, $OPTIONS{$option}[1])
+		 unless weechat::config_is_set_plugin($option);
+		weechat::config_set_desc_plugin($option, $OPTIONS{$option}[0]);
+	}
+}
+
+sub colour {
+	my ($fg, $bg, $text) = @_;
+	my $fore = ($fg =~ /^[0-9][0-9]?$/) ? $fg : $clr{$fg};
+	my $back = ($fg =~ /^[0-9][0-9]?$/) ? $bg : $clr{$bg};
+	$fore-- if $fore == $back;
+	$text = "\003$fore,$back $text \003$back,$fore $text ";
+	$text x= (int 400 / length $text);
+	return "$text\003";
+}
+
+sub parse {
+	my @args = ( split / +/, shift );
+	my ( %todo, $text, $body );
+
+	while ( ($_ = shift @args) ne '' ) {
+		/^-r$/ and next;
+		/^-f$/ and $todo{f} = shift @args, next;
+		/^-fg$/ and $todo{fg} = shift @args, next;
+		/^-bg$/ and $todo{bg} = shift @args, next;
+		/^-/ and weechat::print('', weechat::prefix('error').
+			'Invalid arguments (see /help cflood)'), return;
+		$text = @args < 1 ? $_ : "$_ " . join ' ', @args;
+		last;
+	}
+
+	if (!(defined $todo{fg}) || !(defined $todo{bg})) {
+		$body = "";
+		my @rnd_clr = keys %clr;
+		foreach ( 1 .. (defined $todo{f} ? $todo{f} : 1 ) ) {
+			$body .= colour($rnd_clr[rand @rnd_clr],
+				$rnd_clr[rand @rnd_clr], $text, $todo{f});
+			$body .= "\n";
+		}
+	} else {
+		$body = "";
+		foreach ( 1 .. (defined $todo{f} ? $todo{f} : 1 ) ) {
+			$body .= colour( $todo{fg}, $todo{bg}, $text );
+			$body .= "\n";
+		}
+	}
+	return $body;
+}
+
+sub cmd_cflood {
+	my (undef, $buffer, $data) = @_;
+	my $ret;
+
+	return weechat::WEECHAT_RC_OK if ($data eq '');
+
+	chomp( $ret = parse($data) );
+
+	if ($ret =~ /\n/) {
+		map { weechat::command($buffer, "/msg * $_") } (split /\n/, $ret);
+	} else { 
+		weechat::command($buffer, "/msg * $ret");
+	}
+
+	return weechat::WEECHAT_RC_OK;
+}
diff --git a/scripts/perl/color_popup.pl b/scripts/perl/color_popup.pl
new file mode 100644
index 0000000..02ea51c
--- /dev/null
+++ b/scripts/perl/color_popup.pl
@@ -0,0 +1,38 @@
+use strict; use warnings;
+$INC{'Encode/ConfigLocal.pm'}=1;
+require Encode;
+use utf8;
+
+use constant SCRIPT_NAME => 'color_popup';
+weechat::register(SCRIPT_NAME, 'Nei <anti.teamidiot.de>', '0.4', 'GPL3', 'show mirc color codes', '', '') || return;
+
+my %ones = map { $_ => 1 } 0, 8, 14, 15, 42, 43, 45, 53 .. 58, 65 .. 86, 95 .. 98;
+weechat::hook_modifier('input_text_display_with_cursor', 'color_popup', '');
+
+## color_popup -- show mirc colors
+## () - modifier handler
+## $_[2] - buffer pointer
+## $_[3] - input string
+## returns modified input string
+sub color_popup {
+	Encode::_utf8_on($_[3]);
+	my $cc = qr/(?:\03(?:\d{1,2}(?:,(?:\d{1,2})?)?)?|\02|\x1d|\x0f|\x12|\x15|\x16|\x1f)/;
+	my ($p1, $x, $p2) = split /((?:$cc)?\x19b#)/, $_[3], 2;
+	for ($p1, $p2) {
+		s/($cc)/$1■/g if weechat::config_string_to_boolean(weechat::config_get_plugin('reveal'));
+		Encode::_utf8_on($_ = weechat::hook_modifier_exec(irc_color_decode => 1, weechat::hook_modifier_exec(irc_color_encode => 1, $_)));
+	}
+	$x .= ' ' . weechat::hook_modifier_exec(
+	    irc_color_decode => 1, sub {
+		$x =~ /\cC(\d{1,2})(,(\d{1,2})?)?/;
+		my ($fg, $bg) = ($1//-1, $3//-1);
+		my $sc = $bg >= 0 ? $bg : $2?-1:$fg;
+		(join '', map {
+		     "\03" . ($ones{0+$_} // 0) . ",$_$_"
+		}
+		    $sc >= 0 ? grep /^0?$sc/, '00' .. '99' : ('00' .. '15'))
+		. "\03"
+	    }->()
+	   ) if $x =~ /^\03/ and weechat::current_buffer() eq $_[2];
+	"$p1$x$p2"
+}
diff --git a/scripts/perl/fuckyou.pl b/scripts/perl/fuckyou.pl
new file mode 100644
index 0000000..c2c4fca
--- /dev/null
+++ b/scripts/perl/fuckyou.pl
@@ -0,0 +1,188 @@
+# Ported from irssi to WeeChat by the Krusty Krab
+
+use Time::HiRes qw(time);
+use Digest::MD5 qw(md5_hex);
+
+
+#__        ___    ____  _   _ ___ _   _  ____   _   _ ____ ___ _   _  ____
+#\ \      / / \  |  _ \| \ | |_ _| \ | |/ ___| | | | / ___|_ _| \ | |/ ___|
+# \ \ /\ / / _ \ | |_) |  \| || ||  \| | |  _  | | | \___ \| ||  \| | |  _
+#  \ V  V / ___ \|  _ <| |\  || || |\  | |_| | | |_| |___) | || |\  | |_| |
+#   \_/\_/_/   \_\_| \_\_| \_|___|_| \_|\____|  \___/|____/___|_| \_|\____|
+#
+# _____ _   _ _____ ____  _____   ____   ____ ____  ___ ____ _____ ____
+#|_   _| | | | ____/ ___|| ____| / ___| / ___|  _ \|_ _|  _ \_   _/ ___|
+#  | | | |_| |  _| \___ \|  _|   \___ \| |   | |_) || || |_) || | \___ \
+#  | | |  _  | |___ ___) | |___   ___) | |___|  _ < | ||  __/ | |  ___) |
+#  |_| |_| |_|_____|____/|_____| |____/ \____|_| \_\___|_|    |_| |____/
+#
+# __  __    _ __   __  ____  _____    _    _     _  __   __
+#|  \/  |  / \\ \ / / |  _ \| ____|  / \  | |   | | \ \ / /
+#| |\/| | / _ \\ V /  | |_) |  _|   / _ \ | |   | |  \ \//
+#| |  | |/ ___ \| |   |  _ <| |___ / ___ \| |___| |___| |
+#|_|  |_/_/   \_\_|   |_| \_\_____/_/   \_\_____|_____|_|
+#
+# _____ _   _  ____ _  _____ _   _  ____      _    _   _ _   _  _____   __
+#|  ___| | | |/ ___| |/ /_ _| \ | |/ ___|    / \  | \ | | \ | |/ _ \ \ / /
+#| |_  | | | | |   | ' / | ||  \| | |  _    / _ \ |  \| |  \| | | | \ V /
+#|  _| | |_| | |___| . \ | || |\  | |_| |  / ___ \| |\  | |\  | |_| || |
+#|_|    \___/ \____|_|\_\___|_| \_|\____| /_/   \_\_| \_|_| \_|\___/ |_|
+#
+#__   _____  _   _ ____    _   _ ____  _____ ____  ____
+#\ \ / / _ \| | | |  _ \  | | | / ___|| ____|  _ \/ ___|
+# \ V / | | | | | | |_) | | | | \___ \|  _| | |_) \___ \
+#  | || |_| | |_| |  _ <  | |_| |___) | |___|  _ < ___) |
+#  |_| \___/ \___/|_| \_\  \___/|____/|_____|_| \_\____/
+
+
+my $SCRIPT_NAME = 'fuckyou';
+my $SCRIPT_AUTHOR = 'Goat-See <mrtheplague@gmail.com>';
+my $SCRIPT_VERSION = '2.3';
+my $SCRIPT_LICENCE = 'urmom';
+my $SCRIPT_DESC = '/fuckyou NICK numberchannels';
+
+my %OPTIONS = (
+	forcejoin => ['Command to forcejoin. ratbox uses forcejoin, unreal sajoin',
+		'forcejoin'],
+	forcepart => ['Command to forcepart. ratbox uses forcepart, unreal sapart',
+		'forcepart'],
+	furry => ['Channel prefix (include # or &)', '&HYE'],
+	parallel => ['Number of channels to send per forcejoin command', 1],
+	whois_cmd => ['Prefix to whois user (e.g. for ratbox operspy, "/whois !")',
+		'/whois '],
+	);
+
+sub fuckyou
+{
+	my $buffer = shift;
+	my $nig = $$ * time;
+	my @jews;
+	push @jews, "${FURRY}_".md5_hex($nig + $_) for (1..$PARALLEL);
+
+	weechat::command($buffer, "/quote $FORCEJOIN $target ".join(',', @jews));
+
+	return weechat::WEECHAT_RC_OK;
+}
+
+sub cmd_fuckyou
+{
+	my (undef, $buffer, $data) = @_;
+	my $server = weechat::buffer_get_string($buffer, 'localvar_server');
+	my $amt_end;
+	($target, $amt_end) = split / +/, $data;
+	our ($FORCEJOIN, $FURRY, $PARALLEL) = (
+		weechat::config_get_plugin('forcejoin'),
+		weechat::config_get_plugin('furry'),
+		weechat::config_get_plugin('parallel'));
+
+	weechat::unhook($signal) if $signal;
+	weechat::unhook($timer) if $timer;
+
+	unless ($target) {
+		weechat::print($buffer, 'Stopped any current /fuckyou');
+		return weechat::WEECHAT_RC_OK;
+	}
+	$amt_end //= 0;
+
+	$signal = weechat::hook_signal("$server,irc_raw_in_402", 'irc_402', '');
+	$timer = weechat::hook_timer(50, 0, $amt_end, 'fuckyou', $buffer);